@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,135 @@
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_compile = require("./compile.cjs.cjs");
6
+ const require_diagnostics = require("./diagnostics.cjs.cjs");
7
+ // src/registry.ts
8
+ /** The functions a pack stack loaded, keyed by namespaced id. */
9
+ var FunctionRegistry = class {
10
+ functions = /* @__PURE__ */ new Map();
11
+ /** Registers a function, replacing whatever an earlier pack registered under the same id. */
12
+ add(compiled, pack) {
13
+ this.functions.set(compiled.id, {
14
+ compiled,
15
+ pack
16
+ });
17
+ }
18
+ /** Returns the winning function for an id. */
19
+ get(id) {
20
+ return this.functions.get(id)?.compiled;
21
+ }
22
+ /** Whether any pack registered the id. */
23
+ has(id) {
24
+ return this.functions.has(id);
25
+ }
26
+ /** The name of the pack whose file won the id. */
27
+ packOf(id) {
28
+ return this.functions.get(id)?.pack;
29
+ }
30
+ /** Every registered id, in registration order. */
31
+ ids() {
32
+ return [...this.functions.keys()];
33
+ }
34
+ /** How many functions are registered. */
35
+ get size() {
36
+ return this.functions.size;
37
+ }
38
+ };
39
+ var decoder = new TextDecoder("utf-8", { fatal: true });
40
+ /** Decodes a file, or reports that it is not text. */
41
+ var decode = (file, pack, path, collector) => {
42
+ if (typeof file === "string") return file;
43
+ try {
44
+ return decoder.decode(file);
45
+ } catch {
46
+ collector.add({
47
+ severity: "error",
48
+ code: "load.invalid-file",
49
+ pack,
50
+ message: `${path} is not valid UTF-8`
51
+ });
52
+ return;
53
+ }
54
+ };
55
+ /** Reads a function tag file, which is a JSON object with `values` and an optional `replace`. */
56
+ var readTagFile = (text, pack, path, collector) => {
57
+ const report = (message) => {
58
+ collector.add({
59
+ severity: "error",
60
+ code: "load.invalid-file",
61
+ pack,
62
+ message: `${path}: ${message}`
63
+ });
64
+ };
65
+ let parsed;
66
+ try {
67
+ parsed = JSON.parse(text);
68
+ } catch (error) {
69
+ return report(error instanceof Error ? error.message : String(error));
70
+ }
71
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return report("a tag file must be a JSON object");
72
+ if (!("values" in parsed) || !Array.isArray(parsed.values)) return report("the tag file has no values array");
73
+ const values = [];
74
+ for (const entry of parsed.values) {
75
+ if (typeof entry === "string") {
76
+ values.push(entry);
77
+ continue;
78
+ }
79
+ if (typeof entry === "object" && entry !== null && "id" in entry && typeof entry.id === "string") {
80
+ const required = "required" in entry && typeof entry.required === "boolean" ? entry.required : void 0;
81
+ values.push(required === void 0 ? { id: entry.id } : {
82
+ id: entry.id,
83
+ required
84
+ });
85
+ continue;
86
+ }
87
+ return report("a tag entry must be an id or an object with an id");
88
+ }
89
+ return {
90
+ values,
91
+ replace: "replace" in parsed && parsed.replace === true
92
+ };
93
+ };
94
+ /**
95
+ * Loads every function and function tag a pack stack declares.
96
+ *
97
+ * Packs apply in order. A function id a later pack also declares is replaced
98
+ * whole; a tag a later pack also declares is merged, unless that pack sets
99
+ * `replace`. A file that does not compile is reported and left out, so one
100
+ * broken function does not stop the rest of the stack from loading.
101
+ */
102
+ var loadFunctions = (packs) => {
103
+ const functions = new FunctionRegistry();
104
+ const tags = new require_tags.FunctionTagRegistry();
105
+ const collector = new require_diagnostics.DiagnosticCollector();
106
+ for (const pack of packs) for (const [path, file] of pack.files) {
107
+ const functionId = require_identifiers.functionIdForPath(path);
108
+ if (functionId !== void 0) {
109
+ const text = decode(file, pack.name, path, collector);
110
+ if (text === void 0) continue;
111
+ const compiled = require_compile.compileFunction(functionId, text);
112
+ for (const diagnostic of compiled.diagnostics) collector.add({
113
+ ...diagnostic,
114
+ pack: pack.name
115
+ });
116
+ if (compiled.function) functions.add(compiled.function, pack.name);
117
+ continue;
118
+ }
119
+ const tagId = require_identifiers.functionTagIdForPath(path);
120
+ if (tagId === void 0) continue;
121
+ const text = decode(file, pack.name, path, collector);
122
+ if (text === void 0) continue;
123
+ const tag = readTagFile(text, pack.name, path, collector);
124
+ if (tag) tags.add(tagId, tag);
125
+ }
126
+ return {
127
+ functions,
128
+ tags,
129
+ diagnostics: collector.diagnostics
130
+ };
131
+ };
132
+ exports.FunctionRegistry = FunctionRegistry;
133
+ exports.loadFunctions = loadFunctions;
134
+
135
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuY2pzLmNqcyIsIm5hbWVzIjpbIkZ1bmN0aW9uVGFnUmVnaXN0cnkiLCJEaWFnbm9zdGljQ29sbGVjdG9yIiwiZnVuY3Rpb25JZEZvclBhdGgiLCJjb21waWxlRnVuY3Rpb24iLCJmdW5jdGlvblRhZ0lkRm9yUGF0aCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9yZWdpc3RyeS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExvYWRpbmcgZnVuY3Rpb25zIGFuZCBmdW5jdGlvbiB0YWdzIGZyb20gYSBzdGFjayBvZiBwYWNrcy4gVGhlIHN0YWNrXG4gKiBjb21wb3NlcyB0aGUgd2F5IHRoZSByZXN0IG9mIHRoaXMgcmVwb3NpdG9yeSBjb21wb3NlcyBwYWNrczogYSBsYXRlciBwYWNrXG4gKiByZXBsYWNlcyBhbiBlYXJsaWVyIG9uZSBieSBpZGVudGlmaWVyLiBUYWdzIGFyZSB0aGUgZXhjZXB0aW9uLCBiZWNhdXNlIGEgdGFnXG4gKiBtZXJnZXMgYWNyb3NzIHBhY2tzIHVubGVzcyBpdCBzYXlzIGByZXBsYWNlYCwgd2hpY2ggaXMgd2hhdCBsZXRzIHR3byBwYWNrc1xuICogYm90aCBhZGQgdG8gYG1pbmVjcmFmdDp0aWNrYC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbXBpbGVkRnVuY3Rpb24gfSBmcm9tICcuL2NvbXBpbGUnO1xuaW1wb3J0IHsgY29tcGlsZUZ1bmN0aW9uIH0gZnJvbSAnLi9jb21waWxlJztcbmltcG9ydCB0eXBlIHsgRGlhZ25vc3RpYyB9IGZyb20gJy4vZGlhZ25vc3RpY3MnO1xuaW1wb3J0IHsgRGlhZ25vc3RpY0NvbGxlY3RvciB9IGZyb20gJy4vZGlhZ25vc3RpY3MnO1xuaW1wb3J0IHR5cGUgeyBGdW5jdGlvbkxvb2t1cCB9IGZyb20gJy4vZXhlY3V0b3InO1xuaW1wb3J0IHsgZnVuY3Rpb25JZEZvclBhdGgsIGZ1bmN0aW9uVGFnSWRGb3JQYXRoIH0gZnJvbSAnLi9pZGVudGlmaWVycyc7XG5pbXBvcnQgdHlwZSB7IEZ1bmN0aW9uVGFnLCBGdW5jdGlvblRhZ0VudHJ5IH0gZnJvbSAnLi90YWdzJztcbmltcG9ydCB7IEZ1bmN0aW9uVGFnUmVnaXN0cnkgfSBmcm9tICcuL3RhZ3MnO1xuXG4vKipcbiAqIE9uZSBwYWNrJ3MgZmlsZXMsIGtleWVkIGJ5IHBhY2stcmVsYXRpdmUgcGF0aC4gQW55IHBhY2sgcmVhZGVyIGNhbiBzdXBwbHlcbiAqIHRoaXM6IGBAanNwcmlzbWFyaW5lL3BhY2tzYCByb3V0ZXMgdGhlIEpTT04gaGFsZiBvZiBhIGRhdGFwYWNrLCBhbmQgdGhlXG4gKiBgLm1jZnVuY3Rpb25gIGZpbGVzIGl0IGRvZXMgbm90IGNvbnN1bWUgY29tZSB0aHJvdWdoIGhlcmUgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uUGFjayB7XG4gICAgLyoqIFRoZSBwYWNrJ3MgbmFtZSwgdXNlZCB0byBhdHRyaWJ1dGUgZGlhZ25vc3RpY3MgYW5kIHRvIHNheSB3aGljaCBwYWNrIHdvbi4gKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZmlsZXM6IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nIHwgVWludDhBcnJheT47XG59XG5cbi8qKiBUaGUgZnVuY3Rpb25zIGEgcGFjayBzdGFjayBsb2FkZWQsIGtleWVkIGJ5IG5hbWVzcGFjZWQgaWQuICovXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25SZWdpc3RyeSBpbXBsZW1lbnRzIEZ1bmN0aW9uTG9va3VwIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZ1bmN0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCB7IGNvbXBpbGVkOiBDb21waWxlZEZ1bmN0aW9uOyBwYWNrOiBzdHJpbmcgfT4oKTtcblxuICAgIC8qKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiwgcmVwbGFjaW5nIHdoYXRldmVyIGFuIGVhcmxpZXIgcGFjayByZWdpc3RlcmVkIHVuZGVyIHRoZSBzYW1lIGlkLiAqL1xuICAgIHB1YmxpYyBhZGQoY29tcGlsZWQ6IENvbXBpbGVkRnVuY3Rpb24sIHBhY2s6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmZ1bmN0aW9ucy5zZXQoY29tcGlsZWQuaWQsIHsgY29tcGlsZWQsIHBhY2sgfSk7XG4gICAgfVxuXG4gICAgLyoqIFJldHVybnMgdGhlIHdpbm5pbmcgZnVuY3Rpb24gZm9yIGFuIGlkLiAqL1xuICAgIHB1YmxpYyBnZXQoaWQ6IHN0cmluZyk6IENvbXBpbGVkRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5mdW5jdGlvbnMuZ2V0KGlkKT8uY29tcGlsZWQ7XG4gICAgfVxuXG4gICAgLyoqIFdoZXRoZXIgYW55IHBhY2sgcmVnaXN0ZXJlZCB0aGUgaWQuICovXG4gICAgcHVibGljIGhhcyhpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bmN0aW9ucy5oYXMoaWQpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgcGFjayB3aG9zZSBmaWxlIHdvbiB0aGUgaWQuICovXG4gICAgcHVibGljIHBhY2tPZihpZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25zLmdldChpZCk/LnBhY2s7XG4gICAgfVxuXG4gICAgLyoqIEV2ZXJ5IHJlZ2lzdGVyZWQgaWQsIGluIHJlZ2lzdHJhdGlvbiBvcmRlci4gKi9cbiAgICBwdWJsaWMgaWRzKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLmZ1bmN0aW9ucy5rZXlzKCldO1xuICAgIH1cblxuICAgIC8qKiBIb3cgbWFueSBmdW5jdGlvbnMgYXJlIHJlZ2lzdGVyZWQuICovXG4gICAgcHVibGljIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bmN0aW9ucy5zaXplO1xuICAgIH1cbn1cblxuLyoqIFdoYXQge0BsaW5rIGxvYWRGdW5jdGlvbnN9IHByb2R1Y2VzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbkxvYWRSZXN1bHQge1xuICAgIGZ1bmN0aW9uczogRnVuY3Rpb25SZWdpc3RyeTtcbiAgICB0YWdzOiBGdW5jdGlvblRhZ1JlZ2lzdHJ5O1xuICAgIGRpYWdub3N0aWNzOiByZWFkb25seSBEaWFnbm9zdGljW107XG59XG5cbmNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi04JywgeyBmYXRhbDogdHJ1ZSB9KTtcblxuLyoqIERlY29kZXMgYSBmaWxlLCBvciByZXBvcnRzIHRoYXQgaXQgaXMgbm90IHRleHQuICovXG5jb25zdCBkZWNvZGUgPSAoXG4gICAgZmlsZTogc3RyaW5nIHwgVWludDhBcnJheSxcbiAgICBwYWNrOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGNvbGxlY3RvcjogRGlhZ25vc3RpY0NvbGxlY3RvclxuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAodHlwZW9mIGZpbGUgPT09ICdzdHJpbmcnKSByZXR1cm4gZmlsZTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gZGVjb2Rlci5kZWNvZGUoZmlsZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbGxlY3Rvci5hZGQoe1xuICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICBjb2RlOiAnbG9hZC5pbnZhbGlkLWZpbGUnLFxuICAgICAgICAgICAgcGFjayxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGAke3BhdGh9IGlzIG5vdCB2YWxpZCBVVEYtOGBcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufTtcblxuLyoqIFJlYWRzIGEgZnVuY3Rpb24gdGFnIGZpbGUsIHdoaWNoIGlzIGEgSlNPTiBvYmplY3Qgd2l0aCBgdmFsdWVzYCBhbmQgYW4gb3B0aW9uYWwgYHJlcGxhY2VgLiAqL1xuY29uc3QgcmVhZFRhZ0ZpbGUgPSAoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHBhY2s6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgY29sbGVjdG9yOiBEaWFnbm9zdGljQ29sbGVjdG9yXG4pOiBGdW5jdGlvblRhZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgcmVwb3J0ID0gKG1lc3NhZ2U6IHN0cmluZyk6IHVuZGVmaW5lZCA9PiB7XG4gICAgICAgIGNvbGxlY3Rvci5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgY29kZTogJ2xvYWQuaW52YWxpZC1maWxlJywgcGFjaywgbWVzc2FnZTogYCR7cGF0aH06ICR7bWVzc2FnZX1gIH0pO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHJlcG9ydChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgIH1cblxuICAgIC8vIFBhY2sgZGF0YSBpcyBhIHBhcnNlZC1pbnB1dCBib3VuZGFyeSwgc28gZXZlcnkgZmllbGQgaXMgbmFycm93ZWQgcmF0aGVyIHRoYW4gYXNzZXJ0ZWQuXG4gICAgaWYgKHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnIHx8IHBhcnNlZCA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KHBhcnNlZCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcG9ydCgnYSB0YWcgZmlsZSBtdXN0IGJlIGEgSlNPTiBvYmplY3QnKTtcbiAgICB9XG4gICAgaWYgKCEoJ3ZhbHVlcycgaW4gcGFyc2VkKSB8fCAhQXJyYXkuaXNBcnJheShwYXJzZWQudmFsdWVzKSkgcmV0dXJuIHJlcG9ydCgndGhlIHRhZyBmaWxlIGhhcyBubyB2YWx1ZXMgYXJyYXknKTtcblxuICAgIGNvbnN0IHZhbHVlczogRnVuY3Rpb25UYWdFbnRyeVtdID0gW107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBwYXJzZWQudmFsdWVzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaChlbnRyeSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnb2JqZWN0JyAmJiBlbnRyeSAhPT0gbnVsbCAmJiAnaWQnIGluIGVudHJ5ICYmIHR5cGVvZiBlbnRyeS5pZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVkID0gJ3JlcXVpcmVkJyBpbiBlbnRyeSAmJiB0eXBlb2YgZW50cnkucmVxdWlyZWQgPT09ICdib29sZWFuJyA/IGVudHJ5LnJlcXVpcmVkIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgdmFsdWVzLnB1c2gocmVxdWlyZWQgPT09IHVuZGVmaW5lZCA/IHsgaWQ6IGVudHJ5LmlkIH0gOiB7IGlkOiBlbnRyeS5pZCwgcmVxdWlyZWQgfSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVwb3J0KCdhIHRhZyBlbnRyeSBtdXN0IGJlIGFuIGlkIG9yIGFuIG9iamVjdCB3aXRoIGFuIGlkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVwbGFjZSA9ICdyZXBsYWNlJyBpbiBwYXJzZWQgJiYgcGFyc2VkLnJlcGxhY2UgPT09IHRydWU7XG4gICAgcmV0dXJuIHsgdmFsdWVzLCByZXBsYWNlIH07XG59O1xuXG4vKipcbiAqIExvYWRzIGV2ZXJ5IGZ1bmN0aW9uIGFuZCBmdW5jdGlvbiB0YWcgYSBwYWNrIHN0YWNrIGRlY2xhcmVzLlxuICpcbiAqIFBhY2tzIGFwcGx5IGluIG9yZGVyLiBBIGZ1bmN0aW9uIGlkIGEgbGF0ZXIgcGFjayBhbHNvIGRlY2xhcmVzIGlzIHJlcGxhY2VkXG4gKiB3aG9sZTsgYSB0YWcgYSBsYXRlciBwYWNrIGFsc28gZGVjbGFyZXMgaXMgbWVyZ2VkLCB1bmxlc3MgdGhhdCBwYWNrIHNldHNcbiAqIGByZXBsYWNlYC4gQSBmaWxlIHRoYXQgZG9lcyBub3QgY29tcGlsZSBpcyByZXBvcnRlZCBhbmQgbGVmdCBvdXQsIHNvIG9uZVxuICogYnJva2VuIGZ1bmN0aW9uIGRvZXMgbm90IHN0b3AgdGhlIHJlc3Qgb2YgdGhlIHN0YWNrIGZyb20gbG9hZGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRGdW5jdGlvbnMgPSAocGFja3M6IHJlYWRvbmx5IEZ1bmN0aW9uUGFja1tdKTogRnVuY3Rpb25Mb2FkUmVzdWx0ID0+IHtcbiAgICBjb25zdCBmdW5jdGlvbnMgPSBuZXcgRnVuY3Rpb25SZWdpc3RyeSgpO1xuICAgIGNvbnN0IHRhZ3MgPSBuZXcgRnVuY3Rpb25UYWdSZWdpc3RyeSgpO1xuICAgIGNvbnN0IGNvbGxlY3RvciA9IG5ldyBEaWFnbm9zdGljQ29sbGVjdG9yKCk7XG5cbiAgICBmb3IgKGNvbnN0IHBhY2sgb2YgcGFja3MpIHtcbiAgICAgICAgZm9yIChjb25zdCBbcGF0aCwgZmlsZV0gb2YgcGFjay5maWxlcykge1xuICAgICAgICAgICAgY29uc3QgZnVuY3Rpb25JZCA9IGZ1bmN0aW9uSWRGb3JQYXRoKHBhdGgpO1xuICAgICAgICAgICAgaWYgKGZ1bmN0aW9uSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBkZWNvZGUoZmlsZSwgcGFjay5uYW1lLCBwYXRoLCBjb2xsZWN0b3IpO1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcGlsZWQgPSBjb21waWxlRnVuY3Rpb24oZnVuY3Rpb25JZCwgdGV4dCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBkaWFnbm9zdGljIG9mIGNvbXBpbGVkLmRpYWdub3N0aWNzKSBjb2xsZWN0b3IuYWRkKHsgLi4uZGlhZ25vc3RpYywgcGFjazogcGFjay5uYW1lIH0pO1xuICAgICAgICAgICAgICAgIGlmIChjb21waWxlZC5mdW5jdGlvbikgZnVuY3Rpb25zLmFkZChjb21waWxlZC5mdW5jdGlvbiwgcGFjay5uYW1lKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdGFnSWQgPSBmdW5jdGlvblRhZ0lkRm9yUGF0aChwYXRoKTtcbiAgICAgICAgICAgIGlmICh0YWdJZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IGRlY29kZShmaWxlLCBwYWNrLm5hbWUsIHBhdGgsIGNvbGxlY3Rvcik7XG4gICAgICAgICAgICBpZiAodGV4dCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgdGFnID0gcmVhZFRhZ0ZpbGUodGV4dCwgcGFjay5uYW1lLCBwYXRoLCBjb2xsZWN0b3IpO1xuICAgICAgICAgICAgaWYgKHRhZykgdGFncy5hZGQodGFnSWQsIHRhZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBmdW5jdGlvbnMsIHRhZ3MsIGRpYWdub3N0aWNzOiBjb2xsZWN0b3IuZGlhZ25vc3RpY3MgfTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBNkJBLElBQWEsbUJBQWIsTUFBd0Q7Q0FDcEQsNEJBQTZCLElBQUksSUFBMEQ7O0NBRzNGLElBQVcsVUFBNEIsTUFBb0I7RUFDdkQsS0FBSyxVQUFVLElBQUksU0FBUyxJQUFJO0dBQUU7R0FBVTtFQUFLLENBQUM7Q0FDdEQ7O0NBR0EsSUFBVyxJQUEwQztFQUNqRCxPQUFPLEtBQUssVUFBVSxJQUFJLEVBQUUsQ0FBQyxFQUFFO0NBQ25DOztDQUdBLElBQVcsSUFBcUI7RUFDNUIsT0FBTyxLQUFLLFVBQVUsSUFBSSxFQUFFO0NBQ2hDOztDQUdBLE9BQWMsSUFBZ0M7RUFDMUMsT0FBTyxLQUFLLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRTtDQUNuQzs7Q0FHQSxN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
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Loading functions and function tags from a stack of packs. The stack
3
+ * composes the way the rest of this repository composes packs: a later pack
4
+ * replaces an earlier one by identifier. Tags are the exception, because a tag
5
+ * merges across packs unless it says `replace`, which is what lets two packs
6
+ * both add to `minecraft:tick`.
7
+ */
8
+ import type { CompiledFunction } from './compile';
9
+ import type { Diagnostic } from './diagnostics';
10
+ import type { FunctionLookup } from './executor';
11
+ import { FunctionTagRegistry } from './tags';
12
+ /**
13
+ * One pack's files, keyed by pack-relative path. Any pack reader can supply
14
+ * this: `@jsprismarine/packs` routes the JSON half of a datapack, and the
15
+ * `.mcfunction` files it does not consume come through here unchanged.
16
+ */
17
+ export interface FunctionPack {
18
+ /** The pack's name, used to attribute diagnostics and to say which pack won. */
19
+ name: string;
20
+ files: ReadonlyMap<string, string | Uint8Array>;
21
+ }
22
+ /** The functions a pack stack loaded, keyed by namespaced id. */
23
+ export declare class FunctionRegistry implements FunctionLookup {
24
+ private readonly functions;
25
+ /** Registers a function, replacing whatever an earlier pack registered under the same id. */
26
+ add(compiled: CompiledFunction, pack: string): void;
27
+ /** Returns the winning function for an id. */
28
+ get(id: string): CompiledFunction | undefined;
29
+ /** Whether any pack registered the id. */
30
+ has(id: string): boolean;
31
+ /** The name of the pack whose file won the id. */
32
+ packOf(id: string): string | undefined;
33
+ /** Every registered id, in registration order. */
34
+ ids(): readonly string[];
35
+ /** How many functions are registered. */
36
+ get size(): number;
37
+ }
38
+ /** What {@link loadFunctions} produces. */
39
+ export interface FunctionLoadResult {
40
+ functions: FunctionRegistry;
41
+ tags: FunctionTagRegistry;
42
+ diagnostics: readonly Diagnostic[];
43
+ }
44
+ /**
45
+ * Loads every function and function tag a pack stack declares.
46
+ *
47
+ * Packs apply in order. A function id a later pack also declares is replaced
48
+ * whole; a tag a later pack also declares is merged, unless that pack sets
49
+ * `replace`. A file that does not compile is reported and left out, so one
50
+ * broken function does not stop the rest of the stack from loading.
51
+ */
52
+ export declare const loadFunctions: (packs: readonly FunctionPack[]) => FunctionLoadResult;
53
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAE7C;;;;GAIG;AACH,MAAM,WAAW,YAAY;IACzB,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC;CACnD;AAED,iEAAiE;AACjE,qBAAa,gBAAiB,YAAW,cAAc;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmE;IAE7F,6FAA6F;IACtF,GAAG,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAEzD;IAED,8CAA8C;IACvC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAEnD;IAED,0CAA0C;IACnC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE9B;IAED,kDAAkD;IAC3C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE5C;IAED,kDAAkD;IAC3C,GAAG,IAAI,SAAS,MAAM,EAAE,CAE9B;IAED,yCAAyC;IACzC,IAAW,IAAI,IAAI,MAAM,CAExB;CACJ;AAED,2CAA2C;AAC3C,MAAM,WAAW,kBAAkB;IAC/B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CACtC;AAoED;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,UAAW,SAAS,YAAY,EAAE,KAAG,kBA8B9D,CAAC"}
@@ -0,0 +1,132 @@
1
+ import { functionIdForPath, functionTagIdForPath } from "./identifiers.es.js";
2
+ import { FunctionTagRegistry } from "./tags.es.js";
3
+ import { compileFunction } from "./compile.es.js";
4
+ import { DiagnosticCollector } from "./diagnostics.es.js";
5
+ // src/registry.ts
6
+ /** The functions a pack stack loaded, keyed by namespaced id. */
7
+ var FunctionRegistry = class {
8
+ functions = /* @__PURE__ */ new Map();
9
+ /** Registers a function, replacing whatever an earlier pack registered under the same id. */
10
+ add(compiled, pack) {
11
+ this.functions.set(compiled.id, {
12
+ compiled,
13
+ pack
14
+ });
15
+ }
16
+ /** Returns the winning function for an id. */
17
+ get(id) {
18
+ return this.functions.get(id)?.compiled;
19
+ }
20
+ /** Whether any pack registered the id. */
21
+ has(id) {
22
+ return this.functions.has(id);
23
+ }
24
+ /** The name of the pack whose file won the id. */
25
+ packOf(id) {
26
+ return this.functions.get(id)?.pack;
27
+ }
28
+ /** Every registered id, in registration order. */
29
+ ids() {
30
+ return [...this.functions.keys()];
31
+ }
32
+ /** How many functions are registered. */
33
+ get size() {
34
+ return this.functions.size;
35
+ }
36
+ };
37
+ var decoder = new TextDecoder("utf-8", { fatal: true });
38
+ /** Decodes a file, or reports that it is not text. */
39
+ var decode = (file, pack, path, collector) => {
40
+ if (typeof file === "string") return file;
41
+ try {
42
+ return decoder.decode(file);
43
+ } catch {
44
+ collector.add({
45
+ severity: "error",
46
+ code: "load.invalid-file",
47
+ pack,
48
+ message: `${path} is not valid UTF-8`
49
+ });
50
+ return;
51
+ }
52
+ };
53
+ /** Reads a function tag file, which is a JSON object with `values` and an optional `replace`. */
54
+ var readTagFile = (text, pack, path, collector) => {
55
+ const report = (message) => {
56
+ collector.add({
57
+ severity: "error",
58
+ code: "load.invalid-file",
59
+ pack,
60
+ message: `${path}: ${message}`
61
+ });
62
+ };
63
+ let parsed;
64
+ try {
65
+ parsed = JSON.parse(text);
66
+ } catch (error) {
67
+ return report(error instanceof Error ? error.message : String(error));
68
+ }
69
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return report("a tag file must be a JSON object");
70
+ if (!("values" in parsed) || !Array.isArray(parsed.values)) return report("the tag file has no values array");
71
+ const values = [];
72
+ for (const entry of parsed.values) {
73
+ if (typeof entry === "string") {
74
+ values.push(entry);
75
+ continue;
76
+ }
77
+ if (typeof entry === "object" && entry !== null && "id" in entry && typeof entry.id === "string") {
78
+ const required = "required" in entry && typeof entry.required === "boolean" ? entry.required : void 0;
79
+ values.push(required === void 0 ? { id: entry.id } : {
80
+ id: entry.id,
81
+ required
82
+ });
83
+ continue;
84
+ }
85
+ return report("a tag entry must be an id or an object with an id");
86
+ }
87
+ return {
88
+ values,
89
+ replace: "replace" in parsed && parsed.replace === true
90
+ };
91
+ };
92
+ /**
93
+ * Loads every function and function tag a pack stack declares.
94
+ *
95
+ * Packs apply in order. A function id a later pack also declares is replaced
96
+ * whole; a tag a later pack also declares is merged, unless that pack sets
97
+ * `replace`. A file that does not compile is reported and left out, so one
98
+ * broken function does not stop the rest of the stack from loading.
99
+ */
100
+ var loadFunctions = (packs) => {
101
+ const functions = new FunctionRegistry();
102
+ const tags = new FunctionTagRegistry();
103
+ const collector = new DiagnosticCollector();
104
+ for (const pack of packs) for (const [path, file] of pack.files) {
105
+ const functionId = functionIdForPath(path);
106
+ if (functionId !== void 0) {
107
+ const text = decode(file, pack.name, path, collector);
108
+ if (text === void 0) continue;
109
+ const compiled = compileFunction(functionId, text);
110
+ for (const diagnostic of compiled.diagnostics) collector.add({
111
+ ...diagnostic,
112
+ pack: pack.name
113
+ });
114
+ if (compiled.function) functions.add(compiled.function, pack.name);
115
+ continue;
116
+ }
117
+ const tagId = functionTagIdForPath(path);
118
+ if (tagId === void 0) continue;
119
+ const text = decode(file, pack.name, path, collector);
120
+ if (text === void 0) continue;
121
+ const tag = readTagFile(text, pack.name, path, collector);
122
+ if (tag) tags.add(tagId, tag);
123
+ }
124
+ return {
125
+ functions,
126
+ tags,
127
+ diagnostics: collector.diagnostics
128
+ };
129
+ };
130
+ export { FunctionRegistry, loadFunctions };
131
+
132
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL3JlZ2lzdHJ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTG9hZGluZyBmdW5jdGlvbnMgYW5kIGZ1bmN0aW9uIHRhZ3MgZnJvbSBhIHN0YWNrIG9mIHBhY2tzLiBUaGUgc3RhY2tcbiAqIGNvbXBvc2VzIHRoZSB3YXkgdGhlIHJlc3Qgb2YgdGhpcyByZXBvc2l0b3J5IGNvbXBvc2VzIHBhY2tzOiBhIGxhdGVyIHBhY2tcbiAqIHJlcGxhY2VzIGFuIGVhcmxpZXIgb25lIGJ5IGlkZW50aWZpZXIuIFRhZ3MgYXJlIHRoZSBleGNlcHRpb24sIGJlY2F1c2UgYSB0YWdcbiAqIG1lcmdlcyBhY3Jvc3MgcGFja3MgdW5sZXNzIGl0IHNheXMgYHJlcGxhY2VgLCB3aGljaCBpcyB3aGF0IGxldHMgdHdvIHBhY2tzXG4gKiBib3RoIGFkZCB0byBgbWluZWNyYWZ0OnRpY2tgLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tcGlsZWRGdW5jdGlvbiB9IGZyb20gJy4vY29tcGlsZSc7XG5pbXBvcnQgeyBjb21waWxlRnVuY3Rpb24gfSBmcm9tICcuL2NvbXBpbGUnO1xuaW1wb3J0IHR5cGUgeyBEaWFnbm9zdGljIH0gZnJvbSAnLi9kaWFnbm9zdGljcyc7XG5pbXBvcnQgeyBEaWFnbm9zdGljQ29sbGVjdG9yIH0gZnJvbSAnLi9kaWFnbm9zdGljcyc7XG5pbXBvcnQgdHlwZSB7IEZ1bmN0aW9uTG9va3VwIH0gZnJvbSAnLi9leGVjdXRvcic7XG5pbXBvcnQgeyBmdW5jdGlvbklkRm9yUGF0aCwgZnVuY3Rpb25UYWdJZEZvclBhdGggfSBmcm9tICcuL2lkZW50aWZpZXJzJztcbmltcG9ydCB0eXBlIHsgRnVuY3Rpb25UYWcsIEZ1bmN0aW9uVGFnRW50cnkgfSBmcm9tICcuL3RhZ3MnO1xuaW1wb3J0IHsgRnVuY3Rpb25UYWdSZWdpc3RyeSB9IGZyb20gJy4vdGFncyc7XG5cbi8qKlxuICogT25lIHBhY2sncyBmaWxlcywga2V5ZWQgYnkgcGFjay1yZWxhdGl2ZSBwYXRoLiBBbnkgcGFjayByZWFkZXIgY2FuIHN1cHBseVxuICogdGhpczogYEBqc3ByaXNtYXJpbmUvcGFja3NgIHJvdXRlcyB0aGUgSlNPTiBoYWxmIG9mIGEgZGF0YXBhY2ssIGFuZCB0aGVcbiAqIGAubWNmdW5jdGlvbmAgZmlsZXMgaXQgZG9lcyBub3QgY29uc3VtZSBjb21lIHRocm91Z2ggaGVyZSB1bmNoYW5nZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb25QYWNrIHtcbiAgICAvKiogVGhlIHBhY2sncyBuYW1lLCB1c2VkIHRvIGF0dHJpYnV0ZSBkaWFnbm9zdGljcyBhbmQgdG8gc2F5IHdoaWNoIHBhY2sgd29uLiAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBmaWxlczogUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmcgfCBVaW50OEFycmF5Pjtcbn1cblxuLyoqIFRoZSBmdW5jdGlvbnMgYSBwYWNrIHN0YWNrIGxvYWRlZCwga2V5ZWQgYnkgbmFtZXNwYWNlZCBpZC4gKi9cbmV4cG9ydCBjbGFzcyBGdW5jdGlvblJlZ2lzdHJ5IGltcGxlbWVudHMgRnVuY3Rpb25Mb29rdXAge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZnVuY3Rpb25zID0gbmV3IE1hcDxzdHJpbmcsIHsgY29tcGlsZWQ6IENvbXBpbGVkRnVuY3Rpb247IHBhY2s6IHN0cmluZyB9PigpO1xuXG4gICAgLyoqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uLCByZXBsYWNpbmcgd2hhdGV2ZXIgYW4gZWFybGllciBwYWNrIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIHNhbWUgaWQuICovXG4gICAgcHVibGljIGFkZChjb21waWxlZDogQ29tcGlsZWRGdW5jdGlvbiwgcGFjazogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZnVuY3Rpb25zLnNldChjb21waWxlZC5pZCwgeyBjb21waWxlZCwgcGFjayB9KTtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJucyB0aGUgd2lubmluZyBmdW5jdGlvbiBmb3IgYW4gaWQuICovXG4gICAgcHVibGljIGdldChpZDogc3RyaW5nKTogQ29tcGlsZWRGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bmN0aW9ucy5nZXQoaWQpPy5jb21waWxlZDtcbiAgICB9XG5cbiAgICAvKiogV2hldGhlciBhbnkgcGFjayByZWdpc3RlcmVkIHRoZSBpZC4gKi9cbiAgICBwdWJsaWMgaGFzKGlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25zLmhhcyhpZCk7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBwYWNrIHdob3NlIGZpbGUgd29uIHRoZSBpZC4gKi9cbiAgICBwdWJsaWMgcGFja09mKGlkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5mdW5jdGlvbnMuZ2V0KGlkKT8ucGFjaztcbiAgICB9XG5cbiAgICAvKiogRXZlcnkgcmVnaXN0ZXJlZCBpZCwgaW4gcmVnaXN0cmF0aW9uIG9yZGVyLiAqL1xuICAgIHB1YmxpYyBpZHMoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuZnVuY3Rpb25zLmtleXMoKV07XG4gICAgfVxuXG4gICAgLyoqIEhvdyBtYW55IGZ1bmN0aW9ucyBhcmUgcmVnaXN0ZXJlZC4gKi9cbiAgICBwdWJsaWMgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25zLnNpemU7XG4gICAgfVxufVxuXG4vKiogV2hhdCB7QGxpbmsgbG9hZEZ1bmN0aW9uc30gcHJvZHVjZXMuICovXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uTG9hZFJlc3VsdCB7XG4gICAgZnVuY3Rpb25zOiBGdW5jdGlvblJlZ2lzdHJ5O1xuICAgIHRhZ3M6IEZ1bmN0aW9uVGFnUmVnaXN0cnk7XG4gICAgZGlhZ25vc3RpY3M6IHJlYWRvbmx5IERpYWdub3N0aWNbXTtcbn1cblxuY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTgnLCB7IGZhdGFsOiB0cnVlIH0pO1xuXG4vKiogRGVjb2RlcyBhIGZpbGUsIG9yIHJlcG9ydHMgdGhhdCBpdCBpcyBub3QgdGV4dC4gKi9cbmNvbnN0IGRlY29kZSA9IChcbiAgICBmaWxlOiBzdHJpbmcgfCBVaW50OEFycmF5LFxuICAgIHBhY2s6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgY29sbGVjdG9yOiBEaWFnbm9zdGljQ29sbGVjdG9yXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgIGlmICh0eXBlb2YgZmlsZSA9PT0gJ3N0cmluZycpIHJldHVybiBmaWxlO1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVyLmRlY29kZShmaWxlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgICAgY29sbGVjdG9yLmFkZCh7XG4gICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgIGNvZGU6ICdsb2FkLmludmFsaWQtZmlsZScsXG4gICAgICAgICAgICBwYWNrLFxuICAgICAgICAgICAgbWVzc2FnZTogYCR7cGF0aH0gaXMgbm90IHZhbGlkIFVURi04YFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59O1xuXG4vKiogUmVhZHMgYSBmdW5jdGlvbiB0YWcgZmlsZSwgd2hpY2ggaXMgYSBKU09OIG9iamVjdCB3aXRoIGB2YWx1ZXNgIGFuZCBhbiBvcHRpb25hbCBgcmVwbGFjZWAuICovXG5jb25zdCByZWFkVGFnRmlsZSA9IChcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgcGFjazogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBjb2xsZWN0b3I6IERpYWdub3N0aWNDb2xsZWN0b3Jcbik6IEZ1bmN0aW9uVGFnIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCByZXBvcnQgPSAobWVzc2FnZTogc3RyaW5nKTogdW5kZWZpbmVkID0+IHtcbiAgICAgICAgY29sbGVjdG9yLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBjb2RlOiAnbG9hZC5pbnZhbGlkLWZpbGUnLCBwYWNrLCBtZXNzYWdlOiBgJHtwYXRofTogJHttZXNzYWdlfWAgfSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIGxldCBwYXJzZWQ6IHVua25vd247XG4gICAgdHJ5IHtcbiAgICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gcmVwb3J0KGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSk7XG4gICAgfVxuXG4gICAgLy8gUGFjayBkYXRhIGlzIGEgcGFyc2VkLWlucHV0IGJvdW5kYXJ5LCBzbyBldmVyeSBmaWVsZCBpcyBuYXJyb3dlZCByYXRoZXIgdGhhbiBhc3NlcnRlZC5cbiAgICBpZiAodHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcgfHwgcGFyc2VkID09PSBudWxsIHx8IEFycmF5LmlzQXJyYXkocGFyc2VkKSkge1xuICAgICAgICByZXR1cm4gcmVwb3J0KCdhIHRhZyBmaWxlIG11c3QgYmUgYSBKU09OIG9iamVjdCcpO1xuICAgIH1cbiAgICBpZiAoISgndmFsdWVzJyBpbiBwYXJzZWQpIHx8ICFBcnJheS5pc0FycmF5KHBhcnNlZC52YWx1ZXMpKSByZXR1cm4gcmVwb3J0KCd0aGUgdGFnIGZpbGUgaGFzIG5vIHZhbHVlcyBhcnJheScpO1xuXG4gICAgY29uc3QgdmFsdWVzOiBGdW5jdGlvblRhZ0VudHJ5W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBhcnNlZC52YWx1ZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09ICdvYmplY3QnICYmIGVudHJ5ICE9PSBudWxsICYmICdpZCcgaW4gZW50cnkgJiYgdHlwZW9mIGVudHJ5LmlkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgcmVxdWlyZWQgPSAncmVxdWlyZWQnIGluIGVudHJ5ICYmIHR5cGVvZiBlbnRyeS5yZXF1aXJlZCA9PT0gJ2Jvb2xlYW4nID8gZW50cnkucmVxdWlyZWQgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaChyZXF1aXJlZCA9PT0gdW5kZWZpbmVkID8geyBpZDogZW50cnkuaWQgfSA6IHsgaWQ6IGVudHJ5LmlkLCByZXF1aXJlZCB9KTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXBvcnQoJ2EgdGFnIGVudHJ5IG11c3QgYmUgYW4gaWQgb3IgYW4gb2JqZWN0IHdpdGggYW4gaWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXBsYWNlID0gJ3JlcGxhY2UnIGluIHBhcnNlZCAmJiBwYXJzZWQucmVwbGFjZSA9PT0gdHJ1ZTtcbiAgICByZXR1cm4geyB2YWx1ZXMsIHJlcGxhY2UgfTtcbn07XG5cbi8qKlxuICogTG9hZHMgZXZlcnkgZnVuY3Rpb24gYW5kIGZ1bmN0aW9uIHRhZyBhIHBhY2sgc3RhY2sgZGVjbGFyZXMuXG4gKlxuICogUGFja3MgYXBwbHkgaW4gb3JkZXIuIEEgZnVuY3Rpb24gaWQgYSBsYXRlciBwYWNrIGFsc28gZGVjbGFyZXMgaXMgcmVwbGFjZWRcbiAqIHdob2xlOyBhIHRhZyBhIGxhdGVyIHBhY2sgYWxzbyBkZWNsYXJlcyBpcyBtZXJnZWQsIHVubGVzcyB0aGF0IHBhY2sgc2V0c1xuICogYHJlcGxhY2VgLiBBIGZpbGUgdGhhdCBkb2VzIG5vdCBjb21waWxlIGlzIHJlcG9ydGVkIGFuZCBsZWZ0IG91dCwgc28gb25lXG4gKiBicm9rZW4gZnVuY3Rpb24gZG9lcyBub3Qgc3RvcCB0aGUgcmVzdCBvZiB0aGUgc3RhY2sgZnJvbSBsb2FkaW5nLlxuICovXG5leHBvcnQgY29uc3QgbG9hZEZ1bmN0aW9ucyA9IChwYWNrczogcmVhZG9ubHkgRnVuY3Rpb25QYWNrW10pOiBGdW5jdGlvbkxvYWRSZXN1bHQgPT4ge1xuICAgIGNvbnN0IGZ1bmN0aW9ucyA9IG5ldyBGdW5jdGlvblJlZ2lzdHJ5KCk7XG4gICAgY29uc3QgdGFncyA9IG5ldyBGdW5jdGlvblRhZ1JlZ2lzdHJ5KCk7XG4gICAgY29uc3QgY29sbGVjdG9yID0gbmV3IERpYWdub3N0aWNDb2xsZWN0b3IoKTtcblxuICAgIGZvciAoY29uc3QgcGFjayBvZiBwYWNrcykge1xuICAgICAgICBmb3IgKGNvbnN0IFtwYXRoLCBmaWxlXSBvZiBwYWNrLmZpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBmdW5jdGlvbklkID0gZnVuY3Rpb25JZEZvclBhdGgocGF0aCk7XG4gICAgICAgICAgICBpZiAoZnVuY3Rpb25JZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGRlY29kZShmaWxlLCBwYWNrLm5hbWUsIHBhdGgsIGNvbGxlY3Rvcik7XG4gICAgICAgICAgICAgICAgaWYgKHRleHQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb21waWxlZCA9IGNvbXBpbGVGdW5jdGlvbihmdW5jdGlvbklkLCB0ZXh0KTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRpYWdub3N0aWMgb2YgY29tcGlsZWQuZGlhZ25vc3RpY3MpIGNvbGxlY3Rvci5hZGQoeyAuLi5kaWFnbm9zdGljLCBwYWNrOiBwYWNrLm5hbWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBpbGVkLmZ1bmN0aW9uKSBmdW5jdGlvbnMuYWRkKGNvbXBpbGVkLmZ1bmN0aW9uLCBwYWNrLm5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YWdJZCA9IGZ1bmN0aW9uVGFnSWRGb3JQYXRoKHBhdGgpO1xuICAgICAgICAgICAgaWYgKHRhZ0lkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gZGVjb2RlKGZpbGUsIHBhY2submFtZSwgcGF0aCwgY29sbGVjdG9yKTtcbiAgICAgICAgICAgIGlmICh0ZXh0ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCB0YWcgPSByZWFkVGFnRmlsZSh0ZXh0LCBwYWNrLm5hbWUsIHBhdGgsIGNvbGxlY3Rvcik7XG4gICAgICAgICAgICBpZiAodGFnKSB0YWdzLmFkZCh0YWdJZCwgdGFnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IGZ1bmN0aW9ucywgdGFncywgZGlhZ25vc3RpY3M6IGNvbGxlY3Rvci5kaWFnbm9zdGljcyB9O1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBNkJBLElBQWEsbUJBQWIsTUFBd0Q7Q0FDcEQsNEJBQTZCLElBQUksSUFBMEQ7O0NBRzNGLElBQVcsVUFBNEIsTUFBb0I7RUFDdkQsS0FBSyxVQUFVLElBQUksU0FBUyxJQUFJO0dBQUU7R0FBVTtFQUFLLENBQUM7Q0FDdEQ7O0NBR0EsSUFBVyxJQUEwQztFQUNqRCxPQUFPLEtBQUssVUFBVSxJQUFJLEVBQUUsQ0FBQyxFQUFFO0NBQ25DOztDQUdBLElBQVcsSUFBcUI7RUFDNUIsT0FBTyxLQUFLLFVBQVUsSUFBSSxFQUFFO0NBQ2hDOztDQUdBLE9BQWMsSUFBZ0M7RUFDMUMsT0FBTyxLQUFLLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRTtDQUNuQzs7Q0FHQSxNQUFnQztFQUM1QixPQUFPLENBQUMsR0FBRyxLQUFLLFVBQVUsS0FBSyxDQUFDO0NBQ3BDOztDQUdBLElBQVcsT0FBZTtFQUN0QixPQUFPLEtBQUssVUFBVTtDQUMxQjtBQUNKO0FBU0EsSUFB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
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ // src/runner.ts
4
+ /**
5
+ * A runner that records what it was asked to run instead of running it. It is
6
+ * the second adapter at the command seam: tests and pack authors use it to
7
+ * check what a function would execute without a world to execute it against.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * const runner = new RecordingCommandRunner();
12
+ * new FunctionExecutor({ functions, runner }).run('pack:greet', { source: console });
13
+ * expect(runner.commandLines).toEqual(['say hello']);
14
+ * ```
15
+ */
16
+ var RecordingCommandRunner = class {
17
+ respond;
18
+ /** Every command handed to the runner, in execution order. */
19
+ recorded = [];
20
+ constructor(respond = () => ({})) {
21
+ this.respond = respond;
22
+ }
23
+ /** Records the command and returns whatever the configured response says. */
24
+ run(commandLine, context) {
25
+ this.recorded.push({
26
+ commandLine,
27
+ context
28
+ });
29
+ return this.respond(commandLine, context);
30
+ }
31
+ /** The recorded command text, in execution order. */
32
+ get commandLines() {
33
+ return this.recorded.map((entry) => entry.commandLine);
34
+ }
35
+ /** Forgets everything recorded so far. */
36
+ clear() {
37
+ this.recorded.length = 0;
38
+ }
39
+ };
40
+ exports.RecordingCommandRunner = RecordingCommandRunner;
41
+
42
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmNqcy5janMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL3J1bm5lci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBzZWFtIGJldHdlZW4gdGhpcyBwYWNrYWdlIGFuZCB0aGUgY29tbWFuZHMuIFRoaXMgcGFja2FnZSBydW5zIGZ1bmN0aW9uc1xuICogYW5kIG5ldmVyIGltcGxlbWVudHMgYSBjb21tYW5kOiBldmVyeSBsaW5lIGl0IGRvZXMgbm90IGhhbmRsZSBpdHNlbGYgZ29lcyB0b1xuICogYSB7QGxpbmsgQ29tbWFuZFJ1bm5lcn0sIHdoaWNoIGlzIHdoZXJlIHRoZSBzZXJ2ZXIncyBCcmlnYWRpZXIgZGlzcGF0Y2hlclxuICogcGx1Z3MgaW4uXG4gKi9cblxuLyoqIFdoYXQgYSBjb21tYW5kIGlzIHRvbGQgYWJvdXQgdGhlIGxpbmUgaXQgd2FzIHJlYWNoZWQgZnJvbS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZENvbnRleHQ8VFNvdXJjZSA9IHVua25vd24+IHtcbiAgICAvKiogV2hhdGV2ZXIgdGhlIHNlcnZlciB1c2VzIGFzIGEgY29tbWFuZCBzb3VyY2UsIHBhc3NlZCB0aHJvdWdoIHVudG91Y2hlZC4gKi9cbiAgICBzb3VyY2U6IFRTb3VyY2U7XG4gICAgLyoqIFRoZSBuYW1lc3BhY2VkIGlkIG9mIHRoZSBmdW5jdGlvbiB0aGUgbGluZSBiZWxvbmdzIHRvLiAqL1xuICAgIGZ1bmN0aW9uSWQ6IHN0cmluZztcbiAgICAvKiogVGhlIDEtYmFzZWQgbGluZSBvZiB0aGF0IGZ1bmN0aW9uJ3MgZmlsZS4gKi9cbiAgICBsaW5lOiBudW1iZXI7XG59XG5cbi8qKiBXaGF0IGEgY29tbWFuZCByZXBvcnRzIGJhY2suICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRPdXRjb21lIHtcbiAgICAvKiogVGhlIGNvbW1hbmQncyBpbnRlZ2VyIHJlc3VsdCwgYXMgQnJpZ2FkaWVyIGRlZmluZXMgaXQuIERlZmF1bHRzIHRvIDAuICovXG4gICAgcmVzdWx0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEhvdyBtYW55IGNvbnRleHRzIHRoZSBjb21tYW5kIGNyZWF0ZWQsIHdoaWNoIGlzIHdoYXQgYG1heENvbW1hbmRGb3Jrc2BcbiAgICAgKiBjb3VudHMuIGBleGVjdXRlIGFzIEBlYCB3aXRoIGZpdmUgbWF0Y2hpbmcgZW50aXRpZXMgcmVwb3J0cyA1LiBBIGNvbW1hbmRcbiAgICAgKiB0aGF0IHJ1bnMgaW4gb25lIGNvbnRleHQgcmVwb3J0cyBub3RoaW5nLlxuICAgICAqL1xuICAgIGZvcmtzPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFNldCB3aGVuIHRoZSBsaW5lIGVuZGVkIHRoZSBmdW5jdGlvbiBpdCBiZWxvbmdzIHRvLCB3aGljaCBpcyB3aGF0XG4gICAgICogYC9yZXR1cm5gIGRvZXMuIFRoZSBleGVjdXRvciBkcm9wcyB0aGF0IGZ1bmN0aW9uJ3MgcmVtYWluaW5nIGxpbmVzIGFuZFxuICAgICAqIGNhcnJpZXMgb24gd2l0aCB3aGF0ZXZlciBjYWxsZWQgaXQuXG4gICAgICpcbiAgICAgKiBgdmFsdWVgIGlzIHdoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMuIGAvcmV0dXJuIGZhaWxgLCBhbmQgYVxuICAgICAqIGAvcmV0dXJuIHJ1bmAgd2hvc2UgY29tbWFuZCBmYWlsZWQsIGVuZCB0aGUgZnVuY3Rpb24gd2l0aG91dCBvbmUsIHdoaWNoXG4gICAgICogaXMgdGhlIGNhc2UgYGV4ZWN1dGUgaWYgZnVuY3Rpb25gIGRvZXMgbm90IG1hdGNoLlxuICAgICAqL1xuICAgIHJldHVybmVkPzogeyByZWFkb25seSB2YWx1ZT86IG51bWJlciB9O1xufVxuXG4vKiogUnVucyBvbmUgY29tbWFuZCBsaW5lLiBUaGUgc2VydmVyJ3MgZGlzcGF0Y2hlciBpcyB0aGUgcmVhbCBhZGFwdGVyIGF0IHRoaXMgc2VhbS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZFJ1bm5lcjxUU291cmNlID0gdW5rbm93bj4ge1xuICAgIC8qKlxuICAgICAqIFJ1bnMgb25lIGNvbW1hbmQsIHdyaXR0ZW4gd2l0aG91dCBhIGxlYWRpbmcgc2xhc2guXG4gICAgICpcbiAgICAgKiBUaGUgcnVudGltZSBuZXZlciBjYWxscyB0aGlzIHdpdGggYSBjb21tYW5kIHRoZSBsaW5lIGZvcm1hdCBhbHJlYWR5XG4gICAgICogaGFuZGxlcywgc28gYSBgZnVuY3Rpb25gIGxpbmUgbmV2ZXIgcmVhY2hlcyBpdC4gVGhyb3dpbmcgaXMgYWxsb3dlZDogdGhlXG4gICAgICogZXhlY3V0b3IgY2F0Y2hlcyBpdCwgcmVwb3J0cyBpdCwgYW5kIGNhcnJpZXMgb24gd2l0aCB0aGUgbmV4dCBsaW5lLCB0aGVcbiAgICAgKiB3YXkgb25lIGZhaWxpbmcgY29tbWFuZCBkb2VzIG5vdCBhYm9ydCBhIEphdmEgZnVuY3Rpb24uXG4gICAgICovXG4gICAgcnVuKGNvbW1hbmRMaW5lOiBzdHJpbmcsIGNvbnRleHQ6IENvbW1hbmRDb250ZXh0PFRTb3VyY2U+KTogQ29tbWFuZE91dGNvbWU7XG59XG5cbi8qKiBPbmUgY29tbWFuZCBhIHtAbGluayBSZWNvcmRpbmdDb21tYW5kUnVubmVyfSB3YXMgYXNrZWQgdG8gcnVuLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRlZENvbW1hbmQ8VFNvdXJjZSA9IHVua25vd24+IHtcbiAgICBjb21tYW5kTGluZTogc3RyaW5nO1xuICAgIGNvbnRleHQ6IENvbW1hbmRDb250ZXh0PFRTb3VyY2U+O1xufVxuXG4vKipcbiAqIEEgcnVubmVyIHRoYXQgcmVjb3JkcyB3aGF0IGl0IHdhcyBhc2tlZCB0byBydW4gaW5zdGVhZCBvZiBydW5uaW5nIGl0LiBJdCBpc1xuICogdGhlIHNlY29uZCBhZGFwdGVyIGF0IHRoZSBjb21tYW5kIHNlYW06IHRlc3RzIGFuZCBwYWNrIGF1dGhvcnMgdXNlIGl0IHRvXG4gKiBjaGVjayB3aGF0IGEgZnVuY3Rpb24gd291bGQgZXhlY3V0ZSB3aXRob3V0IGEgd29ybGQgdG8gZXhlY3V0ZSBpdCBhZ2FpbnN0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgcnVubmVyID0gbmV3IFJlY29yZGluZ0NvbW1hbmRSdW5uZXIoKTtcbiAqIG5ldyBGdW5jdGlvbkV4ZWN1dG9yKHsgZnVuY3Rpb25zLCBydW5uZXIgfSkucnVuKCdwYWNrOmdyZWV0JywgeyBzb3VyY2U6IGNvbnNvbGUgfSk7XG4gKiBleHBlY3QocnVubmVyLmNvbW1hbmRMaW5lcykudG9FcXVhbChbJ3NheSBoZWxsbyddKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUmVjb3JkaW5nQ29tbWFuZFJ1bm5lcjxUU291cmNlID0gdW5rbm93bj4gaW1wbGVtZW50cyBDb21tYW5kUnVubmVyPFRTb3VyY2U+IHtcbiAgICAvKiogRXZlcnkgY29tbWFuZCBoYW5kZWQgdG8gdGhlIHJ1bm5lciwgaW4gZXhlY3V0aW9uIG9yZGVyLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSByZWNvcmRlZDogUmVjb3JkZWRDb21tYW5kPFRTb3VyY2U+W10gPSBbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgLyoqIERlY2lkZXMgd2hhdCBlYWNoIGNvbW1hbmQgcmVwb3J0cyBiYWNrLiBFdmVyeXRoaW5nIHN1Y2NlZWRzIHdpdGggbm8gZm9ya3MgYnkgZGVmYXVsdC4gKi9cbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSByZXNwb25kOiAoY29tbWFuZExpbmU6IHN0cmluZywgY29udGV4dDogQ29tbWFuZENvbnRleHQ8VFNvdXJjZT4pID0+IENvbW1hbmRPdXRjb21lID0gKCkgPT4gKHt9KVxuICAgICkge31cblxuICAgIC8qKiBSZWNvcmRzIHRoZSBjb21tYW5kIGFuZCByZXR1cm5zIHdoYXRldmVyIHRoZSBjb25maWd1cmVkIHJlc3BvbnNlIHNheXMuICovXG4gICAgcHVibGljIHJ1bihjb21tYW5kTGluZTogc3RyaW5nLCBjb250ZXh0OiBDb21tYW5kQ29udGV4dDxUU291cmNlPik6IENvbW1hbmRPdXRjb21lIHtcbiAgICAgICAgdGhpcy5yZWNvcmRlZC5wdXNoKHsgY29tbWFuZExpbmUsIGNvbnRleHQgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc3BvbmQoY29tbWFuZExpbmUsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIC8qKiBUaGUgcmVjb3JkZWQgY29tbWFuZCB0ZXh0LCBpbiBleGVjdXRpb24gb3JkZXIuICovXG4gICAgcHVibGljIGdldCBjb21tYW5kTGluZXMoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWNvcmRlZC5tYXAoKGVudHJ5KSA9PiBlbnRyeS5jb21tYW5kTGluZSk7XG4gICAgfVxuXG4gICAgLyoqIEZvcmdldHMgZXZlcnl0aGluZyByZWNvcmRlZCBzbyBmYXIuICovXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlY29yZGVkLmxlbmd0aCA9IDA7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFzRUEsSUFBYSx5QkFBYixNQUF5RjtDQU1oRTs7Q0FKckIsV0FBdUQsQ0FBQztDQUV4RCxZQUVJLGlCQUE2RyxDQUFDLElBQ2hIO0VBRG1CLEtBQUEsVUFBQTtDQUNsQjs7Q0FHSCxJQUFXLGFBQXFCLFNBQWtEO0VBQzlFLEtBQUssU0FBUyxLQUFLO0dBQUU7R0FBYTtFQUFRLENBQUM7RUFDM0MsT0FBTyxLQUFLLFFBQVEsYUFBYSxPQUFPO0NBQzVDOztDQUdBLElBQVcsZUFBa0M7RUFDekMsT0FBTyxLQUFLLFNBQVMsS0FBSyxVQUFVLE1BQU0sV0FBVztDQUN6RDs7Q0FHQSxRQUFxQjtFQUNqQixLQUFLLFNBQVMsU0FBUztDQUMzQjtBQUNKIn0=
@@ -0,0 +1,83 @@
1
+ /**
2
+ * The seam between this package and the commands. This package runs functions
3
+ * and never implements a command: every line it does not handle itself goes to
4
+ * a {@link CommandRunner}, which is where the server's Brigadier dispatcher
5
+ * plugs in.
6
+ */
7
+ /** What a command is told about the line it was reached from. */
8
+ export interface CommandContext<TSource = unknown> {
9
+ /** Whatever the server uses as a command source, passed through untouched. */
10
+ source: TSource;
11
+ /** The namespaced id of the function the line belongs to. */
12
+ functionId: string;
13
+ /** The 1-based line of that function's file. */
14
+ line: number;
15
+ }
16
+ /** What a command reports back. */
17
+ export interface CommandOutcome {
18
+ /** The command's integer result, as Brigadier defines it. Defaults to 0. */
19
+ result?: number;
20
+ /**
21
+ * How many contexts the command created, which is what `maxCommandForks`
22
+ * counts. `execute as @e` with five matching entities reports 5. A command
23
+ * that runs in one context reports nothing.
24
+ */
25
+ forks?: number;
26
+ /**
27
+ * Set when the line ended the function it belongs to, which is what
28
+ * `/return` does. The executor drops that function's remaining lines and
29
+ * carries on with whatever called it.
30
+ *
31
+ * `value` is what the function returns. `/return fail`, and a
32
+ * `/return run` whose command failed, end the function without one, which
33
+ * is the case `execute if function` does not match.
34
+ */
35
+ returned?: {
36
+ readonly value?: number;
37
+ };
38
+ }
39
+ /** Runs one command line. The server's dispatcher is the real adapter at this seam. */
40
+ export interface CommandRunner<TSource = unknown> {
41
+ /**
42
+ * Runs one command, written without a leading slash.
43
+ *
44
+ * The runtime never calls this with a command the line format already
45
+ * handles, so a `function` line never reaches it. Throwing is allowed: the
46
+ * executor catches it, reports it, and carries on with the next line, the
47
+ * way one failing command does not abort a Java function.
48
+ */
49
+ run(commandLine: string, context: CommandContext<TSource>): CommandOutcome;
50
+ }
51
+ /** One command a {@link RecordingCommandRunner} was asked to run. */
52
+ export interface RecordedCommand<TSource = unknown> {
53
+ commandLine: string;
54
+ context: CommandContext<TSource>;
55
+ }
56
+ /**
57
+ * A runner that records what it was asked to run instead of running it. It is
58
+ * the second adapter at the command seam: tests and pack authors use it to
59
+ * check what a function would execute without a world to execute it against.
60
+ *
61
+ * @example
62
+ * ```ts
63
+ * const runner = new RecordingCommandRunner();
64
+ * new FunctionExecutor({ functions, runner }).run('pack:greet', { source: console });
65
+ * expect(runner.commandLines).toEqual(['say hello']);
66
+ * ```
67
+ */
68
+ export declare class RecordingCommandRunner<TSource = unknown> implements CommandRunner<TSource> {
69
+ /** Decides what each command reports back. Everything succeeds with no forks by default. */
70
+ private readonly respond;
71
+ /** Every command handed to the runner, in execution order. */
72
+ readonly recorded: RecordedCommand<TSource>[];
73
+ constructor(
74
+ /** Decides what each command reports back. Everything succeeds with no forks by default. */
75
+ respond?: (commandLine: string, context: CommandContext<TSource>) => CommandOutcome);
76
+ /** Records the command and returns whatever the configured response says. */
77
+ run(commandLine: string, context: CommandContext<TSource>): CommandOutcome;
78
+ /** The recorded command text, in execution order. */
79
+ get commandLines(): readonly string[];
80
+ /** Forgets everything recorded so far. */
81
+ clear(): void;
82
+ }
83
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,iEAAiE;AACjE,MAAM,WAAW,cAAc,CAAC,OAAO,GAAG,OAAO;IAC7C,8EAA8E;IAC9E,MAAM,EAAE,OAAO,CAAC;IAChB,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,mCAAmC;AACnC,MAAM,WAAW,cAAc;IAC3B,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C;AAED,uFAAuF;AACvF,MAAM,WAAW,aAAa,CAAC,OAAO,GAAG,OAAO;IAC5C;;;;;;;OAOG;IACH,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC;CAC9E;AAED,qEAAqE;AACrE,MAAM,WAAW,eAAe,CAAC,OAAO,GAAG,OAAO;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;CACpC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,sBAAsB,CAAC,OAAO,GAAG,OAAO,CAAE,YAAW,aAAa,CAAC,OAAO,CAAC;IAKhF,4FAA4F;IAC5F,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL5B,8DAA8D;IAC9D,SAAgB,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,CAAM;IAE1D;IACI,4FAA4F;IAC3E,OAAO,GAAE,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,cAA2B,EAChH;IAEJ,6EAA6E;IACtE,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,cAAc,CAGhF;IAED,qDAAqD;IACrD,IAAW,YAAY,IAAI,SAAS,MAAM,EAAE,CAE3C;IAED,0CAA0C;IACnC,KAAK,IAAI,IAAI,CAEnB;CACJ"}
@@ -0,0 +1,40 @@
1
+ // src/runner.ts
2
+ /**
3
+ * A runner that records what it was asked to run instead of running it. It is
4
+ * the second adapter at the command seam: tests and pack authors use it to
5
+ * check what a function would execute without a world to execute it against.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const runner = new RecordingCommandRunner();
10
+ * new FunctionExecutor({ functions, runner }).run('pack:greet', { source: console });
11
+ * expect(runner.commandLines).toEqual(['say hello']);
12
+ * ```
13
+ */
14
+ var RecordingCommandRunner = class {
15
+ respond;
16
+ /** Every command handed to the runner, in execution order. */
17
+ recorded = [];
18
+ constructor(respond = () => ({})) {
19
+ this.respond = respond;
20
+ }
21
+ /** Records the command and returns whatever the configured response says. */
22
+ run(commandLine, context) {
23
+ this.recorded.push({
24
+ commandLine,
25
+ context
26
+ });
27
+ return this.respond(commandLine, context);
28
+ }
29
+ /** The recorded command text, in execution order. */
30
+ get commandLines() {
31
+ return this.recorded.map((entry) => entry.commandLine);
32
+ }
33
+ /** Forgets everything recorded so far. */
34
+ clear() {
35
+ this.recorded.length = 0;
36
+ }
37
+ };
38
+ export { RecordingCommandRunner };
39
+
40
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmVyLmVzLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW5uZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgc2VhbSBiZXR3ZWVuIHRoaXMgcGFja2FnZSBhbmQgdGhlIGNvbW1hbmRzLiBUaGlzIHBhY2thZ2UgcnVucyBmdW5jdGlvbnNcbiAqIGFuZCBuZXZlciBpbXBsZW1lbnRzIGEgY29tbWFuZDogZXZlcnkgbGluZSBpdCBkb2VzIG5vdCBoYW5kbGUgaXRzZWxmIGdvZXMgdG9cbiAqIGEge0BsaW5rIENvbW1hbmRSdW5uZXJ9LCB3aGljaCBpcyB3aGVyZSB0aGUgc2VydmVyJ3MgQnJpZ2FkaWVyIGRpc3BhdGNoZXJcbiAqIHBsdWdzIGluLlxuICovXG5cbi8qKiBXaGF0IGEgY29tbWFuZCBpcyB0b2xkIGFib3V0IHRoZSBsaW5lIGl0IHdhcyByZWFjaGVkIGZyb20uICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRDb250ZXh0PFRTb3VyY2UgPSB1bmtub3duPiB7XG4gICAgLyoqIFdoYXRldmVyIHRoZSBzZXJ2ZXIgdXNlcyBhcyBhIGNvbW1hbmQgc291cmNlLCBwYXNzZWQgdGhyb3VnaCB1bnRvdWNoZWQuICovXG4gICAgc291cmNlOiBUU291cmNlO1xuICAgIC8qKiBUaGUgbmFtZXNwYWNlZCBpZCBvZiB0aGUgZnVuY3Rpb24gdGhlIGxpbmUgYmVsb25ncyB0by4gKi9cbiAgICBmdW5jdGlvbklkOiBzdHJpbmc7XG4gICAgLyoqIFRoZSAxLWJhc2VkIGxpbmUgb2YgdGhhdCBmdW5jdGlvbidzIGZpbGUuICovXG4gICAgbGluZTogbnVtYmVyO1xufVxuXG4vKiogV2hhdCBhIGNvbW1hbmQgcmVwb3J0cyBiYWNrLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kT3V0Y29tZSB7XG4gICAgLyoqIFRoZSBjb21tYW5kJ3MgaW50ZWdlciByZXN1bHQsIGFzIEJyaWdhZGllciBkZWZpbmVzIGl0LiBEZWZhdWx0cyB0byAwLiAqL1xuICAgIHJlc3VsdD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBIb3cgbWFueSBjb250ZXh0cyB0aGUgY29tbWFuZCBjcmVhdGVkLCB3aGljaCBpcyB3aGF0IGBtYXhDb21tYW5kRm9ya3NgXG4gICAgICogY291bnRzLiBgZXhlY3V0ZSBhcyBAZWAgd2l0aCBmaXZlIG1hdGNoaW5nIGVudGl0aWVzIHJlcG9ydHMgNS4gQSBjb21tYW5kXG4gICAgICogdGhhdCBydW5zIGluIG9uZSBjb250ZXh0IHJlcG9ydHMgbm90aGluZy5cbiAgICAgKi9cbiAgICBmb3Jrcz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTZXQgd2hlbiB0aGUgbGluZSBlbmRlZCB0aGUgZnVuY3Rpb24gaXQgYmVsb25ncyB0bywgd2hpY2ggaXMgd2hhdFxuICAgICAqIGAvcmV0dXJuYCBkb2VzLiBUaGUgZXhlY3V0b3IgZHJvcHMgdGhhdCBmdW5jdGlvbidzIHJlbWFpbmluZyBsaW5lcyBhbmRcbiAgICAgKiBjYXJyaWVzIG9uIHdpdGggd2hhdGV2ZXIgY2FsbGVkIGl0LlxuICAgICAqXG4gICAgICogYHZhbHVlYCBpcyB3aGF0IHRoZSBmdW5jdGlvbiByZXR1cm5zLiBgL3JldHVybiBmYWlsYCwgYW5kIGFcbiAgICAgKiBgL3JldHVybiBydW5gIHdob3NlIGNvbW1hbmQgZmFpbGVkLCBlbmQgdGhlIGZ1bmN0aW9uIHdpdGhvdXQgb25lLCB3aGljaFxuICAgICAqIGlzIHRoZSBjYXNlIGBleGVjdXRlIGlmIGZ1bmN0aW9uYCBkb2VzIG5vdCBtYXRjaC5cbiAgICAgKi9cbiAgICByZXR1cm5lZD86IHsgcmVhZG9ubHkgdmFsdWU/OiBudW1iZXIgfTtcbn1cblxuLyoqIFJ1bnMgb25lIGNvbW1hbmQgbGluZS4gVGhlIHNlcnZlcidzIGRpc3BhdGNoZXIgaXMgdGhlIHJlYWwgYWRhcHRlciBhdCB0aGlzIHNlYW0uICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRSdW5uZXI8VFNvdXJjZSA9IHVua25vd24+IHtcbiAgICAvKipcbiAgICAgKiBSdW5zIG9uZSBjb21tYW5kLCB3cml0dGVuIHdpdGhvdXQgYSBsZWFkaW5nIHNsYXNoLlxuICAgICAqXG4gICAgICogVGhlIHJ1bnRpbWUgbmV2ZXIgY2FsbHMgdGhpcyB3aXRoIGEgY29tbWFuZCB0aGUgbGluZSBmb3JtYXQgYWxyZWFkeVxuICAgICAqIGhhbmRsZXMsIHNvIGEgYGZ1bmN0aW9uYCBsaW5lIG5ldmVyIHJlYWNoZXMgaXQuIFRocm93aW5nIGlzIGFsbG93ZWQ6IHRoZVxuICAgICAqIGV4ZWN1dG9yIGNhdGNoZXMgaXQsIHJlcG9ydHMgaXQsIGFuZCBjYXJyaWVzIG9uIHdpdGggdGhlIG5leHQgbGluZSwgdGhlXG4gICAgICogd2F5IG9uZSBmYWlsaW5nIGNvbW1hbmQgZG9lcyBub3QgYWJvcnQgYSBKYXZhIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHJ1bihjb21tYW5kTGluZTogc3RyaW5nLCBjb250ZXh0OiBDb21tYW5kQ29udGV4dDxUU291cmNlPik6IENvbW1hbmRPdXRjb21lO1xufVxuXG4vKiogT25lIGNvbW1hbmQgYSB7QGxpbmsgUmVjb3JkaW5nQ29tbWFuZFJ1bm5lcn0gd2FzIGFza2VkIHRvIHJ1bi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkZWRDb21tYW5kPFRTb3VyY2UgPSB1bmtub3duPiB7XG4gICAgY29tbWFuZExpbmU6IHN0cmluZztcbiAgICBjb250ZXh0OiBDb21tYW5kQ29udGV4dDxUU291cmNlPjtcbn1cblxuLyoqXG4gKiBBIHJ1bm5lciB0aGF0IHJlY29yZHMgd2hhdCBpdCB3YXMgYXNrZWQgdG8gcnVuIGluc3RlYWQgb2YgcnVubmluZyBpdC4gSXQgaXNcbiAqIHRoZSBzZWNvbmQgYWRhcHRlciBhdCB0aGUgY29tbWFuZCBzZWFtOiB0ZXN0cyBhbmQgcGFjayBhdXRob3JzIHVzZSBpdCB0b1xuICogY2hlY2sgd2hhdCBhIGZ1bmN0aW9uIHdvdWxkIGV4ZWN1dGUgd2l0aG91dCBhIHdvcmxkIHRvIGV4ZWN1dGUgaXQgYWdhaW5zdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHJ1bm5lciA9IG5ldyBSZWNvcmRpbmdDb21tYW5kUnVubmVyKCk7XG4gKiBuZXcgRnVuY3Rpb25FeGVjdXRvcih7IGZ1bmN0aW9ucywgcnVubmVyIH0pLnJ1bigncGFjazpncmVldCcsIHsgc291cmNlOiBjb25zb2xlIH0pO1xuICogZXhwZWN0KHJ1bm5lci5jb21tYW5kTGluZXMpLnRvRXF1YWwoWydzYXkgaGVsbG8nXSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJlY29yZGluZ0NvbW1hbmRSdW5uZXI8VFNvdXJjZSA9IHVua25vd24+IGltcGxlbWVudHMgQ29tbWFuZFJ1bm5lcjxUU291cmNlPiB7XG4gICAgLyoqIEV2ZXJ5IGNvbW1hbmQgaGFuZGVkIHRvIHRoZSBydW5uZXIsIGluIGV4ZWN1dGlvbiBvcmRlci4gKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgcmVjb3JkZWQ6IFJlY29yZGVkQ29tbWFuZDxUU291cmNlPltdID0gW107XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIC8qKiBEZWNpZGVzIHdoYXQgZWFjaCBjb21tYW5kIHJlcG9ydHMgYmFjay4gRXZlcnl0aGluZyBzdWNjZWVkcyB3aXRoIG5vIGZvcmtzIGJ5IGRlZmF1bHQuICovXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzcG9uZDogKGNvbW1hbmRMaW5lOiBzdHJpbmcsIGNvbnRleHQ6IENvbW1hbmRDb250ZXh0PFRTb3VyY2U+KSA9PiBDb21tYW5kT3V0Y29tZSA9ICgpID0+ICh7fSlcbiAgICApIHt9XG5cbiAgICAvKiogUmVjb3JkcyB0aGUgY29tbWFuZCBhbmQgcmV0dXJucyB3aGF0ZXZlciB0aGUgY29uZmlndXJlZCByZXNwb25zZSBzYXlzLiAqL1xuICAgIHB1YmxpYyBydW4oY29tbWFuZExpbmU6IHN0cmluZywgY29udGV4dDogQ29tbWFuZENvbnRleHQ8VFNvdXJjZT4pOiBDb21tYW5kT3V0Y29tZSB7XG4gICAgICAgIHRoaXMucmVjb3JkZWQucHVzaCh7IGNvbW1hbmRMaW5lLCBjb250ZXh0IH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNwb25kKGNvbW1hbmRMaW5lLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICAvKiogVGhlIHJlY29yZGVkIGNvbW1hbmQgdGV4dCwgaW4gZXhlY3V0aW9uIG9yZGVyLiAqL1xuICAgIHB1YmxpYyBnZXQgY29tbWFuZExpbmVzKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVjb3JkZWQubWFwKChlbnRyeSkgPT4gZW50cnkuY29tbWFuZExpbmUpO1xuICAgIH1cblxuICAgIC8qKiBGb3JnZXRzIGV2ZXJ5dGhpbmcgcmVjb3JkZWQgc28gZmFyLiAqL1xuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWNvcmRlZC5sZW5ndGggPSAwO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQXNFQSxJQUFhLHlCQUFiLE1BQXlGO0NBTWhFOztDQUpyQixXQUF1RCxDQUFDO0NBRXhELFlBRUksaUJBQTZHLENBQUMsSUFDaEg7RUFEbUIsS0FBQSxVQUFBO0NBQ2xCOztDQUdILElBQVcsYUFBcUIsU0FBa0Q7RUFDOUUsS0FBSyxTQUFTLEtBQUs7R0FBRTtHQUFhO0VBQVEsQ0FBQztFQUMzQyxPQUFPLEtBQUssUUFBUSxhQUFhLE9BQU87Q0FDNUM7O0NBR0EsSUFBVyxlQUFrQztFQUN6QyxPQUFPLEtBQUssU0FBUyxLQUFLLFVBQVUsTUFBTSxXQUFXO0NBQ3pEOztDQUdBLFFBQXFCO0VBQ2pCLEtBQUssU0FBUyxTQUFTO0NBQzNCO0FBQ0oifQ==