@wq2/brigadier-ts 1.0.6 → 1.0.8
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/.git-blame-ignore-revs +2 -0
- package/.github/workflows/publish.yml +6 -4
- package/.github/workflows/test.yml +9 -4
- package/{README.md → ReadME.md} +4 -0
- package/dist/Command.d.ts +7 -2
- package/dist/CommandDispatcher.d.ts +30 -25
- package/dist/CommandDispatcher.js +2 -297
- package/dist/CommandDispatcher.js.map +1 -0
- package/dist/ParseResults.d.ts +17 -9
- package/dist/ParseResults.js +2 -20
- package/dist/ParseResults.js.map +1 -0
- package/dist/Predicate.d.ts +5 -1
- package/dist/StringReader.d.ts +29 -25
- package/dist/StringReader.js +2 -186
- package/dist/StringReader.js.map +1 -0
- package/dist/arguments/ArgumentType.d.ts +12 -7
- package/dist/arguments/ArgumentType.js +2 -14
- package/dist/arguments/ArgumentType.js.map +1 -0
- package/dist/arguments/BoolArgumentType.d.ts +14 -9
- package/dist/arguments/BoolArgumentType.js +2 -23
- package/dist/arguments/BoolArgumentType.js.map +1 -0
- package/dist/arguments/FloatArgumentType.d.ts +13 -7
- package/dist/arguments/FloatArgumentType.js +2 -20
- package/dist/arguments/FloatArgumentType.js.map +1 -0
- package/dist/arguments/IntegerArgumentType.d.ts +13 -7
- package/dist/arguments/IntegerArgumentType.js +2 -20
- package/dist/arguments/IntegerArgumentType.js.map +1 -0
- package/dist/arguments/LongArgumentType.d.ts +15 -9
- package/dist/arguments/LongArgumentType.js +2 -22
- package/dist/arguments/LongArgumentType.js.map +1 -0
- package/dist/arguments/NumberArgumentType.d.ts +18 -13
- package/dist/arguments/NumberArgumentType.js +2 -31
- package/dist/arguments/NumberArgumentType.js.map +1 -0
- package/dist/arguments/StringArgumentType.d.ts +15 -11
- package/dist/arguments/StringArgumentType.js +2 -39
- package/dist/arguments/StringArgumentType.js.map +1 -0
- package/dist/builder/ArgumentBuilder.d.ts +32 -27
- package/dist/builder/ArgumentBuilder.js +2 -56
- package/dist/builder/ArgumentBuilder.js.map +1 -0
- package/dist/builder/LiteralArgumentBuilder.d.ts +14 -9
- package/dist/builder/LiteralArgumentBuilder.js +2 -29
- package/dist/builder/LiteralArgumentBuilder.js.map +1 -0
- package/dist/builder/RequiredArgumentBuilder.d.ts +17 -12
- package/dist/builder/RequiredArgumentBuilder.js +2 -33
- package/dist/builder/RequiredArgumentBuilder.js.map +1 -0
- package/dist/context/CommandContext.d.ts +36 -31
- package/dist/context/CommandContext.js +2 -66
- package/dist/context/CommandContext.js.map +1 -0
- package/dist/context/CommandContextBuilder.d.ts +42 -37
- package/dist/context/CommandContextBuilder.js +2 -118
- package/dist/context/CommandContextBuilder.js.map +1 -0
- package/dist/context/ParsedArgument.d.ts +12 -7
- package/dist/context/ParsedArgument.js +2 -17
- package/dist/context/ParsedArgument.js.map +1 -0
- package/dist/context/ParsedCommandNode.d.ts +13 -8
- package/dist/context/ParsedCommandNode.js +2 -16
- package/dist/context/ParsedCommandNode.js.map +1 -0
- package/dist/context/StringRange.d.ts +14 -10
- package/dist/context/StringRange.js +2 -30
- package/dist/context/StringRange.js.map +1 -0
- package/dist/context/SuggestionContext.d.ts +10 -5
- package/dist/context/SuggestionContext.js +2 -10
- package/dist/context/SuggestionContext.js.map +1 -0
- package/dist/exceptions/CommandErrorType.d.ts +12 -8
- package/dist/exceptions/CommandErrorType.js +2 -18
- package/dist/exceptions/CommandErrorType.js.map +1 -0
- package/dist/exceptions/CommandSyntaxError.d.ts +8 -4
- package/dist/exceptions/CommandSyntaxError.js +2 -20
- package/dist/exceptions/CommandSyntaxError.js.map +1 -0
- package/dist/exceptions/StandardErrorTypes.d.ts +28 -23
- package/dist/exceptions/StandardErrorTypes.js +2 -26
- package/dist/exceptions/StandardErrorTypes.js.map +1 -0
- package/dist/index.d.ts +32 -30
- package/dist/index.js +1 -46
- package/dist/suggestion/Suggestion.d.ts +16 -11
- package/dist/suggestion/Suggestion.js +2 -48
- package/dist/suggestion/Suggestion.js.map +1 -0
- package/dist/suggestion/Suggestions.d.ts +18 -13
- package/dist/suggestion/Suggestions.js +2 -56
- package/dist/suggestion/Suggestions.js.map +1 -0
- package/dist/suggestion/SuggestionsBuilder.d.ts +21 -16
- package/dist/suggestion/SuggestionsBuilder.js +2 -47
- package/dist/suggestion/SuggestionsBuilder.js.map +1 -0
- package/dist/tree/ArgumentCommandNode.d.ts +26 -21
- package/dist/tree/ArgumentCommandNode.js +2 -34
- package/dist/tree/ArgumentCommandNode.js.map +1 -0
- package/dist/tree/CommandNode.d.ts +45 -39
- package/dist/tree/CommandNode.js +2 -80
- package/dist/tree/CommandNode.js.map +1 -0
- package/dist/tree/LiteralCommandNode.d.ts +24 -19
- package/dist/tree/LiteralCommandNode.js +2 -60
- package/dist/tree/LiteralCommandNode.js.map +1 -0
- package/dist/tree/RootCommandNode.d.ts +17 -12
- package/dist/tree/RootCommandNode.js +2 -26
- package/dist/tree/RootCommandNode.js.map +1 -0
- package/dist/tree/internal.js +2 -7
- package/dist/tree/internal.js.map +1 -0
- package/dist/tree/internal2.d.ts +8 -5
- package/dist/tree/internal2.js +2 -10
- package/dist/tree/internal2.js.map +1 -0
- package/package.json +39 -33
- package/src/CommandDispatcher.ts +6 -1
- package/src/StringReader.ts +10 -1
- package/src/arguments/FloatArgumentType.ts +4 -1
- package/src/arguments/IntegerArgumentType.ts +4 -1
- package/src/index.ts +1 -0
- package/src/tree/CommandNode.ts +7 -8
- package/src/tree/LiteralCommandNode.ts +1 -4
- package/src/tree/internal.ts +7 -0
- package/tsconfig.json +3 -2
- package/tsdown.config.ts +10 -0
- package/dist/Command.js +0 -2
- package/dist/Predicate.js +0 -2
- package/dist/tree/internal.d.ts +0 -3
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -27,15 +27,17 @@ jobs:
|
|
|
27
27
|
|
|
28
28
|
steps:
|
|
29
29
|
- uses: actions/checkout@v6
|
|
30
|
-
|
|
30
|
+
|
|
31
|
+
- name: Setup Bun
|
|
32
|
+
uses: oven-sh/setup-bun@v2
|
|
31
33
|
with:
|
|
32
|
-
|
|
34
|
+
bun-version: latest
|
|
33
35
|
|
|
34
36
|
- name: Install & Build
|
|
35
|
-
run:
|
|
37
|
+
run: bun install && bun run build
|
|
36
38
|
|
|
37
39
|
- name: Publish (npm)
|
|
38
|
-
run: npm publish --registry=https://registry.npmjs.org/ --loglevel info
|
|
40
|
+
run: bunx npm publish --registry=https://registry.npmjs.org/ --loglevel info
|
|
39
41
|
env:
|
|
40
42
|
GITHUB_TOKEN: ${{ env.GITHUB_TOKEN }}
|
|
41
43
|
NPM_TOKEN: ${{ env.GITHUB_TOKEN }}
|
|
@@ -11,13 +11,18 @@ jobs:
|
|
|
11
11
|
runs-on: ubuntu-latest
|
|
12
12
|
steps:
|
|
13
13
|
- name: Checkout
|
|
14
|
-
uses: actions/checkout@
|
|
14
|
+
uses: actions/checkout@v6
|
|
15
|
+
|
|
16
|
+
- name: Setup Bun
|
|
17
|
+
uses: oven-sh/setup-bun@v2
|
|
18
|
+
with:
|
|
19
|
+
bun-version: latest
|
|
15
20
|
|
|
16
21
|
- name: Install
|
|
17
|
-
run:
|
|
22
|
+
run: bun i
|
|
18
23
|
|
|
19
24
|
- name: Build
|
|
20
|
-
run:
|
|
25
|
+
run: bun run build
|
|
21
26
|
|
|
22
27
|
- name: Test
|
|
23
|
-
run:
|
|
28
|
+
run: bun test
|
package/{README.md → ReadME.md}
RENAMED
|
@@ -9,6 +9,10 @@ Fork of [brigadier-ts](https://github.com/misode/brigadier-ts) with some changes
|
|
|
9
9
|
|
|
10
10
|
(not many, but we'll probably add more later)
|
|
11
11
|
|
|
12
|
+
## Migration from original
|
|
13
|
+
|
|
14
|
+
See [our wiki page](https://github.com/MinibloxCheaters2/brigadier-ts/wiki/Migrating-from-Misode-brigadier%E2%80%90ts)
|
|
15
|
+
|
|
12
16
|
## Installation
|
|
13
17
|
|
|
14
18
|
```
|
package/dist/Command.d.ts
CHANGED
|
@@ -1,2 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
1
|
+
import { CommandContext } from "./context/CommandContext.js";
|
|
2
|
+
|
|
3
|
+
//#region src/Command.d.ts
|
|
4
|
+
type Command<S> = (c: CommandContext<S>) => Promise<number | void>;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { Command };
|
|
7
|
+
//# sourceMappingURL=Command.d.ts.map
|
|
@@ -1,26 +1,31 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
1
|
+
import { StringReader } from "./StringReader.js";
|
|
2
|
+
import { Suggestions } from "./suggestion/Suggestions.js";
|
|
3
|
+
import { LiteralCommandNode } from "./tree/LiteralCommandNode.js";
|
|
4
|
+
import { LiteralArgumentBuilder } from "./builder/LiteralArgumentBuilder.js";
|
|
5
|
+
import { ParseResults } from "./ParseResults.js";
|
|
6
|
+
import { RootCommandNode } from "./tree/RootCommandNode.js";
|
|
7
|
+
import { CommandNode } from "./tree/CommandNode.js";
|
|
8
|
+
|
|
9
|
+
//#region src/CommandDispatcher.d.ts
|
|
10
|
+
declare class CommandDispatcher<S> {
|
|
11
|
+
private root;
|
|
12
|
+
private static USAGE_OPTIONAL_OPEN;
|
|
13
|
+
private static USAGE_OPTIONAL_CLOSE;
|
|
14
|
+
private static USAGE_REQUIRED_OPEN;
|
|
15
|
+
private static USAGE_REQUIRED_CLOSE;
|
|
16
|
+
private static USAGE_OR;
|
|
17
|
+
constructor();
|
|
18
|
+
register(command: LiteralArgumentBuilder<S>): LiteralCommandNode<S>;
|
|
19
|
+
execute(parse: ParseResults<S> | string, source: S): Promise<number>;
|
|
20
|
+
parse(reader: StringReader | string, source: S): Promise<ParseResults<S>>;
|
|
21
|
+
private parseNodes;
|
|
22
|
+
getAllUsage(node: CommandNode<S>, source: S, restricted: boolean): Promise<string[]>;
|
|
23
|
+
private getAllUsageImpl;
|
|
24
|
+
getCompletionSuggestions(parse: ParseResults<S>, cursor?: number): Promise<Suggestions>;
|
|
25
|
+
getSmartUsage(node: CommandNode<S>, source: S): Map<CommandNode<S>, string>;
|
|
26
|
+
getSmartUsage(node: CommandNode<S>, source: S, optional: boolean, deep: boolean): string;
|
|
27
|
+
getRoot(): RootCommandNode<S>;
|
|
26
28
|
}
|
|
29
|
+
//#endregion
|
|
30
|
+
export { CommandDispatcher };
|
|
31
|
+
//# sourceMappingURL=CommandDispatcher.d.ts.map
|
|
@@ -1,297 +1,2 @@
|
|
|
1
|
-
"
|
|
2
|
-
|
|
3
|
-
exports.CommandDispatcher = void 0;
|
|
4
|
-
const CommandContextBuilder_1 = require("./context/CommandContextBuilder");
|
|
5
|
-
const CommandSyntaxError_1 = require("./exceptions/CommandSyntaxError");
|
|
6
|
-
const StandardErrorTypes_1 = require("./exceptions/StandardErrorTypes");
|
|
7
|
-
const ParseResults_1 = require("./ParseResults");
|
|
8
|
-
const StringReader_1 = require("./StringReader");
|
|
9
|
-
const Suggestions_1 = require("./suggestion/Suggestions");
|
|
10
|
-
const SuggestionsBuilder_1 = require("./suggestion/SuggestionsBuilder");
|
|
11
|
-
const RootCommandNode_1 = require("./tree/RootCommandNode");
|
|
12
|
-
class CommandDispatcher {
|
|
13
|
-
constructor() {
|
|
14
|
-
this.root = new RootCommandNode_1.RootCommandNode();
|
|
15
|
-
}
|
|
16
|
-
register(command) {
|
|
17
|
-
const build = command.build();
|
|
18
|
-
this.root.addChild(build);
|
|
19
|
-
return build;
|
|
20
|
-
}
|
|
21
|
-
async execute(parse, source) {
|
|
22
|
-
if (typeof parse === "string") {
|
|
23
|
-
parse = await this.parse(new StringReader_1.StringReader(parse), source);
|
|
24
|
-
}
|
|
25
|
-
if (parse.getReader().canRead()) {
|
|
26
|
-
if (parse.getErrors().size === 1) {
|
|
27
|
-
throw parse.getErrors().values().next();
|
|
28
|
-
}
|
|
29
|
-
else if (parse.getContext().getRange().isEmpty()) {
|
|
30
|
-
throw StandardErrorTypes_1.DISPATCHER_UNKNOWN_COMMAND.createWithContext(parse.getReader());
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
throw StandardErrorTypes_1.DISPATCHER_UNKNOWN_ARGUMENT.createWithContext(parse.getReader());
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
let result = 0;
|
|
37
|
-
let successfulForks = 0;
|
|
38
|
-
let forked = false;
|
|
39
|
-
let foundCommand = false;
|
|
40
|
-
const command = parse.getReader().getString();
|
|
41
|
-
const original = parse.getContext().build(command);
|
|
42
|
-
let contexts = [original];
|
|
43
|
-
let next = [];
|
|
44
|
-
while (contexts.length > 0) {
|
|
45
|
-
const size = contexts.length;
|
|
46
|
-
for (let i = 0; i < size; i++) {
|
|
47
|
-
const context = contexts[i];
|
|
48
|
-
const child = context.getChild();
|
|
49
|
-
if (child !== null) {
|
|
50
|
-
forked = forked || context.isForked();
|
|
51
|
-
if (child.hasNodes()) {
|
|
52
|
-
foundCommand = true;
|
|
53
|
-
const modifier = context.getRedirectModifier();
|
|
54
|
-
if (modifier === null) {
|
|
55
|
-
next.push(child.copyFor(context.getSource()));
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
try {
|
|
59
|
-
const results = modifier(context);
|
|
60
|
-
results.forEach((source) => {
|
|
61
|
-
next.push(child.copyFor(source));
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
catch (e) {
|
|
65
|
-
if (!forked)
|
|
66
|
-
throw e;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
else if (context.getCommand()) {
|
|
72
|
-
foundCommand = true;
|
|
73
|
-
try {
|
|
74
|
-
const value = await context.getCommand()(context);
|
|
75
|
-
result += value || value === 0 ? value : 1;
|
|
76
|
-
successfulForks++;
|
|
77
|
-
}
|
|
78
|
-
catch (e) {
|
|
79
|
-
if (!forked)
|
|
80
|
-
throw e;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
contexts = next;
|
|
85
|
-
next = [];
|
|
86
|
-
}
|
|
87
|
-
if (!foundCommand) {
|
|
88
|
-
throw StandardErrorTypes_1.DISPATCHER_UNKNOWN_COMMAND.createWithContext(parse.getReader());
|
|
89
|
-
}
|
|
90
|
-
return forked ? successfulForks : result;
|
|
91
|
-
}
|
|
92
|
-
async parse(reader, source) {
|
|
93
|
-
reader = new StringReader_1.StringReader(reader);
|
|
94
|
-
const context = new CommandContextBuilder_1.CommandContextBuilder(this, source, this.root, reader.getCursor());
|
|
95
|
-
return this.parseNodes(this.root, reader, context);
|
|
96
|
-
}
|
|
97
|
-
async parseNodes(node, originalReader, contextSoFar) {
|
|
98
|
-
const source = contextSoFar.getSource();
|
|
99
|
-
const errors = new Map();
|
|
100
|
-
const potentials = [];
|
|
101
|
-
const cursor = originalReader.getCursor();
|
|
102
|
-
for (const child of node.getRelevantNodes(originalReader)) {
|
|
103
|
-
if (!(await child.canUse(source))) {
|
|
104
|
-
continue;
|
|
105
|
-
}
|
|
106
|
-
const context = contextSoFar.copy();
|
|
107
|
-
const reader = new StringReader_1.StringReader(originalReader);
|
|
108
|
-
try {
|
|
109
|
-
try {
|
|
110
|
-
child.parse(reader, context);
|
|
111
|
-
}
|
|
112
|
-
catch (e) {
|
|
113
|
-
if (e instanceof CommandSyntaxError_1.CommandSyntaxError) {
|
|
114
|
-
throw e;
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
throw StandardErrorTypes_1.DISPATCHER_PARSE_ERROR.createWithContext(reader, e.message);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
if (reader.canRead() && reader.peek() !== " ") {
|
|
121
|
-
throw StandardErrorTypes_1.DISPATCHER_EXPECTED_ARGUMENT_SEPARATOR.createWithContext(reader);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
catch (e) {
|
|
125
|
-
if (e instanceof CommandSyntaxError_1.CommandSyntaxError) {
|
|
126
|
-
errors.set(child, e);
|
|
127
|
-
reader.setCursor(cursor);
|
|
128
|
-
continue;
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
throw e;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
context.withCommand(child.getCommand());
|
|
135
|
-
if (reader.canRead(child.getRedirect() === null ? 2 : 1)) {
|
|
136
|
-
reader.skip();
|
|
137
|
-
if (child.getRedirect()) {
|
|
138
|
-
const childContext = new CommandContextBuilder_1.CommandContextBuilder(this, source, child.getRedirect(), reader.getCursor());
|
|
139
|
-
const parse = await this.parseNodes(child.getRedirect(), reader, childContext);
|
|
140
|
-
context.withChild(parse.getContext());
|
|
141
|
-
return new ParseResults_1.ParseResults(context, parse.getReader(), parse.getErrors());
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
potentials.push(this.parseNodes(child, reader, context));
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
potentials.push(new ParseResults_1.ParseResults(context, reader, new Map()));
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
if (potentials.length === 0) {
|
|
152
|
-
potentials.push(new ParseResults_1.ParseResults(contextSoFar, originalReader, errors));
|
|
153
|
-
}
|
|
154
|
-
return potentials[0];
|
|
155
|
-
}
|
|
156
|
-
async getAllUsage(node, source, restricted) {
|
|
157
|
-
const result = [];
|
|
158
|
-
await this.getAllUsageImpl(node, source, result, "", restricted);
|
|
159
|
-
return result;
|
|
160
|
-
}
|
|
161
|
-
async getAllUsageImpl(node, source, result, prefix, restricted) {
|
|
162
|
-
if (restricted && !(await node.canUse(source))) {
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
if (node.getCommand() != null) {
|
|
166
|
-
result.push(prefix);
|
|
167
|
-
}
|
|
168
|
-
if (node.getRedirect() != null) {
|
|
169
|
-
const redirect = node.getRedirect() === this.root
|
|
170
|
-
? "..."
|
|
171
|
-
: `-> ${node.getRedirect().getUsageText()}`;
|
|
172
|
-
result.push(prefix.length === 0
|
|
173
|
-
? `${node.getUsageText()} ${redirect}`
|
|
174
|
-
: `${prefix} ${redirect}`);
|
|
175
|
-
}
|
|
176
|
-
else if (node.getChildren().length > 0) {
|
|
177
|
-
for (const child of node.getChildren()) {
|
|
178
|
-
const newPrefix = prefix.length === 0
|
|
179
|
-
? child.getUsageText()
|
|
180
|
-
: `${prefix} ${child.getUsageText()}`;
|
|
181
|
-
await this.getAllUsageImpl(child, source, result, newPrefix, restricted);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
async getCompletionSuggestions(parse, cursor) {
|
|
186
|
-
if (cursor === undefined) {
|
|
187
|
-
cursor = parse.getReader().getTotalLength();
|
|
188
|
-
}
|
|
189
|
-
const context = parse.getContext();
|
|
190
|
-
const nodeBeforeCursor = context.findSuggestionContext(cursor);
|
|
191
|
-
const parent = nodeBeforeCursor.parent;
|
|
192
|
-
const start = Math.min(nodeBeforeCursor.startPos, cursor);
|
|
193
|
-
const fullInput = parse.getReader().getString();
|
|
194
|
-
const truncatedInput = fullInput.substring(0, cursor);
|
|
195
|
-
const promises = [];
|
|
196
|
-
for (const node of parent.getChildren()) {
|
|
197
|
-
let promise = Suggestions_1.Suggestions.empty();
|
|
198
|
-
try {
|
|
199
|
-
promise = node.listSuggestions(context.build(truncatedInput), new SuggestionsBuilder_1.SuggestionsBuilder(truncatedInput, start));
|
|
200
|
-
}
|
|
201
|
-
catch (ignored) {
|
|
202
|
-
console.log("???", ignored);
|
|
203
|
-
}
|
|
204
|
-
promises.push(promise);
|
|
205
|
-
}
|
|
206
|
-
const suggestions = await Promise.all(promises);
|
|
207
|
-
return Suggestions_1.Suggestions.merge(fullInput, suggestions);
|
|
208
|
-
}
|
|
209
|
-
getSmartUsage(node, source, optional, deep) {
|
|
210
|
-
if (optional === undefined && deep === undefined) {
|
|
211
|
-
const result = new Map();
|
|
212
|
-
const optional = node.getCommand() !== undefined && node.getCommand() !== null;
|
|
213
|
-
const children = node.getChildren();
|
|
214
|
-
for (const index in children) {
|
|
215
|
-
const child = children[index];
|
|
216
|
-
const usage = this.getSmartUsage(child, source, optional, false);
|
|
217
|
-
if (usage !== undefined) {
|
|
218
|
-
result.set(child, usage);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
return result;
|
|
222
|
-
}
|
|
223
|
-
else {
|
|
224
|
-
if (!node.canUse(source)) {
|
|
225
|
-
return undefined;
|
|
226
|
-
}
|
|
227
|
-
const self = optional
|
|
228
|
-
? CommandDispatcher.USAGE_OPTIONAL_OPEN +
|
|
229
|
-
node.getUsageText() +
|
|
230
|
-
CommandDispatcher.USAGE_OPTIONAL_CLOSE
|
|
231
|
-
: node.getUsageText();
|
|
232
|
-
const childOptional = node.getCommand() !== undefined;
|
|
233
|
-
const open = childOptional
|
|
234
|
-
? CommandDispatcher.USAGE_OPTIONAL_OPEN
|
|
235
|
-
: CommandDispatcher.USAGE_REQUIRED_OPEN;
|
|
236
|
-
const close = childOptional
|
|
237
|
-
? CommandDispatcher.USAGE_OPTIONAL_CLOSE
|
|
238
|
-
: CommandDispatcher.USAGE_REQUIRED_CLOSE;
|
|
239
|
-
if (!deep) {
|
|
240
|
-
if (node.getRedirect() !== undefined) {
|
|
241
|
-
const redirect = node.getRedirect() === this.root
|
|
242
|
-
? "..."
|
|
243
|
-
: `-> ${node.getRedirect().getUsageText()}`;
|
|
244
|
-
return `${self} ${redirect}`;
|
|
245
|
-
}
|
|
246
|
-
else {
|
|
247
|
-
const children = node
|
|
248
|
-
.getChildren()
|
|
249
|
-
.filter((c) => c.canUse(source));
|
|
250
|
-
if (children.length === 1) {
|
|
251
|
-
const usage = String(this.getSmartUsage(children[0], source, childOptional, childOptional));
|
|
252
|
-
if (usage !== undefined) {
|
|
253
|
-
return `${self} ${usage}`;
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
else if (children.length > 1) {
|
|
257
|
-
const childUsage = new Set();
|
|
258
|
-
for (const index in children) {
|
|
259
|
-
const child = children[index];
|
|
260
|
-
const usage = this.getSmartUsage(child, source, childOptional, true);
|
|
261
|
-
if (usage !== undefined) {
|
|
262
|
-
childUsage.add(usage);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
if (childUsage.size === 1) {
|
|
266
|
-
const usage = childUsage.values().next().value;
|
|
267
|
-
return `${self} ${childOptional ? CommandDispatcher.USAGE_OPTIONAL_OPEN + usage + CommandDispatcher.USAGE_OPTIONAL_CLOSE : usage}`;
|
|
268
|
-
}
|
|
269
|
-
else if (childUsage.size > 1) {
|
|
270
|
-
let builder = open;
|
|
271
|
-
for (let index = 0; index < children.length; index++) {
|
|
272
|
-
const child = children[index];
|
|
273
|
-
if (index > 0) {
|
|
274
|
-
builder += CommandDispatcher.USAGE_OR;
|
|
275
|
-
}
|
|
276
|
-
builder += child.getUsageText();
|
|
277
|
-
}
|
|
278
|
-
if (children.length > 0) {
|
|
279
|
-
builder += close;
|
|
280
|
-
return `${self} ${builder}`;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
getRoot() {
|
|
289
|
-
return this.root;
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
exports.CommandDispatcher = CommandDispatcher;
|
|
293
|
-
CommandDispatcher.USAGE_OPTIONAL_OPEN = "[";
|
|
294
|
-
CommandDispatcher.USAGE_OPTIONAL_CLOSE = "]";
|
|
295
|
-
CommandDispatcher.USAGE_REQUIRED_OPEN = "(";
|
|
296
|
-
CommandDispatcher.USAGE_REQUIRED_CLOSE = ")";
|
|
297
|
-
CommandDispatcher.USAGE_OR = "|";
|
|
1
|
+
import{Suggestions as e}from"./suggestion/Suggestions.js";import{CommandSyntaxError as t}from"./exceptions/CommandSyntaxError.js";import{DISPATCHER_EXPECTED_ARGUMENT_SEPARATOR as n,DISPATCHER_PARSE_ERROR as r,DISPATCHER_UNKNOWN_ARGUMENT as i,DISPATCHER_UNKNOWN_COMMAND as a}from"./exceptions/StandardErrorTypes.js";import{RootCommandNode as o}from"./tree/RootCommandNode.js";import{CommandContextBuilder as s}from"./context/CommandContextBuilder.js";import{ParseResults as c}from"./ParseResults.js";import{StringReader as l}from"./StringReader.js";import{SuggestionsBuilder as u}from"./suggestion/SuggestionsBuilder.js";var d=class d{constructor(){this.root=new o}register(e){let t=e.build();return this.root.addChild(t),t}async execute(e,t){if(typeof e==`string`&&(e=await this.parse(new l(e),t)),e.getReader().canRead())throw e.getErrors().size===1?e.getErrors().values().next():e.getContext().getRange().isEmpty()?a.createWithContext(e.getReader()):i.createWithContext(e.getReader());let n=0,r=0,o=!1,s=!1,c=e.getReader().getString(),u=[e.getContext().build(c)],d=[];for(;u.length>0;){let e=u.length;for(let t=0;t<e;t++){let e=u[t],i=e.getChild();if(i!==null){if(o=o||e.isForked(),i.hasNodes()){s=!0;let t=e.getRedirectModifier();if(t===null)d.push(i.copyFor(e.getSource()));else try{t(e).forEach(e=>{d.push(i.copyFor(e))})}catch(e){if(!o)throw e}}}else if(e.getCommand()){s=!0;try{let t=await e.getCommand()(e);n+=t||t===0?t:1,r++}catch(e){if(!o)throw e}}}u=d,d=[]}if(!s)throw a.createWithContext(e.getReader());return o?r:n}async parse(e,t){e=new l(e);let n=new s(this,t,this.root,e.getCursor());return this.parseNodes(this.root,e,n)}async parseNodes(e,i,a){let o=a.getSource(),u=new Map,d=[],f=i.getCursor();for(let p of e.getRelevantNodes(i)){if(!await p.canUse(o))continue;let e=a.copy(),m=new l(i);try{try{p.parse(m,e)}catch(e){throw e instanceof t?e:r.createWithContext(m,e.message)}if(m.canRead()&&m.peek()!==` `)throw n.createWithContext(m)}catch(e){if(e instanceof t){u.set(p,e),m.setCursor(f);continue}else throw e}if(e.withCommand(p.getCommand()),m.canRead(p.getRedirect()===null?2:1))if(m.skip(),p.getRedirect()){let t=new s(this,o,p.getRedirect(),m.getCursor()),n=await this.parseNodes(p.getRedirect(),m,t);return e.withChild(n.getContext()),new c(e,n.getReader(),n.getErrors())}else d.push(this.parseNodes(p,m,e));else d.push(new c(e,m,new Map))}return d.length===0&&d.push(new c(a,i,u)),d[0]}async getAllUsage(e,t,n){let r=[];return await this.getAllUsageImpl(e,t,r,``,n),r}async getAllUsageImpl(e,t,n,r,i){if(!(i&&!await e.canUse(t))){if(e.getCommand()!=null&&n.push(r),e.getRedirect()!=null){let t=e.getRedirect()===this.root?`...`:`-> ${e.getRedirect().getUsageText()}`;n.push(r.length===0?`${e.getUsageText()} ${t}`:`${r} ${t}`)}else if(e.getChildren().length>0)for(let a of e.getChildren()){let e=r.length===0?a.getUsageText():`${r} ${a.getUsageText()}`;await this.getAllUsageImpl(a,t,n,e,i)}}}async getCompletionSuggestions(t,n){n===void 0&&(n=t.getReader().getTotalLength());let r=t.getContext(),i=r.findSuggestionContext(n),a=i.parent,o=Math.min(i.startPos,n),s=t.getReader().getString(),c=s.substring(0,n),l=[];for(let t of a.getChildren()){let n=e.empty();try{n=t.listSuggestions(r.build(c),new u(c,o))}catch(e){console.log(`???`,e)}l.push(n)}let d=await Promise.all(l);return e.merge(s,d)}getSmartUsage(e,t,n,r){if(n===void 0&&r===void 0){let n=new Map,r=e.getCommand()!==void 0&&e.getCommand()!==null,i=e.getChildren();for(let e in i){let a=i[e],o=this.getSmartUsage(a,t,r,!1);o!==void 0&&n.set(a,o)}return n}else{if(!e.canUse(t))return;let i=n?d.USAGE_OPTIONAL_OPEN+e.getUsageText()+d.USAGE_OPTIONAL_CLOSE:e.getUsageText(),a=e.getCommand()!==void 0,o=a?d.USAGE_OPTIONAL_OPEN:d.USAGE_REQUIRED_OPEN,s=a?d.USAGE_OPTIONAL_CLOSE:d.USAGE_REQUIRED_CLOSE;if(!r){if(e.getRedirect()!==void 0)return`${i} ${e.getRedirect()===this.root?`...`:`-> ${e.getRedirect().getUsageText()}`}`;{let n=e.getChildren().filter(e=>e.canUse(t));if(n.length===1){let e=String(this.getSmartUsage(n[0],t,a,a));if(e!==void 0)return`${i} ${e}`}else if(n.length>1){let e=new Set;for(let r in n){let i=n[r],o=this.getSmartUsage(i,t,a,!0);o!==void 0&&e.add(o)}if(e.size===1){let t=e.values().next().value;return`${i} ${a?d.USAGE_OPTIONAL_OPEN+t+d.USAGE_OPTIONAL_CLOSE:t}`}else if(e.size>1){let e=o;for(let t=0;t<n.length;t++){let r=n[t];t>0&&(e+=d.USAGE_OR),e+=r.getUsageText()}if(n.length>0)return e+=s,`${i} ${e}`}}}}}}getRoot(){return this.root}};d.USAGE_OPTIONAL_OPEN=`[`,d.USAGE_OPTIONAL_CLOSE=`]`,d.USAGE_REQUIRED_OPEN=`(`,d.USAGE_REQUIRED_CLOSE=`)`,d.USAGE_OR=`|`;export{d as CommandDispatcher};
|
|
2
|
+
//# sourceMappingURL=CommandDispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandDispatcher.js","names":[],"sources":["../src/CommandDispatcher.ts"],"sourcesContent":["import type { LiteralArgumentBuilder } from \"./builder/LiteralArgumentBuilder\";\nimport { CommandContextBuilder } from \"./context/CommandContextBuilder\";\nimport { CommandSyntaxError } from \"./exceptions/CommandSyntaxError\";\nimport {\n\tDISPATCHER_EXPECTED_ARGUMENT_SEPARATOR,\n\tDISPATCHER_PARSE_ERROR,\n\tDISPATCHER_UNKNOWN_ARGUMENT,\n\tDISPATCHER_UNKNOWN_COMMAND,\n} from \"./exceptions/StandardErrorTypes\";\nimport { ParseResults } from \"./ParseResults\";\nimport { StringReader } from \"./StringReader\";\nimport { Suggestions } from \"./suggestion/Suggestions\";\nimport { SuggestionsBuilder } from \"./suggestion/SuggestionsBuilder\";\nimport type { CommandNode } from \"./tree/CommandNode\";\nimport type { LiteralCommandNode } from \"./tree/LiteralCommandNode\";\nimport { RootCommandNode } from \"./tree/RootCommandNode\";\n\nexport class CommandDispatcher<S> {\n\tprivate root: RootCommandNode<S>;\n\n\tprivate static USAGE_OPTIONAL_OPEN = \"[\";\n\tprivate static USAGE_OPTIONAL_CLOSE = \"]\";\n\tprivate static USAGE_REQUIRED_OPEN = \"(\";\n\tprivate static USAGE_REQUIRED_CLOSE = \")\";\n\tprivate static USAGE_OR = \"|\";\n\n\tconstructor() {\n\t\tthis.root = new RootCommandNode();\n\t}\n\n\tregister(command: LiteralArgumentBuilder<S>): LiteralCommandNode<S> {\n\t\tconst build = command.build();\n\t\tthis.root.addChild(build);\n\t\treturn build;\n\t}\n\n\tasync execute(parse: ParseResults<S> | string, source: S): Promise<number> {\n\t\tif (typeof parse === \"string\") {\n\t\t\tparse = await this.parse(new StringReader(parse), source);\n\t\t}\n\n\t\tif (parse.getReader().canRead()) {\n\t\t\tif (parse.getErrors().size === 1) {\n\t\t\t\tthrow parse.getErrors().values().next();\n\t\t\t} else if (parse.getContext().getRange().isEmpty()) {\n\t\t\t\tthrow DISPATCHER_UNKNOWN_COMMAND.createWithContext(parse.getReader());\n\t\t\t} else {\n\t\t\t\tthrow DISPATCHER_UNKNOWN_ARGUMENT.createWithContext(parse.getReader());\n\t\t\t}\n\t\t}\n\n\t\tlet result = 0;\n\t\tlet successfulForks = 0;\n\t\tlet forked = false;\n\t\tlet foundCommand = false;\n\t\tconst command = parse.getReader().getString();\n\t\tconst original = parse.getContext().build(command);\n\t\tlet contexts = [original];\n\t\tlet next = [];\n\n\t\twhile (contexts.length > 0) {\n\t\t\tconst size = contexts.length;\n\t\t\tfor (let i = 0; i < size; i++) {\n\t\t\t\tconst context = contexts[i];\n\t\t\t\tconst child = context.getChild();\n\t\t\t\tif (child !== null) {\n\t\t\t\t\tforked = forked || context.isForked();\n\t\t\t\t\tif (child.hasNodes()) {\n\t\t\t\t\t\tfoundCommand = true;\n\t\t\t\t\t\tconst modifier = context.getRedirectModifier();\n\t\t\t\t\t\tif (modifier === null) {\n\t\t\t\t\t\t\tnext.push(child.copyFor(context.getSource()));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst results = <S[]>modifier(context);\n\t\t\t\t\t\t\t\tresults.forEach((source) => {\n\t\t\t\t\t\t\t\t\tnext.push(child.copyFor(source));\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\tif (!forked) throw e;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (context.getCommand()) {\n\t\t\t\t\tfoundCommand = true;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst value = await context.getCommand()(context);\n\t\t\t\t\t\tresult += value || value === 0 ? value : 1;\n\t\t\t\t\t\tsuccessfulForks++;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (!forked) throw e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontexts = next;\n\t\t\tnext = [];\n\t\t}\n\n\t\tif (!foundCommand) {\n\t\t\tthrow DISPATCHER_UNKNOWN_COMMAND.createWithContext(parse.getReader());\n\t\t}\n\t\treturn forked ? successfulForks : result;\n\t}\n\n\tasync parse(\n\t\treader: StringReader | string,\n\t\tsource: S,\n\t): Promise<ParseResults<S>> {\n\t\treader = new StringReader(reader);\n\t\tconst context = new CommandContextBuilder<S>(\n\t\t\tthis,\n\t\t\tsource,\n\t\t\tthis.root,\n\t\t\treader.getCursor(),\n\t\t);\n\t\treturn this.parseNodes(this.root, reader, context);\n\t}\n\n\tprivate async parseNodes(\n\t\tnode: CommandNode<S>,\n\t\toriginalReader: StringReader,\n\t\tcontextSoFar: CommandContextBuilder<S>,\n\t): Promise<ParseResults<S>> {\n\t\tconst source = contextSoFar.getSource();\n\t\tconst errors = new Map<CommandNode<S>, CommandSyntaxError>();\n\t\tconst potentials = [];\n\t\tconst cursor = originalReader.getCursor();\n\n\t\tfor (const child of node.getRelevantNodes(originalReader)) {\n\t\t\tif (!(await child.canUse(source))) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst context = contextSoFar.copy();\n\t\t\tconst reader = new StringReader(originalReader);\n\n\t\t\ttry {\n\t\t\t\ttry {\n\t\t\t\t\tchild.parse(reader, context);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (e instanceof CommandSyntaxError) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow DISPATCHER_PARSE_ERROR.createWithContext(reader, e.message);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (reader.canRead() && reader.peek() !== \" \") {\n\t\t\t\t\tthrow DISPATCHER_EXPECTED_ARGUMENT_SEPARATOR.createWithContext(\n\t\t\t\t\t\treader,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tif (e instanceof CommandSyntaxError) {\n\t\t\t\t\terrors.set(child, e);\n\t\t\t\t\treader.setCursor(cursor);\n\t\t\t\t\tcontinue;\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcontext.withCommand(child.getCommand());\n\t\t\tif (reader.canRead(child.getRedirect() === null ? 2 : 1)) {\n\t\t\t\treader.skip();\n\t\t\t\tif (child.getRedirect()) {\n\t\t\t\t\tconst childContext = new CommandContextBuilder<S>(\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\tsource,\n\t\t\t\t\t\tchild.getRedirect(),\n\t\t\t\t\t\treader.getCursor(),\n\t\t\t\t\t);\n\t\t\t\t\tconst parse = await this.parseNodes(\n\t\t\t\t\t\tchild.getRedirect(),\n\t\t\t\t\t\treader,\n\t\t\t\t\t\tchildContext,\n\t\t\t\t\t);\n\t\t\t\t\tcontext.withChild(parse.getContext());\n\t\t\t\t\treturn new ParseResults<S>(\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tparse.getReader(),\n\t\t\t\t\t\tparse.getErrors(),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tpotentials.push(this.parseNodes(child, reader, context));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpotentials.push(new ParseResults(context, reader, new Map()));\n\t\t\t}\n\t\t}\n\t\tif (potentials.length === 0) {\n\t\t\tpotentials.push(new ParseResults(contextSoFar, originalReader, errors));\n\t\t}\n\t\treturn potentials[0];\n\t}\n\n\tasync getAllUsage(\n\t\tnode: CommandNode<S>,\n\t\tsource: S,\n\t\trestricted: boolean,\n\t): Promise<string[]> {\n\t\tconst result = [];\n\t\tawait this.getAllUsageImpl(node, source, result, \"\", restricted);\n\t\treturn result;\n\t}\n\n\tprivate async getAllUsageImpl(\n\t\tnode: CommandNode<S>,\n\t\tsource: S,\n\t\tresult: string[],\n\t\tprefix: string,\n\t\trestricted: boolean,\n\t): Promise<void> {\n\t\tif (restricted && !(await node.canUse(source))) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (node.getCommand() != null) {\n\t\t\tresult.push(prefix);\n\t\t}\n\n\t\tif (node.getRedirect() != null) {\n\t\t\tconst redirect =\n\t\t\t\tnode.getRedirect() === this.root\n\t\t\t\t\t? \"...\"\n\t\t\t\t\t: `-> ${node.getRedirect().getUsageText()}`;\n\t\t\tresult.push(\n\t\t\t\tprefix.length === 0\n\t\t\t\t\t? `${node.getUsageText()} ${redirect}`\n\t\t\t\t\t: `${prefix} ${redirect}`,\n\t\t\t);\n\t\t} else if (node.getChildren().length > 0) {\n\t\t\tfor (const child of node.getChildren()) {\n\t\t\t\tconst newPrefix =\n\t\t\t\t\tprefix.length === 0\n\t\t\t\t\t\t? child.getUsageText()\n\t\t\t\t\t\t: `${prefix} ${child.getUsageText()}`;\n\t\t\t\tawait this.getAllUsageImpl(\n\t\t\t\t\tchild,\n\t\t\t\t\tsource,\n\t\t\t\t\tresult,\n\t\t\t\t\tnewPrefix,\n\t\t\t\t\trestricted,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync getCompletionSuggestions(\n\t\tparse: ParseResults<S>,\n\t\tcursor?: number,\n\t): Promise<Suggestions> {\n\t\tif (cursor === undefined) {\n\t\t\tcursor = parse.getReader().getTotalLength();\n\t\t}\n\t\tconst context = parse.getContext();\n\t\tconst nodeBeforeCursor = context.findSuggestionContext(cursor);\n\t\tconst parent = nodeBeforeCursor.parent;\n\t\tconst start = Math.min(nodeBeforeCursor.startPos, cursor);\n\n\t\tconst fullInput = parse.getReader().getString();\n\t\tconst truncatedInput = fullInput.substring(0, cursor);\n\t\tconst promises: Promise<Suggestions>[] = [];\n\t\tfor (const node of parent.getChildren()) {\n\t\t\tlet promise = Suggestions.empty();\n\t\t\ttry {\n\t\t\t\tpromise = node.listSuggestions(\n\t\t\t\t\tcontext.build(truncatedInput),\n\t\t\t\t\tnew SuggestionsBuilder(truncatedInput, start),\n\t\t\t\t);\n\t\t\t} catch (ignored) {\n\t\t\t\tconsole.log(\"???\", ignored);\n\t\t\t}\n\t\t\tpromises.push(promise);\n\t\t}\n\t\tconst suggestions = await Promise.all(promises);\n\t\treturn Suggestions.merge(fullInput, suggestions);\n\t}\n\n\tgetSmartUsage(node: CommandNode<S>, source: S): Map<CommandNode<S>, string>;\n\tgetSmartUsage(\n\t\tnode: CommandNode<S>,\n\t\tsource: S,\n\t\toptional: boolean,\n\t\tdeep: boolean,\n\t): string;\n\n\tgetSmartUsage(\n\t\tnode: CommandNode<S>,\n\t\tsource: S,\n\t\toptional?: boolean,\n\t\tdeep?: boolean,\n\t): Map<CommandNode<S>, string> | string {\n\t\tif (optional === undefined && deep === undefined) {\n\t\t\tconst result = new Map<CommandNode<S>, string>();\n\t\t\tconst optional: boolean =\n\t\t\t\tnode.getCommand() !== undefined && node.getCommand() !== null;\n\t\t\tconst children = node.getChildren();\n\n\t\t\tfor (const index in children) {\n\t\t\t\tconst child = children[index];\n\t\t\t\tconst usage = this.getSmartUsage(child, source, optional, false);\n\n\t\t\t\tif (usage !== undefined) {\n\t\t\t\t\tresult.set(child, usage);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t} else {\n\t\t\tif (!node.canUse(source)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst self: string = optional\n\t\t\t\t? CommandDispatcher.USAGE_OPTIONAL_OPEN +\n\t\t\t\t\tnode.getUsageText() +\n\t\t\t\t\tCommandDispatcher.USAGE_OPTIONAL_CLOSE\n\t\t\t\t: node.getUsageText();\n\t\t\tconst childOptional: boolean = node.getCommand() !== undefined;\n\t\t\tconst open: string = childOptional\n\t\t\t\t? CommandDispatcher.USAGE_OPTIONAL_OPEN\n\t\t\t\t: CommandDispatcher.USAGE_REQUIRED_OPEN;\n\t\t\tconst close: string = childOptional\n\t\t\t\t? CommandDispatcher.USAGE_OPTIONAL_CLOSE\n\t\t\t\t: CommandDispatcher.USAGE_REQUIRED_CLOSE;\n\n\t\t\tif (!deep) {\n\t\t\t\tif (node.getRedirect() !== undefined) {\n\t\t\t\t\tconst redirect =\n\t\t\t\t\t\tnode.getRedirect() === this.root\n\t\t\t\t\t\t\t? \"...\"\n\t\t\t\t\t\t\t: `-> ${node.getRedirect().getUsageText()}`;\n\t\t\t\t\treturn `${self} ${redirect}`;\n\t\t\t\t} else {\n\t\t\t\t\tconst children: CommandNode<S>[] = node\n\t\t\t\t\t\t.getChildren()\n\t\t\t\t\t\t.filter((c) => c.canUse(source));\n\n\t\t\t\t\tif (children.length === 1) {\n\t\t\t\t\t\tconst usage = String(\n\t\t\t\t\t\t\tthis.getSmartUsage(\n\t\t\t\t\t\t\t\tchildren[0],\n\t\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\t\tchildOptional,\n\t\t\t\t\t\t\t\tchildOptional,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (usage !== undefined) {\n\t\t\t\t\t\t\treturn `${self} ${usage}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (children.length > 1) {\n\t\t\t\t\t\tconst childUsage = new Set<string>();\n\n\t\t\t\t\t\tfor (const index in children) {\n\t\t\t\t\t\t\tconst child = children[index];\n\t\t\t\t\t\t\tconst usage = this.getSmartUsage(\n\t\t\t\t\t\t\t\tchild,\n\t\t\t\t\t\t\t\tsource,\n\t\t\t\t\t\t\t\tchildOptional,\n\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (usage !== undefined) {\n\t\t\t\t\t\t\t\tchildUsage.add(usage);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (childUsage.size === 1) {\n\t\t\t\t\t\t\tconst usage = childUsage.values().next().value;\n\t\t\t\t\t\t\treturn `${self} ${childOptional ? CommandDispatcher.USAGE_OPTIONAL_OPEN + usage + CommandDispatcher.USAGE_OPTIONAL_CLOSE : usage}`;\n\t\t\t\t\t\t} else if (childUsage.size > 1) {\n\t\t\t\t\t\t\tlet builder = open;\n\n\t\t\t\t\t\t\tfor (let index = 0; index < children.length; index++) {\n\t\t\t\t\t\t\t\tconst child = children[index];\n\n\t\t\t\t\t\t\t\tif (index > 0) {\n\t\t\t\t\t\t\t\t\tbuilder += CommandDispatcher.USAGE_OR;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbuilder += child.getUsageText();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (children.length > 0) {\n\t\t\t\t\t\t\t\tbuilder += close;\n\t\t\t\t\t\t\t\treturn `${self} ${builder}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tgetRoot(): RootCommandNode<S> {\n\t\treturn this.root;\n\t}\n}\n"],"mappings":"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"}
|
package/dist/ParseResults.d.ts
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import { StringReader } from "./StringReader.js";
|
|
2
|
+
import { CommandContextBuilder } from "./context/CommandContextBuilder.js";
|
|
3
|
+
import { CommandNode } from "./tree/CommandNode.js";
|
|
4
|
+
import { CommandSyntaxError } from "./exceptions/CommandSyntaxError.js";
|
|
5
|
+
|
|
6
|
+
//#region src/ParseResults.d.ts
|
|
7
|
+
declare class ParseResults<S> {
|
|
8
|
+
private context;
|
|
9
|
+
private reader;
|
|
10
|
+
private errors;
|
|
11
|
+
constructor(context: CommandContextBuilder<S>, reader: StringReader, errors: Map<CommandNode<S>, CommandSyntaxError>);
|
|
12
|
+
getContext(): CommandContextBuilder<S>;
|
|
13
|
+
getReader(): StringReader;
|
|
14
|
+
getErrors(): Map<CommandNode<S>, CommandSyntaxError>;
|
|
10
15
|
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { ParseResults };
|
|
18
|
+
//# sourceMappingURL=ParseResults.d.ts.map
|
package/dist/ParseResults.js
CHANGED
|
@@ -1,20 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.ParseResults = void 0;
|
|
4
|
-
class ParseResults {
|
|
5
|
-
constructor(context, reader, errors) {
|
|
6
|
-
this.context = context;
|
|
7
|
-
this.reader = reader;
|
|
8
|
-
this.errors = errors;
|
|
9
|
-
}
|
|
10
|
-
getContext() {
|
|
11
|
-
return this.context;
|
|
12
|
-
}
|
|
13
|
-
getReader() {
|
|
14
|
-
return this.reader;
|
|
15
|
-
}
|
|
16
|
-
getErrors() {
|
|
17
|
-
return this.errors;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
exports.ParseResults = ParseResults;
|
|
1
|
+
var e=class{constructor(e,t,n){this.context=e,this.reader=t,this.errors=n}getContext(){return this.context}getReader(){return this.reader}getErrors(){return this.errors}};export{e as ParseResults};
|
|
2
|
+
//# sourceMappingURL=ParseResults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParseResults.js","names":[],"sources":["../src/ParseResults.ts"],"sourcesContent":["import type {\n\tCommandContextBuilder,\n\tCommandNode,\n\tCommandSyntaxError,\n\tStringReader,\n} from \".\";\n\nexport class ParseResults<S> {\n\tprivate context: CommandContextBuilder<S>;\n\tprivate reader: StringReader;\n\tprivate errors: Map<CommandNode<S>, CommandSyntaxError>;\n\n\tconstructor(\n\t\tcontext: CommandContextBuilder<S>,\n\t\treader: StringReader,\n\t\terrors: Map<CommandNode<S>, CommandSyntaxError>,\n\t) {\n\t\tthis.context = context;\n\t\tthis.reader = reader;\n\t\tthis.errors = errors;\n\t}\n\n\tgetContext(): CommandContextBuilder<S> {\n\t\treturn this.context;\n\t}\n\n\tgetReader(): StringReader {\n\t\treturn this.reader;\n\t}\n\n\tgetErrors(): Map<CommandNode<S>, CommandSyntaxError> {\n\t\treturn this.errors;\n\t}\n}\n"],"mappings":"AAOA,IAAa,EAAb,KAA6B,CAK5B,YACC,EACA,EACA,EACC,CACD,KAAK,QAAU,EACf,KAAK,OAAS,EACd,KAAK,OAAS,EAGf,YAAuC,CACtC,OAAO,KAAK,QAGb,WAA0B,CACzB,OAAO,KAAK,OAGb,WAAqD,CACpD,OAAO,KAAK"}
|
package/dist/Predicate.d.ts
CHANGED
package/dist/StringReader.d.ts
CHANGED
|
@@ -1,26 +1,30 @@
|
|
|
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
|
-
|
|
1
|
+
//#region src/StringReader.d.ts
|
|
2
|
+
declare class StringReader {
|
|
3
|
+
private string;
|
|
4
|
+
private cursor;
|
|
5
|
+
constructor(string: string | StringReader);
|
|
6
|
+
getString(): string;
|
|
7
|
+
getCursor(): number;
|
|
8
|
+
setCursor(cursor: number): void;
|
|
9
|
+
getRemainingLength(): number;
|
|
10
|
+
getTotalLength(): number;
|
|
11
|
+
getRead(): string;
|
|
12
|
+
getRemaining(): string;
|
|
13
|
+
canRead(length?: number): boolean;
|
|
14
|
+
peek(offset?: number): string;
|
|
15
|
+
read(): string;
|
|
16
|
+
skip(): void;
|
|
17
|
+
isAllowedNumber(c: string): boolean;
|
|
18
|
+
readInt(): number;
|
|
19
|
+
readLong(): bigint;
|
|
20
|
+
readFloat(): number;
|
|
21
|
+
isAllowedInUnquotedString(c: string): boolean;
|
|
22
|
+
isQuotedStringStart(c: string): boolean;
|
|
23
|
+
readUnquotedString(): string;
|
|
24
|
+
readStringUntil(terminator: string): string;
|
|
25
|
+
readString(): string;
|
|
26
|
+
readBoolean(): boolean;
|
|
26
27
|
}
|
|
28
|
+
//#endregion
|
|
29
|
+
export { StringReader };
|
|
30
|
+
//# sourceMappingURL=StringReader.d.ts.map
|