@jsprismarine/mcfunction 0.0.0-stage → 0.16.0-unstable-20261029132853
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/CHANGELOG.md +48 -0
- package/LICENSE +373 -0
- package/README.md +181 -2
- package/dist/compile.cjs.cjs +166 -0
- package/dist/compile.d.ts +91 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.es.js +162 -0
- package/dist/diagnostics.cjs.cjs +19 -0
- package/dist/diagnostics.d.ts +62 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.es.js +17 -0
- package/dist/executor.cjs.cjs +302 -0
- package/dist/executor.d.ts +140 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.es.js +298 -0
- package/dist/identifiers.cjs.cjs +79 -0
- package/dist/identifiers.d.ts +44 -0
- package/dist/identifiers.d.ts.map +1 -0
- package/dist/identifiers.es.js +72 -0
- package/dist/index.cjs.cjs +36 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.es.js +10 -0
- package/dist/macro.cjs.cjs +119 -0
- package/dist/macro.d.ts +59 -0
- package/dist/macro.d.ts.map +1 -0
- package/dist/macro.es.js +115 -0
- package/dist/parse.cjs.cjs +107 -0
- package/dist/parse.d.ts +40 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.es.js +104 -0
- package/dist/registry.cjs.cjs +135 -0
- package/dist/registry.d.ts +53 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.es.js +132 -0
- package/dist/runner.cjs.cjs +42 -0
- package/dist/runner.d.ts +83 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.es.js +40 -0
- package/dist/tags.cjs.cjs +113 -0
- package/dist/tags.d.ts +70 -0
- package/dist/tags.d.ts.map +1 -0
- package/dist/tags.es.js +108 -0
- package/package.json +61 -3
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { parseFunctionReference } from "./identifiers.es.js";
|
|
2
|
+
import { LOAD_FUNCTION_TAG, TICK_FUNCTION_TAG, resolveFunctionTag } from "./tags.es.js";
|
|
3
|
+
// src/executor.ts
|
|
4
|
+
/**
|
|
5
|
+
* The limits a run uses when the caller sets none.
|
|
6
|
+
*
|
|
7
|
+
* Both default to 65536. Mojang has never published either default: the
|
|
8
|
+
* figure has two independent secondary confirmations (minecraft.wiki's
|
|
9
|
+
* gamerule page and Pumpkin's extraction from the 26.3 server jar) and the
|
|
10
|
+
* `GameRules` class holds 65536 in its constant pool, but no Mojang document
|
|
11
|
+
* attributes the value to either rule. Treat it as a well-corroborated
|
|
12
|
+
* default rather than a confirmed one, and configure it when a world says
|
|
13
|
+
* otherwise.
|
|
14
|
+
*/
|
|
15
|
+
var DEFAULT_EXECUTION_LIMITS = {
|
|
16
|
+
maxCommandSequenceLength: 65536,
|
|
17
|
+
maxCommandForks: 65536
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* What Bedrock caps a single `/function` call at, from Mojang's creator
|
|
21
|
+
* documentation. This runtime runs Java functions and does not apply it; a
|
|
22
|
+
* server that wants Bedrock's ceiling passes it as `maxCommandSequenceLength`.
|
|
23
|
+
*/
|
|
24
|
+
var BEDROCK_MAX_COMMANDS_PER_FUNCTION = 1e4;
|
|
25
|
+
var CALL_PATTERN = /^function[ \t]+(\S+)[ \t]*([\s\S]*)$/;
|
|
26
|
+
/** Reads a JSON object as an argument compound; anything else is rejected. */
|
|
27
|
+
var parseJsonArguments = (text) => {
|
|
28
|
+
let parsed;
|
|
29
|
+
try {
|
|
30
|
+
parsed = JSON.parse(text);
|
|
31
|
+
} catch {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return void 0;
|
|
35
|
+
return { ...parsed };
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Runs functions against a command runner.
|
|
39
|
+
*
|
|
40
|
+
* One executor is reusable: it holds no run state, so a server builds it once
|
|
41
|
+
* at load and calls {@link FunctionExecutor.runTick} every tick.
|
|
42
|
+
*
|
|
43
|
+
* `function <id>` and `function #tag` are the only lines the executor reads
|
|
44
|
+
* itself, because a call is control flow rather than a command: handling it
|
|
45
|
+
* here is what keeps nesting on the queue instead of on the JavaScript stack.
|
|
46
|
+
* Every other line goes to the runner untouched.
|
|
47
|
+
*
|
|
48
|
+
* `/return` is the other half of that split. It is a command, so the runner
|
|
49
|
+
* implements it, but only the executor can act on it: a runner that reports
|
|
50
|
+
* {@link CommandOutcome.returned} ends the function the line came from and
|
|
51
|
+
* the loop carries on with its caller.
|
|
52
|
+
*/
|
|
53
|
+
var FunctionExecutor = class {
|
|
54
|
+
options;
|
|
55
|
+
limits;
|
|
56
|
+
parseArguments;
|
|
57
|
+
constructor(options) {
|
|
58
|
+
this.options = options;
|
|
59
|
+
this.limits = {
|
|
60
|
+
...DEFAULT_EXECUTION_LIMITS,
|
|
61
|
+
...options.limits
|
|
62
|
+
};
|
|
63
|
+
this.parseArguments = options.parseArguments ?? parseJsonArguments;
|
|
64
|
+
}
|
|
65
|
+
/** Runs `minecraft:load`, which a server does once after its packs load. */
|
|
66
|
+
runLoad(options) {
|
|
67
|
+
return this.run(`#${LOAD_FUNCTION_TAG}`, options);
|
|
68
|
+
}
|
|
69
|
+
/** Runs `minecraft:tick`, which a server does once per server tick. */
|
|
70
|
+
runTick(options) {
|
|
71
|
+
return this.run(`#${TICK_FUNCTION_TAG}`, options);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Runs one function or every function in one tag.
|
|
75
|
+
*
|
|
76
|
+
* Everything a call reaches shares one budget, so the report covers the
|
|
77
|
+
* whole tree below the entry point. A limit stops the run and is reported
|
|
78
|
+
* as a diagnostic; nothing here throws, and a command that throws is
|
|
79
|
+
* reported and skipped.
|
|
80
|
+
*
|
|
81
|
+
* @param reference - A function id, or a tag id written `#namespace:tag`.
|
|
82
|
+
*/
|
|
83
|
+
run(reference, options) {
|
|
84
|
+
const diagnostics = [];
|
|
85
|
+
const state = {
|
|
86
|
+
operations: 0,
|
|
87
|
+
forks: 0,
|
|
88
|
+
commands: 0,
|
|
89
|
+
invocations: 0,
|
|
90
|
+
maxDepth: 0
|
|
91
|
+
};
|
|
92
|
+
const stack = [];
|
|
93
|
+
const returnValues = [];
|
|
94
|
+
const parsed = parseFunctionReference(reference);
|
|
95
|
+
if (!parsed) {
|
|
96
|
+
diagnostics.push({
|
|
97
|
+
severity: "error",
|
|
98
|
+
code: "call.unknown-function",
|
|
99
|
+
message: `'${reference}' is not a valid function reference`
|
|
100
|
+
});
|
|
101
|
+
return {
|
|
102
|
+
...state,
|
|
103
|
+
returnValues,
|
|
104
|
+
diagnostics
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
let stopped;
|
|
108
|
+
/** Charges one operation, reporting and stopping the run at the limit. */
|
|
109
|
+
const charge = (functionId, line) => {
|
|
110
|
+
state.operations += 1;
|
|
111
|
+
if (state.operations <= this.limits.maxCommandSequenceLength) return true;
|
|
112
|
+
stopped = "max-command-sequence-length";
|
|
113
|
+
diagnostics.push({
|
|
114
|
+
severity: "error",
|
|
115
|
+
code: "limit.command-sequence-length",
|
|
116
|
+
functionId,
|
|
117
|
+
line,
|
|
118
|
+
message: `the run reached maxCommandSequenceLength (${this.limits.maxCommandSequenceLength}) and stopped`
|
|
119
|
+
});
|
|
120
|
+
return false;
|
|
121
|
+
};
|
|
122
|
+
/** Instantiates one call and pushes its frame, or reports why it could not. */
|
|
123
|
+
const invoke = (id, args, from, root = false) => {
|
|
124
|
+
const compiled = this.options.functions.get(id);
|
|
125
|
+
if (!compiled) {
|
|
126
|
+
diagnostics.push({
|
|
127
|
+
severity: "error",
|
|
128
|
+
code: "call.unknown-function",
|
|
129
|
+
functionId: from.functionId,
|
|
130
|
+
line: from.line,
|
|
131
|
+
message: `the function ${id} does not exist`
|
|
132
|
+
});
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
if (!charge(from.functionId, from.line)) return false;
|
|
136
|
+
state.invocations += 1;
|
|
137
|
+
const instantiated = compiled.instantiate(args);
|
|
138
|
+
if (!instantiated.ok) {
|
|
139
|
+
diagnostics.push({
|
|
140
|
+
severity: "error",
|
|
141
|
+
code: "macro.missing-arguments",
|
|
142
|
+
functionId: id,
|
|
143
|
+
line: instantiated.line,
|
|
144
|
+
message: instantiated.message
|
|
145
|
+
});
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
const top = stack.at(-1);
|
|
149
|
+
const replaced = top && top.index >= top.commands.length ? stack.pop() : void 0;
|
|
150
|
+
stack.push({
|
|
151
|
+
functionId: id,
|
|
152
|
+
commands: instantiated.commands,
|
|
153
|
+
index: 0,
|
|
154
|
+
root: replaced?.root ?? root
|
|
155
|
+
});
|
|
156
|
+
state.maxDepth = Math.max(state.maxDepth, stack.length);
|
|
157
|
+
return true;
|
|
158
|
+
};
|
|
159
|
+
const entries = parsed.kind === "function" ? [parsed.id] : this.resolveTag(parsed.id, reference, diagnostics);
|
|
160
|
+
for (const id of [...entries].reverse()) if (!invoke(id, options.arguments, { functionId: reference }, true)) break;
|
|
161
|
+
while (stopped === void 0 && stack.length > 0) {
|
|
162
|
+
const frame = stack.at(-1);
|
|
163
|
+
if (!frame) break;
|
|
164
|
+
if (frame.index >= frame.commands.length) {
|
|
165
|
+
stack.pop();
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const entry = frame.commands[frame.index];
|
|
169
|
+
frame.index += 1;
|
|
170
|
+
if (!entry) continue;
|
|
171
|
+
if (!charge(frame.functionId, entry.line)) break;
|
|
172
|
+
const call = CALL_PATTERN.exec(entry.command);
|
|
173
|
+
if (call) {
|
|
174
|
+
this.handleCall(call, frame, entry, invoke, diagnostics);
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
state.commands += 1;
|
|
178
|
+
let forks = 0;
|
|
179
|
+
let returned;
|
|
180
|
+
try {
|
|
181
|
+
const outcome = this.options.runner.run(entry.command, {
|
|
182
|
+
source: options.source,
|
|
183
|
+
functionId: frame.functionId,
|
|
184
|
+
line: entry.line
|
|
185
|
+
});
|
|
186
|
+
forks = outcome.forks ?? 0;
|
|
187
|
+
returned = outcome.returned;
|
|
188
|
+
} catch (error) {
|
|
189
|
+
diagnostics.push({
|
|
190
|
+
severity: "error",
|
|
191
|
+
code: "command.failed",
|
|
192
|
+
functionId: frame.functionId,
|
|
193
|
+
line: entry.line,
|
|
194
|
+
message: error instanceof Error ? error.message : String(error)
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
if (returned !== void 0) {
|
|
198
|
+
if (frame.root && returned.value !== void 0) returnValues.push(returned.value);
|
|
199
|
+
if (stack.at(-1) === frame) stack.pop();
|
|
200
|
+
}
|
|
201
|
+
state.forks += forks;
|
|
202
|
+
if (state.forks > this.limits.maxCommandForks) {
|
|
203
|
+
stopped = "max-command-forks";
|
|
204
|
+
diagnostics.push({
|
|
205
|
+
severity: "error",
|
|
206
|
+
code: "limit.command-forks",
|
|
207
|
+
functionId: frame.functionId,
|
|
208
|
+
line: entry.line,
|
|
209
|
+
message: `the run reached maxCommandForks (${this.limits.maxCommandForks}) and stopped`
|
|
210
|
+
});
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
...state,
|
|
216
|
+
returnValues,
|
|
217
|
+
...stopped ? { stopped } : {},
|
|
218
|
+
diagnostics
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/** Expands a tag reference, reporting a tag no pack declared. */
|
|
222
|
+
resolveTag(id, reference, diagnostics) {
|
|
223
|
+
if (!this.options.tags) {
|
|
224
|
+
diagnostics.push({
|
|
225
|
+
severity: "error",
|
|
226
|
+
code: "call.unknown-tag",
|
|
227
|
+
message: `${reference} is a tag reference, and this executor has no tag lookup`
|
|
228
|
+
});
|
|
229
|
+
return [];
|
|
230
|
+
}
|
|
231
|
+
const resolved = resolveFunctionTag(this.options.tags, id);
|
|
232
|
+
diagnostics.push(...resolved.diagnostics);
|
|
233
|
+
return resolved.functions;
|
|
234
|
+
}
|
|
235
|
+
/** Runs one `function` line: resolves what it names and pushes the frames it invokes. */
|
|
236
|
+
handleCall(call, frame, entry, invoke, diagnostics) {
|
|
237
|
+
const from = {
|
|
238
|
+
functionId: frame.functionId,
|
|
239
|
+
line: entry.line
|
|
240
|
+
};
|
|
241
|
+
const target = parseFunctionReference(call[1] ?? "");
|
|
242
|
+
if (!target) {
|
|
243
|
+
diagnostics.push({
|
|
244
|
+
severity: "error",
|
|
245
|
+
code: "call.unknown-function",
|
|
246
|
+
...from,
|
|
247
|
+
message: `'${call[1] ?? ""}' is not a valid function reference`
|
|
248
|
+
});
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
const argumentText = (call[2] ?? "").trim();
|
|
252
|
+
let args;
|
|
253
|
+
if (argumentText.length > 0) {
|
|
254
|
+
args = this.parseArguments(argumentText);
|
|
255
|
+
if (args === void 0) {
|
|
256
|
+
diagnostics.push({
|
|
257
|
+
severity: "error",
|
|
258
|
+
code: "call.invalid-arguments",
|
|
259
|
+
...from,
|
|
260
|
+
message: `the arguments of '${entry.command}' are not a compound this runtime can read`
|
|
261
|
+
});
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (target.kind === "function") {
|
|
266
|
+
invoke(target.id, args, from);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
const tags = this.options.tags;
|
|
270
|
+
if (!tags) {
|
|
271
|
+
diagnostics.push({
|
|
272
|
+
severity: "error",
|
|
273
|
+
code: "call.unknown-tag",
|
|
274
|
+
...from,
|
|
275
|
+
message: `#${target.id} cannot be resolved, because this executor has no tag lookup`
|
|
276
|
+
});
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
const resolved = resolveFunctionTag(tags, target.id);
|
|
280
|
+
diagnostics.push(...resolved.diagnostics.map((diagnostic) => ({
|
|
281
|
+
...diagnostic,
|
|
282
|
+
...from
|
|
283
|
+
})));
|
|
284
|
+
if (!resolved.exists) {
|
|
285
|
+
diagnostics.push({
|
|
286
|
+
severity: "error",
|
|
287
|
+
code: "call.unknown-tag",
|
|
288
|
+
...from,
|
|
289
|
+
message: `the function tag #${target.id} does not exist`
|
|
290
|
+
});
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
for (const id of [...resolved.functions].reverse()) if (!invoke(id, args, from)) break;
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
export { BEDROCK_MAX_COMMANDS_PER_FUNCTION, DEFAULT_EXECUTION_LIMITS, FunctionExecutor };
|
|
297
|
+
|
|
298
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0b3IuZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2V4ZWN1dG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGV4ZWN1dG9yLiBKYXZhIHJld3JvdGUgZnVuY3Rpb24gZXhlY3V0aW9uIGluIDIzdzQxYSBmcm9tIGEgcmVjdXJzaXZlXG4gKiBjYWxsIHBhdGggaW50byBhbiBleHBsaWNpdCBxdWV1ZSBvZiBmcmFtZXMgb24gdGhlIGhlYXAsIHdoaWNoIGlzIHdoYXQgbGV0c1xuICogaXQgYm91bmQgd29yayB3aXRoIGEgY291bnRlciBhbmQgc3RvcHMgYSB0YWlsLXJlY3Vyc2l2ZSBwYWNrIGZyb21cbiAqIGV4aGF1c3RpbmcgdGhlIGhvc3Qgc3RhY2suIFRoaXMgaXMgdGhlIHNhbWUgc2hhcGU6IGEgc3RhY2sgb2YgZnJhbWVzIGluIGFuXG4gKiBhcnJheSwgb25lIGxvb3AsIGFuZCBhIGNvdW50ZXIgY2hhcmdlZCBwZXIgb3BlcmF0aW9uLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tcGlsZWRGdW5jdGlvbiwgSW5zdGFudGlhdGVkQ29tbWFuZCB9IGZyb20gJy4vY29tcGlsZSc7XG5pbXBvcnQgdHlwZSB7IERpYWdub3N0aWMgfSBmcm9tICcuL2RpYWdub3N0aWNzJztcbmltcG9ydCB0eXBlIHsgRnVuY3Rpb25SZWZlcmVuY2UgfSBmcm9tICcuL2lkZW50aWZpZXJzJztcbmltcG9ydCB7IHBhcnNlRnVuY3Rpb25SZWZlcmVuY2UgfSBmcm9tICcuL2lkZW50aWZpZXJzJztcbmltcG9ydCB0eXBlIHsgTWFjcm9Bcmd1bWVudHMgfSBmcm9tICcuL21hY3JvJztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE91dGNvbWUsIENvbW1hbmRSdW5uZXIgfSBmcm9tICcuL3J1bm5lcic7XG5pbXBvcnQgdHlwZSB7IEZ1bmN0aW9uVGFnTG9va3VwIH0gZnJvbSAnLi90YWdzJztcbmltcG9ydCB7IExPQURfRlVOQ1RJT05fVEFHLCBUSUNLX0ZVTkNUSU9OX1RBRywgcmVzb2x2ZUZ1bmN0aW9uVGFnIH0gZnJvbSAnLi90YWdzJztcblxuLyoqXG4gKiBUaGUgdHdvIGdhbWVydWxlcyB0aGF0IGJvdW5kIGEgcnVuLiBUaGV5IHdlcmUgcmVuYW1lZCBpbiAxLjIxLjExIGZyb21cbiAqIGBtYXhDb21tYW5kQ2hhaW5MZW5ndGhgIGFuZCBgbWF4Q29tbWFuZEZvcmtDb3VudGA7IGFueXRoaW5nIHdyaXR0ZW4gYWdhaW5zdFxuICogdGhlIGNhbWVsQ2FzZSBuYW1lcyBpcyBzdGFsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25MaW1pdHMge1xuICAgIC8qKiBgbWluZWNyYWZ0Om1heF9jb21tYW5kX3NlcXVlbmNlX2xlbmd0aGA6IGhvdyBtYW55IG9wZXJhdGlvbnMgb25lIGVudHJ5IHBvaW50IG1heSBydW4uICovXG4gICAgbWF4Q29tbWFuZFNlcXVlbmNlTGVuZ3RoOiBudW1iZXI7XG4gICAgLyoqIGBtaW5lY3JhZnQ6bWF4X2NvbW1hbmRfZm9ya3NgOiBob3cgbWFueSBjb250ZXh0cyBvbmUgZW50cnkgcG9pbnQgbWF5IGNyZWF0ZS4gKi9cbiAgICBtYXhDb21tYW5kRm9ya3M6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgbGltaXRzIGEgcnVuIHVzZXMgd2hlbiB0aGUgY2FsbGVyIHNldHMgbm9uZS5cbiAqXG4gKiBCb3RoIGRlZmF1bHQgdG8gNjU1MzYuIE1vamFuZyBoYXMgbmV2ZXIgcHVibGlzaGVkIGVpdGhlciBkZWZhdWx0OiB0aGVcbiAqIGZpZ3VyZSBoYXMgdHdvIGluZGVwZW5kZW50IHNlY29uZGFyeSBjb25maXJtYXRpb25zIChtaW5lY3JhZnQud2lraSdzXG4gKiBnYW1lcnVsZSBwYWdlIGFuZCBQdW1wa2luJ3MgZXh0cmFjdGlvbiBmcm9tIHRoZSAyNi4zIHNlcnZlciBqYXIpIGFuZCB0aGVcbiAqIGBHYW1lUnVsZXNgIGNsYXNzIGhvbGRzIDY1NTM2IGluIGl0cyBjb25zdGFudCBwb29sLCBidXQgbm8gTW9qYW5nIGRvY3VtZW50XG4gKiBhdHRyaWJ1dGVzIHRoZSB2YWx1ZSB0byBlaXRoZXIgcnVsZS4gVHJlYXQgaXQgYXMgYSB3ZWxsLWNvcnJvYm9yYXRlZFxuICogZGVmYXVsdCByYXRoZXIgdGhhbiBhIGNvbmZpcm1lZCBvbmUsIGFuZCBjb25maWd1cmUgaXQgd2hlbiBhIHdvcmxkIHNheXNcbiAqIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVhFQ1VUSU9OX0xJTUlUUzogRXhlY3V0aW9uTGltaXRzID0ge1xuICAgIG1heENvbW1hbmRTZXF1ZW5jZUxlbmd0aDogNjVfNTM2LFxuICAgIG1heENvbW1hbmRGb3JrczogNjVfNTM2XG59O1xuXG4vKipcbiAqIFdoYXQgQmVkcm9jayBjYXBzIGEgc2luZ2xlIGAvZnVuY3Rpb25gIGNhbGwgYXQsIGZyb20gTW9qYW5nJ3MgY3JlYXRvclxuICogZG9jdW1lbnRhdGlvbi4gVGhpcyBydW50aW1lIHJ1bnMgSmF2YSBmdW5jdGlvbnMgYW5kIGRvZXMgbm90IGFwcGx5IGl0OyBhXG4gKiBzZXJ2ZXIgdGhhdCB3YW50cyBCZWRyb2NrJ3MgY2VpbGluZyBwYXNzZXMgaXQgYXMgYG1heENvbW1hbmRTZXF1ZW5jZUxlbmd0aGAuXG4gKi9cbmV4cG9ydCBjb25zdCBCRURST0NLX01BWF9DT01NQU5EU19QRVJfRlVOQ1RJT04gPSAxMF8wMDA7XG5cbi8qKiBXaGVyZSB0aGUgZXhlY3V0b3IgcmVhZHMgY29tcGlsZWQgZnVuY3Rpb25zIGZyb20uICovXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uTG9va3VwIHtcbiAgICAvKiogUmV0dXJucyB0aGUgZnVuY3Rpb24gcmVnaXN0ZXJlZCB1bmRlciBhIG5hbWVzcGFjZWQgaWQuICovXG4gICAgZ2V0KGlkOiBzdHJpbmcpOiBDb21waWxlZEZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xufVxuXG4vKiogSG93IHRvIGJ1aWxkIGEge0BsaW5rIEZ1bmN0aW9uRXhlY3V0b3J9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbkV4ZWN1dG9yT3B0aW9uczxUU291cmNlID0gdW5rbm93bj4ge1xuICAgIGZ1bmN0aW9uczogRnVuY3Rpb25Mb29rdXA7XG4gICAgcnVubmVyOiBDb21tYW5kUnVubmVyPFRTb3VyY2U+O1xuICAgIC8qKiBSZXNvbHZlcyBgI25hbWVzcGFjZTp0YWdgIHJlZmVyZW5jZXMuIFdpdGhvdXQgaXQsIGEgdGFnIHJlZmVyZW5jZSBpcyByZXBvcnRlZCBhcyB1bmtub3duLiAqL1xuICAgIHRhZ3M/OiBGdW5jdGlvblRhZ0xvb2t1cDtcbiAgICAvKiogT3ZlcnJpZGVzIGVpdGhlciBsaW1pdDsgYW55dGhpbmcgbGVmdCBvdXQga2VlcHMgaXRzIHtAbGluayBERUZBVUxUX0VYRUNVVElPTl9MSU1JVFN9IHZhbHVlLiAqL1xuICAgIGxpbWl0cz86IFBhcnRpYWw8RXhlY3V0aW9uTGltaXRzPjtcbiAgICAvKipcbiAgICAgKiBSZWFkcyB0aGUgYXJndW1lbnQgY29tcG91bmQgb2YgYSBgZnVuY3Rpb24gPGlkPiA8YXJndW1lbnRzPmAgbGluZS4gVGhlXG4gICAgICogZGVmYXVsdCBhY2NlcHRzIEpTT04sIGJlY2F1c2UgU05CVCBuZWVkcyBhIHBhcnNlciB0aGlzIHBhY2thZ2UgZG9lcyBub3RcbiAgICAgKiBvd247IGEgc2VydmVyIHdpdGggb25lIHBhc3NlcyBpdCBoZXJlLlxuICAgICAqL1xuICAgIHBhcnNlQXJndW1lbnRzPzogKHRleHQ6IHN0cmluZykgPT4gTWFjcm9Bcmd1bWVudHMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKiBXaGF0IG9uZSBjYWxsIG5lZWRzIGJleW9uZCB0aGUgZnVuY3Rpb24gdG8gcnVuLiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25PcHRpb25zPFRTb3VyY2UgPSB1bmtub3duPiB7XG4gICAgLyoqIFRoZSBjb21tYW5kIHNvdXJjZSBldmVyeSBjb21tYW5kIGluIHRoZSBydW4gaXMgZ2l2ZW4uICovXG4gICAgc291cmNlOiBUU291cmNlO1xuICAgIC8qKiBUaGUgY29tcG91bmQgYSBtYWNybyBmdW5jdGlvbiBzdWJzdGl0dXRlcyBmcm9tLiBJZ25vcmVkIGJ5IGEgcGxhaW4gZnVuY3Rpb24uICovXG4gICAgYXJndW1lbnRzPzogTWFjcm9Bcmd1bWVudHM7XG59XG5cbi8qKiBXaHkgYSBydW4gc3RvcHBlZCBiZWZvcmUgaXQgZmluaXNoZWQuICovXG5leHBvcnQgdHlwZSBFeGVjdXRpb25TdG9wID0gJ21heC1jb21tYW5kLXNlcXVlbmNlLWxlbmd0aCcgfCAnbWF4LWNvbW1hbmQtZm9ya3MnO1xuXG4vKiogV2hhdCBvbmUgcnVuIGRpZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uUmVwb3J0IHtcbiAgICAvKiogT3BlcmF0aW9ucyBjaGFyZ2VkIGFnYWluc3QgYG1heENvbW1hbmRTZXF1ZW5jZUxlbmd0aGAuICovXG4gICAgb3BlcmF0aW9uczogbnVtYmVyO1xuICAgIC8qKiBDb250ZXh0cyBjaGFyZ2VkIGFnYWluc3QgYG1heENvbW1hbmRGb3Jrc2AuICovXG4gICAgZm9ya3M6IG51bWJlcjtcbiAgICAvKiogSG93IG1hbnkgY29tbWFuZCBsaW5lcyByZWFjaGVkIHRoZSBydW5uZXIuICovXG4gICAgY29tbWFuZHM6IG51bWJlcjtcbiAgICAvKiogSG93IG1hbnkgZnVuY3Rpb25zIHRoZSBydW4gaW52b2tlZCwgaW5jbHVkaW5nIHRoZSBlbnRyeSBwb2ludC4gKi9cbiAgICBpbnZvY2F0aW9uczogbnVtYmVyO1xuICAgIC8qKiBUaGUgZGVlcGVzdCB0aGUgZnJhbWUgc3RhY2sgZ290LiBBIHRhaWwgY2FsbCBkb2VzIG5vdCBkZWVwZW4gaXQuICovXG4gICAgbWF4RGVwdGg6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWVzIGAvcmV0dXJuYCBwcm9kdWNlZCwgb25lIHBlciBmdW5jdGlvbiB0aGUgZW50cnkgcG9pbnRcbiAgICAgKiBpbnZva2VkIGRpcmVjdGx5IHRoYXQgcmVhY2hlZCBvbmUuXG4gICAgICpcbiAgICAgKiBFbXB0eSB3aGVuIGV2ZXJ5IGZ1bmN0aW9uIHJhbiB0byBpdHMgbGFzdCBsaW5lLCB3aGljaCBpcyB0aGUgY2FzZSBKYXZhXG4gICAgICogY2FsbHMgXCJyZXR1cm5lZCBubyB2YWx1ZVwiLiBBIHRhZyBjb250cmlidXRlcyBvbmUgZW50cnkgcGVyIG1lbWJlciB0aGF0XG4gICAgICogcmV0dXJuZWQsIGJlY2F1c2UgYGV4ZWN1dGUgaWYgZnVuY3Rpb24gI3RhZ2AgbWF0Y2hlcyB3aGVuIGFueSBtZW1iZXJcbiAgICAgKiBkaWQuIEEgYC9yZXR1cm5gIGRlZXBlciBpbiB0aGUgY2FsbCB0cmVlIGVuZHMgaXRzIG93biBmdW5jdGlvbiBhbmRcbiAgICAgKiBsZWF2ZXMgbm90aGluZyBoZXJlLCB0aGUgd2F5IEphdmEgcmV0dXJucyBmcm9tIG9uZSBmdW5jdGlvbiByYXRoZXJcbiAgICAgKiB0aGFuIGZyb20gaXRzIGNhbGxlci5cbiAgICAgKi9cbiAgICByZXR1cm5WYWx1ZXM6IHJlYWRvbmx5IG51bWJlcltdO1xuICAgIC8qKiBTZXQgd2hlbiBhIGxpbWl0IHN0b3BwZWQgdGhlIHJ1bjsgdGhlIG1hdGNoaW5nIGRpYWdub3N0aWMgY2FycmllcyB0aGUgZGV0YWlsLiAqL1xuICAgIHN0b3BwZWQ/OiBFeGVjdXRpb25TdG9wO1xuICAgIGRpYWdub3N0aWNzOiByZWFkb25seSBEaWFnbm9zdGljW107XG59XG5cbi8qKiBPbmUgZnVuY3Rpb24gaW4gcHJvZ3Jlc3M6IGl0cyByZW1haW5pbmcgY29tbWFuZHMgYW5kIHdoZXJlIGl0IGlzIGluIHRoZW0uICovXG5pbnRlcmZhY2UgRnJhbWUge1xuICAgIGZ1bmN0aW9uSWQ6IHN0cmluZztcbiAgICBjb21tYW5kczogcmVhZG9ubHkgSW5zdGFudGlhdGVkQ29tbWFuZFtdO1xuICAgIGluZGV4OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgZW50cnkgcG9pbnQgaW52b2tlZCB0aGlzIGZ1bmN0aW9uIGl0c2VsZiwgd2hpY2ggaXMgd2hhdFxuICAgICAqIGRlY2lkZXMgd2hvc2UgYC9yZXR1cm5gIHRoZSBydW4gcmVwb3J0cy4gQSB0YWlsIGNhbGwgaW5oZXJpdHMgaXQ6IHRoZVxuICAgICAqIHJlcGxhY2VtZW50IHJ1bnMgaW4gdGhlIGZyYW1lIGl0IHJlcGxhY2VkLCBzbyBpdHMgcmV0dXJuIGlzIHRoYXRcbiAgICAgKiBmdW5jdGlvbidzIGxhc3QgYWN0LlxuICAgICAqL1xuICAgIHJvb3Q6IGJvb2xlYW47XG59XG5cbmNvbnN0IENBTExfUEFUVEVSTiA9IC9eZnVuY3Rpb25bIFxcdF0rKFxcUyspWyBcXHRdKihbXFxzXFxTXSopJC87XG5cbi8qKiBSZWFkcyBhIEpTT04gb2JqZWN0IGFzIGFuIGFyZ3VtZW50IGNvbXBvdW5kOyBhbnl0aGluZyBlbHNlIGlzIHJlamVjdGVkLiAqL1xuY29uc3QgcGFyc2VKc29uQXJndW1lbnRzID0gKHRleHQ6IHN0cmluZyk6IE1hY3JvQXJndW1lbnRzIHwgdW5kZWZpbmVkID0+IHtcbiAgICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIEpTT04ucGFyc2UgaXMgYSBwYXJzZWQtaW5wdXQgYm91bmRhcnksIHNvIG5hcnJvdyByYXRoZXIgdGhhbiBhc3NlcnQuXG4gICAgaWYgKHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnIHx8IHBhcnNlZCA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KHBhcnNlZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgLi4ucGFyc2VkIH07XG59O1xuXG4vKipcbiAqIFJ1bnMgZnVuY3Rpb25zIGFnYWluc3QgYSBjb21tYW5kIHJ1bm5lci5cbiAqXG4gKiBPbmUgZXhlY3V0b3IgaXMgcmV1c2FibGU6IGl0IGhvbGRzIG5vIHJ1biBzdGF0ZSwgc28gYSBzZXJ2ZXIgYnVpbGRzIGl0IG9uY2VcbiAqIGF0IGxvYWQgYW5kIGNhbGxzIHtAbGluayBGdW5jdGlvbkV4ZWN1dG9yLnJ1blRpY2t9IGV2ZXJ5IHRpY2suXG4gKlxuICogYGZ1bmN0aW9uIDxpZD5gIGFuZCBgZnVuY3Rpb24gI3RhZ2AgYXJlIHRoZSBvbmx5IGxpbmVzIHRoZSBleGVjdXRvciByZWFkc1xuICogaXRzZWxmLCBiZWNhdXNlIGEgY2FsbCBpcyBjb250cm9sIGZsb3cgcmF0aGVyIHRoYW4gYSBjb21tYW5kOiBoYW5kbGluZyBpdFxuICogaGVyZSBpcyB3aGF0IGtlZXBzIG5lc3Rpbmcgb24gdGhlIHF1ZXVlIGluc3RlYWQgb2Ygb24gdGhlIEphdmFTY3JpcHQgc3RhY2suXG4gKiBFdmVyeSBvdGhlciBsaW5lIGdvZXMgdG8gdGhlIHJ1bm5lciB1bnRvdWNoZWQuXG4gKlxuICogYC9yZXR1cm5gIGlzIHRoZSBvdGhlciBoYWxmIG9mIHRoYXQgc3BsaXQuIEl0IGlzIGEgY29tbWFuZCwgc28gdGhlIHJ1bm5lclxuICogaW1wbGVtZW50cyBpdCwgYnV0IG9ubHkgdGhlIGV4ZWN1dG9yIGNhbiBhY3Qgb24gaXQ6IGEgcnVubmVyIHRoYXQgcmVwb3J0c1xuICoge0BsaW5rIENvbW1hbmRPdXRjb21lLnJldHVybmVkfSBlbmRzIHRoZSBmdW5jdGlvbiB0aGUgbGluZSBjYW1lIGZyb20gYW5kXG4gKiB0aGUgbG9vcCBjYXJyaWVzIG9uIHdpdGggaXRzIGNhbGxlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uRXhlY3V0b3I8VFNvdXJjZSA9IHVua25vd24+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxpbWl0czogRXhlY3V0aW9uTGltaXRzO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJzZUFyZ3VtZW50czogKHRleHQ6IHN0cmluZykgPT4gTWFjcm9Bcmd1bWVudHMgfCB1bmRlZmluZWQ7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBGdW5jdGlvbkV4ZWN1dG9yT3B0aW9uczxUU291cmNlPikge1xuICAgICAgICB0aGlzLmxpbWl0cyA9IHsgLi4uREVGQVVMVF9FWEVDVVRJT05fTElNSVRTLCAuLi5vcHRpb25zLmxpbWl0cyB9O1xuICAgICAgICB0aGlzLnBhcnNlQXJndW1lbnRzID0gb3B0aW9ucy5wYXJzZUFyZ3VtZW50cyA/PyBwYXJzZUpzb25Bcmd1bWVudHM7XG4gICAgfVxuXG4gICAgLyoqIFJ1bnMgYG1pbmVjcmFmdDpsb2FkYCwgd2hpY2ggYSBzZXJ2ZXIgZG9lcyBvbmNlIGFmdGVyIGl0cyBwYWNrcyBsb2FkLiAqL1xuICAgIHB1YmxpYyBydW5Mb2FkKG9wdGlvbnM6IEV4ZWN1dGlvbk9wdGlvbnM8VFNvdXJjZT4pOiBFeGVjdXRpb25SZXBvcnQge1xuICAgICAgICByZXR1cm4gdGhpcy5ydW4oYCMke0xPQURfRlVOQ1RJT05fVEFHfWAsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKiBSdW5zIGBtaW5lY3JhZnQ6dGlja2AsIHdoaWNoIGEgc2VydmVyIGRvZXMgb25jZSBwZXIgc2VydmVyIHRpY2suICovXG4gICAgcHVibGljIHJ1blRpY2sob3B0aW9uczogRXhlY3V0aW9uT3B0aW9uczxUU291cmNlPik6IEV4ZWN1dGlvblJlcG9ydCB7XG4gICAgICAgIHJldHVybiB0aGlzLnJ1bihgIyR7VElDS19GVU5DVElPTl9UQUd9YCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyBvbmUgZnVuY3Rpb24gb3IgZXZlcnkgZnVuY3Rpb24gaW4gb25lIHRhZy5cbiAgICAgKlxuICAgICAqIEV2ZXJ5dGhpbmcgYSBjYWxsIHJlYWNoZXMgc2hhcmVzIG9uZSBidWRnZXQsIHNvIHRoZSByZXBvcnQgY292ZXJzIHRoZVxuICAgICAqIHdob2xlIHRyZWUgYmVsb3cgdGhlIGVudHJ5IHBvaW50LiBBIGxpbWl0IHN0b3BzIHRoZSBydW4gYW5kIGlzIHJlcG9ydGVkXG4gICAgICogYXMgYSBkaWFnbm9zdGljOyBub3RoaW5nIGhlcmUgdGhyb3dzLCBhbmQgYSBjb21tYW5kIHRoYXQgdGhyb3dzIGlzXG4gICAgICogcmVwb3J0ZWQgYW5kIHNraXBwZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVmZXJlbmNlIC0gQSBmdW5jdGlvbiBpZCwgb3IgYSB0YWcgaWQgd3JpdHRlbiBgI25hbWVzcGFjZTp0YWdgLlxuICAgICAqL1xuICAgIHB1YmxpYyBydW4ocmVmZXJlbmNlOiBzdHJpbmcsIG9wdGlvbnM6IEV4ZWN1dGlvbk9wdGlvbnM8VFNvdXJjZT4pOiBFeGVjdXRpb25SZXBvcnQge1xuICAgICAgICBjb25zdCBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdID0gW107XG4gICAgICAgIGNvbnN0IHN0YXRlID0geyBvcGVyYXRpb25zOiAwLCBmb3JrczogMCwgY29tbWFuZHM6IDAsIGludm9jYXRpb25zOiAwLCBtYXhEZXB0aDogMCB9O1xuICAgICAgICBjb25zdCBzdGFjazogRnJhbWVbXSA9IFtdO1xuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZXM6IG51bWJlcltdID0gW107XG5cbiAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VGdW5jdGlvblJlZmVyZW5jZShyZWZlcmVuY2UpO1xuICAgICAgICBpZiAoIXBhcnNlZCkge1xuICAgICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ2NhbGwudW5rbm93bi1mdW5jdGlvbicsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYCcke3JlZmVyZW5jZX0nIGlzIG5vdCBhIHZhbGlkIGZ1bmN0aW9uIHJlZmVyZW5jZWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHJldHVyblZhbHVlcywgZGlhZ25vc3RpY3MgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdG9wcGVkOiBFeGVjdXRpb25TdG9wIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIC8qKiBDaGFyZ2VzIG9uZSBvcGVyYXRpb24sIHJlcG9ydGluZyBhbmQgc3RvcHBpbmcgdGhlIHJ1biBhdCB0aGUgbGltaXQuICovXG4gICAgICAgIGNvbnN0IGNoYXJnZSA9IChmdW5jdGlvbklkOiBzdHJpbmcsIGxpbmU/OiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIHN0YXRlLm9wZXJhdGlvbnMgKz0gMTtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5vcGVyYXRpb25zIDw9IHRoaXMubGltaXRzLm1heENvbW1hbmRTZXF1ZW5jZUxlbmd0aCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBzdG9wcGVkID0gJ21heC1jb21tYW5kLXNlcXVlbmNlLWxlbmd0aCc7XG4gICAgICAgICAgICBkaWFnbm9zdGljcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnbGltaXQuY29tbWFuZC1zZXF1ZW5jZS1sZW5ndGgnLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uSWQsXG4gICAgICAgICAgICAgICAgbGluZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdGhlIHJ1biByZWFjaGVkIG1heENvbW1hbmRTZXF1ZW5jZUxlbmd0aCAoJHt0aGlzLmxpbWl0cy5tYXhDb21tYW5kU2VxdWVuY2VMZW5ndGh9KSBhbmQgc3RvcHBlZGBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKiBJbnN0YW50aWF0ZXMgb25lIGNhbGwgYW5kIHB1c2hlcyBpdHMgZnJhbWUsIG9yIHJlcG9ydHMgd2h5IGl0IGNvdWxkIG5vdC4gKi9cbiAgICAgICAgY29uc3QgaW52b2tlID0gKFxuICAgICAgICAgICAgaWQ6IHN0cmluZyxcbiAgICAgICAgICAgIGFyZ3M6IE1hY3JvQXJndW1lbnRzIHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgZnJvbTogeyBmdW5jdGlvbklkOiBzdHJpbmc7IGxpbmU/OiBudW1iZXIgfSxcbiAgICAgICAgICAgIHJvb3QgPSBmYWxzZVxuICAgICAgICApOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBpbGVkID0gdGhpcy5vcHRpb25zLmZ1bmN0aW9ucy5nZXQoaWQpO1xuICAgICAgICAgICAgaWYgKCFjb21waWxlZCkge1xuICAgICAgICAgICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ2NhbGwudW5rbm93bi1mdW5jdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uSWQ6IGZyb20uZnVuY3Rpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgbGluZTogZnJvbS5saW5lLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdGhlIGZ1bmN0aW9uICR7aWR9IGRvZXMgbm90IGV4aXN0YFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWNoYXJnZShmcm9tLmZ1bmN0aW9uSWQsIGZyb20ubGluZSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHN0YXRlLmludm9jYXRpb25zICs9IDE7XG5cbiAgICAgICAgICAgIGNvbnN0IGluc3RhbnRpYXRlZCA9IGNvbXBpbGVkLmluc3RhbnRpYXRlKGFyZ3MpO1xuICAgICAgICAgICAgaWYgKCFpbnN0YW50aWF0ZWQub2spIHtcbiAgICAgICAgICAgICAgICBkaWFnbm9zdGljcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdtYWNyby5taXNzaW5nLWFyZ3VtZW50cycsXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uSWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICBsaW5lOiBpbnN0YW50aWF0ZWQubGluZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogaW5zdGFudGlhdGVkLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQSBjYWxsIG1hZGUgZnJvbSB0aGUgbGFzdCBsaW5lIG9mIGEgZnJhbWUgcmVwbGFjZXMgdGhhdCBmcmFtZVxuICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBzdGFja2luZyBvbiBpdCwgc28gYSB0YWlsLXJlY3Vyc2l2ZSBmdW5jdGlvbiBydW5zIGluXG4gICAgICAgICAgICAvLyBjb25zdGFudCBkZXB0aCwgYXMgSmF2YSdzIHJld3JpdGUgbWFkZSBpdCBpbiAyM3c0NGEuXG4gICAgICAgICAgICBjb25zdCB0b3AgPSBzdGFjay5hdCgtMSk7XG4gICAgICAgICAgICBjb25zdCByZXBsYWNlZCA9IHRvcCAmJiB0b3AuaW5kZXggPj0gdG9wLmNvbW1hbmRzLmxlbmd0aCA/IHN0YWNrLnBvcCgpIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbklkOiBpZCxcbiAgICAgICAgICAgICAgICBjb21tYW5kczogaW5zdGFudGlhdGVkLmNvbW1hbmRzLFxuICAgICAgICAgICAgICAgIGluZGV4OiAwLFxuICAgICAgICAgICAgICAgIHJvb3Q6IHJlcGxhY2VkPy5yb290ID8/IHJvb3RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3RhdGUubWF4RGVwdGggPSBNYXRoLm1heChzdGF0ZS5tYXhEZXB0aCwgc3RhY2subGVuZ3RoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBwYXJzZWQua2luZCA9PT0gJ2Z1bmN0aW9uJyA/IFtwYXJzZWQuaWRdIDogdGhpcy5yZXNvbHZlVGFnKHBhcnNlZC5pZCwgcmVmZXJlbmNlLCBkaWFnbm9zdGljcyk7XG5cbiAgICAgICAgLy8gRnJhbWVzIHJ1biBmcm9tIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBzbyB0aGUgZmlyc3QgZnVuY3Rpb24gb2YgYSB0YWdcbiAgICAgICAgLy8gaXMgcHVzaGVkIGxhc3QuXG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgWy4uLmVudHJpZXNdLnJldmVyc2UoKSkge1xuICAgICAgICAgICAgaWYgKCFpbnZva2UoaWQsIG9wdGlvbnMuYXJndW1lbnRzLCB7IGZ1bmN0aW9uSWQ6IHJlZmVyZW5jZSB9LCB0cnVlKSkgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAoc3RvcHBlZCA9PT0gdW5kZWZpbmVkICYmIHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGZyYW1lID0gc3RhY2suYXQoLTEpO1xuICAgICAgICAgICAgaWYgKCFmcmFtZSkgYnJlYWs7XG4gICAgICAgICAgICBpZiAoZnJhbWUuaW5kZXggPj0gZnJhbWUuY29tbWFuZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZnJhbWUuY29tbWFuZHNbZnJhbWUuaW5kZXhdO1xuICAgICAgICAgICAgZnJhbWUuaW5kZXggKz0gMTtcbiAgICAgICAgICAgIGlmICghZW50cnkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCFjaGFyZ2UoZnJhbWUuZnVuY3Rpb25JZCwgZW50cnkubGluZSkpIGJyZWFrO1xuXG4gICAgICAgICAgICBjb25zdCBjYWxsID0gQ0FMTF9QQVRURVJOLmV4ZWMoZW50cnkuY29tbWFuZCk7XG4gICAgICAgICAgICBpZiAoY2FsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2FsbChjYWxsLCBmcmFtZSwgZW50cnksIGludm9rZSwgZGlhZ25vc3RpY3MpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGF0ZS5jb21tYW5kcyArPSAxO1xuICAgICAgICAgICAgbGV0IGZvcmtzID0gMDtcbiAgICAgICAgICAgIGxldCByZXR1cm5lZDogQ29tbWFuZE91dGNvbWVbJ3JldHVybmVkJ107XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dGNvbWUgPSB0aGlzLm9wdGlvbnMucnVubmVyLnJ1bihlbnRyeS5jb21tYW5kLCB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZTogb3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uSWQ6IGZyYW1lLmZ1bmN0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgIGxpbmU6IGVudHJ5LmxpbmVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBmb3JrcyA9IG91dGNvbWUuZm9ya3MgPz8gMDtcbiAgICAgICAgICAgICAgICByZXR1cm5lZCA9IG91dGNvbWUucmV0dXJuZWQ7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ2NvbW1hbmQuZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25JZDogZnJhbWUuZnVuY3Rpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgbGluZTogZW50cnkubGluZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZXR1cm5lZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gYC9yZXR1cm5gIGVuZHMgdGhpcyBmdW5jdGlvbiBhbmQgbm8gb3RoZXI6IGl0cyBjYWxsZXInc1xuICAgICAgICAgICAgICAgIC8vIGZyYW1lIGlzIHN0aWxsIGJlbG93IGFuZCBydW5zIG9uIGZyb20gd2hlcmUgaXQgY2FsbGVkLlxuICAgICAgICAgICAgICAgIGlmIChmcmFtZS5yb290ICYmIHJldHVybmVkLnZhbHVlICE9PSB1bmRlZmluZWQpIHJldHVyblZhbHVlcy5wdXNoKHJldHVybmVkLnZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhY2suYXQoLTEpID09PSBmcmFtZSkgc3RhY2sucG9wKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0YXRlLmZvcmtzICs9IGZvcmtzO1xuICAgICAgICAgICAgaWYgKHN0YXRlLmZvcmtzID4gdGhpcy5saW1pdHMubWF4Q29tbWFuZEZvcmtzKSB7XG4gICAgICAgICAgICAgICAgc3RvcHBlZCA9ICdtYXgtY29tbWFuZC1mb3Jrcyc7XG4gICAgICAgICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnbGltaXQuY29tbWFuZC1mb3JrcycsXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uSWQ6IGZyYW1lLmZ1bmN0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgIGxpbmU6IGVudHJ5LmxpbmUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB0aGUgcnVuIHJlYWNoZWQgbWF4Q29tbWFuZEZvcmtzICgke3RoaXMubGltaXRzLm1heENvbW1hbmRGb3Jrc30pIGFuZCBzdG9wcGVkYFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHJldHVyblZhbHVlcywgLi4uKHN0b3BwZWQgPyB7IHN0b3BwZWQgfSA6IHt9KSwgZGlhZ25vc3RpY3MgfTtcbiAgICB9XG5cbiAgICAvKiogRXhwYW5kcyBhIHRhZyByZWZlcmVuY2UsIHJlcG9ydGluZyBhIHRhZyBubyBwYWNrIGRlY2xhcmVkLiAqL1xuICAgIHByaXZhdGUgcmVzb2x2ZVRhZyhpZDogc3RyaW5nLCByZWZlcmVuY2U6IHN0cmluZywgZGlhZ25vc3RpY3M6IERpYWdub3N0aWNbXSk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudGFncykge1xuICAgICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ2NhbGwudW5rbm93bi10YWcnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGAke3JlZmVyZW5jZX0gaXMgYSB0YWcgcmVmZXJlbmNlLCBhbmQgdGhpcyBleGVjdXRvciBoYXMgbm8gdGFnIGxvb2t1cGBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRnVuY3Rpb25UYWcodGhpcy5vcHRpb25zLnRhZ3MsIGlkKTtcbiAgICAgICAgZGlhZ25vc3RpY3MucHVzaCguLi5yZXNvbHZlZC5kaWFnbm9zdGljcyk7XG4gICAgICAgIHJldHVybiByZXNvbHZlZC5mdW5jdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqIFJ1bnMgb25lIGBmdW5jdGlvbmAgbGluZTogcmVzb2x2ZXMgd2hhdCBpdCBuYW1lcyBhbmQgcHVzaGVzIHRoZSBmcmFtZXMgaXQgaW52b2tlcy4gKi9cbiAgICBwcml2YXRlIGhhbmRsZUNhbGwoXG4gICAgICAgIGNhbGw6IFJlZ0V4cEV4ZWNBcnJheSxcbiAgICAgICAgZnJhbWU6IEZyYW1lLFxuICAgICAgICBlbnRyeTogSW5zdGFudGlhdGVkQ29tbWFuZCxcbiAgICAgICAgaW52b2tlOiAoaWQ6IHN0cmluZywgYXJnczogTWFjcm9Bcmd1bWVudHMgfCB1bmRlZmluZWQsIGZyb206IHsgZnVuY3Rpb25JZDogc3RyaW5nOyBsaW5lPzogbnVtYmVyIH0pID0+IGJvb2xlYW4sXG4gICAgICAgIGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW11cbiAgICApOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZnJvbSA9IHsgZnVuY3Rpb25JZDogZnJhbWUuZnVuY3Rpb25JZCwgbGluZTogZW50cnkubGluZSB9O1xuICAgICAgICBjb25zdCB0YXJnZXQ6IEZ1bmN0aW9uUmVmZXJlbmNlIHwgdW5kZWZpbmVkID0gcGFyc2VGdW5jdGlvblJlZmVyZW5jZShjYWxsWzFdID8/ICcnKTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdjYWxsLnVua25vd24tZnVuY3Rpb24nLFxuICAgICAgICAgICAgICAgIC4uLmZyb20sXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYCcke2NhbGxbMV0gPz8gJyd9JyBpcyBub3QgYSB2YWxpZCBmdW5jdGlvbiByZWZlcmVuY2VgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFyZ3VtZW50VGV4dCA9IChjYWxsWzJdID8/ICcnKS50cmltKCk7XG4gICAgICAgIGxldCBhcmdzOiBNYWNyb0FyZ3VtZW50cyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGFyZ3VtZW50VGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhcmdzID0gdGhpcy5wYXJzZUFyZ3VtZW50cyhhcmd1bWVudFRleHQpO1xuICAgICAgICAgICAgaWYgKGFyZ3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ2NhbGwuaW52YWxpZC1hcmd1bWVudHMnLFxuICAgICAgICAgICAgICAgICAgICAuLi5mcm9tLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdGhlIGFyZ3VtZW50cyBvZiAnJHtlbnRyeS5jb21tYW5kfScgYXJlIG5vdCBhIGNvbXBvdW5kIHRoaXMgcnVudGltZSBjYW4gcmVhZGBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0LmtpbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGludm9rZSh0YXJnZXQuaWQsIGFyZ3MsIGZyb20pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFncyA9IHRoaXMub3B0aW9ucy50YWdzO1xuICAgICAgICBpZiAoIXRhZ3MpIHtcbiAgICAgICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdjYWxsLnVua25vd24tdGFnJyxcbiAgICAgICAgICAgICAgICAuLi5mcm9tLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGAjJHt0YXJnZXQuaWR9IGNhbm5vdCBiZSByZXNvbHZlZCwgYmVjYXVzZSB0aGlzIGV4ZWN1dG9yIGhhcyBubyB0YWcgbG9va3VwYFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVGdW5jdGlvblRhZyh0YWdzLCB0YXJnZXQuaWQpO1xuICAgICAgICBkaWFnbm9zdGljcy5wdXNoKC4uLnJlc29sdmVkLmRpYWdub3N0aWNzLm1hcCgoZGlhZ25vc3RpYykgPT4gKHsgLi4uZGlhZ25vc3RpYywgLi4uZnJvbSB9KSkpO1xuICAgICAgICBpZiAoIXJlc29sdmVkLmV4aXN0cykge1xuICAgICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ2NhbGwudW5rbm93bi10YWcnLFxuICAgICAgICAgICAgICAgIC4uLmZyb20sXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYHRoZSBmdW5jdGlvbiB0YWcgIyR7dGFyZ2V0LmlkfSBkb2VzIG5vdCBleGlzdGBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBbLi4ucmVzb2x2ZWQuZnVuY3Rpb25zXS5yZXZlcnNlKCkpIHtcbiAgICAgICAgICAgIGlmICghaW52b2tlKGlkLCBhcmdzLCBmcm9tKSkgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBd0NBLElBQWEsMkJBQTRDO0NBQ3JELDBCQUEwQjtDQUMxQixpQkFBaUI7QUFDckI7Ozs7OztBQU9BLElBQWEsb0NBQW9DO0FBOEVqRCxJQUFNLGVBQWU7O0FBR3JCLElBQU0sc0JBQXNCLFNBQTZDO0NBQ3JFLElBQUk7Q0FDSixJQUFJO0VBQ0EsU0FBUyxLQUFLLE1BQU0sSUFBSTtDQUM1QixRQUFRO0VBQ0o7Q0FDSjtDQUVBLElBQUksT0FBTyxXQUFXLFlBQVksV0FBVyxRQUFRLE1BQU0sUUFBUSxNQUFNLEdBQUcsT0FBTyxLQUFBO0NBQ25GLE9BQU8sRUFBRSxHQUFHLE9BQU87QUFDdkI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBLElBQWEsbUJBQWIsTUFBaUQ7Q0FLVDtDQUpwQztDQUVB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
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
// src/identifiers.ts
|
|
4
|
+
/**
|
|
5
|
+
* Namespaced ids as `/function` and the function tag files use them. A
|
|
6
|
+
* reference is either a function id (`minecraft:foo/bar`) or a tag id written
|
|
7
|
+
* with a leading `#` (`#minecraft:tick`); both default to the `minecraft`
|
|
8
|
+
* namespace when the colon is left out.
|
|
9
|
+
*/
|
|
10
|
+
var NAMESPACE_PATTERN = /^[a-z0-9_.-]+$/;
|
|
11
|
+
var PATH_PATTERN = /^[a-z0-9_./-]+$/;
|
|
12
|
+
/** The namespace an id without a colon belongs to. */
|
|
13
|
+
var DEFAULT_NAMESPACE = "minecraft";
|
|
14
|
+
/**
|
|
15
|
+
* Normalizes a namespaced id, filling in the default namespace.
|
|
16
|
+
*
|
|
17
|
+
* @returns The `namespace:path` form, or undefined when either half is not a legal id.
|
|
18
|
+
*/
|
|
19
|
+
var normalizeIdentifier = (text) => {
|
|
20
|
+
const colon = text.indexOf(":");
|
|
21
|
+
const namespace = colon === -1 ? DEFAULT_NAMESPACE : text.slice(0, colon);
|
|
22
|
+
const path = colon === -1 ? text : text.slice(colon + 1);
|
|
23
|
+
if (!NAMESPACE_PATTERN.test(namespace) || !PATH_PATTERN.test(path)) return void 0;
|
|
24
|
+
return `${namespace}:${path}`;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Parses the argument of a `/function` call or a function tag entry.
|
|
28
|
+
*
|
|
29
|
+
* @returns The reference, or undefined when the text is not a legal id.
|
|
30
|
+
*/
|
|
31
|
+
var parseFunctionReference = (text) => {
|
|
32
|
+
const tag = text.startsWith("#");
|
|
33
|
+
const id = normalizeIdentifier(tag ? text.slice(1) : text);
|
|
34
|
+
if (id === void 0) return void 0;
|
|
35
|
+
return {
|
|
36
|
+
kind: tag ? "tag" : "function",
|
|
37
|
+
id
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
/** The file extension of a function file. */
|
|
41
|
+
var FUNCTION_EXTENSION = ".mcfunction";
|
|
42
|
+
/**
|
|
43
|
+
* Derives a function id from a pack-relative path, following the 26.3 layout
|
|
44
|
+
* `data/<namespace>/function/<path>.mcfunction`.
|
|
45
|
+
*
|
|
46
|
+
* @returns The namespaced id, or undefined when the path is not a function file.
|
|
47
|
+
*/
|
|
48
|
+
var functionIdForPath = (path) => {
|
|
49
|
+
if (!path.startsWith("data/") || !path.endsWith(".mcfunction")) return void 0;
|
|
50
|
+
const [namespace, folder, ...rest] = path.slice(5, -11).split("/");
|
|
51
|
+
if (!namespace || folder !== "function" || rest.length === 0) return void 0;
|
|
52
|
+
if (!NAMESPACE_PATTERN.test(namespace)) return void 0;
|
|
53
|
+
const idPath = rest.join("/");
|
|
54
|
+
if (!PATH_PATTERN.test(idPath)) return void 0;
|
|
55
|
+
return `${namespace}:${idPath}`;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Derives a function tag id from a pack-relative path, following
|
|
59
|
+
* `data/<namespace>/tags/function/<path>.json`.
|
|
60
|
+
*
|
|
61
|
+
* @returns The namespaced tag id without a `#`, or undefined when the path is not a function tag.
|
|
62
|
+
*/
|
|
63
|
+
var functionTagIdForPath = (path) => {
|
|
64
|
+
if (!path.startsWith("data/") || !path.endsWith(".json")) return void 0;
|
|
65
|
+
const [namespace, folder, registry, ...rest] = path.slice(5, -5).split("/");
|
|
66
|
+
if (!namespace || folder !== "tags" || registry !== "function" || rest.length === 0) return void 0;
|
|
67
|
+
if (!NAMESPACE_PATTERN.test(namespace)) return void 0;
|
|
68
|
+
const idPath = rest.join("/");
|
|
69
|
+
if (!PATH_PATTERN.test(idPath)) return void 0;
|
|
70
|
+
return `${namespace}:${idPath}`;
|
|
71
|
+
};
|
|
72
|
+
exports.DEFAULT_NAMESPACE = DEFAULT_NAMESPACE;
|
|
73
|
+
exports.FUNCTION_EXTENSION = FUNCTION_EXTENSION;
|
|
74
|
+
exports.functionIdForPath = functionIdForPath;
|
|
75
|
+
exports.functionTagIdForPath = functionTagIdForPath;
|
|
76
|
+
exports.normalizeIdentifier = normalizeIdentifier;
|
|
77
|
+
exports.parseFunctionReference = parseFunctionReference;
|
|
78
|
+
|
|
79
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpZmllcnMuY2pzLmNqcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvaWRlbnRpZmllcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBOYW1lc3BhY2VkIGlkcyBhcyBgL2Z1bmN0aW9uYCBhbmQgdGhlIGZ1bmN0aW9uIHRhZyBmaWxlcyB1c2UgdGhlbS4gQVxuICogcmVmZXJlbmNlIGlzIGVpdGhlciBhIGZ1bmN0aW9uIGlkIChgbWluZWNyYWZ0OmZvby9iYXJgKSBvciBhIHRhZyBpZCB3cml0dGVuXG4gKiB3aXRoIGEgbGVhZGluZyBgI2AgKGAjbWluZWNyYWZ0OnRpY2tgKTsgYm90aCBkZWZhdWx0IHRvIHRoZSBgbWluZWNyYWZ0YFxuICogbmFtZXNwYWNlIHdoZW4gdGhlIGNvbG9uIGlzIGxlZnQgb3V0LlxuICovXG5cbmNvbnN0IE5BTUVTUEFDRV9QQVRURVJOID0gL15bYS16MC05Xy4tXSskLztcbmNvbnN0IFBBVEhfUEFUVEVSTiA9IC9eW2EtejAtOV8uLy1dKyQvO1xuXG4vKiogVGhlIG5hbWVzcGFjZSBhbiBpZCB3aXRob3V0IGEgY29sb24gYmVsb25ncyB0by4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX05BTUVTUEFDRSA9ICdtaW5lY3JhZnQnO1xuXG4vKiogQSBwYXJzZWQgcmVmZXJlbmNlIHRvIGVpdGhlciBvbmUgZnVuY3Rpb24gb3IgYSBmdW5jdGlvbiB0YWcuICovXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uUmVmZXJlbmNlIHtcbiAgICAvKiogV2hldGhlciB0aGUgcmVmZXJlbmNlIG5hbWVkIGEgdGFnIChgI25hbWVzcGFjZTpwYXRoYCkgb3IgYSBzaW5nbGUgZnVuY3Rpb24uICovXG4gICAga2luZDogJ2Z1bmN0aW9uJyB8ICd0YWcnO1xuICAgIC8qKiBUaGUgbmFtZXNwYWNlZCBpZCwgYWx3YXlzIHdpdGggYW4gZXhwbGljaXQgbmFtZXNwYWNlIGFuZCB3aXRob3V0IHRoZSBgI2AuICovXG4gICAgaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgbmFtZXNwYWNlZCBpZCwgZmlsbGluZyBpbiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UuXG4gKlxuICogQHJldHVybnMgVGhlIGBuYW1lc3BhY2U6cGF0aGAgZm9ybSwgb3IgdW5kZWZpbmVkIHdoZW4gZWl0aGVyIGhhbGYgaXMgbm90IGEgbGVnYWwgaWQuXG4gKi9cbmV4cG9ydCBjb25zdCBub3JtYWxpemVJZGVudGlmaWVyID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgY29sb24gPSB0ZXh0LmluZGV4T2YoJzonKTtcbiAgICBjb25zdCBuYW1lc3BhY2UgPSBjb2xvbiA9PT0gLTEgPyBERUZBVUxUX05BTUVTUEFDRSA6IHRleHQuc2xpY2UoMCwgY29sb24pO1xuICAgIGNvbnN0IHBhdGggPSBjb2xvbiA9PT0gLTEgPyB0ZXh0IDogdGV4dC5zbGljZShjb2xvbiArIDEpO1xuICAgIGlmICghTkFNRVNQQUNFX1BBVFRFUk4udGVzdChuYW1lc3BhY2UpIHx8ICFQQVRIX1BBVFRFUk4udGVzdChwYXRoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYCR7bmFtZXNwYWNlfToke3BhdGh9YDtcbn07XG5cbi8qKlxuICogUGFyc2VzIHRoZSBhcmd1bWVudCBvZiBhIGAvZnVuY3Rpb25gIGNhbGwgb3IgYSBmdW5jdGlvbiB0YWcgZW50cnkuXG4gKlxuICogQHJldHVybnMgVGhlIHJlZmVyZW5jZSwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHRleHQgaXMgbm90IGEgbGVnYWwgaWQuXG4gKi9cbmV4cG9ydCBjb25zdCBwYXJzZUZ1bmN0aW9uUmVmZXJlbmNlID0gKHRleHQ6IHN0cmluZyk6IEZ1bmN0aW9uUmVmZXJlbmNlIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCB0YWcgPSB0ZXh0LnN0YXJ0c1dpdGgoJyMnKTtcbiAgICBjb25zdCBpZCA9IG5vcm1hbGl6ZUlkZW50aWZpZXIodGFnID8gdGV4dC5zbGljZSgxKSA6IHRleHQpO1xuICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IGtpbmQ6IHRhZyA/ICd0YWcnIDogJ2Z1bmN0aW9uJywgaWQgfTtcbn07XG5cbi8qKiBUaGUgZmlsZSBleHRlbnNpb24gb2YgYSBmdW5jdGlvbiBmaWxlLiAqL1xuZXhwb3J0IGNvbnN0IEZVTkNUSU9OX0VYVEVOU0lPTiA9ICcubWNmdW5jdGlvbic7XG5cbi8qKlxuICogRGVyaXZlcyBhIGZ1bmN0aW9uIGlkIGZyb20gYSBwYWNrLXJlbGF0aXZlIHBhdGgsIGZvbGxvd2luZyB0aGUgMjYuMyBsYXlvdXRcbiAqIGBkYXRhLzxuYW1lc3BhY2U+L2Z1bmN0aW9uLzxwYXRoPi5tY2Z1bmN0aW9uYC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbmFtZXNwYWNlZCBpZCwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHBhdGggaXMgbm90IGEgZnVuY3Rpb24gZmlsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uSWRGb3JQYXRoID0gKHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoJ2RhdGEvJykgfHwgIXBhdGguZW5kc1dpdGgoRlVOQ1RJT05fRVhURU5TSU9OKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zbGljZSgnZGF0YS8nLmxlbmd0aCwgLUZVTkNUSU9OX0VYVEVOU0lPTi5sZW5ndGgpLnNwbGl0KCcvJyk7XG4gICAgY29uc3QgW25hbWVzcGFjZSwgZm9sZGVyLCAuLi5yZXN0XSA9IHNlZ21lbnRzO1xuICAgIGlmICghbmFtZXNwYWNlIHx8IGZvbGRlciAhPT0gJ2Z1bmN0aW9uJyB8fCByZXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoIU5BTUVTUEFDRV9QQVRURVJOLnRlc3QobmFtZXNwYWNlKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGlkUGF0aCA9IHJlc3Quam9pbignLycpO1xuICAgIGlmICghUEFUSF9QQVRURVJOLnRlc3QoaWRQYXRoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYCR7bmFtZXNwYWNlfToke2lkUGF0aH1gO1xufTtcblxuLyoqXG4gKiBEZXJpdmVzIGEgZnVuY3Rpb24gdGFnIGlkIGZyb20gYSBwYWNrLXJlbGF0aXZlIHBhdGgsIGZvbGxvd2luZ1xuICogYGRhdGEvPG5hbWVzcGFjZT4vdGFncy9mdW5jdGlvbi88cGF0aD4uanNvbmAuXG4gKlxuICogQHJldHVybnMgVGhlIG5hbWVzcGFjZWQgdGFnIGlkIHdpdGhvdXQgYSBgI2AsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBwYXRoIGlzIG5vdCBhIGZ1bmN0aW9uIHRhZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uVGFnSWRGb3JQYXRoID0gKHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoJ2RhdGEvJykgfHwgIXBhdGguZW5kc1dpdGgoJy5qc29uJykpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc2xpY2UoJ2RhdGEvJy5sZW5ndGgsIC0nLmpzb24nLmxlbmd0aCkuc3BsaXQoJy8nKTtcbiAgICBjb25zdCBbbmFtZXNwYWNlLCBmb2xkZXIsIHJlZ2lzdHJ5LCAuLi5yZXN0XSA9IHNlZ21lbnRzO1xuICAgIGlmICghbmFtZXNwYWNlIHx8IGZvbGRlciAhPT0gJ3RhZ3MnIHx8IHJlZ2lzdHJ5ICE9PSAnZnVuY3Rpb24nIHx8IHJlc3QubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICghTkFNRVNQQUNFX1BBVFRFUk4udGVzdChuYW1lc3BhY2UpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgaWRQYXRoID0gcmVzdC5qb2luKCcvJyk7XG4gICAgaWYgKCFQQVRIX1BBVFRFUk4udGVzdChpZFBhdGgpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBgJHtuYW1lc3BhY2V9OiR7aWRQYXRofWA7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFPQSxJQUFNLG9CQUFvQjtBQUMxQixJQUFNLGVBQWU7O0FBR3JCLElBQWEsb0JBQW9COzs7Ozs7QUFlakMsSUFBYSx1QkFBdUIsU0FBcUM7Q0FDckUsTUFBTSxRQUFRLEtBQUssUUFBUSxHQUFHO0NBQzlCLE1BQU0sWUFBWSxVQUFVLEtBQUssb0JBQW9CLEtBQUssTUFBTSxHQUFHLEtBQUs7Q0FDeEUsTUFBTSxPQUFPLFVBQVUsS0FBSyxPQUFPLEtBQUssTUFBTSxRQUFRLENBQUM7Q0FDdkQsSUFBSSxDQUFDLGtCQUFrQixLQUFLLFNBQVMsS0FBSyxDQUFDLGFBQWEsS0FBSyxJQUFJLEdBQUcsT0FBTyxLQUFBO0NBQzNFLE9BQU8sR0FBRyxVQUFVLEdBQUc7QUFDM0I7Ozs7OztBQU9BLElBQWEsMEJBQTBCLFNBQWdEO0NBQ25GLE1BQU0sTUFBTSxLQUFLLFdBQVcsR0FBRztDQUMvQixNQUFNLEtBQUssb0JBQW9CLE1BQU0sS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJO0NBQ3pELElBQUksT0FBTyxLQUFBLEdBQVcsT0FBTyxLQUFBO0NBQzdCLE9BQU87RUFBRSxNQUFNLE1BQU0sUUFBUTtFQUFZO0NBQUc7QUFDaEQ7O0FBR0EsSUFBYSxxQkFBcUI7Ozs7Ozs7QUFRbEMsSUFBYSxxQkFBcUIsU0FBcUM7Q0FDbkUsSUFBSSxDQUFDLEtBQUssV0FBVyxPQUFPLEtBQUssQ0FBQyxLQUFLLFNBQUEsYUFBMkIsR0FBRyxPQUFPLEtBQUE7Q0FHNUUsTUFBTSxDQUFDLFdBQVcsUUFBUSxHQUFHLFFBRFosS0FBSyxNQUFNLEdBQWdCLEdBQTBCLENBQUMsQ0FBQyxNQUFNLEdBQ3pDO0NBQ3JDLElBQUksQ0FBQyxhQUFhLFdBQVcsY0FBYyxLQUFLLFdBQVcsR0FBRyxPQUFPLEtBQUE7Q0FDckUsSUFBSSxDQUFDLGtCQUFrQixLQUFLLFNBQVMsR0FBRyxPQUFPLEtBQUE7Q0FFL0MsTUFBTSxTQUFTLEtBQUssS0FBSyxHQUFHO0NBQzVCLElBQUksQ0FBQyxhQUFhLEtBQUssTUFBTSxHQUFHLE9BQU8sS0FBQTtDQUN2QyxPQUFPLEdBQUcsVUFBVSxHQUFHO0FBQzNCOzs7Ozs7O0FBUUEsSUFBYSx3QkFBd0IsU0FBcUM7Q0FDdEUsSUFBSSxDQUFDLEtBQUssV0FBVyxPQUFPLEtBQUssQ0FBQyxLQUFLLFNBQVMsT0FBTyxHQUFHLE9BQU8sS0FBQTtDQUdqRSxNQUFNLENBQUMsV0FBVyxRQUFRLFVBQVUsR0FBRyxRQUR0QixLQUFLLE1BQU0sR0FBZ0IsRUFBZSxDQUFDLENBQUMsTUFBTSxHQUNwQjtDQUMvQyxJQUFJLENBQUMsYUFBYSxXQUFXLFVBQVUsYUFBYSxjQUFjLEtBQUssV0FBVyxHQUFHLE9BQU8sS0FBQTtDQUM1RixJQUFJLENBQUMsa0JBQWtCLEtBQUssU0FBUyxHQUFHLE9BQU8sS0FBQTtDQUUvQyxNQUFNLFNBQVMsS0FBSyxLQUFLLEdBQUc7Q0FDNUIsSUFBSSxDQUFDLGFBQWEsS0FBSyxNQUFNLEdBQUcsT0FBTyxLQUFBO0NBQ3ZDLE9BQU8sR0FBRyxVQUFVLEdBQUc7QUFDM0IifQ==
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Namespaced ids as `/function` and the function tag files use them. A
|
|
3
|
+
* reference is either a function id (`minecraft:foo/bar`) or a tag id written
|
|
4
|
+
* with a leading `#` (`#minecraft:tick`); both default to the `minecraft`
|
|
5
|
+
* namespace when the colon is left out.
|
|
6
|
+
*/
|
|
7
|
+
/** The namespace an id without a colon belongs to. */
|
|
8
|
+
export declare const DEFAULT_NAMESPACE = "minecraft";
|
|
9
|
+
/** A parsed reference to either one function or a function tag. */
|
|
10
|
+
export interface FunctionReference {
|
|
11
|
+
/** Whether the reference named a tag (`#namespace:path`) or a single function. */
|
|
12
|
+
kind: 'function' | 'tag';
|
|
13
|
+
/** The namespaced id, always with an explicit namespace and without the `#`. */
|
|
14
|
+
id: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Normalizes a namespaced id, filling in the default namespace.
|
|
18
|
+
*
|
|
19
|
+
* @returns The `namespace:path` form, or undefined when either half is not a legal id.
|
|
20
|
+
*/
|
|
21
|
+
export declare const normalizeIdentifier: (text: string) => string | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Parses the argument of a `/function` call or a function tag entry.
|
|
24
|
+
*
|
|
25
|
+
* @returns The reference, or undefined when the text is not a legal id.
|
|
26
|
+
*/
|
|
27
|
+
export declare const parseFunctionReference: (text: string) => FunctionReference | undefined;
|
|
28
|
+
/** The file extension of a function file. */
|
|
29
|
+
export declare const FUNCTION_EXTENSION = ".mcfunction";
|
|
30
|
+
/**
|
|
31
|
+
* Derives a function id from a pack-relative path, following the 26.3 layout
|
|
32
|
+
* `data/<namespace>/function/<path>.mcfunction`.
|
|
33
|
+
*
|
|
34
|
+
* @returns The namespaced id, or undefined when the path is not a function file.
|
|
35
|
+
*/
|
|
36
|
+
export declare const functionIdForPath: (path: string) => string | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Derives a function tag id from a pack-relative path, following
|
|
39
|
+
* `data/<namespace>/tags/function/<path>.json`.
|
|
40
|
+
*
|
|
41
|
+
* @returns The namespaced tag id without a `#`, or undefined when the path is not a function tag.
|
|
42
|
+
*/
|
|
43
|
+
export declare const functionTagIdForPath: (path: string) => string | undefined;
|
|
44
|
+
//# sourceMappingURL=identifiers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identifiers.d.ts","sourceRoot":"","sources":["../src/identifiers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,sDAAsD;AACtD,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAE7C,mEAAmE;AACnE,MAAM,WAAW,iBAAiB;IAC9B,kFAAkF;IAClF,IAAI,EAAE,UAAU,GAAG,KAAK,CAAC;IACzB,gFAAgF;IAChF,EAAE,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,SAAU,MAAM,KAAG,MAAM,GAAG,SAM3D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,SAAU,MAAM,KAAG,iBAAiB,GAAG,SAKzE,CAAC;AAEF,6CAA6C;AAC7C,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,SAAU,MAAM,KAAG,MAAM,GAAG,SAWzD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,SAAU,MAAM,KAAG,MAAM,GAAG,SAW5D,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// src/identifiers.ts
|
|
2
|
+
/**
|
|
3
|
+
* Namespaced ids as `/function` and the function tag files use them. A
|
|
4
|
+
* reference is either a function id (`minecraft:foo/bar`) or a tag id written
|
|
5
|
+
* with a leading `#` (`#minecraft:tick`); both default to the `minecraft`
|
|
6
|
+
* namespace when the colon is left out.
|
|
7
|
+
*/
|
|
8
|
+
var NAMESPACE_PATTERN = /^[a-z0-9_.-]+$/;
|
|
9
|
+
var PATH_PATTERN = /^[a-z0-9_./-]+$/;
|
|
10
|
+
/** The namespace an id without a colon belongs to. */
|
|
11
|
+
var DEFAULT_NAMESPACE = "minecraft";
|
|
12
|
+
/**
|
|
13
|
+
* Normalizes a namespaced id, filling in the default namespace.
|
|
14
|
+
*
|
|
15
|
+
* @returns The `namespace:path` form, or undefined when either half is not a legal id.
|
|
16
|
+
*/
|
|
17
|
+
var normalizeIdentifier = (text) => {
|
|
18
|
+
const colon = text.indexOf(":");
|
|
19
|
+
const namespace = colon === -1 ? DEFAULT_NAMESPACE : text.slice(0, colon);
|
|
20
|
+
const path = colon === -1 ? text : text.slice(colon + 1);
|
|
21
|
+
if (!NAMESPACE_PATTERN.test(namespace) || !PATH_PATTERN.test(path)) return void 0;
|
|
22
|
+
return `${namespace}:${path}`;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Parses the argument of a `/function` call or a function tag entry.
|
|
26
|
+
*
|
|
27
|
+
* @returns The reference, or undefined when the text is not a legal id.
|
|
28
|
+
*/
|
|
29
|
+
var parseFunctionReference = (text) => {
|
|
30
|
+
const tag = text.startsWith("#");
|
|
31
|
+
const id = normalizeIdentifier(tag ? text.slice(1) : text);
|
|
32
|
+
if (id === void 0) return void 0;
|
|
33
|
+
return {
|
|
34
|
+
kind: tag ? "tag" : "function",
|
|
35
|
+
id
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
/** The file extension of a function file. */
|
|
39
|
+
var FUNCTION_EXTENSION = ".mcfunction";
|
|
40
|
+
/**
|
|
41
|
+
* Derives a function id from a pack-relative path, following the 26.3 layout
|
|
42
|
+
* `data/<namespace>/function/<path>.mcfunction`.
|
|
43
|
+
*
|
|
44
|
+
* @returns The namespaced id, or undefined when the path is not a function file.
|
|
45
|
+
*/
|
|
46
|
+
var functionIdForPath = (path) => {
|
|
47
|
+
if (!path.startsWith("data/") || !path.endsWith(".mcfunction")) return void 0;
|
|
48
|
+
const [namespace, folder, ...rest] = path.slice(5, -11).split("/");
|
|
49
|
+
if (!namespace || folder !== "function" || rest.length === 0) return void 0;
|
|
50
|
+
if (!NAMESPACE_PATTERN.test(namespace)) return void 0;
|
|
51
|
+
const idPath = rest.join("/");
|
|
52
|
+
if (!PATH_PATTERN.test(idPath)) return void 0;
|
|
53
|
+
return `${namespace}:${idPath}`;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Derives a function tag id from a pack-relative path, following
|
|
57
|
+
* `data/<namespace>/tags/function/<path>.json`.
|
|
58
|
+
*
|
|
59
|
+
* @returns The namespaced tag id without a `#`, or undefined when the path is not a function tag.
|
|
60
|
+
*/
|
|
61
|
+
var functionTagIdForPath = (path) => {
|
|
62
|
+
if (!path.startsWith("data/") || !path.endsWith(".json")) return void 0;
|
|
63
|
+
const [namespace, folder, registry, ...rest] = path.slice(5, -5).split("/");
|
|
64
|
+
if (!namespace || folder !== "tags" || registry !== "function" || rest.length === 0) return void 0;
|
|
65
|
+
if (!NAMESPACE_PATTERN.test(namespace)) return void 0;
|
|
66
|
+
const idPath = rest.join("/");
|
|
67
|
+
if (!PATH_PATTERN.test(idPath)) return void 0;
|
|
68
|
+
return `${namespace}:${idPath}`;
|
|
69
|
+
};
|
|
70
|
+
export { DEFAULT_NAMESPACE, FUNCTION_EXTENSION, functionIdForPath, functionTagIdForPath, normalizeIdentifier, parseFunctionReference };
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpZmllcnMuZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2lkZW50aWZpZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTmFtZXNwYWNlZCBpZHMgYXMgYC9mdW5jdGlvbmAgYW5kIHRoZSBmdW5jdGlvbiB0YWcgZmlsZXMgdXNlIHRoZW0uIEFcbiAqIHJlZmVyZW5jZSBpcyBlaXRoZXIgYSBmdW5jdGlvbiBpZCAoYG1pbmVjcmFmdDpmb28vYmFyYCkgb3IgYSB0YWcgaWQgd3JpdHRlblxuICogd2l0aCBhIGxlYWRpbmcgYCNgIChgI21pbmVjcmFmdDp0aWNrYCk7IGJvdGggZGVmYXVsdCB0byB0aGUgYG1pbmVjcmFmdGBcbiAqIG5hbWVzcGFjZSB3aGVuIHRoZSBjb2xvbiBpcyBsZWZ0IG91dC5cbiAqL1xuXG5jb25zdCBOQU1FU1BBQ0VfUEFUVEVSTiA9IC9eW2EtejAtOV8uLV0rJC87XG5jb25zdCBQQVRIX1BBVFRFUk4gPSAvXlthLXowLTlfLi8tXSskLztcblxuLyoqIFRoZSBuYW1lc3BhY2UgYW4gaWQgd2l0aG91dCBhIGNvbG9uIGJlbG9uZ3MgdG8uICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9OQU1FU1BBQ0UgPSAnbWluZWNyYWZ0JztcblxuLyoqIEEgcGFyc2VkIHJlZmVyZW5jZSB0byBlaXRoZXIgb25lIGZ1bmN0aW9uIG9yIGEgZnVuY3Rpb24gdGFnLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvblJlZmVyZW5jZSB7XG4gICAgLyoqIFdoZXRoZXIgdGhlIHJlZmVyZW5jZSBuYW1lZCBhIHRhZyAoYCNuYW1lc3BhY2U6cGF0aGApIG9yIGEgc2luZ2xlIGZ1bmN0aW9uLiAqL1xuICAgIGtpbmQ6ICdmdW5jdGlvbicgfCAndGFnJztcbiAgICAvKiogVGhlIG5hbWVzcGFjZWQgaWQsIGFsd2F5cyB3aXRoIGFuIGV4cGxpY2l0IG5hbWVzcGFjZSBhbmQgd2l0aG91dCB0aGUgYCNgLiAqL1xuICAgIGlkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIG5hbWVzcGFjZWQgaWQsIGZpbGxpbmcgaW4gdGhlIGRlZmF1bHQgbmFtZXNwYWNlLlxuICpcbiAqIEByZXR1cm5zIFRoZSBgbmFtZXNwYWNlOnBhdGhgIGZvcm0sIG9yIHVuZGVmaW5lZCB3aGVuIGVpdGhlciBoYWxmIGlzIG5vdCBhIGxlZ2FsIGlkLlxuICovXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplSWRlbnRpZmllciA9ICh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGNvbG9uID0gdGV4dC5pbmRleE9mKCc6Jyk7XG4gICAgY29uc3QgbmFtZXNwYWNlID0gY29sb24gPT09IC0xID8gREVGQVVMVF9OQU1FU1BBQ0UgOiB0ZXh0LnNsaWNlKDAsIGNvbG9uKTtcbiAgICBjb25zdCBwYXRoID0gY29sb24gPT09IC0xID8gdGV4dCA6IHRleHQuc2xpY2UoY29sb24gKyAxKTtcbiAgICBpZiAoIU5BTUVTUEFDRV9QQVRURVJOLnRlc3QobmFtZXNwYWNlKSB8fCAhUEFUSF9QQVRURVJOLnRlc3QocGF0aCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGAke25hbWVzcGFjZX06JHtwYXRofWA7XG59O1xuXG4vKipcbiAqIFBhcnNlcyB0aGUgYXJndW1lbnQgb2YgYSBgL2Z1bmN0aW9uYCBjYWxsIG9yIGEgZnVuY3Rpb24gdGFnIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIFRoZSByZWZlcmVuY2UsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSB0ZXh0IGlzIG5vdCBhIGxlZ2FsIGlkLlxuICovXG5leHBvcnQgY29uc3QgcGFyc2VGdW5jdGlvblJlZmVyZW5jZSA9ICh0ZXh0OiBzdHJpbmcpOiBGdW5jdGlvblJlZmVyZW5jZSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgdGFnID0gdGV4dC5zdGFydHNXaXRoKCcjJyk7XG4gICAgY29uc3QgaWQgPSBub3JtYWxpemVJZGVudGlmaWVyKHRhZyA/IHRleHQuc2xpY2UoMSkgOiB0ZXh0KTtcbiAgICBpZiAoaWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyBraW5kOiB0YWcgPyAndGFnJyA6ICdmdW5jdGlvbicsIGlkIH07XG59O1xuXG4vKiogVGhlIGZpbGUgZXh0ZW5zaW9uIG9mIGEgZnVuY3Rpb24gZmlsZS4gKi9cbmV4cG9ydCBjb25zdCBGVU5DVElPTl9FWFRFTlNJT04gPSAnLm1jZnVuY3Rpb24nO1xuXG4vKipcbiAqIERlcml2ZXMgYSBmdW5jdGlvbiBpZCBmcm9tIGEgcGFjay1yZWxhdGl2ZSBwYXRoLCBmb2xsb3dpbmcgdGhlIDI2LjMgbGF5b3V0XG4gKiBgZGF0YS88bmFtZXNwYWNlPi9mdW5jdGlvbi88cGF0aD4ubWNmdW5jdGlvbmAuXG4gKlxuICogQHJldHVybnMgVGhlIG5hbWVzcGFjZWQgaWQsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBwYXRoIGlzIG5vdCBhIGZ1bmN0aW9uIGZpbGUuXG4gKi9cbmV4cG9ydCBjb25zdCBmdW5jdGlvbklkRm9yUGF0aCA9IChwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCdkYXRhLycpIHx8ICFwYXRoLmVuZHNXaXRoKEZVTkNUSU9OX0VYVEVOU0lPTikpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc2xpY2UoJ2RhdGEvJy5sZW5ndGgsIC1GVU5DVElPTl9FWFRFTlNJT04ubGVuZ3RoKS5zcGxpdCgnLycpO1xuICAgIGNvbnN0IFtuYW1lc3BhY2UsIGZvbGRlciwgLi4ucmVzdF0gPSBzZWdtZW50cztcbiAgICBpZiAoIW5hbWVzcGFjZSB8fCBmb2xkZXIgIT09ICdmdW5jdGlvbicgfHwgcmVzdC5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKCFOQU1FU1BBQ0VfUEFUVEVSTi50ZXN0KG5hbWVzcGFjZSkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBpZFBhdGggPSByZXN0LmpvaW4oJy8nKTtcbiAgICBpZiAoIVBBVEhfUEFUVEVSTi50ZXN0KGlkUGF0aCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGAke25hbWVzcGFjZX06JHtpZFBhdGh9YDtcbn07XG5cbi8qKlxuICogRGVyaXZlcyBhIGZ1bmN0aW9uIHRhZyBpZCBmcm9tIGEgcGFjay1yZWxhdGl2ZSBwYXRoLCBmb2xsb3dpbmdcbiAqIGBkYXRhLzxuYW1lc3BhY2U+L3RhZ3MvZnVuY3Rpb24vPHBhdGg+Lmpzb25gLlxuICpcbiAqIEByZXR1cm5zIFRoZSBuYW1lc3BhY2VkIHRhZyBpZCB3aXRob3V0IGEgYCNgLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgcGF0aCBpcyBub3QgYSBmdW5jdGlvbiB0YWcuXG4gKi9cbmV4cG9ydCBjb25zdCBmdW5jdGlvblRhZ0lkRm9yUGF0aCA9IChwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmICghcGF0aC5zdGFydHNXaXRoKCdkYXRhLycpIHx8ICFwYXRoLmVuZHNXaXRoKCcuanNvbicpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNsaWNlKCdkYXRhLycubGVuZ3RoLCAtJy5qc29uJy5sZW5ndGgpLnNwbGl0KCcvJyk7XG4gICAgY29uc3QgW25hbWVzcGFjZSwgZm9sZGVyLCByZWdpc3RyeSwgLi4ucmVzdF0gPSBzZWdtZW50cztcbiAgICBpZiAoIW5hbWVzcGFjZSB8fCBmb2xkZXIgIT09ICd0YWdzJyB8fCByZWdpc3RyeSAhPT0gJ2Z1bmN0aW9uJyB8fCByZXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoIU5BTUVTUEFDRV9QQVRURVJOLnRlc3QobmFtZXNwYWNlKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGlkUGF0aCA9IHJlc3Quam9pbignLycpO1xuICAgIGlmICghUEFUSF9QQVRURVJOLnRlc3QoaWRQYXRoKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYCR7bmFtZXNwYWNlfToke2lkUGF0aH1gO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQU9BLElBQU0sb0JBQW9CO0FBQzFCLElBQU0sZUFBZTs7QUFHckIsSUFBYSxvQkFBb0I7Ozs7OztBQWVqQyxJQUFhLHVCQUF1QixTQUFxQztDQUNyRSxNQUFNLFFBQVEsS0FBSyxRQUFRLEdBQUc7Q0FDOUIsTUFBTSxZQUFZLFVBQVUsS0FBSyxvQkFBb0IsS0FBSyxNQUFNLEdBQUcsS0FBSztDQUN4RSxNQUFNLE9BQU8sVUFBVSxLQUFLLE9BQU8sS0FBSyxNQUFNLFFBQVEsQ0FBQztDQUN2RCxJQUFJLENBQUMsa0JBQWtCLEtBQUssU0FBUyxLQUFLLENBQUMsYUFBYSxLQUFLLElBQUksR0FBRyxPQUFPLEtBQUE7Q0FDM0UsT0FBTyxHQUFHLFVBQVUsR0FBRztBQUMzQjs7Ozs7O0FBT0EsSUFBYSwwQkFBMEIsU0FBZ0Q7Q0FDbkYsTUFBTSxNQUFNLEtBQUssV0FBVyxHQUFHO0NBQy9CLE1BQU0sS0FBSyxvQkFBb0IsTUFBTSxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUk7Q0FDekQsSUFBSSxPQUFPLEtBQUEsR0FBVyxPQUFPLEtBQUE7Q0FDN0IsT0FBTztFQUFFLE1BQU0sTUFBTSxRQUFRO0VBQVk7Q0FBRztBQUNoRDs7QUFHQSxJQUFhLHFCQUFxQjs7Ozs7OztBQVFsQyxJQUFhLHFCQUFxQixTQUFxQztDQUNuRSxJQUFJLENBQUMsS0FBSyxXQUFXLE9BQU8sS0FBSyxDQUFDLEtBQUssU0FBQSxhQUEyQixHQUFHLE9BQU8sS0FBQTtDQUc1RSxNQUFNLENBQUMsV0FBVyxRQUFRLEdBQUcsUUFEWixLQUFLLE1BQU0sR0FBZ0IsR0FBMEIsQ0FBQyxDQUFDLE1BQU0sR0FDekM7Q0FDckMsSUFBSSxDQUFDLGFBQWEsV0FBVyxjQUFjLEtBQUssV0FBVyxHQUFHLE9BQU8sS0FBQTtDQUNyRSxJQUFJLENBQUMsa0JBQWtCLEtBQUssU0FBUyxHQUFHLE9BQU8sS0FBQTtDQUUvQyxNQUFNLFNBQVMsS0FBSyxLQUFLLEdBQUc7Q0FDNUIsSUFBSSxDQUFDLGFBQWEsS0FBSyxNQUFNLEdBQUcsT0FBTyxLQUFBO0NBQ3ZDLE9BQU8sR0FBRyxVQUFVLEdBQUc7QUFDM0I7Ozs7Ozs7QUFRQSxJQUFhLHdCQUF3QixTQUFxQztDQUN0RSxJQUFJLENBQUMsS0FBSyxXQUFXLE9BQU8sS0FBSyxDQUFDLEtBQUssU0FBUyxPQUFPLEdBQUcsT0FBTyxLQUFBO0NBR2pFLE1BQU0sQ0FBQyxXQUFXLFFBQVEsVUFBVSxHQUFHLFFBRHRCLEtBQUssTUFBTSxHQUFnQixFQUFlLENBQUMsQ0FBQyxNQUFNLEdBQ3BCO0NBQy9DLElBQUksQ0FBQyxhQUFhLFdBQVcsVUFBVSxhQUFhLGNBQWMsS0FBSyxXQUFXLEdBQUcsT0FBTyxLQUFBO0NBQzVGLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxTQUFTLEdBQUcsT0FBTyxLQUFBO0NBRS9DLE1BQU0sU0FBUyxLQUFLLEtBQUssR0FBRztDQUM1QixJQUFJLENBQUMsYUFBYSxLQUFLLE1BQU0sR0FBRyxPQUFPLEtBQUE7Q0FDdkMsT0FBTyxHQUFHLFVBQVUsR0FBRztBQUMzQiJ9
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const require_identifiers = require("./identifiers.cjs.cjs");
|
|
4
|
+
const require_tags = require("./tags.cjs.cjs");
|
|
5
|
+
const require_runner = require("./runner.cjs.cjs");
|
|
6
|
+
const require_macro = require("./macro.cjs.cjs");
|
|
7
|
+
const require_parse = require("./parse.cjs.cjs");
|
|
8
|
+
const require_compile = require("./compile.cjs.cjs");
|
|
9
|
+
const require_diagnostics = require("./diagnostics.cjs.cjs");
|
|
10
|
+
const require_registry = require("./registry.cjs.cjs");
|
|
11
|
+
const require_executor = require("./executor.cjs.cjs");
|
|
12
|
+
exports.BEDROCK_MAX_COMMANDS_PER_FUNCTION = require_executor.BEDROCK_MAX_COMMANDS_PER_FUNCTION;
|
|
13
|
+
exports.CompiledFunction = require_compile.CompiledFunction;
|
|
14
|
+
exports.DEFAULT_EXECUTION_LIMITS = require_executor.DEFAULT_EXECUTION_LIMITS;
|
|
15
|
+
exports.DEFAULT_NAMESPACE = require_identifiers.DEFAULT_NAMESPACE;
|
|
16
|
+
exports.DiagnosticCollector = require_diagnostics.DiagnosticCollector;
|
|
17
|
+
exports.FUNCTION_EXTENSION = require_identifiers.FUNCTION_EXTENSION;
|
|
18
|
+
exports.FunctionExecutor = require_executor.FunctionExecutor;
|
|
19
|
+
exports.FunctionRegistry = require_registry.FunctionRegistry;
|
|
20
|
+
exports.FunctionTagRegistry = require_tags.FunctionTagRegistry;
|
|
21
|
+
exports.LOAD_FUNCTION_TAG = require_tags.LOAD_FUNCTION_TAG;
|
|
22
|
+
exports.MACRO_CACHE_ENTRIES = require_compile.MACRO_CACHE_ENTRIES;
|
|
23
|
+
exports.MAX_COMMAND_LENGTH = require_parse.MAX_COMMAND_LENGTH;
|
|
24
|
+
exports.RecordingCommandRunner = require_runner.RecordingCommandRunner;
|
|
25
|
+
exports.TICK_FUNCTION_TAG = require_tags.TICK_FUNCTION_TAG;
|
|
26
|
+
exports.compileFunction = require_compile.compileFunction;
|
|
27
|
+
exports.compileMacroLine = require_macro.compileMacroLine;
|
|
28
|
+
exports.functionIdForPath = require_identifiers.functionIdForPath;
|
|
29
|
+
exports.functionTagIdForPath = require_identifiers.functionTagIdForPath;
|
|
30
|
+
exports.loadFunctions = require_registry.loadFunctions;
|
|
31
|
+
exports.normalizeIdentifier = require_identifiers.normalizeIdentifier;
|
|
32
|
+
exports.parseFunctionReference = require_identifiers.parseFunctionReference;
|
|
33
|
+
exports.parseFunctionSource = require_parse.parseFunctionSource;
|
|
34
|
+
exports.renderMacroValue = require_macro.renderMacroValue;
|
|
35
|
+
exports.resolveFunctionTag = require_tags.resolveFunctionTag;
|
|
36
|
+
exports.substituteMacro = require_macro.substituteMacro;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './compile';
|
|
2
|
+
export * from './diagnostics';
|
|
3
|
+
export * from './executor';
|
|
4
|
+
export * from './identifiers';
|
|
5
|
+
export * from './macro';
|
|
6
|
+
export * from './parse';
|
|
7
|
+
export * from './registry';
|
|
8
|
+
export * from './runner';
|
|
9
|
+
export * from './tags';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC"}
|
package/dist/index.es.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DEFAULT_NAMESPACE, FUNCTION_EXTENSION, functionIdForPath, functionTagIdForPath, normalizeIdentifier, parseFunctionReference } from "./identifiers.es.js";
|
|
2
|
+
import { FunctionTagRegistry, LOAD_FUNCTION_TAG, TICK_FUNCTION_TAG, resolveFunctionTag } from "./tags.es.js";
|
|
3
|
+
import { RecordingCommandRunner } from "./runner.es.js";
|
|
4
|
+
import { compileMacroLine, renderMacroValue, substituteMacro } from "./macro.es.js";
|
|
5
|
+
import { MAX_COMMAND_LENGTH, parseFunctionSource } from "./parse.es.js";
|
|
6
|
+
import { CompiledFunction, MACRO_CACHE_ENTRIES, compileFunction } from "./compile.es.js";
|
|
7
|
+
import { DiagnosticCollector } from "./diagnostics.es.js";
|
|
8
|
+
import { FunctionRegistry, loadFunctions } from "./registry.es.js";
|
|
9
|
+
import { BEDROCK_MAX_COMMANDS_PER_FUNCTION, DEFAULT_EXECUTION_LIMITS, FunctionExecutor } from "./executor.es.js";
|
|
10
|
+
export { BEDROCK_MAX_COMMANDS_PER_FUNCTION, CompiledFunction, DEFAULT_EXECUTION_LIMITS, DEFAULT_NAMESPACE, DiagnosticCollector, FUNCTION_EXTENSION, FunctionExecutor, FunctionRegistry, FunctionTagRegistry, LOAD_FUNCTION_TAG, MACRO_CACHE_ENTRIES, MAX_COMMAND_LENGTH, RecordingCommandRunner, TICK_FUNCTION_TAG, compileFunction, compileMacroLine, functionIdForPath, functionTagIdForPath, loadFunctions, normalizeIdentifier, parseFunctionReference, parseFunctionSource, renderMacroValue, resolveFunctionTag, substituteMacro };
|