@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,166 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const require_macro = require("./macro.cjs.cjs");
4
+ const require_parse = require("./parse.cjs.cjs");
5
+ // src/compile.ts
6
+ /**
7
+ * How many argument sets one macro function remembers. Java's
8
+ * `MacroFunction` carries 8 as its only integer constant, and caches only the
9
+ * values the macro actually references, so extra entries in the compound do
10
+ * not split the cache.
11
+ */
12
+ var MACRO_CACHE_ENTRIES = 8;
13
+ /**
14
+ * A function file ready to run. Instances come from {@link compileFunction}
15
+ * and are shared by every call, including the macro cache.
16
+ */
17
+ var CompiledFunction = class {
18
+ id;
19
+ lines;
20
+ /** Whether any line of the function is a macro line, so calls need arguments. */
21
+ macro;
22
+ /** Every variable the function substitutes, once each, in first-use order. */
23
+ variables;
24
+ cache = /* @__PURE__ */ new Map();
25
+ plain;
26
+ constructor(id, lines) {
27
+ this.id = id;
28
+ this.lines = lines;
29
+ this.macro = lines.some((line) => "template" in line);
30
+ const variables = [];
31
+ for (const line of lines) {
32
+ if (!("template" in line)) continue;
33
+ for (const variable of line.template.variables) if (!variables.includes(variable)) variables.push(variable);
34
+ }
35
+ this.variables = variables;
36
+ this.plain = this.macro ? void 0 : lines.flatMap((line) => "command" in line ? [{
37
+ command: line.command,
38
+ line: line.line
39
+ }] : []);
40
+ }
41
+ /** How many commands the function declares. */
42
+ get length() {
43
+ return this.lines.length;
44
+ }
45
+ /**
46
+ * Produces the commands one call runs.
47
+ *
48
+ * A plain function ignores the arguments, the way the Java server
49
+ * silently ignores a compound passed to a non-macro function. A macro
50
+ * function needs one entry per variable it substitutes and reports the
51
+ * first entry it is missing; the Java server skips the whole call in that
52
+ * case, and so does {@link FunctionExecutor}.
53
+ */
54
+ instantiate(args) {
55
+ if (this.plain) return {
56
+ ok: true,
57
+ commands: this.plain
58
+ };
59
+ if (args === void 0) return {
60
+ ok: false,
61
+ message: `${this.id} is a macro function and was called without arguments`
62
+ };
63
+ for (const variable of this.variables) {
64
+ const value = args[variable];
65
+ if (value === void 0 || value === null) return {
66
+ ok: false,
67
+ message: `the macro arguments have no entry for '${variable}'`
68
+ };
69
+ }
70
+ const key = JSON.stringify(this.variables.map((variable) => args[variable] ?? null));
71
+ const cached = this.cache.get(key);
72
+ if (cached) {
73
+ this.cache.delete(key);
74
+ this.cache.set(key, cached);
75
+ return {
76
+ ok: true,
77
+ commands: cached
78
+ };
79
+ }
80
+ const commands = [];
81
+ for (const line of this.lines) {
82
+ if ("command" in line) {
83
+ commands.push({
84
+ command: line.command,
85
+ line: line.line
86
+ });
87
+ continue;
88
+ }
89
+ const substituted = require_macro.substituteMacro(line.template, args);
90
+ if (!substituted.ok) return {
91
+ ok: false,
92
+ message: substituted.message,
93
+ line: line.line
94
+ };
95
+ commands.push({
96
+ command: substituted.command,
97
+ line: line.line
98
+ });
99
+ }
100
+ this.cache.set(key, commands);
101
+ if (this.cache.size > 8) {
102
+ const oldest = this.cache.keys().next();
103
+ if (!oldest.done) this.cache.delete(oldest.value);
104
+ }
105
+ return {
106
+ ok: true,
107
+ commands
108
+ };
109
+ }
110
+ /** How many argument sets the macro cache currently holds. */
111
+ get cachedArgumentSets() {
112
+ return this.cache.size;
113
+ }
114
+ };
115
+ /**
116
+ * Compiles one function file.
117
+ *
118
+ * A file with any error does not produce a function, matching the Java
119
+ * server, where a file that fails `CommandFunction.fromLines` is logged and
120
+ * left out of the function library rather than partly loaded.
121
+ *
122
+ * @param id - The namespaced id the file loads under.
123
+ * @param source - The text of the `.mcfunction` file.
124
+ */
125
+ var compileFunction = (id, source) => {
126
+ const parsed = require_parse.parseFunctionSource(source);
127
+ const diagnostics = parsed.diagnostics.map((diagnostic) => ({
128
+ ...diagnostic,
129
+ functionId: id
130
+ }));
131
+ const lines = [];
132
+ for (const line of parsed.lines) {
133
+ if (!line.macro) {
134
+ lines.push({
135
+ line: line.line,
136
+ command: line.command
137
+ });
138
+ continue;
139
+ }
140
+ const compiled = require_macro.compileMacroLine(line.command);
141
+ if (!compiled.ok) {
142
+ diagnostics.push({
143
+ severity: "error",
144
+ code: "macro.invalid",
145
+ functionId: id,
146
+ line: line.line,
147
+ message: compiled.message
148
+ });
149
+ continue;
150
+ }
151
+ lines.push({
152
+ line: line.line,
153
+ template: compiled.template
154
+ });
155
+ }
156
+ if (diagnostics.some((diagnostic) => diagnostic.severity === "error")) return { diagnostics };
157
+ return {
158
+ function: new CompiledFunction(id, lines),
159
+ diagnostics
160
+ };
161
+ };
162
+ exports.CompiledFunction = CompiledFunction;
163
+ exports.MACRO_CACHE_ENTRIES = MACRO_CACHE_ENTRIES;
164
+ exports.compileFunction = compileFunction;
165
+
166
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZS5janMuY2pzIiwibmFtZXMiOlsic3Vic3RpdHV0ZU1hY3JvIiwicGFyc2VGdW5jdGlvblNvdXJjZSIsImNvbXBpbGVNYWNyb0xpbmUiXSwic291cmNlcyI6WyIuLi9zcmMvY29tcGlsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgZnVuY3Rpb24gZmlsZSBjb21waWxlZCBvbmNlIGludG8gdGhlIGNvbW1hbmRzIGEgY2FsbCBydW5zLiBBIHBsYWluXG4gKiBmdW5jdGlvbiBpcyBpbnN0YW50aWF0ZWQgZm9yIGZyZWUsIGV2ZXJ5IGNhbGwgc2hhcmluZyB0aGUgc2FtZSBsaW5lcy4gQVxuICogbWFjcm8gZnVuY3Rpb24gcmUtaW5zdGFudGlhdGVzIHBlciBhcmd1bWVudCBzZXQsIHNvIGl0IGtlZXBzIGEgc21hbGwgY2FjaGVcbiAqIG9mIHJlY2VudCBzZXRzLCB3aGljaCBpcyB3aGF0IG1ha2VzIHJlcGVhdGVkIGNhbGxzIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzXG4gKiBjaGVhcGVyIHRoYW4gbmV3IG9uZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEaWFnbm9zdGljIH0gZnJvbSAnLi9kaWFnbm9zdGljcyc7XG5pbXBvcnQgdHlwZSB7IE1hY3JvQXJndW1lbnRzLCBNYWNyb1RlbXBsYXRlIH0gZnJvbSAnLi9tYWNybyc7XG5pbXBvcnQgeyBjb21waWxlTWFjcm9MaW5lLCBzdWJzdGl0dXRlTWFjcm8gfSBmcm9tICcuL21hY3JvJztcbmltcG9ydCB7IHBhcnNlRnVuY3Rpb25Tb3VyY2UgfSBmcm9tICcuL3BhcnNlJztcblxuLyoqXG4gKiBIb3cgbWFueSBhcmd1bWVudCBzZXRzIG9uZSBtYWNybyBmdW5jdGlvbiByZW1lbWJlcnMuIEphdmEnc1xuICogYE1hY3JvRnVuY3Rpb25gIGNhcnJpZXMgOCBhcyBpdHMgb25seSBpbnRlZ2VyIGNvbnN0YW50LCBhbmQgY2FjaGVzIG9ubHkgdGhlXG4gKiB2YWx1ZXMgdGhlIG1hY3JvIGFjdHVhbGx5IHJlZmVyZW5jZXMsIHNvIGV4dHJhIGVudHJpZXMgaW4gdGhlIGNvbXBvdW5kIGRvXG4gKiBub3Qgc3BsaXQgdGhlIGNhY2hlLlxuICovXG5leHBvcnQgY29uc3QgTUFDUk9fQ0FDSEVfRU5UUklFUyA9IDg7XG5cbi8qKiBPbmUgY29tbWFuZCBhIGNhbGwgaXMgYWJvdXQgdG8gcnVuLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0YW50aWF0ZWRDb21tYW5kIHtcbiAgICAvKiogVGhlIGNvbW1hbmQgdGV4dCwgd2l0aCBldmVyeSBtYWNybyBzdWJzdGl0dXRpb24gYWxyZWFkeSBmaWxsZWQgaW4uICovXG4gICAgY29tbWFuZDogc3RyaW5nO1xuICAgIC8qKiBUaGUgMS1iYXNlZCBsaW5lIG9mIHRoZSBmdW5jdGlvbiBmaWxlIHRoZSBjb21tYW5kIGNhbWUgZnJvbS4gKi9cbiAgICBsaW5lOiBudW1iZXI7XG59XG5cbi8qKiBUaGUgb3V0Y29tZSBvZiBpbnN0YW50aWF0aW5nIGEgZnVuY3Rpb24gZm9yIG9uZSBjYWxsLiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFudGlhdGlvblJlc3VsdCA9XG4gICAgeyBvazogdHJ1ZTsgY29tbWFuZHM6IHJlYWRvbmx5IEluc3RhbnRpYXRlZENvbW1hbmRbXSB9IHwgeyBvazogZmFsc2U7IG1lc3NhZ2U6IHN0cmluZzsgbGluZT86IG51bWJlciB9O1xuXG4vKiogT25lIGNvbXBpbGVkIGxpbmU6IGZpeGVkIHRleHQsIG9yIGEgdGVtcGxhdGUgd2FpdGluZyBmb3IgYXJndW1lbnRzLiAqL1xudHlwZSBDb21waWxlZExpbmUgPSB7IGxpbmU6IG51bWJlcjsgY29tbWFuZDogc3RyaW5nIH0gfCB7IGxpbmU6IG51bWJlcjsgdGVtcGxhdGU6IE1hY3JvVGVtcGxhdGUgfTtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIGZpbGUgcmVhZHkgdG8gcnVuLiBJbnN0YW5jZXMgY29tZSBmcm9tIHtAbGluayBjb21waWxlRnVuY3Rpb259XG4gKiBhbmQgYXJlIHNoYXJlZCBieSBldmVyeSBjYWxsLCBpbmNsdWRpbmcgdGhlIG1hY3JvIGNhY2hlLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcGlsZWRGdW5jdGlvbiB7XG4gICAgLyoqIFdoZXRoZXIgYW55IGxpbmUgb2YgdGhlIGZ1bmN0aW9uIGlzIGEgbWFjcm8gbGluZSwgc28gY2FsbHMgbmVlZCBhcmd1bWVudHMuICovXG4gICAgcHVibGljIHJlYWRvbmx5IG1hY3JvOiBib29sZWFuO1xuXG4gICAgLyoqIEV2ZXJ5IHZhcmlhYmxlIHRoZSBmdW5jdGlvbiBzdWJzdGl0dXRlcywgb25jZSBlYWNoLCBpbiBmaXJzdC11c2Ugb3JkZXIuICovXG4gICAgcHVibGljIHJlYWRvbmx5IHZhcmlhYmxlczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHJlYWRvbmx5IEluc3RhbnRpYXRlZENvbW1hbmRbXT4oKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGxhaW46IHJlYWRvbmx5IEluc3RhbnRpYXRlZENvbW1hbmRbXSB8IHVuZGVmaW5lZDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgLyoqIFRoZSBuYW1lc3BhY2VkIGlkIHRoZSBmdW5jdGlvbiBpcyByZWdpc3RlcmVkIHVuZGVyLiAqL1xuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBsaW5lczogcmVhZG9ubHkgQ29tcGlsZWRMaW5lW11cbiAgICApIHtcbiAgICAgICAgdGhpcy5tYWNybyA9IGxpbmVzLnNvbWUoKGxpbmUpID0+ICd0ZW1wbGF0ZScgaW4gbGluZSk7XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgICAgICBpZiAoISgndGVtcGxhdGUnIGluIGxpbmUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFyaWFibGUgb2YgbGluZS50ZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlcy5pbmNsdWRlcyh2YXJpYWJsZSkpIHZhcmlhYmxlcy5wdXNoKHZhcmlhYmxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhcmlhYmxlcyA9IHZhcmlhYmxlcztcbiAgICAgICAgdGhpcy5wbGFpbiA9IHRoaXMubWFjcm9cbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IGxpbmVzLmZsYXRNYXAoKGxpbmUpID0+ICgnY29tbWFuZCcgaW4gbGluZSA/IFt7IGNvbW1hbmQ6IGxpbmUuY29tbWFuZCwgbGluZTogbGluZS5saW5lIH1dIDogW10pKTtcbiAgICB9XG5cbiAgICAvKiogSG93IG1hbnkgY29tbWFuZHMgdGhlIGZ1bmN0aW9uIGRlY2xhcmVzLiAqL1xuICAgIHB1YmxpYyBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyB0aGUgY29tbWFuZHMgb25lIGNhbGwgcnVucy5cbiAgICAgKlxuICAgICAqIEEgcGxhaW4gZnVuY3Rpb24gaWdub3JlcyB0aGUgYXJndW1lbnRzLCB0aGUgd2F5IHRoZSBKYXZhIHNlcnZlclxuICAgICAqIHNpbGVudGx5IGlnbm9yZXMgYSBjb21wb3VuZCBwYXNzZWQgdG8gYSBub24tbWFjcm8gZnVuY3Rpb24uIEEgbWFjcm9cbiAgICAgKiBmdW5jdGlvbiBuZWVkcyBvbmUgZW50cnkgcGVyIHZhcmlhYmxlIGl0IHN1YnN0aXR1dGVzIGFuZCByZXBvcnRzIHRoZVxuICAgICAqIGZpcnN0IGVudHJ5IGl0IGlzIG1pc3Npbmc7IHRoZSBKYXZhIHNlcnZlciBza2lwcyB0aGUgd2hvbGUgY2FsbCBpbiB0aGF0XG4gICAgICogY2FzZSwgYW5kIHNvIGRvZXMge0BsaW5rIEZ1bmN0aW9uRXhlY3V0b3J9LlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnN0YW50aWF0ZShhcmdzPzogTWFjcm9Bcmd1bWVudHMpOiBJbnN0YW50aWF0aW9uUmVzdWx0IHtcbiAgICAgICAgaWYgKHRoaXMucGxhaW4pIHJldHVybiB7IG9rOiB0cnVlLCBjb21tYW5kczogdGhpcy5wbGFpbiB9O1xuXG4gICAgICAgIGlmIChhcmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGAke3RoaXMuaWR9IGlzIGEgbWFjcm8gZnVuY3Rpb24gYW5kIHdhcyBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHNgXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB2YXJpYWJsZSBvZiB0aGlzLnZhcmlhYmxlcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhcmdzW3ZhcmlhYmxlXTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgdGhlIG1hY3JvIGFyZ3VtZW50cyBoYXZlIG5vIGVudHJ5IGZvciAnJHt2YXJpYWJsZX0nYCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkodGhpcy52YXJpYWJsZXMubWFwKCh2YXJpYWJsZSkgPT4gYXJnc1t2YXJpYWJsZV0gPz8gbnVsbCkpO1xuICAgICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgICAgICAvLyBSZS1pbnNlcnQgdG8gbWFrZSB0aGlzIHRoZSBtb3N0IHJlY2VudCBzZXQsIHNvIHRoZSBldmljdGlvbiBiZWxvd1xuICAgICAgICAgICAgLy8gZHJvcHMgdGhlIHNldCB0aGF0IGhhcyBnb25lIHVudXNlZCB0aGUgbG9uZ2VzdC5cbiAgICAgICAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB0aGlzLmNhY2hlLnNldChrZXksIGNhY2hlZCk7XG4gICAgICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgY29tbWFuZHM6IGNhY2hlZCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tbWFuZHM6IEluc3RhbnRpYXRlZENvbW1hbmRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGhpcy5saW5lcykge1xuICAgICAgICAgICAgaWYgKCdjb21tYW5kJyBpbiBsaW5lKSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGxpbmUuY29tbWFuZCwgbGluZTogbGluZS5saW5lIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzdWJzdGl0dXRlZCA9IHN1YnN0aXR1dGVNYWNybyhsaW5lLnRlbXBsYXRlLCBhcmdzKTtcbiAgICAgICAgICAgIGlmICghc3Vic3RpdHV0ZWQub2spIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogc3Vic3RpdHV0ZWQubWVzc2FnZSwgbGluZTogbGluZS5saW5lIH07XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHsgY29tbWFuZDogc3Vic3RpdHV0ZWQuY29tbWFuZCwgbGluZTogbGluZS5saW5lIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWNoZS5zZXQoa2V5LCBjb21tYW5kcyk7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlLnNpemUgPiBNQUNST19DQUNIRV9FTlRSSUVTKSB7XG4gICAgICAgICAgICBjb25zdCBvbGRlc3QgPSB0aGlzLmNhY2hlLmtleXMoKS5uZXh0KCk7XG4gICAgICAgICAgICBpZiAoIW9sZGVzdC5kb25lKSB0aGlzLmNhY2hlLmRlbGV0ZShvbGRlc3QudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIGNvbW1hbmRzIH07XG4gICAgfVxuXG4gICAgLyoqIEhvdyBtYW55IGFyZ3VtZW50IHNldHMgdGhlIG1hY3JvIGNhY2hlIGN1cnJlbnRseSBob2xkcy4gKi9cbiAgICBwdWJsaWMgZ2V0IGNhY2hlZEFyZ3VtZW50U2V0cygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5zaXplO1xuICAgIH1cbn1cblxuLyoqIFdoYXQge0BsaW5rIGNvbXBpbGVGdW5jdGlvbn0gcHJvZHVjZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVSZXN1bHQge1xuICAgIC8qKiBUaGUgY29tcGlsZWQgZnVuY3Rpb24sIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBmaWxlIGRpZCBub3QgY29tcGlsZS4gKi9cbiAgICBmdW5jdGlvbj86IENvbXBpbGVkRnVuY3Rpb247XG4gICAgZGlhZ25vc3RpY3M6IHJlYWRvbmx5IERpYWdub3N0aWNbXTtcbn1cblxuLyoqXG4gKiBDb21waWxlcyBvbmUgZnVuY3Rpb24gZmlsZS5cbiAqXG4gKiBBIGZpbGUgd2l0aCBhbnkgZXJyb3IgZG9lcyBub3QgcHJvZHVjZSBhIGZ1bmN0aW9uLCBtYXRjaGluZyB0aGUgSmF2YVxuICogc2VydmVyLCB3aGVyZSBhIGZpbGUgdGhhdCBmYWlscyBgQ29tbWFuZEZ1bmN0aW9uLmZyb21MaW5lc2AgaXMgbG9nZ2VkIGFuZFxuICogbGVmdCBvdXQgb2YgdGhlIGZ1bmN0aW9uIGxpYnJhcnkgcmF0aGVyIHRoYW4gcGFydGx5IGxvYWRlZC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgbmFtZXNwYWNlZCBpZCB0aGUgZmlsZSBsb2FkcyB1bmRlci5cbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgdGV4dCBvZiB0aGUgYC5tY2Z1bmN0aW9uYCBmaWxlLlxuICovXG5leHBvcnQgY29uc3QgY29tcGlsZUZ1bmN0aW9uID0gKGlkOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nKTogQ29tcGlsZVJlc3VsdCA9PiB7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VGdW5jdGlvblNvdXJjZShzb3VyY2UpO1xuICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBwYXJzZWQuZGlhZ25vc3RpY3MubWFwKChkaWFnbm9zdGljKSA9PiAoeyAuLi5kaWFnbm9zdGljLCBmdW5jdGlvbklkOiBpZCB9KSk7XG4gICAgY29uc3QgbGluZXM6IENvbXBpbGVkTGluZVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcGFyc2VkLmxpbmVzKSB7XG4gICAgICAgIGlmICghbGluZS5tYWNybykge1xuICAgICAgICAgICAgbGluZXMucHVzaCh7IGxpbmU6IGxpbmUubGluZSwgY29tbWFuZDogbGluZS5jb21tYW5kIH0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21waWxlZCA9IGNvbXBpbGVNYWNyb0xpbmUobGluZS5jb21tYW5kKTtcbiAgICAgICAgaWYgKCFjb21waWxlZC5vaykge1xuICAgICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ21hY3JvLmludmFsaWQnLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uSWQ6IGlkLFxuICAgICAgICAgICAgICAgIGxpbmU6IGxpbmUubGluZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBjb21waWxlZC5tZXNzYWdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGluZXMucHVzaCh7IGxpbmU6IGxpbmUubGluZSwgdGVtcGxhdGU6IGNvbXBpbGVkLnRlbXBsYXRlIH0pO1xuICAgIH1cblxuICAgIGlmIChkaWFnbm9zdGljcy5zb21lKChkaWFnbm9zdGljKSA9PiBkaWFnbm9zdGljLnNldmVyaXR5ID09PSAnZXJyb3InKSkgcmV0dXJuIHsgZGlhZ25vc3RpY3MgfTtcbiAgICByZXR1cm4geyBmdW5jdGlvbjogbmV3IENvbXBpbGVkRnVuY3Rpb24oaWQsIGxpbmVzKSwgZGlhZ25vc3RpY3MgfTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBbUJBLElBQWEsc0JBQXNCOzs7OztBQXFCbkMsSUFBYSxtQkFBYixNQUE4QjtDQWFOO0NBQ0M7O0NBWnJCOztDQUdBO0NBRUEsd0JBQXlCLElBQUksSUFBNEM7Q0FFekU7Q0FFQSxZQUVJLElBQ0EsT0FDRjtFQUZrQixLQUFBLEtBQUE7RUFDQyxLQUFBLFFBQUE7RUFFakIsS0FBSyxRQUFRLE1BQU0sTUFBTSxTQUFTLGNBQWMsSUFBSTtFQUNwRCxNQUFNLFlBQXNCLENBQUM7RUFDN0IsS0FBSyxNQUFNLFFBQVEsT0FBTztHQUN0QixJQUFJLEVBQUUsY0FBYyxPQUFPO0dBQzNCLEtBQUssTUFBTSxZQUFZLEtBQUssU0FBUyxXQUNqQyxJQUFJLENBQUMsVUFBVSxTQUFTLFFBQVEsR0FBRyxVQUFVLEtBQUssUUFBUTtFQUVsRTtFQUNBLEtBQUssWUFBWTtFQUNqQixLQUFLLFFBQVEsS0FBSyxRQUNaLEtBQUEsSUFDQSxNQUFNLFNBQVMsU0FBVSxhQUFhLE9BQU8sQ0FBQztHQUFFLFNBQVMsS0FBSztHQUFTLE1BQU0sS0FBSztFQUFLLENBQUMsSUFBSSxDQUFDLENBQUU7Q0FDekc7O0NBR0EsSUFBVyxTQUFpQjtFQUN4QixPQUFPLEtBQUssTUFBTTtDQUN0Qjs7Ozs7Ozs7OztDQVdBLFlBQW1CLE1BQTRDO0VBQzNELElBQUksS0FBSyxPQUFPLE9BQU87R0FBRSxJQUFJO0dBQU0sVUFBVSxLQUFLO0VBQU07RUFFeEQsSUFBSSxTQUFTLEtBQUEsR0FDVCxPQUFPO0dBQ0gsSUFBSTtHQUNKLFNBQVMsR0FBRyxLQUFLLEdBQUc7RUFDeEI7RUFHSixLQUFLLE1BQU0sWUFBWSxLQUFLLFdBQVc7R0FDbkMsTUFBTSxRQUFRLEtBQUs7R0FDbkIsSUFBSSxVQUFVLEtBQUEsS0FBYSxVQUFVLE1BQ2pDLE9BQU87SUFBRSxJQUFJO0lBQU8sU0FBUywwQ0FBMEMsU0FBUztHQUFHO0VBRTNGO0VBRUEsTUFBTSxNQUFNLEtBQUssVUFBVSxLQUFLLFVBQVUsS0FBSyxhQUFhLEtBQUssYUFBYSxJQUFJLENBQUM7RUFDbkYsTUFBTSxTQUFTLEtBQUssTUFBTSxJQUFJLEdBQUc7RUFDakMsSUFBSSxRQUFRO0dBR1IsS0FBSyxNQUFNLE9BQU8sR0FBRztHQUNyQixLQUFLLE1BQU0sSUFBSSxLQUFLLE1BQU07R0FDMUIsT0FBTztJQUFFLElBQUk7SUFBTSxVQUFVO0dBQU87RUFDeEM7RUFFQSxNQUFNLFdBQWtDLENBQUM7RUFDekMsS0FBSyxNQUFNLFFBQVEsS0FBSyxPQUFPO0dBQzNCLElBQUksYUFBYSxNQUFNO0lBQ25CLFNBQVMsS0FBSztLQUFFLFNBQVMsS0FBSztLQUFTLE1BQU0sS0FBSztJQUFLLENBQUM7SUFDeEQ7R0FDSjtHQUVBLE1BQU0sY0FBY0EsY0FBQUEsZ0JBQWdCLEtBQUssVUFBVSxJQUFJO0dBQ3ZELElBQUksQ0FBQyxZQUFZLElBQUksT0FBTztJQUFFLElBQUk7SUFBTyxTQUFTLFlBQVk7SUFBUyxNQUFNLEtBQUs7R0FBSztHQUN2RixTQUFTLEtBQUs7SUFBRSxTQUFTLFlBQVk7SUFBUyxNQUFNLEtBQUs7R0FBSyxDQUFDO0VBQ25FO0VBRUEsS0FBSyxNQUFNLElBQUksS0FBSyxRQUFRO0VBQzVCLElBQUksS0FBSyxNQUFNLE9BQUEsR0FBNEI7R0FDdkMsTUFBTSxTQUFTLEtBQUssTUFBTSxLQUFLLENBQUMsQ0FBQyxLQUFLO0dBQ3RDLElBQUksQ0FBQyxPQUFPLE1BQU0sS0FBSyxNQUFNLE9BQU8sT0FBTyxLQUFLO0VBQ3BEO0VBRUEsT0FBTztHQUFFLElBQUk7R0FBTTtFQUFTO0NBQ2hDOztDQUdBLElBQVcscUJBQTZCO0VBQ3BDLE9BQU8sS0FBSyxNQUFNO0NBQ3RCO0FBQ0o7Ozs7Ozs7Ozs7O0FBbUJBLElBQWEsbUJBQW1CLElBQVksV0FBa0M7Q0FDMUUsTUFBTSxTQUFTQyxjQUFBQSxvQkFBb0IsTUFBTTtDQUN6QyxNQUFNLGNBQTRCLE9BQU8sWUFBWSxLQUFLLGdCQUFnQjtFQUFFLEdBQUc7RUFBWSxZQUFZO0NBQUcsRUFBRTtDQUM1RyxNQUFNLFFBQXdCLENBQUM7Q0FFL0IsS0FBSyxNQUFNLFFBQVEsT0FBTyxPQUFPO0VBQzdCLElBQUksQ0FBQyxLQUFLLE9BQU87R0FDYixNQUFNLEtBQUs7SUFBRSxNQUFNLEtBQUs7SUFBTSxTQUFTLEtBQUs7R0FBUSxDQUFDO0dBQ3JEO0VBQ0o7RUFFQSxNQUFNLFdBQVdDLGNBQUFBLGlCQUFpQixLQUFLLE9BQU87RUFDOUMsSUFBSSxDQUFDLFNBQVMsSUFBSTtHQUNkLFlBQVksS0FBSztJQUNiLFVBQVU7SUFDVixNQUFNO0lBQ04sWUFBWTtJQUNaLE1BQU0sS0FBSztJQUNYLFNBQVMsU0FBUztHQUN0QixDQUFDO0dBQ0Q7RUFDSjtFQUVBLE1BQU0sS0FBSztHQUFFLE1BQU0sS0FBSztHQUFNLFVBQVUsU0FBUztFQUFTLENBQUM7Q0FDL0Q7Q0FFQSxJQUFJLFlBQVksTUFBTSxlQUFlLFdBQVcsYUFBYSxPQUFPLEdBQUcsT0FBTyxFQUFFLFlBQVk7Q0FDNUYsT0FBTztFQUFFLFVBQVUsSUFBSSxpQkFBaUIsSUFBSSxLQUFLO0VBQUc7Q0FBWTtBQUNwRSJ9
@@ -0,0 +1,91 @@
1
+ /**
2
+ * A function file compiled once into the commands a call runs. A plain
3
+ * function is instantiated for free, every call sharing the same lines. A
4
+ * macro function re-instantiates per argument set, so it keeps a small cache
5
+ * of recent sets, which is what makes repeated calls with the same arguments
6
+ * cheaper than new ones.
7
+ */
8
+ import type { Diagnostic } from './diagnostics';
9
+ import type { MacroArguments, MacroTemplate } from './macro';
10
+ /**
11
+ * How many argument sets one macro function remembers. Java's
12
+ * `MacroFunction` carries 8 as its only integer constant, and caches only the
13
+ * values the macro actually references, so extra entries in the compound do
14
+ * not split the cache.
15
+ */
16
+ export declare const MACRO_CACHE_ENTRIES = 8;
17
+ /** One command a call is about to run. */
18
+ export interface InstantiatedCommand {
19
+ /** The command text, with every macro substitution already filled in. */
20
+ command: string;
21
+ /** The 1-based line of the function file the command came from. */
22
+ line: number;
23
+ }
24
+ /** The outcome of instantiating a function for one call. */
25
+ export type InstantiationResult = {
26
+ ok: true;
27
+ commands: readonly InstantiatedCommand[];
28
+ } | {
29
+ ok: false;
30
+ message: string;
31
+ line?: number;
32
+ };
33
+ /** One compiled line: fixed text, or a template waiting for arguments. */
34
+ type CompiledLine = {
35
+ line: number;
36
+ command: string;
37
+ } | {
38
+ line: number;
39
+ template: MacroTemplate;
40
+ };
41
+ /**
42
+ * A function file ready to run. Instances come from {@link compileFunction}
43
+ * and are shared by every call, including the macro cache.
44
+ */
45
+ export declare class CompiledFunction {
46
+ /** The namespaced id the function is registered under. */
47
+ readonly id: string;
48
+ private readonly lines;
49
+ /** Whether any line of the function is a macro line, so calls need arguments. */
50
+ readonly macro: boolean;
51
+ /** Every variable the function substitutes, once each, in first-use order. */
52
+ readonly variables: readonly string[];
53
+ private readonly cache;
54
+ private readonly plain;
55
+ constructor(
56
+ /** The namespaced id the function is registered under. */
57
+ id: string, lines: readonly CompiledLine[]);
58
+ /** How many commands the function declares. */
59
+ get length(): number;
60
+ /**
61
+ * Produces the commands one call runs.
62
+ *
63
+ * A plain function ignores the arguments, the way the Java server
64
+ * silently ignores a compound passed to a non-macro function. A macro
65
+ * function needs one entry per variable it substitutes and reports the
66
+ * first entry it is missing; the Java server skips the whole call in that
67
+ * case, and so does {@link FunctionExecutor}.
68
+ */
69
+ instantiate(args?: MacroArguments): InstantiationResult;
70
+ /** How many argument sets the macro cache currently holds. */
71
+ get cachedArgumentSets(): number;
72
+ }
73
+ /** What {@link compileFunction} produces. */
74
+ export interface CompileResult {
75
+ /** The compiled function, or undefined when the file did not compile. */
76
+ function?: CompiledFunction;
77
+ diagnostics: readonly Diagnostic[];
78
+ }
79
+ /**
80
+ * Compiles one function file.
81
+ *
82
+ * A file with any error does not produce a function, matching the Java
83
+ * server, where a file that fails `CommandFunction.fromLines` is logged and
84
+ * left out of the function library rather than partly loaded.
85
+ *
86
+ * @param id - The namespaced id the file loads under.
87
+ * @param source - The text of the `.mcfunction` file.
88
+ */
89
+ export declare const compileFunction: (id: string, source: string) => CompileResult;
90
+ export {};
91
+ //# sourceMappingURL=compile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAI7D;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IAChC,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,4DAA4D;AAC5D,MAAM,MAAM,mBAAmB,GAC3B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3G,0EAA0E;AAC1E,KAAK,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAA;CAAE,CAAC;AAElG;;;GAGG;AACH,qBAAa,gBAAgB;IAYrB,0DAA0D;aAC1C,EAAE,EAAE,MAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAb1B,iFAAiF;IACjF,SAAgB,KAAK,EAAE,OAAO,CAAC;IAE/B,8EAA8E;IAC9E,SAAgB,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IAE7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqD;IAE3E,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6C;IAEnE;IACI,0DAA0D;IAC1C,EAAE,EAAE,MAAM,EACT,KAAK,EAAE,SAAS,YAAY,EAAE,EAclD;IAED,+CAA+C;IAC/C,IAAW,MAAM,IAAI,MAAM,CAE1B;IAED;;;;;;;;OAQG;IACI,WAAW,CAAC,IAAI,CAAC,EAAE,cAAc,GAAG,mBAAmB,CA8C7D;IAED,8DAA8D;IAC9D,IAAW,kBAAkB,IAAI,MAAM,CAEtC;CACJ;AAED,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC1B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CACtC;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,OAAQ,MAAM,UAAU,MAAM,KAAG,aA4B5D,CAAC"}
@@ -0,0 +1,162 @@
1
+ import { compileMacroLine, substituteMacro } from "./macro.es.js";
2
+ import { parseFunctionSource } from "./parse.es.js";
3
+ // src/compile.ts
4
+ /**
5
+ * How many argument sets one macro function remembers. Java's
6
+ * `MacroFunction` carries 8 as its only integer constant, and caches only the
7
+ * values the macro actually references, so extra entries in the compound do
8
+ * not split the cache.
9
+ */
10
+ var MACRO_CACHE_ENTRIES = 8;
11
+ /**
12
+ * A function file ready to run. Instances come from {@link compileFunction}
13
+ * and are shared by every call, including the macro cache.
14
+ */
15
+ var CompiledFunction = class {
16
+ id;
17
+ lines;
18
+ /** Whether any line of the function is a macro line, so calls need arguments. */
19
+ macro;
20
+ /** Every variable the function substitutes, once each, in first-use order. */
21
+ variables;
22
+ cache = /* @__PURE__ */ new Map();
23
+ plain;
24
+ constructor(id, lines) {
25
+ this.id = id;
26
+ this.lines = lines;
27
+ this.macro = lines.some((line) => "template" in line);
28
+ const variables = [];
29
+ for (const line of lines) {
30
+ if (!("template" in line)) continue;
31
+ for (const variable of line.template.variables) if (!variables.includes(variable)) variables.push(variable);
32
+ }
33
+ this.variables = variables;
34
+ this.plain = this.macro ? void 0 : lines.flatMap((line) => "command" in line ? [{
35
+ command: line.command,
36
+ line: line.line
37
+ }] : []);
38
+ }
39
+ /** How many commands the function declares. */
40
+ get length() {
41
+ return this.lines.length;
42
+ }
43
+ /**
44
+ * Produces the commands one call runs.
45
+ *
46
+ * A plain function ignores the arguments, the way the Java server
47
+ * silently ignores a compound passed to a non-macro function. A macro
48
+ * function needs one entry per variable it substitutes and reports the
49
+ * first entry it is missing; the Java server skips the whole call in that
50
+ * case, and so does {@link FunctionExecutor}.
51
+ */
52
+ instantiate(args) {
53
+ if (this.plain) return {
54
+ ok: true,
55
+ commands: this.plain
56
+ };
57
+ if (args === void 0) return {
58
+ ok: false,
59
+ message: `${this.id} is a macro function and was called without arguments`
60
+ };
61
+ for (const variable of this.variables) {
62
+ const value = args[variable];
63
+ if (value === void 0 || value === null) return {
64
+ ok: false,
65
+ message: `the macro arguments have no entry for '${variable}'`
66
+ };
67
+ }
68
+ const key = JSON.stringify(this.variables.map((variable) => args[variable] ?? null));
69
+ const cached = this.cache.get(key);
70
+ if (cached) {
71
+ this.cache.delete(key);
72
+ this.cache.set(key, cached);
73
+ return {
74
+ ok: true,
75
+ commands: cached
76
+ };
77
+ }
78
+ const commands = [];
79
+ for (const line of this.lines) {
80
+ if ("command" in line) {
81
+ commands.push({
82
+ command: line.command,
83
+ line: line.line
84
+ });
85
+ continue;
86
+ }
87
+ const substituted = substituteMacro(line.template, args);
88
+ if (!substituted.ok) return {
89
+ ok: false,
90
+ message: substituted.message,
91
+ line: line.line
92
+ };
93
+ commands.push({
94
+ command: substituted.command,
95
+ line: line.line
96
+ });
97
+ }
98
+ this.cache.set(key, commands);
99
+ if (this.cache.size > 8) {
100
+ const oldest = this.cache.keys().next();
101
+ if (!oldest.done) this.cache.delete(oldest.value);
102
+ }
103
+ return {
104
+ ok: true,
105
+ commands
106
+ };
107
+ }
108
+ /** How many argument sets the macro cache currently holds. */
109
+ get cachedArgumentSets() {
110
+ return this.cache.size;
111
+ }
112
+ };
113
+ /**
114
+ * Compiles one function file.
115
+ *
116
+ * A file with any error does not produce a function, matching the Java
117
+ * server, where a file that fails `CommandFunction.fromLines` is logged and
118
+ * left out of the function library rather than partly loaded.
119
+ *
120
+ * @param id - The namespaced id the file loads under.
121
+ * @param source - The text of the `.mcfunction` file.
122
+ */
123
+ var compileFunction = (id, source) => {
124
+ const parsed = parseFunctionSource(source);
125
+ const diagnostics = parsed.diagnostics.map((diagnostic) => ({
126
+ ...diagnostic,
127
+ functionId: id
128
+ }));
129
+ const lines = [];
130
+ for (const line of parsed.lines) {
131
+ if (!line.macro) {
132
+ lines.push({
133
+ line: line.line,
134
+ command: line.command
135
+ });
136
+ continue;
137
+ }
138
+ const compiled = compileMacroLine(line.command);
139
+ if (!compiled.ok) {
140
+ diagnostics.push({
141
+ severity: "error",
142
+ code: "macro.invalid",
143
+ functionId: id,
144
+ line: line.line,
145
+ message: compiled.message
146
+ });
147
+ continue;
148
+ }
149
+ lines.push({
150
+ line: line.line,
151
+ template: compiled.template
152
+ });
153
+ }
154
+ if (diagnostics.some((diagnostic) => diagnostic.severity === "error")) return { diagnostics };
155
+ return {
156
+ function: new CompiledFunction(id, lines),
157
+ diagnostics
158
+ };
159
+ };
160
+ export { CompiledFunction, MACRO_CACHE_ENTRIES, compileFunction };
161
+
162
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZS5lcy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvY29tcGlsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgZnVuY3Rpb24gZmlsZSBjb21waWxlZCBvbmNlIGludG8gdGhlIGNvbW1hbmRzIGEgY2FsbCBydW5zLiBBIHBsYWluXG4gKiBmdW5jdGlvbiBpcyBpbnN0YW50aWF0ZWQgZm9yIGZyZWUsIGV2ZXJ5IGNhbGwgc2hhcmluZyB0aGUgc2FtZSBsaW5lcy4gQVxuICogbWFjcm8gZnVuY3Rpb24gcmUtaW5zdGFudGlhdGVzIHBlciBhcmd1bWVudCBzZXQsIHNvIGl0IGtlZXBzIGEgc21hbGwgY2FjaGVcbiAqIG9mIHJlY2VudCBzZXRzLCB3aGljaCBpcyB3aGF0IG1ha2VzIHJlcGVhdGVkIGNhbGxzIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzXG4gKiBjaGVhcGVyIHRoYW4gbmV3IG9uZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEaWFnbm9zdGljIH0gZnJvbSAnLi9kaWFnbm9zdGljcyc7XG5pbXBvcnQgdHlwZSB7IE1hY3JvQXJndW1lbnRzLCBNYWNyb1RlbXBsYXRlIH0gZnJvbSAnLi9tYWNybyc7XG5pbXBvcnQgeyBjb21waWxlTWFjcm9MaW5lLCBzdWJzdGl0dXRlTWFjcm8gfSBmcm9tICcuL21hY3JvJztcbmltcG9ydCB7IHBhcnNlRnVuY3Rpb25Tb3VyY2UgfSBmcm9tICcuL3BhcnNlJztcblxuLyoqXG4gKiBIb3cgbWFueSBhcmd1bWVudCBzZXRzIG9uZSBtYWNybyBmdW5jdGlvbiByZW1lbWJlcnMuIEphdmEnc1xuICogYE1hY3JvRnVuY3Rpb25gIGNhcnJpZXMgOCBhcyBpdHMgb25seSBpbnRlZ2VyIGNvbnN0YW50LCBhbmQgY2FjaGVzIG9ubHkgdGhlXG4gKiB2YWx1ZXMgdGhlIG1hY3JvIGFjdHVhbGx5IHJlZmVyZW5jZXMsIHNvIGV4dHJhIGVudHJpZXMgaW4gdGhlIGNvbXBvdW5kIGRvXG4gKiBub3Qgc3BsaXQgdGhlIGNhY2hlLlxuICovXG5leHBvcnQgY29uc3QgTUFDUk9fQ0FDSEVfRU5UUklFUyA9IDg7XG5cbi8qKiBPbmUgY29tbWFuZCBhIGNhbGwgaXMgYWJvdXQgdG8gcnVuLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0YW50aWF0ZWRDb21tYW5kIHtcbiAgICAvKiogVGhlIGNvbW1hbmQgdGV4dCwgd2l0aCBldmVyeSBtYWNybyBzdWJzdGl0dXRpb24gYWxyZWFkeSBmaWxsZWQgaW4uICovXG4gICAgY29tbWFuZDogc3RyaW5nO1xuICAgIC8qKiBUaGUgMS1iYXNlZCBsaW5lIG9mIHRoZSBmdW5jdGlvbiBmaWxlIHRoZSBjb21tYW5kIGNhbWUgZnJvbS4gKi9cbiAgICBsaW5lOiBudW1iZXI7XG59XG5cbi8qKiBUaGUgb3V0Y29tZSBvZiBpbnN0YW50aWF0aW5nIGEgZnVuY3Rpb24gZm9yIG9uZSBjYWxsLiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFudGlhdGlvblJlc3VsdCA9XG4gICAgeyBvazogdHJ1ZTsgY29tbWFuZHM6IHJlYWRvbmx5IEluc3RhbnRpYXRlZENvbW1hbmRbXSB9IHwgeyBvazogZmFsc2U7IG1lc3NhZ2U6IHN0cmluZzsgbGluZT86IG51bWJlciB9O1xuXG4vKiogT25lIGNvbXBpbGVkIGxpbmU6IGZpeGVkIHRleHQsIG9yIGEgdGVtcGxhdGUgd2FpdGluZyBmb3IgYXJndW1lbnRzLiAqL1xudHlwZSBDb21waWxlZExpbmUgPSB7IGxpbmU6IG51bWJlcjsgY29tbWFuZDogc3RyaW5nIH0gfCB7IGxpbmU6IG51bWJlcjsgdGVtcGxhdGU6IE1hY3JvVGVtcGxhdGUgfTtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIGZpbGUgcmVhZHkgdG8gcnVuLiBJbnN0YW5jZXMgY29tZSBmcm9tIHtAbGluayBjb21waWxlRnVuY3Rpb259XG4gKiBhbmQgYXJlIHNoYXJlZCBieSBldmVyeSBjYWxsLCBpbmNsdWRpbmcgdGhlIG1hY3JvIGNhY2hlLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcGlsZWRGdW5jdGlvbiB7XG4gICAgLyoqIFdoZXRoZXIgYW55IGxpbmUgb2YgdGhlIGZ1bmN0aW9uIGlzIGEgbWFjcm8gbGluZSwgc28gY2FsbHMgbmVlZCBhcmd1bWVudHMuICovXG4gICAgcHVibGljIHJlYWRvbmx5IG1hY3JvOiBib29sZWFuO1xuXG4gICAgLyoqIEV2ZXJ5IHZhcmlhYmxlIHRoZSBmdW5jdGlvbiBzdWJzdGl0dXRlcywgb25jZSBlYWNoLCBpbiBmaXJzdC11c2Ugb3JkZXIuICovXG4gICAgcHVibGljIHJlYWRvbmx5IHZhcmlhYmxlczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHJlYWRvbmx5IEluc3RhbnRpYXRlZENvbW1hbmRbXT4oKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGxhaW46IHJlYWRvbmx5IEluc3RhbnRpYXRlZENvbW1hbmRbXSB8IHVuZGVmaW5lZDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgLyoqIFRoZSBuYW1lc3BhY2VkIGlkIHRoZSBmdW5jdGlvbiBpcyByZWdpc3RlcmVkIHVuZGVyLiAqL1xuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWQ6IHN0cmluZyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBsaW5lczogcmVhZG9ubHkgQ29tcGlsZWRMaW5lW11cbiAgICApIHtcbiAgICAgICAgdGhpcy5tYWNybyA9IGxpbmVzLnNvbWUoKGxpbmUpID0+ICd0ZW1wbGF0ZScgaW4gbGluZSk7XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgICAgICBpZiAoISgndGVtcGxhdGUnIGluIGxpbmUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFyaWFibGUgb2YgbGluZS50ZW1wbGF0ZS52YXJpYWJsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXZhcmlhYmxlcy5pbmNsdWRlcyh2YXJpYWJsZSkpIHZhcmlhYmxlcy5wdXNoKHZhcmlhYmxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhcmlhYmxlcyA9IHZhcmlhYmxlcztcbiAgICAgICAgdGhpcy5wbGFpbiA9IHRoaXMubWFjcm9cbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IGxpbmVzLmZsYXRNYXAoKGxpbmUpID0+ICgnY29tbWFuZCcgaW4gbGluZSA/IFt7IGNvbW1hbmQ6IGxpbmUuY29tbWFuZCwgbGluZTogbGluZS5saW5lIH1dIDogW10pKTtcbiAgICB9XG5cbiAgICAvKiogSG93IG1hbnkgY29tbWFuZHMgdGhlIGZ1bmN0aW9uIGRlY2xhcmVzLiAqL1xuICAgIHB1YmxpYyBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpbmVzLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyB0aGUgY29tbWFuZHMgb25lIGNhbGwgcnVucy5cbiAgICAgKlxuICAgICAqIEEgcGxhaW4gZnVuY3Rpb24gaWdub3JlcyB0aGUgYXJndW1lbnRzLCB0aGUgd2F5IHRoZSBKYXZhIHNlcnZlclxuICAgICAqIHNpbGVudGx5IGlnbm9yZXMgYSBjb21wb3VuZCBwYXNzZWQgdG8gYSBub24tbWFjcm8gZnVuY3Rpb24uIEEgbWFjcm9cbiAgICAgKiBmdW5jdGlvbiBuZWVkcyBvbmUgZW50cnkgcGVyIHZhcmlhYmxlIGl0IHN1YnN0aXR1dGVzIGFuZCByZXBvcnRzIHRoZVxuICAgICAqIGZpcnN0IGVudHJ5IGl0IGlzIG1pc3Npbmc7IHRoZSBKYXZhIHNlcnZlciBza2lwcyB0aGUgd2hvbGUgY2FsbCBpbiB0aGF0XG4gICAgICogY2FzZSwgYW5kIHNvIGRvZXMge0BsaW5rIEZ1bmN0aW9uRXhlY3V0b3J9LlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnN0YW50aWF0ZShhcmdzPzogTWFjcm9Bcmd1bWVudHMpOiBJbnN0YW50aWF0aW9uUmVzdWx0IHtcbiAgICAgICAgaWYgKHRoaXMucGxhaW4pIHJldHVybiB7IG9rOiB0cnVlLCBjb21tYW5kczogdGhpcy5wbGFpbiB9O1xuXG4gICAgICAgIGlmIChhcmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGAke3RoaXMuaWR9IGlzIGEgbWFjcm8gZnVuY3Rpb24gYW5kIHdhcyBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHNgXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB2YXJpYWJsZSBvZiB0aGlzLnZhcmlhYmxlcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhcmdzW3ZhcmlhYmxlXTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBtZXNzYWdlOiBgdGhlIG1hY3JvIGFyZ3VtZW50cyBoYXZlIG5vIGVudHJ5IGZvciAnJHt2YXJpYWJsZX0nYCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkodGhpcy52YXJpYWJsZXMubWFwKCh2YXJpYWJsZSkgPT4gYXJnc1t2YXJpYWJsZV0gPz8gbnVsbCkpO1xuICAgICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgICAgICAvLyBSZS1pbnNlcnQgdG8gbWFrZSB0aGlzIHRoZSBtb3N0IHJlY2VudCBzZXQsIHNvIHRoZSBldmljdGlvbiBiZWxvd1xuICAgICAgICAgICAgLy8gZHJvcHMgdGhlIHNldCB0aGF0IGhhcyBnb25lIHVudXNlZCB0aGUgbG9uZ2VzdC5cbiAgICAgICAgICAgIHRoaXMuY2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB0aGlzLmNhY2hlLnNldChrZXksIGNhY2hlZCk7XG4gICAgICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgY29tbWFuZHM6IGNhY2hlZCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tbWFuZHM6IEluc3RhbnRpYXRlZENvbW1hbmRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGhpcy5saW5lcykge1xuICAgICAgICAgICAgaWYgKCdjb21tYW5kJyBpbiBsaW5lKSB7XG4gICAgICAgICAgICAgICAgY29tbWFuZHMucHVzaCh7IGNvbW1hbmQ6IGxpbmUuY29tbWFuZCwgbGluZTogbGluZS5saW5lIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzdWJzdGl0dXRlZCA9IHN1YnN0aXR1dGVNYWNybyhsaW5lLnRlbXBsYXRlLCBhcmdzKTtcbiAgICAgICAgICAgIGlmICghc3Vic3RpdHV0ZWQub2spIHJldHVybiB7IG9rOiBmYWxzZSwgbWVzc2FnZTogc3Vic3RpdHV0ZWQubWVzc2FnZSwgbGluZTogbGluZS5saW5lIH07XG4gICAgICAgICAgICBjb21tYW5kcy5wdXNoKHsgY29tbWFuZDogc3Vic3RpdHV0ZWQuY29tbWFuZCwgbGluZTogbGluZS5saW5lIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWNoZS5zZXQoa2V5LCBjb21tYW5kcyk7XG4gICAgICAgIGlmICh0aGlzLmNhY2hlLnNpemUgPiBNQUNST19DQUNIRV9FTlRSSUVTKSB7XG4gICAgICAgICAgICBjb25zdCBvbGRlc3QgPSB0aGlzLmNhY2hlLmtleXMoKS5uZXh0KCk7XG4gICAgICAgICAgICBpZiAoIW9sZGVzdC5kb25lKSB0aGlzLmNhY2hlLmRlbGV0ZShvbGRlc3QudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIGNvbW1hbmRzIH07XG4gICAgfVxuXG4gICAgLyoqIEhvdyBtYW55IGFyZ3VtZW50IHNldHMgdGhlIG1hY3JvIGNhY2hlIGN1cnJlbnRseSBob2xkcy4gKi9cbiAgICBwdWJsaWMgZ2V0IGNhY2hlZEFyZ3VtZW50U2V0cygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5zaXplO1xuICAgIH1cbn1cblxuLyoqIFdoYXQge0BsaW5rIGNvbXBpbGVGdW5jdGlvbn0gcHJvZHVjZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVSZXN1bHQge1xuICAgIC8qKiBUaGUgY29tcGlsZWQgZnVuY3Rpb24sIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBmaWxlIGRpZCBub3QgY29tcGlsZS4gKi9cbiAgICBmdW5jdGlvbj86IENvbXBpbGVkRnVuY3Rpb247XG4gICAgZGlhZ25vc3RpY3M6IHJlYWRvbmx5IERpYWdub3N0aWNbXTtcbn1cblxuLyoqXG4gKiBDb21waWxlcyBvbmUgZnVuY3Rpb24gZmlsZS5cbiAqXG4gKiBBIGZpbGUgd2l0aCBhbnkgZXJyb3IgZG9lcyBub3QgcHJvZHVjZSBhIGZ1bmN0aW9uLCBtYXRjaGluZyB0aGUgSmF2YVxuICogc2VydmVyLCB3aGVyZSBhIGZpbGUgdGhhdCBmYWlscyBgQ29tbWFuZEZ1bmN0aW9uLmZyb21MaW5lc2AgaXMgbG9nZ2VkIGFuZFxuICogbGVmdCBvdXQgb2YgdGhlIGZ1bmN0aW9uIGxpYnJhcnkgcmF0aGVyIHRoYW4gcGFydGx5IGxvYWRlZC5cbiAqXG4gKiBAcGFyYW0gaWQgLSBUaGUgbmFtZXNwYWNlZCBpZCB0aGUgZmlsZSBsb2FkcyB1bmRlci5cbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgdGV4dCBvZiB0aGUgYC5tY2Z1bmN0aW9uYCBmaWxlLlxuICovXG5leHBvcnQgY29uc3QgY29tcGlsZUZ1bmN0aW9uID0gKGlkOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nKTogQ29tcGlsZVJlc3VsdCA9PiB7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VGdW5jdGlvblNvdXJjZShzb3VyY2UpO1xuICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBwYXJzZWQuZGlhZ25vc3RpY3MubWFwKChkaWFnbm9zdGljKSA9PiAoeyAuLi5kaWFnbm9zdGljLCBmdW5jdGlvbklkOiBpZCB9KSk7XG4gICAgY29uc3QgbGluZXM6IENvbXBpbGVkTGluZVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcGFyc2VkLmxpbmVzKSB7XG4gICAgICAgIGlmICghbGluZS5tYWNybykge1xuICAgICAgICAgICAgbGluZXMucHVzaCh7IGxpbmU6IGxpbmUubGluZSwgY29tbWFuZDogbGluZS5jb21tYW5kIH0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21waWxlZCA9IGNvbXBpbGVNYWNyb0xpbmUobGluZS5jb21tYW5kKTtcbiAgICAgICAgaWYgKCFjb21waWxlZC5vaykge1xuICAgICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ21hY3JvLmludmFsaWQnLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uSWQ6IGlkLFxuICAgICAgICAgICAgICAgIGxpbmU6IGxpbmUubGluZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBjb21waWxlZC5tZXNzYWdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGluZXMucHVzaCh7IGxpbmU6IGxpbmUubGluZSwgdGVtcGxhdGU6IGNvbXBpbGVkLnRlbXBsYXRlIH0pO1xuICAgIH1cblxuICAgIGlmIChkaWFnbm9zdGljcy5zb21lKChkaWFnbm9zdGljKSA9PiBkaWFnbm9zdGljLnNldmVyaXR5ID09PSAnZXJyb3InKSkgcmV0dXJuIHsgZGlhZ25vc3RpY3MgfTtcbiAgICByZXR1cm4geyBmdW5jdGlvbjogbmV3IENvbXBpbGVkRnVuY3Rpb24oaWQsIGxpbmVzKSwgZGlhZ25vc3RpY3MgfTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQW1CQSxJQUFhLHNCQUFzQjs7Ozs7QUFxQm5DLElBQWEsbUJBQWIsTUFBOEI7Q0FhTjtDQUNDOztDQVpyQjs7Q0FHQTtDQUVBLHdCQUF5QixJQUFJLElBQTRDO0NBRXpFO0NBRUEsWUFFSSxJQUNBLE9BQ0Y7RUFGa0IsS0FBQSxLQUFBO0VBQ0MsS0FBQSxRQUFBO0VBRWpCLEtBQUssUUFBUSxNQUFNLE1BQU0sU0FBUyxjQUFjLElBQUk7RUFDcEQsTUFBTSxZQUFzQixDQUFDO0VBQzdCLEtBQUssTUFBTSxRQUFRLE9BQU87R0FDdEIsSUFBSSxFQUFFLGNBQWMsT0FBTztHQUMzQixLQUFLLE1BQU0sWUFBWSxLQUFLLFNBQVMsV0FDakMsSUFBSSxDQUFDLFVBQVUsU0FBUyxRQUFRLEdBQUcsVUFBVSxLQUFLLFFBQVE7RUFFbEU7RUFDQSxLQUFLLFlBQVk7RUFDakIsS0FBSyxRQUFRLEtBQUssUUFDWixLQUFBLElBQ0EsTUFBTSxTQUFTLFNBQVUsYUFBYSxPQUFPLENBQUM7R0FBRSxTQUFTLEtBQUs7R0FBUyxNQUFNLEtBQUs7RUFBSyxDQUFDLElBQUksQ0FBQyxDQUFFO0NBQ3pHOztDQUdBLElBQVcsU0FBaUI7RUFDeEIsT0FBTyxLQUFLLE1BQU07Q0FDdEI7Ozs7Ozs7Ozs7Q0FXQSxZQUFtQixNQUE0QztFQUMzRCxJQUFJLEtBQUssT0FBTyxPQUFPO0dBQUUsSUFBSTtHQUFNLFVBQVUsS0FBSztFQUFNO0VBRXhELElBQUksU0FBUyxLQUFBLEdBQ1QsT0FBTztHQUNILElBQUk7R0FDSixTQUFTLEdBQUcsS0FBSyxHQUFHO0VBQ3hCO0VBR0osS0FBSyxNQUFNLFlBQVksS0FBSyxXQUFXO0dBQ25DLE1BQU0sUUFBUSxLQUFLO0dBQ25CLElBQUksVUFBVSxLQUFBLEtBQWEsVUFBVSxNQUNqQyxPQUFPO0lBQUUsSUFBSTtJQUFPLFNBQVMsMENBQTBDLFNBQVM7R0FBRztFQUUzRjtFQUVBLE1BQU0sTUFBTSxLQUFLLFVBQVUsS0FBSyxVQUFVLEtBQUssYUFBYSxLQUFLLGFBQWEsSUFBSSxDQUFDO0VBQ25GLE1BQU0sU0FBUyxLQUFLLE1BQU0sSUFBSSxHQUFHO0VBQ2pDLElBQUksUUFBUTtHQUdSLEtBQUssTUFBTSxPQUFPLEdBQUc7R0FDckIsS0FBSyxNQUFNLElBQUksS0FBSyxNQUFNO0dBQzFCLE9BQU87SUFBRSxJQUFJO0lBQU0sVUFBVTtHQUFPO0VBQ3hDO0VBRUEsTUFBTSxXQUFrQyxDQUFDO0VBQ3pDLEtBQUssTUFBTSxRQUFRLEtBQUssT0FBTztHQUMzQixJQUFJLGFBQWEsTUFBTTtJQUNuQixTQUFTLEtBQUs7S0FBRSxTQUFTLEtBQUs7S0FBUyxNQUFNLEtBQUs7SUFBSyxDQUFDO0lBQ3hEO0dBQ0o7R0FFQSxNQUFNLGNBQWMsZ0JBQWdCLEtBQUssVUFBVSxJQUFJO0dBQ3ZELElBQUksQ0FBQyxZQUFZLElBQUksT0FBTztJQUFFLElBQUk7SUFBTyxTQUFTLFlBQVk7SUFBUyxNQUFNLEtBQUs7R0FBSztHQUN2RixTQUFTLEtBQUs7SUFBRSxTQUFTLFlBQVk7SUFBUyxNQUFNLEtBQUs7R0FBSyxDQUFDO0VBQ25FO0VBRUEsS0FBSyxNQUFNLElBQUksS0FBSyxRQUFRO0VBQzVCLElBQUksS0FBSyxNQUFNLE9BQUEsR0FBNEI7R0FDdkMsTUFBTSxTQUFTLEtBQUssTUFBTSxLQUFLLENBQUMsQ0FBQyxLQUFLO0dBQ3RDLElBQUksQ0FBQyxPQUFPLE1BQU0sS0FBSyxNQUFNLE9BQU8sT0FBTyxLQUFLO0VBQ3BEO0VBRUEsT0FBTztHQUFFLElBQUk7R0FBTTtFQUFTO0NBQ2hDOztDQUdBLElBQVcscUJBQTZCO0VBQ3BDLE9BQU8sS0FBSyxNQUFNO0NBQ3RCO0FBQ0o7Ozs7Ozs7Ozs7O0FBbUJBLElBQWEsbUJBQW1CLElBQVksV0FBa0M7Q0FDMUUsTUFBTSxTQUFTLG9CQUFvQixNQUFNO0NBQ3pDLE1BQU0sY0FBNEIsT0FBTyxZQUFZLEtBQUssZ0JBQWdCO0VBQUUsR0FBRztFQUFZLFlBQVk7Q0FBRyxFQUFFO0NBQzVHLE1BQU0sUUFBd0IsQ0FBQztDQUUvQixLQUFLLE1BQU0sUUFBUSxPQUFPLE9BQU87RUFDN0IsSUFBSSxDQUFDLEtBQUssT0FBTztHQUNiLE1BQU0sS0FBSztJQUFFLE1BQU0sS0FBSztJQUFNLFNBQVMsS0FBSztHQUFRLENBQUM7R0FDckQ7RUFDSjtFQUVBLE1BQU0sV0FBVyxpQkFBaUIsS0FBSyxPQUFPO0VBQzlDLElBQUksQ0FBQyxTQUFTLElBQUk7R0FDZCxZQUFZLEtBQUs7SUFDYixVQUFVO0lBQ1YsTUFBTTtJQUNOLFlBQVk7SUFDWixNQUFNLEtBQUs7SUFDWCxTQUFTLFNBQVM7R0FDdEIsQ0FBQztHQUNEO0VBQ0o7RUFFQSxNQUFNLEtBQUs7R0FBRSxNQUFNLEtBQUs7R0FBTSxVQUFVLFNBQVM7RUFBUyxDQUFDO0NBQy9EO0NBRUEsSUFBSSxZQUFZLE1BQU0sZUFBZSxXQUFXLGFBQWEsT0FBTyxHQUFHLE9BQU8sRUFBRSxZQUFZO0NBQzVGLE9BQU87RUFBRSxVQUFVLElBQUksaUJBQWlCLElBQUksS0FBSztFQUFHO0NBQVk7QUFDcEUifQ==
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ // src/diagnostics.ts
4
+ /** Collects diagnostics in report order. */
5
+ var DiagnosticCollector = class {
6
+ /** Everything reported so far, in the order it was reported. */
7
+ diagnostics = [];
8
+ /** Records one diagnostic. */
9
+ add(diagnostic) {
10
+ this.diagnostics.push(diagnostic);
11
+ }
12
+ /** Whether any recorded diagnostic is an error. */
13
+ get hasErrors() {
14
+ return this.diagnostics.some((diagnostic) => diagnostic.severity === "error");
15
+ }
16
+ };
17
+ exports.DiagnosticCollector = DiagnosticCollector;
18
+
19
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ25vc3RpY3MuY2pzLmNqcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvZGlhZ25vc3RpY3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXaGF0IHRoaXMgcnVudGltZSByZXBvcnRzIGluc3RlYWQgb2YgdGhyb3dpbmcuIExvYWRpbmcgYSBwYWNrLCBjb21waWxpbmcgYVxuICogZnVuY3Rpb24gYW5kIHJ1bm5pbmcgb25lIGFyZSBhbGwgYmVzdC1lZmZvcnQ6IGEgYnJva2VuIGZpbGUgb3IgYSB0cmlwcGVkXG4gKiBsaW1pdCBwcm9kdWNlcyBhIGRpYWdub3N0aWMgYW5kIHRoZSByZXN0IG9mIHRoZSB3b3JrIGNvbnRpbnVlcywgdGhlIHdheSB0aGVcbiAqIEphdmEgc2VydmVyIGxvZ3MgYSBmdW5jdGlvbiBpdCBjb3VsZCBub3QgbG9hZCBhbmQga2VlcHMgdGhlIHNlcnZlciBydW5uaW5nLlxuICovXG5cbi8qKiBIb3cgc2VyaW91cyBhIGRpYWdub3N0aWMgaXMuIEFuIGVycm9yIG1lYW5zIHRoZSBhZmZlY3RlZCBmdW5jdGlvbiBkaWQgbm90IGxvYWQgb3IgZGlkIG5vdCBydW4uICovXG5leHBvcnQgdHlwZSBEaWFnbm9zdGljU2V2ZXJpdHkgPSAnZXJyb3InIHwgJ3dhcm5pbmcnO1xuXG4vKiogVGhlIHByb2JsZW1zIHRoaXMgcGFja2FnZSByZXBvcnRzLiAqL1xuZXhwb3J0IHR5cGUgRGlhZ25vc3RpY0NvZGUgPVxuICAgIC8qKiBBIGxpbmUgc3RhcnRlZCB3aXRoIGAvL2AsIHdoaWNoIGlzIG5vdCBhIGNvbW1lbnQgbWFya2VyIGluIG1jZnVuY3Rpb24uICovXG4gICAgfCAnbGluZS5kb3VibGUtc2xhc2gtY29tbWVudCdcbiAgICAvKiogQSBsaW5lIHN0YXJ0ZWQgd2l0aCBgL2AsIHdoaWNoIG1jZnVuY3Rpb24gZG9lcyBub3QgdXNlLiAqL1xuICAgIHwgJ2xpbmUubGVhZGluZy1zbGFzaCdcbiAgICAvKiogQSBsaW5lIHdhcyBsb25nZXIgdGhhbiB7QGxpbmsgTUFYX0NPTU1BTkRfTEVOR1RIfS4gKi9cbiAgICB8ICdsaW5lLnRvby1sb25nJ1xuICAgIC8qKiBUaGUgZmlsZSBlbmRlZCB3aXRoIGEgbGluZSBjb250aW51YXRpb24gdGhhdCBoYWQgbm90aGluZyB0byBjb250aW51ZSBpbnRvLiAqL1xuICAgIHwgJ2xpbmUuZGFuZ2xpbmctY29udGludWF0aW9uJ1xuICAgIC8qKiBBIG1hY3JvIGxpbmUgd2FzIG1hbGZvcm1lZDogYSBiYWQgdmFyaWFibGUgbmFtZSwgYW4gdW50ZXJtaW5hdGVkIGAkKGAsIG9yIG5vIHN1YnN0aXR1dGlvbiBhdCBhbGwuICovXG4gICAgfCAnbWFjcm8uaW52YWxpZCdcbiAgICAvKiogQSBtYWNybyBmdW5jdGlvbiB3YXMgY2FsbGVkIHdpdGhvdXQgdGhlIGFyZ3VtZW50cyBpdHMgc3Vic3RpdHV0aW9ucyBuZWVkLiAqL1xuICAgIHwgJ21hY3JvLm1pc3NpbmctYXJndW1lbnRzJ1xuICAgIC8qKiBBIGBmdW5jdGlvbmAgbGluZSBuYW1lZCBhIGZ1bmN0aW9uIHRoYXQgaXMgbm90IHJlZ2lzdGVyZWQuICovXG4gICAgfCAnY2FsbC51bmtub3duLWZ1bmN0aW9uJ1xuICAgIC8qKiBBIGBmdW5jdGlvbmAgbGluZSBuYW1lZCBhIHRhZyB0aGF0IHRoZSB0YWcgbG9va3VwIGRvZXMgbm90IGtub3cuICovXG4gICAgfCAnY2FsbC51bmtub3duLXRhZydcbiAgICAvKiogQSBgZnVuY3Rpb25gIGxpbmUgY2FycmllZCBhbiBhcmd1bWVudCBjb21wb3VuZCB0aGF0IGNvdWxkIG5vdCBiZSBwYXJzZWQuICovXG4gICAgfCAnY2FsbC5pbnZhbGlkLWFyZ3VtZW50cydcbiAgICAvKiogVGhlIGNvbW1hbmQgcnVubmVyIHRocmV3IHdoaWxlIHJ1bm5pbmcgYSBsaW5lLiAqL1xuICAgIHwgJ2NvbW1hbmQuZmFpbGVkJ1xuICAgIC8qKiBBIGZ1bmN0aW9uIHRhZyByZWZlcmVuY2VkIGl0c2VsZiB0aHJvdWdoIGEgY2hhaW4gb2YgdGFncy4gKi9cbiAgICB8ICd0YWcuY3ljbGUnXG4gICAgLyoqIEEgdGFnIGVudHJ5IG5hbWVkIGEgcmVxdWlyZWQgZnVuY3Rpb24gb3IgdGFnIHRoYXQgZG9lcyBub3QgZXhpc3QuICovXG4gICAgfCAndGFnLm1pc3NpbmctZW50cnknXG4gICAgLyoqIEV4ZWN1dGlvbiBzdG9wcGVkIGJlY2F1c2UgaXQgcmVhY2hlZCBgbWF4Q29tbWFuZFNlcXVlbmNlTGVuZ3RoYC4gKi9cbiAgICB8ICdsaW1pdC5jb21tYW5kLXNlcXVlbmNlLWxlbmd0aCdcbiAgICAvKiogRXhlY3V0aW9uIHN0b3BwZWQgYmVjYXVzZSBpdCByZWFjaGVkIGBtYXhDb21tYW5kRm9ya3NgLiAqL1xuICAgIHwgJ2xpbWl0LmNvbW1hbmQtZm9ya3MnXG4gICAgLyoqIEEgZmlsZSB1bmRlciBgZnVuY3Rpb24vYCBjb3VsZCBub3QgYmUgZGVjb2RlZCBvciByb3V0ZWQgdG8gYW4gaWRlbnRpZmllci4gKi9cbiAgICB8ICdsb2FkLmludmFsaWQtZmlsZSc7XG5cbi8qKiBPbmUgcmVwb3J0ZWQgcHJvYmxlbSwgY2FycnlpbmcgZW5vdWdoIGxvY2F0aW9uIHRvIGZpbmQgaXQgaW4gYSBwYWNrLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaWFnbm9zdGljIHtcbiAgICBzZXZlcml0eTogRGlhZ25vc3RpY1NldmVyaXR5O1xuICAgIGNvZGU6IERpYWdub3N0aWNDb2RlO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAvKiogVGhlIG5hbWVzcGFjZWQgaWQgb2YgdGhlIGZ1bmN0aW9uIHRoZSBwcm9ibGVtIGlzIGluLCB3aGVuIHRoZXJlIGlzIG9uZS4gKi9cbiAgICBmdW5jdGlvbklkPzogc3RyaW5nO1xuICAgIC8qKiBUaGUgMS1iYXNlZCBsaW5lIG51bWJlciBpbnNpZGUgdGhhdCBmdW5jdGlvbiwgd2hlbiB0aGUgcHJvYmxlbSBoYXMgb25lLiAqL1xuICAgIGxpbmU/OiBudW1iZXI7XG4gICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBwYWNrIHRoZSBmaWxlIGNhbWUgZnJvbSwgZm9yIHByb2JsZW1zIGZvdW5kIHdoaWxlIGxvYWRpbmcuICovXG4gICAgcGFjaz86IHN0cmluZztcbn1cblxuLyoqIENvbGxlY3RzIGRpYWdub3N0aWNzIGluIHJlcG9ydCBvcmRlci4gKi9cbmV4cG9ydCBjbGFzcyBEaWFnbm9zdGljQ29sbGVjdG9yIHtcbiAgICAvKiogRXZlcnl0aGluZyByZXBvcnRlZCBzbyBmYXIsIGluIHRoZSBvcmRlciBpdCB3YXMgcmVwb3J0ZWQuICovXG4gICAgcHVibGljIHJlYWRvbmx5IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcblxuICAgIC8qKiBSZWNvcmRzIG9uZSBkaWFnbm9zdGljLiAqL1xuICAgIHB1YmxpYyBhZGQoZGlhZ25vc3RpYzogRGlhZ25vc3RpYyk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpYWdub3N0aWNzLnB1c2goZGlhZ25vc3RpYyk7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgYW55IHJlY29yZGVkIGRpYWdub3N0aWMgaXMgYW4gZXJyb3IuICovXG4gICAgcHVibGljIGdldCBoYXNFcnJvcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpYWdub3N0aWNzLnNvbWUoKGRpYWdub3N0aWMpID0+IGRpYWdub3N0aWMuc2V2ZXJpdHkgPT09ICdlcnJvcicpO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQXlEQSxJQUFhLHNCQUFiLE1BQWlDOztDQUU3QixjQUE0QyxDQUFDOztDQUc3QyxJQUFXLFlBQThCO0VBQ3JDLEtBQUssWUFBWSxLQUFLLFVBQVU7Q0FDcEM7O0NBR0EsSUFBVyxZQUFxQjtFQUM1QixPQUFPLEtBQUssWUFBWSxNQUFNLGVBQWUsV0FBVyxhQUFhLE9BQU87Q0FDaEY7QUFDSiJ9
@@ -0,0 +1,62 @@
1
+ /**
2
+ * What this runtime reports instead of throwing. Loading a pack, compiling a
3
+ * function and running one are all best-effort: a broken file or a tripped
4
+ * limit produces a diagnostic and the rest of the work continues, the way the
5
+ * Java server logs a function it could not load and keeps the server running.
6
+ */
7
+ /** How serious a diagnostic is. An error means the affected function did not load or did not run. */
8
+ export type DiagnosticSeverity = 'error' | 'warning';
9
+ /** The problems this package reports. */
10
+ export type DiagnosticCode =
11
+ /** A line started with `//`, which is not a comment marker in mcfunction. */
12
+ 'line.double-slash-comment'
13
+ /** A line started with `/`, which mcfunction does not use. */
14
+ | 'line.leading-slash'
15
+ /** A line was longer than {@link MAX_COMMAND_LENGTH}. */
16
+ | 'line.too-long'
17
+ /** The file ended with a line continuation that had nothing to continue into. */
18
+ | 'line.dangling-continuation'
19
+ /** A macro line was malformed: a bad variable name, an unterminated `$(`, or no substitution at all. */
20
+ | 'macro.invalid'
21
+ /** A macro function was called without the arguments its substitutions need. */
22
+ | 'macro.missing-arguments'
23
+ /** A `function` line named a function that is not registered. */
24
+ | 'call.unknown-function'
25
+ /** A `function` line named a tag that the tag lookup does not know. */
26
+ | 'call.unknown-tag'
27
+ /** A `function` line carried an argument compound that could not be parsed. */
28
+ | 'call.invalid-arguments'
29
+ /** The command runner threw while running a line. */
30
+ | 'command.failed'
31
+ /** A function tag referenced itself through a chain of tags. */
32
+ | 'tag.cycle'
33
+ /** A tag entry named a required function or tag that does not exist. */
34
+ | 'tag.missing-entry'
35
+ /** Execution stopped because it reached `maxCommandSequenceLength`. */
36
+ | 'limit.command-sequence-length'
37
+ /** Execution stopped because it reached `maxCommandForks`. */
38
+ | 'limit.command-forks'
39
+ /** A file under `function/` could not be decoded or routed to an identifier. */
40
+ | 'load.invalid-file';
41
+ /** One reported problem, carrying enough location to find it in a pack. */
42
+ export interface Diagnostic {
43
+ severity: DiagnosticSeverity;
44
+ code: DiagnosticCode;
45
+ message: string;
46
+ /** The namespaced id of the function the problem is in, when there is one. */
47
+ functionId?: string;
48
+ /** The 1-based line number inside that function, when the problem has one. */
49
+ line?: number;
50
+ /** The name of the pack the file came from, for problems found while loading. */
51
+ pack?: string;
52
+ }
53
+ /** Collects diagnostics in report order. */
54
+ export declare class DiagnosticCollector {
55
+ /** Everything reported so far, in the order it was reported. */
56
+ readonly diagnostics: Diagnostic[];
57
+ /** Records one diagnostic. */
58
+ add(diagnostic: Diagnostic): void;
59
+ /** Whether any recorded diagnostic is an error. */
60
+ get hasErrors(): boolean;
61
+ }
62
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qGAAqG;AACrG,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,SAAS,CAAC;AAErD,yCAAyC;AACzC,MAAM,MAAM,cAAc;AACtB,6EAA6E;AAC3E,2BAA2B;AAC7B,8DAA8D;GAC5D,oBAAoB;AACtB,yDAAyD;GACvD,eAAe;AACjB,iFAAiF;GAC/E,4BAA4B;AAC9B,wGAAwG;GACtG,eAAe;AACjB,gFAAgF;GAC9E,yBAAyB;AAC3B,iEAAiE;GAC/D,uBAAuB;AACzB,uEAAuE;GACrE,kBAAkB;AACpB,+EAA+E;GAC7E,wBAAwB;AAC1B,qDAAqD;GACnD,gBAAgB;AAClB,gEAAgE;GAC9D,WAAW;AACb,wEAAwE;GACtE,mBAAmB;AACrB,uEAAuE;GACrE,+BAA+B;AACjC,8DAA8D;GAC5D,qBAAqB;AACvB,gFAAgF;GAC9E,mBAAmB,CAAC;AAE1B,2EAA2E;AAC3E,MAAM,WAAW,UAAU;IACvB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,4CAA4C;AAC5C,qBAAa,mBAAmB;IAC5B,gEAAgE;IAChE,SAAgB,WAAW,EAAE,UAAU,EAAE,CAAM;IAE/C,8BAA8B;IACvB,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAEvC;IAED,mDAAmD;IACnD,IAAW,SAAS,IAAI,OAAO,CAE9B;CACJ"}
@@ -0,0 +1,17 @@
1
+ // src/diagnostics.ts
2
+ /** Collects diagnostics in report order. */
3
+ var DiagnosticCollector = class {
4
+ /** Everything reported so far, in the order it was reported. */
5
+ diagnostics = [];
6
+ /** Records one diagnostic. */
7
+ add(diagnostic) {
8
+ this.diagnostics.push(diagnostic);
9
+ }
10
+ /** Whether any recorded diagnostic is an error. */
11
+ get hasErrors() {
12
+ return this.diagnostics.some((diagnostic) => diagnostic.severity === "error");
13
+ }
14
+ };
15
+ export { DiagnosticCollector };
16
+
17
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ25vc3RpY3MuZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2RpYWdub3N0aWNzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV2hhdCB0aGlzIHJ1bnRpbWUgcmVwb3J0cyBpbnN0ZWFkIG9mIHRocm93aW5nLiBMb2FkaW5nIGEgcGFjaywgY29tcGlsaW5nIGFcbiAqIGZ1bmN0aW9uIGFuZCBydW5uaW5nIG9uZSBhcmUgYWxsIGJlc3QtZWZmb3J0OiBhIGJyb2tlbiBmaWxlIG9yIGEgdHJpcHBlZFxuICogbGltaXQgcHJvZHVjZXMgYSBkaWFnbm9zdGljIGFuZCB0aGUgcmVzdCBvZiB0aGUgd29yayBjb250aW51ZXMsIHRoZSB3YXkgdGhlXG4gKiBKYXZhIHNlcnZlciBsb2dzIGEgZnVuY3Rpb24gaXQgY291bGQgbm90IGxvYWQgYW5kIGtlZXBzIHRoZSBzZXJ2ZXIgcnVubmluZy5cbiAqL1xuXG4vKiogSG93IHNlcmlvdXMgYSBkaWFnbm9zdGljIGlzLiBBbiBlcnJvciBtZWFucyB0aGUgYWZmZWN0ZWQgZnVuY3Rpb24gZGlkIG5vdCBsb2FkIG9yIGRpZCBub3QgcnVuLiAqL1xuZXhwb3J0IHR5cGUgRGlhZ25vc3RpY1NldmVyaXR5ID0gJ2Vycm9yJyB8ICd3YXJuaW5nJztcblxuLyoqIFRoZSBwcm9ibGVtcyB0aGlzIHBhY2thZ2UgcmVwb3J0cy4gKi9cbmV4cG9ydCB0eXBlIERpYWdub3N0aWNDb2RlID1cbiAgICAvKiogQSBsaW5lIHN0YXJ0ZWQgd2l0aCBgLy9gLCB3aGljaCBpcyBub3QgYSBjb21tZW50IG1hcmtlciBpbiBtY2Z1bmN0aW9uLiAqL1xuICAgIHwgJ2xpbmUuZG91YmxlLXNsYXNoLWNvbW1lbnQnXG4gICAgLyoqIEEgbGluZSBzdGFydGVkIHdpdGggYC9gLCB3aGljaCBtY2Z1bmN0aW9uIGRvZXMgbm90IHVzZS4gKi9cbiAgICB8ICdsaW5lLmxlYWRpbmctc2xhc2gnXG4gICAgLyoqIEEgbGluZSB3YXMgbG9uZ2VyIHRoYW4ge0BsaW5rIE1BWF9DT01NQU5EX0xFTkdUSH0uICovXG4gICAgfCAnbGluZS50b28tbG9uZydcbiAgICAvKiogVGhlIGZpbGUgZW5kZWQgd2l0aCBhIGxpbmUgY29udGludWF0aW9uIHRoYXQgaGFkIG5vdGhpbmcgdG8gY29udGludWUgaW50by4gKi9cbiAgICB8ICdsaW5lLmRhbmdsaW5nLWNvbnRpbnVhdGlvbidcbiAgICAvKiogQSBtYWNybyBsaW5lIHdhcyBtYWxmb3JtZWQ6IGEgYmFkIHZhcmlhYmxlIG5hbWUsIGFuIHVudGVybWluYXRlZCBgJChgLCBvciBubyBzdWJzdGl0dXRpb24gYXQgYWxsLiAqL1xuICAgIHwgJ21hY3JvLmludmFsaWQnXG4gICAgLyoqIEEgbWFjcm8gZnVuY3Rpb24gd2FzIGNhbGxlZCB3aXRob3V0IHRoZSBhcmd1bWVudHMgaXRzIHN1YnN0aXR1dGlvbnMgbmVlZC4gKi9cbiAgICB8ICdtYWNyby5taXNzaW5nLWFyZ3VtZW50cydcbiAgICAvKiogQSBgZnVuY3Rpb25gIGxpbmUgbmFtZWQgYSBmdW5jdGlvbiB0aGF0IGlzIG5vdCByZWdpc3RlcmVkLiAqL1xuICAgIHwgJ2NhbGwudW5rbm93bi1mdW5jdGlvbidcbiAgICAvKiogQSBgZnVuY3Rpb25gIGxpbmUgbmFtZWQgYSB0YWcgdGhhdCB0aGUgdGFnIGxvb2t1cCBkb2VzIG5vdCBrbm93LiAqL1xuICAgIHwgJ2NhbGwudW5rbm93bi10YWcnXG4gICAgLyoqIEEgYGZ1bmN0aW9uYCBsaW5lIGNhcnJpZWQgYW4gYXJndW1lbnQgY29tcG91bmQgdGhhdCBjb3VsZCBub3QgYmUgcGFyc2VkLiAqL1xuICAgIHwgJ2NhbGwuaW52YWxpZC1hcmd1bWVudHMnXG4gICAgLyoqIFRoZSBjb21tYW5kIHJ1bm5lciB0aHJldyB3aGlsZSBydW5uaW5nIGEgbGluZS4gKi9cbiAgICB8ICdjb21tYW5kLmZhaWxlZCdcbiAgICAvKiogQSBmdW5jdGlvbiB0YWcgcmVmZXJlbmNlZCBpdHNlbGYgdGhyb3VnaCBhIGNoYWluIG9mIHRhZ3MuICovXG4gICAgfCAndGFnLmN5Y2xlJ1xuICAgIC8qKiBBIHRhZyBlbnRyeSBuYW1lZCBhIHJlcXVpcmVkIGZ1bmN0aW9uIG9yIHRhZyB0aGF0IGRvZXMgbm90IGV4aXN0LiAqL1xuICAgIHwgJ3RhZy5taXNzaW5nLWVudHJ5J1xuICAgIC8qKiBFeGVjdXRpb24gc3RvcHBlZCBiZWNhdXNlIGl0IHJlYWNoZWQgYG1heENvbW1hbmRTZXF1ZW5jZUxlbmd0aGAuICovXG4gICAgfCAnbGltaXQuY29tbWFuZC1zZXF1ZW5jZS1sZW5ndGgnXG4gICAgLyoqIEV4ZWN1dGlvbiBzdG9wcGVkIGJlY2F1c2UgaXQgcmVhY2hlZCBgbWF4Q29tbWFuZEZvcmtzYC4gKi9cbiAgICB8ICdsaW1pdC5jb21tYW5kLWZvcmtzJ1xuICAgIC8qKiBBIGZpbGUgdW5kZXIgYGZ1bmN0aW9uL2AgY291bGQgbm90IGJlIGRlY29kZWQgb3Igcm91dGVkIHRvIGFuIGlkZW50aWZpZXIuICovXG4gICAgfCAnbG9hZC5pbnZhbGlkLWZpbGUnO1xuXG4vKiogT25lIHJlcG9ydGVkIHByb2JsZW0sIGNhcnJ5aW5nIGVub3VnaCBsb2NhdGlvbiB0byBmaW5kIGl0IGluIGEgcGFjay4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlhZ25vc3RpYyB7XG4gICAgc2V2ZXJpdHk6IERpYWdub3N0aWNTZXZlcml0eTtcbiAgICBjb2RlOiBEaWFnbm9zdGljQ29kZTtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBuYW1lc3BhY2VkIGlkIG9mIHRoZSBmdW5jdGlvbiB0aGUgcHJvYmxlbSBpcyBpbiwgd2hlbiB0aGVyZSBpcyBvbmUuICovXG4gICAgZnVuY3Rpb25JZD86IHN0cmluZztcbiAgICAvKiogVGhlIDEtYmFzZWQgbGluZSBudW1iZXIgaW5zaWRlIHRoYXQgZnVuY3Rpb24sIHdoZW4gdGhlIHByb2JsZW0gaGFzIG9uZS4gKi9cbiAgICBsaW5lPzogbnVtYmVyO1xuICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgcGFjayB0aGUgZmlsZSBjYW1lIGZyb20sIGZvciBwcm9ibGVtcyBmb3VuZCB3aGlsZSBsb2FkaW5nLiAqL1xuICAgIHBhY2s/OiBzdHJpbmc7XG59XG5cbi8qKiBDb2xsZWN0cyBkaWFnbm9zdGljcyBpbiByZXBvcnQgb3JkZXIuICovXG5leHBvcnQgY2xhc3MgRGlhZ25vc3RpY0NvbGxlY3RvciB7XG4gICAgLyoqIEV2ZXJ5dGhpbmcgcmVwb3J0ZWQgc28gZmFyLCBpbiB0aGUgb3JkZXIgaXQgd2FzIHJlcG9ydGVkLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdID0gW107XG5cbiAgICAvKiogUmVjb3JkcyBvbmUgZGlhZ25vc3RpYy4gKi9cbiAgICBwdWJsaWMgYWRkKGRpYWdub3N0aWM6IERpYWdub3N0aWMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaWFnbm9zdGljcy5wdXNoKGRpYWdub3N0aWMpO1xuICAgIH1cblxuICAgIC8qKiBXaGV0aGVyIGFueSByZWNvcmRlZCBkaWFnbm9zdGljIGlzIGFuIGVycm9yLiAqL1xuICAgIHB1YmxpYyBnZXQgaGFzRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWFnbm9zdGljcy5zb21lKChkaWFnbm9zdGljKSA9PiBkaWFnbm9zdGljLnNldmVyaXR5ID09PSAnZXJyb3InKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBeURBLElBQWEsc0JBQWIsTUFBaUM7O0NBRTdCLGNBQTRDLENBQUM7O0NBRzdDLElBQVcsWUFBOEI7RUFDckMsS0FBSyxZQUFZLEtBQUssVUFBVTtDQUNwQzs7Q0FHQSxJQUFXLFlBQXFCO0VBQzVCLE9BQU8sS0FBSyxZQUFZLE1BQU0sZUFBZSxXQUFXLGFBQWEsT0FBTztDQUNoRjtBQUNKIn0=