@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.
Files changed (44) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/LICENSE +373 -0
  3. package/README.md +181 -2
  4. package/dist/compile.cjs.cjs +166 -0
  5. package/dist/compile.d.ts +91 -0
  6. package/dist/compile.d.ts.map +1 -0
  7. package/dist/compile.es.js +162 -0
  8. package/dist/diagnostics.cjs.cjs +19 -0
  9. package/dist/diagnostics.d.ts +62 -0
  10. package/dist/diagnostics.d.ts.map +1 -0
  11. package/dist/diagnostics.es.js +17 -0
  12. package/dist/executor.cjs.cjs +302 -0
  13. package/dist/executor.d.ts +140 -0
  14. package/dist/executor.d.ts.map +1 -0
  15. package/dist/executor.es.js +298 -0
  16. package/dist/identifiers.cjs.cjs +79 -0
  17. package/dist/identifiers.d.ts +44 -0
  18. package/dist/identifiers.d.ts.map +1 -0
  19. package/dist/identifiers.es.js +72 -0
  20. package/dist/index.cjs.cjs +36 -0
  21. package/dist/index.d.ts +10 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.es.js +10 -0
  24. package/dist/macro.cjs.cjs +119 -0
  25. package/dist/macro.d.ts +59 -0
  26. package/dist/macro.d.ts.map +1 -0
  27. package/dist/macro.es.js +115 -0
  28. package/dist/parse.cjs.cjs +107 -0
  29. package/dist/parse.d.ts +40 -0
  30. package/dist/parse.d.ts.map +1 -0
  31. package/dist/parse.es.js +104 -0
  32. package/dist/registry.cjs.cjs +135 -0
  33. package/dist/registry.d.ts +53 -0
  34. package/dist/registry.d.ts.map +1 -0
  35. package/dist/registry.es.js +132 -0
  36. package/dist/runner.cjs.cjs +42 -0
  37. package/dist/runner.d.ts +83 -0
  38. package/dist/runner.d.ts.map +1 -0
  39. package/dist/runner.es.js +40 -0
  40. package/dist/tags.cjs.cjs +113 -0
  41. package/dist/tags.d.ts +70 -0
  42. package/dist/tags.d.ts.map +1 -0
  43. package/dist/tags.es.js +108 -0
  44. 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;
@@ -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"}
@@ -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 };