@rhost/testkit 1.5.1 → 1.5.2

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 (157) hide show
  1. package/node_modules/@ursamu/mushcode/.github/workflows/publish.yml +36 -0
  2. package/node_modules/@ursamu/mushcode/LICENSE +21 -0
  3. package/node_modules/@ursamu/mushcode/README.md +110 -0
  4. package/node_modules/@ursamu/mushcode/_dist/mod.d.ts +36 -0
  5. package/node_modules/@ursamu/mushcode/_dist/mod.d.ts.map +1 -0
  6. package/node_modules/@ursamu/mushcode/_dist/parser/mod.d.ts +41 -0
  7. package/node_modules/@ursamu/mushcode/_dist/parser/mod.d.ts.map +1 -0
  8. package/node_modules/@ursamu/mushcode/_dist/src/analyze/commands.d.ts +15 -0
  9. package/node_modules/@ursamu/mushcode/_dist/src/analyze/commands.d.ts.map +1 -0
  10. package/node_modules/@ursamu/mushcode/_dist/src/analyze/deps.d.ts +18 -0
  11. package/node_modules/@ursamu/mushcode/_dist/src/analyze/deps.d.ts.map +1 -0
  12. package/node_modules/@ursamu/mushcode/_dist/src/analyze/mod.d.ts +20 -0
  13. package/node_modules/@ursamu/mushcode/_dist/src/analyze/mod.d.ts.map +1 -0
  14. package/node_modules/@ursamu/mushcode/_dist/src/analyze/tags.d.ts +6 -0
  15. package/node_modules/@ursamu/mushcode/_dist/src/analyze/tags.d.ts.map +1 -0
  16. package/node_modules/@ursamu/mushcode/_dist/src/eval/context.d.ts +85 -0
  17. package/node_modules/@ursamu/mushcode/_dist/src/eval/context.d.ts.map +1 -0
  18. package/node_modules/@ursamu/mushcode/_dist/src/eval/engine.d.ts +48 -0
  19. package/node_modules/@ursamu/mushcode/_dist/src/eval/engine.d.ts.map +1 -0
  20. package/node_modules/@ursamu/mushcode/_dist/src/eval/mod.d.ts +26 -0
  21. package/node_modules/@ursamu/mushcode/_dist/src/eval/mod.d.ts.map +1 -0
  22. package/node_modules/@ursamu/mushcode/_dist/src/eval/stdlib/mod.d.ts +3 -0
  23. package/node_modules/@ursamu/mushcode/_dist/src/eval/stdlib/mod.d.ts.map +1 -0
  24. package/node_modules/@ursamu/mushcode/_dist/src/lint/mod.d.ts +38 -0
  25. package/node_modules/@ursamu/mushcode/_dist/src/lint/mod.d.ts.map +1 -0
  26. package/node_modules/@ursamu/mushcode/_dist/src/print/mod.d.ts +18 -0
  27. package/node_modules/@ursamu/mushcode/_dist/src/print/mod.d.ts.map +1 -0
  28. package/node_modules/@ursamu/mushcode/_dist/src/print/printer.d.ts +15 -0
  29. package/node_modules/@ursamu/mushcode/_dist/src/print/printer.d.ts.map +1 -0
  30. package/node_modules/@ursamu/mushcode/_dist/src/traverse/mod.d.ts +19 -0
  31. package/node_modules/@ursamu/mushcode/_dist/src/traverse/mod.d.ts.map +1 -0
  32. package/node_modules/@ursamu/mushcode/_dist/src/traverse/transform.d.ts +27 -0
  33. package/node_modules/@ursamu/mushcode/_dist/src/traverse/transform.d.ts.map +1 -0
  34. package/node_modules/@ursamu/mushcode/_dist/src/traverse/walk.d.ts +27 -0
  35. package/node_modules/@ursamu/mushcode/_dist/src/traverse/walk.d.ts.map +1 -0
  36. package/node_modules/@ursamu/mushcode/deno.json +26 -0
  37. package/node_modules/@ursamu/mushcode/deno.lock +42 -0
  38. package/node_modules/@ursamu/mushcode/docs/analyze.md +145 -0
  39. package/node_modules/@ursamu/mushcode/docs/eval.md +312 -0
  40. package/node_modules/@ursamu/mushcode/docs/lint.md +152 -0
  41. package/node_modules/@ursamu/mushcode/docs/parser.md +196 -0
  42. package/node_modules/@ursamu/mushcode/docs/print.md +84 -0
  43. package/node_modules/@ursamu/mushcode/docs/stdlib.md +418 -0
  44. package/node_modules/@ursamu/mushcode/docs/traverse.md +167 -0
  45. package/node_modules/@ursamu/mushcode/grammar/mux-softcode.pegjs +781 -0
  46. package/node_modules/@ursamu/mushcode/mod.js +44 -0
  47. package/node_modules/@ursamu/mushcode/mod.js.map +1 -0
  48. package/node_modules/@ursamu/mushcode/mod.ts +63 -0
  49. package/node_modules/@ursamu/mushcode/package.json +38 -0
  50. package/node_modules/@ursamu/mushcode/parser/mod.js +47 -0
  51. package/node_modules/@ursamu/mushcode/parser/mod.js.map +1 -0
  52. package/node_modules/@ursamu/mushcode/parser/mod.ts +99 -0
  53. package/node_modules/@ursamu/mushcode/parser/mux-softcode.js +3833 -0
  54. package/node_modules/@ursamu/mushcode/parser/mux-softcode.mjs +3837 -0
  55. package/node_modules/@ursamu/mushcode/src/analyze/commands.js +29 -0
  56. package/node_modules/@ursamu/mushcode/src/analyze/commands.js.map +1 -0
  57. package/node_modules/@ursamu/mushcode/src/analyze/commands.ts +46 -0
  58. package/node_modules/@ursamu/mushcode/src/analyze/deps.js +45 -0
  59. package/node_modules/@ursamu/mushcode/src/analyze/deps.js.map +1 -0
  60. package/node_modules/@ursamu/mushcode/src/analyze/deps.ts +51 -0
  61. package/node_modules/@ursamu/mushcode/src/analyze/mod.js +18 -0
  62. package/node_modules/@ursamu/mushcode/src/analyze/mod.js.map +1 -0
  63. package/node_modules/@ursamu/mushcode/src/analyze/mod.ts +20 -0
  64. package/node_modules/@ursamu/mushcode/src/analyze/tags.js +11 -0
  65. package/node_modules/@ursamu/mushcode/src/analyze/tags.js.map +1 -0
  66. package/node_modules/@ursamu/mushcode/src/analyze/tags.ts +11 -0
  67. package/node_modules/@ursamu/mushcode/src/eval/context.js +22 -0
  68. package/node_modules/@ursamu/mushcode/src/eval/context.js.map +1 -0
  69. package/node_modules/@ursamu/mushcode/src/eval/context.ts +177 -0
  70. package/node_modules/@ursamu/mushcode/src/eval/engine.js +238 -0
  71. package/node_modules/@ursamu/mushcode/src/eval/engine.js.map +1 -0
  72. package/node_modules/@ursamu/mushcode/src/eval/engine.ts +276 -0
  73. package/node_modules/@ursamu/mushcode/src/eval/mod.js +25 -0
  74. package/node_modules/@ursamu/mushcode/src/eval/mod.js.map +1 -0
  75. package/node_modules/@ursamu/mushcode/src/eval/mod.ts +31 -0
  76. package/node_modules/@ursamu/mushcode/src/eval/stdlib/compare.js +56 -0
  77. package/node_modules/@ursamu/mushcode/src/eval/stdlib/compare.js.map +1 -0
  78. package/node_modules/@ursamu/mushcode/src/eval/stdlib/compare.ts +16 -0
  79. package/node_modules/@ursamu/mushcode/src/eval/stdlib/db.js +91 -0
  80. package/node_modules/@ursamu/mushcode/src/eval/stdlib/db.js.map +1 -0
  81. package/node_modules/@ursamu/mushcode/src/eval/stdlib/db.ts +104 -0
  82. package/node_modules/@ursamu/mushcode/src/eval/stdlib/iter.js +91 -0
  83. package/node_modules/@ursamu/mushcode/src/eval/stdlib/iter.js.map +1 -0
  84. package/node_modules/@ursamu/mushcode/src/eval/stdlib/iter.ts +98 -0
  85. package/node_modules/@ursamu/mushcode/src/eval/stdlib/logic.js +79 -0
  86. package/node_modules/@ursamu/mushcode/src/eval/stdlib/logic.js.map +1 -0
  87. package/node_modules/@ursamu/mushcode/src/eval/stdlib/logic.ts +84 -0
  88. package/node_modules/@ursamu/mushcode/src/eval/stdlib/math.js +120 -0
  89. package/node_modules/@ursamu/mushcode/src/eval/stdlib/math.js.map +1 -0
  90. package/node_modules/@ursamu/mushcode/src/eval/stdlib/math.ts +115 -0
  91. package/node_modules/@ursamu/mushcode/src/eval/stdlib/mod.js +17 -0
  92. package/node_modules/@ursamu/mushcode/src/eval/stdlib/mod.js.map +1 -0
  93. package/node_modules/@ursamu/mushcode/src/eval/stdlib/mod.ts +19 -0
  94. package/node_modules/@ursamu/mushcode/src/eval/stdlib/register.js +28 -0
  95. package/node_modules/@ursamu/mushcode/src/eval/stdlib/register.js.map +1 -0
  96. package/node_modules/@ursamu/mushcode/src/eval/stdlib/register.ts +31 -0
  97. package/node_modules/@ursamu/mushcode/src/eval/stdlib/string.js +153 -0
  98. package/node_modules/@ursamu/mushcode/src/eval/stdlib/string.js.map +1 -0
  99. package/node_modules/@ursamu/mushcode/src/eval/stdlib/string.ts +154 -0
  100. package/node_modules/@ursamu/mushcode/src/lint/builtin_arities.js +212 -0
  101. package/node_modules/@ursamu/mushcode/src/lint/builtin_arities.js.map +1 -0
  102. package/node_modules/@ursamu/mushcode/src/lint/builtin_arities.ts +68 -0
  103. package/node_modules/@ursamu/mushcode/src/lint/mod.js +60 -0
  104. package/node_modules/@ursamu/mushcode/src/lint/mod.js.map +1 -0
  105. package/node_modules/@ursamu/mushcode/src/lint/mod.ts +96 -0
  106. package/node_modules/@ursamu/mushcode/src/lint/rules/arg_count.js +37 -0
  107. package/node_modules/@ursamu/mushcode/src/lint/rules/arg_count.js.map +1 -0
  108. package/node_modules/@ursamu/mushcode/src/lint/rules/arg_count.ts +44 -0
  109. package/node_modules/@ursamu/mushcode/src/lint/rules/iter_var_outside_iter.js +55 -0
  110. package/node_modules/@ursamu/mushcode/src/lint/rules/iter_var_outside_iter.js.map +1 -0
  111. package/node_modules/@ursamu/mushcode/src/lint/rules/iter_var_outside_iter.ts +60 -0
  112. package/node_modules/@ursamu/mushcode/src/lint/rules/missing_wildcard.js +31 -0
  113. package/node_modules/@ursamu/mushcode/src/lint/rules/missing_wildcard.js.map +1 -0
  114. package/node_modules/@ursamu/mushcode/src/lint/rules/missing_wildcard.ts +40 -0
  115. package/node_modules/@ursamu/mushcode/src/lint/rules/register_before_set.js +59 -0
  116. package/node_modules/@ursamu/mushcode/src/lint/rules/register_before_set.js.map +1 -0
  117. package/node_modules/@ursamu/mushcode/src/lint/rules/register_before_set.ts +64 -0
  118. package/node_modules/@ursamu/mushcode/src/print/lock_printer.js +43 -0
  119. package/node_modules/@ursamu/mushcode/src/print/lock_printer.js.map +1 -0
  120. package/node_modules/@ursamu/mushcode/src/print/lock_printer.ts +41 -0
  121. package/node_modules/@ursamu/mushcode/src/print/mod.js +17 -0
  122. package/node_modules/@ursamu/mushcode/src/print/mod.js.map +1 -0
  123. package/node_modules/@ursamu/mushcode/src/print/mod.ts +18 -0
  124. package/node_modules/@ursamu/mushcode/src/print/printer.js +91 -0
  125. package/node_modules/@ursamu/mushcode/src/print/printer.js.map +1 -0
  126. package/node_modules/@ursamu/mushcode/src/print/printer.ts +132 -0
  127. package/node_modules/@ursamu/mushcode/src/traverse/child_slots.js +129 -0
  128. package/node_modules/@ursamu/mushcode/src/traverse/child_slots.js.map +1 -0
  129. package/node_modules/@ursamu/mushcode/src/traverse/child_slots.ts +51 -0
  130. package/node_modules/@ursamu/mushcode/src/traverse/mod.js +17 -0
  131. package/node_modules/@ursamu/mushcode/src/traverse/mod.js.map +1 -0
  132. package/node_modules/@ursamu/mushcode/src/traverse/mod.ts +19 -0
  133. package/node_modules/@ursamu/mushcode/src/traverse/transform.js +70 -0
  134. package/node_modules/@ursamu/mushcode/src/traverse/transform.js.map +1 -0
  135. package/node_modules/@ursamu/mushcode/src/traverse/transform.ts +84 -0
  136. package/node_modules/@ursamu/mushcode/src/traverse/walk.js +55 -0
  137. package/node_modules/@ursamu/mushcode/src/traverse/walk.js.map +1 -0
  138. package/node_modules/@ursamu/mushcode/src/traverse/walk.ts +82 -0
  139. package/node_modules/@ursamu/mushcode/tests/01-literals.test.ts +105 -0
  140. package/node_modules/@ursamu/mushcode/tests/02-substitutions.test.ts +145 -0
  141. package/node_modules/@ursamu/mushcode/tests/03-function-calls.test.ts +184 -0
  142. package/node_modules/@ursamu/mushcode/tests/04-eval-blocks.test.ts +110 -0
  143. package/node_modules/@ursamu/mushcode/tests/05-braced-strings.test.ts +119 -0
  144. package/node_modules/@ursamu/mushcode/tests/06-commands.test.ts +222 -0
  145. package/node_modules/@ursamu/mushcode/tests/07-dollar-patterns.test.ts +156 -0
  146. package/node_modules/@ursamu/mushcode/tests/08-lock-expressions.test.ts +159 -0
  147. package/node_modules/@ursamu/mushcode/tests/09-edge-cases.test.ts +162 -0
  148. package/node_modules/@ursamu/mushcode/tests/10-regression.test.ts +211 -0
  149. package/node_modules/@ursamu/mushcode/tests/11-tags.test.ts +357 -0
  150. package/node_modules/@ursamu/mushcode/tests/12-locations.test.ts +162 -0
  151. package/node_modules/@ursamu/mushcode/tests/13-eval.test.ts +389 -0
  152. package/node_modules/@ursamu/mushcode/tests/analyze.test.ts +194 -0
  153. package/node_modules/@ursamu/mushcode/tests/helpers.ts +69 -0
  154. package/node_modules/@ursamu/mushcode/tests/lint.test.ts +232 -0
  155. package/node_modules/@ursamu/mushcode/tests/print.test.ts +204 -0
  156. package/node_modules/@ursamu/mushcode/tests/traverse.test.ts +211 -0
  157. package/package.json +4 -1
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @module
3
+ * Full-featured MUX/RhostMUSH softcode toolkit: parser, AST traversal,
4
+ * canonical printer, static linter, dependency analyzer, and evaluator.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { parse, lint, print, EvalEngine, makeContext, registerStdlib } from "@ursamu/mushcode";
9
+ *
10
+ * const ast = parse("$+finger *:@pemit %#=[u(me/FN_FINGER,%0)]");
11
+ * const diags = lint(ast);
12
+ * console.log(print(ast)); // "$+finger *:@pemit %#=[u(me/FN_FINGER,%0)]"
13
+ *
14
+ * const engine = new EvalEngine({
15
+ * getAttr: async (_id, _attr) => null,
16
+ * resolveTarget: async (_from, expr) => expr === "me" ? "player-uuid" : null,
17
+ * getName: async (_id) => "Tester",
18
+ * hasFlag: async (_id, _flag) => false,
19
+ * });
20
+ * registerStdlib(engine);
21
+ * const result = await engine.evalString("[add(1,2)]", makeContext({ enactor: "player-uuid", executor: "player-uuid" }));
22
+ * console.log(result); // "3"
23
+ * ```
24
+ */ // @ursamu/mushcode — MUX/RhostMUSH softcode toolkit
25
+ //
26
+ // Sub-path imports are also available for tree-shaking:
27
+ // import { parse } from "@ursamu/mushcode/parse"
28
+ // import { walk } from "@ursamu/mushcode/traverse"
29
+ // import { print } from "@ursamu/mushcode/print"
30
+ // import { lint } from "@ursamu/mushcode/lint"
31
+ // import { extractCommands } from "@ursamu/mushcode/analyze"
32
+ // ── Parse ─────────────────────────────────────────────────────────────────────
33
+ export { parse, ParseError } from "./parser/mod.js";
34
+ // ── Traverse ──────────────────────────────────────────────────────────────────
35
+ export { walk, transform, findAll, findFirst, findFirstOrNull } from "./src/traverse/mod.js";
36
+ // ── Print ─────────────────────────────────────────────────────────────────────
37
+ export { print } from "./src/print/mod.js";
38
+ // ── Lint ──────────────────────────────────────────────────────────────────────
39
+ export { lint, RULES } from "./src/lint/mod.js";
40
+ // ── Analyze ───────────────────────────────────────────────────────────────────
41
+ export { extractCommands, extractDeps, extractTagRefs } from "./src/analyze/mod.js";
42
+ // ── Eval ──────────────────────────────────────────────────────────────────────
43
+ export { EvalEngine, makeContext, registerStdlib } from "./src/eval/mod.js";
44
+ //# sourceMappingURL=mod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.js","sources":["./mod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;CAuBC,GACD,oDAAoD;AACpD,EAAE;AACF,wDAAwD;AACxD,uDAAuD;AACvD,0DAA0D;AAC1D,uDAAuD;AACvD,sDAAsD;AACtD,+DAA+D;AAE/D,iFAAiF;AACjF,SAAS,KAAK,EAAE,UAAU,0BAAiD;AAI3E,iFAAiF;AACjF,SAAS,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,gCACoB;AAGjF,iFAAiF;AACjF,SAAS,KAAK,6BAAgE;AAG9E,iFAAiF;AACjF,SAAS,IAAI,EAAE,KAAK,4BAAyD;AAI7E,iFAAiF;AACjF,SAAS,eAAe,EAAE,WAAW,EAAE,cAAc,+BAC2B;AAGhF,iFAAiF;AACjF,SAAS,UAAU,EAAE,WAAW,EAAE,cAAc,4BAA6B"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @module
3
+ * Full-featured MUX/RhostMUSH softcode toolkit: parser, AST traversal,
4
+ * canonical printer, static linter, dependency analyzer, and evaluator.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { parse, lint, print, EvalEngine, makeContext, registerStdlib } from "@ursamu/mushcode";
9
+ *
10
+ * const ast = parse("$+finger *:@pemit %#=[u(me/FN_FINGER,%0)]");
11
+ * const diags = lint(ast);
12
+ * console.log(print(ast)); // "$+finger *:@pemit %#=[u(me/FN_FINGER,%0)]"
13
+ *
14
+ * const engine = new EvalEngine({
15
+ * getAttr: async (_id, _attr) => null,
16
+ * resolveTarget: async (_from, expr) => expr === "me" ? "player-uuid" : null,
17
+ * getName: async (_id) => "Tester",
18
+ * hasFlag: async (_id, _flag) => false,
19
+ * });
20
+ * registerStdlib(engine);
21
+ * const result = await engine.evalString("[add(1,2)]", makeContext({ enactor: "player-uuid", executor: "player-uuid" }));
22
+ * console.log(result); // "3"
23
+ * ```
24
+ */
25
+ // @ursamu/mushcode — MUX/RhostMUSH softcode toolkit
26
+ //
27
+ // Sub-path imports are also available for tree-shaking:
28
+ // import { parse } from "@ursamu/mushcode/parse"
29
+ // import { walk } from "@ursamu/mushcode/traverse"
30
+ // import { print } from "@ursamu/mushcode/print"
31
+ // import { lint } from "@ursamu/mushcode/lint"
32
+ // import { extractCommands } from "@ursamu/mushcode/analyze"
33
+
34
+ // ── Parse ─────────────────────────────────────────────────────────────────────
35
+ export { parse, ParseError } from "./parser/mod.js";
36
+ export type { ASTNode, NodeType, StartRule,
37
+ SourceLocation, SourcePosition } from "./parser/mod.js";
38
+
39
+ // ── Traverse ──────────────────────────────────────────────────────────────────
40
+ export { walk, transform, findAll, findFirst, findFirstOrNull }
41
+ from "./src/traverse/mod.js";
42
+ export type { Visitor, Transformer } from "./src/traverse/mod.js";
43
+
44
+ // ── Print ─────────────────────────────────────────────────────────────────────
45
+ export { print } from "./src/print/mod.js";
46
+ export type { PrintOptions, PrintMode } from "./src/print/mod.js";
47
+
48
+ // ── Lint ──────────────────────────────────────────────────────────────────────
49
+ export { lint, RULES } from "./src/lint/mod.js";
50
+ export type { Diagnostic, Severity, LintOptions, RuleId }
51
+ from "./src/lint/mod.js";
52
+
53
+ // ── Analyze ───────────────────────────────────────────────────────────────────
54
+ export { extractCommands, extractDeps, extractTagRefs }
55
+ from "./src/analyze/mod.js";
56
+ export type { PatternEntry, DepEntry } from "./src/analyze/mod.js";
57
+
58
+ // ── Eval ──────────────────────────────────────────────────────────────────────
59
+ export { EvalEngine, makeContext, registerStdlib } from "./src/eval/mod.js";
60
+ export type {
61
+ EvalContext, EvalThunk, ObjectAccessor, IEvalEngine,
62
+ FunctionImpl, CommandImpl, IterFrame,
63
+ } from "./src/eval/mod.js";
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@jsr/ursamu__mushcode",
3
+ "version": "0.3.4",
4
+ "homepage": "https://jsr.io/@ursamu/mushcode",
5
+ "type": "module",
6
+ "dependencies": {},
7
+ "exports": {
8
+ ".": {
9
+ "types": "./_dist/mod.d.ts",
10
+ "default": "./mod.js"
11
+ },
12
+ "./parse": {
13
+ "types": "./_dist/parser/mod.d.ts",
14
+ "default": "./parser/mod.js"
15
+ },
16
+ "./traverse": {
17
+ "types": "./_dist/src/traverse/mod.d.ts",
18
+ "default": "./src/traverse/mod.js"
19
+ },
20
+ "./print": {
21
+ "types": "./_dist/src/print/mod.d.ts",
22
+ "default": "./src/print/mod.js"
23
+ },
24
+ "./lint": {
25
+ "types": "./_dist/src/lint/mod.d.ts",
26
+ "default": "./src/lint/mod.js"
27
+ },
28
+ "./analyze": {
29
+ "types": "./_dist/src/analyze/mod.d.ts",
30
+ "default": "./src/analyze/mod.js"
31
+ },
32
+ "./eval": {
33
+ "types": "./_dist/src/eval/mod.d.ts",
34
+ "default": "./src/eval/mod.js"
35
+ }
36
+ },
37
+ "_jsr_revision": 11
38
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @module
3
+ * Parses MUX/RhostMUSH softcode strings into an AST.
4
+ * Exposes `parse()`, the `ParseError` class, and all AST node types.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { parse } from "@ursamu/mushcode/parse";
9
+ *
10
+ * const ast = parse("$+finger *:@pemit %#=[u(me/FN_FINGER,%0)]");
11
+ * console.log(ast.type); // "DollarPattern"
12
+ *
13
+ * const lock = parse("flag^WIZARD|attr^STAFF:1", "LockExpr");
14
+ * console.log(lock.type); // "LockOr"
15
+ * ```
16
+ */ // Thin Deno wrapper around the Peggy-generated ESM parser.
17
+ // Generated with: npx peggy --format es --allowed-start-rules Start,LockExpr \
18
+ // -o parser/mux-softcode.mjs grammar/mux-softcode.pegjs
19
+ import { parse as _parse, SyntaxError as _SyntaxError } from "./mux-softcode.mjs";
20
+ /** Thrown when the parser encounters a syntax error in the softcode input. */ export class ParseError extends Error {
21
+ location;
22
+ constructor(message, location){
23
+ super(message), this.location = location;
24
+ this.name = "ParseError";
25
+ }
26
+ }
27
+ /**
28
+ * Parse a raw softcode string and return its AST root node.
29
+ *
30
+ * @param text The softcode source to parse.
31
+ * @param startRule Grammar entry point — `"Start"` for normal softcode (default),
32
+ * `"LockExpr"` for lock-expression strings.
33
+ * @throws {@link ParseError} on syntax errors.
34
+ */ export function parse(text, startRule = "Start") {
35
+ try {
36
+ return _parse(text, {
37
+ startRule
38
+ });
39
+ } catch (err) {
40
+ if (err instanceof _SyntaxError) {
41
+ const loc = err.location?.start;
42
+ throw new ParseError(err.message, loc);
43
+ }
44
+ throw err;
45
+ }
46
+ }
47
+ //# sourceMappingURL=mod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.js","sources":["./mod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD,2DAA2D;AAC3D,gFAAgF;AAChF,0EAA0E;AAE1E,SACE,SAAS,MAAM,EACf,eAAe,YAAY,QACtB,qBAAqB;AAyC5B,4EAA4E,GAC5E,OAAO,MAAM,mBAAmB;;EAC9B,YACE,OAAe,EACf,AAAgB,QAA2D,CAC3E;IACA,KAAK,CAAC,eAFU,WAAA;IAGhB,IAAI,CAAC,IAAI,GAAG;EACd;AACF;AAKA;;;;;;;CAOC,GACD,OAAO,SAAS,MAAM,IAAY,EAAE,YAAuB,OAAO;EAChE,IAAI;IACF,OAAO,OAAO,MAAM;MAAE;IAAU;EAClC,EAAE,OAAO,KAAK;IACZ,IAAI,eAAe,cAAc;MAC/B,MAAM,MAAM,AAAC,IAEV,QAAQ,EAAE;MACb,MAAM,IAAI,WAAW,AAAC,IAAc,OAAO,EAAE;IAC/C;IACA,MAAM;EACR;AACF"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * @module
3
+ * Parses MUX/RhostMUSH softcode strings into an AST.
4
+ * Exposes `parse()`, the `ParseError` class, and all AST node types.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { parse } from "@ursamu/mushcode/parse";
9
+ *
10
+ * const ast = parse("$+finger *:@pemit %#=[u(me/FN_FINGER,%0)]");
11
+ * console.log(ast.type); // "DollarPattern"
12
+ *
13
+ * const lock = parse("flag^WIZARD|attr^STAFF:1", "LockExpr");
14
+ * console.log(lock.type); // "LockOr"
15
+ * ```
16
+ */
17
+ // Thin Deno wrapper around the Peggy-generated ESM parser.
18
+ // Generated with: npx peggy --format es --allowed-start-rules Start,LockExpr \
19
+ // -o parser/mux-softcode.mjs grammar/mux-softcode.pegjs
20
+
21
+ import {
22
+ parse as _parse,
23
+ SyntaxError as _SyntaxError,
24
+ } from "./mux-softcode.mjs";
25
+
26
+ // ── AST Types (mirrors grammar rule names) ───────────────────────────────────
27
+
28
+ /** Union of every node `type` string the parser can produce. */
29
+ export type NodeType =
30
+ | "Literal" | "Escape" | "Substitution" | "SpecialVar" | "Wildcard"
31
+ | "EvalBlock" | "BracedString" | "Text" | "Arg"
32
+ | "FunctionCall" | "DollarPattern" | "ListenPattern"
33
+ | "PatternAlts" | "Pattern"
34
+ | "CommandList" | "AtCommand" | "AttributeSet" | "UserCommand"
35
+ | "TagRef"
36
+ | "LockOr" | "LockAnd" | "LockNot" | "LockMe" | "LockDbref"
37
+ | "LockFlagCheck" | "LockTypeCheck" | "LockAttrCheck" | "LockPlayerName";
38
+
39
+ /** A character offset, line number (1-based), and column (1-based) in source text. */
40
+ export interface SourcePosition {
41
+ /** Zero-based byte offset from the start of the source string. */
42
+ offset: number;
43
+ /** One-based line number. */
44
+ line: number;
45
+ /** One-based column number within the line. */
46
+ column: number;
47
+ }
48
+
49
+ /** The start and end {@link SourcePosition} of an AST node in the original source. */
50
+ export interface SourceLocation {
51
+ /** Position of the first character of the node. */
52
+ start: SourcePosition;
53
+ /** Position one past the last character of the node. */
54
+ end: SourcePosition;
55
+ }
56
+
57
+ /**
58
+ * A generic AST node. Every node has a `type` discriminant string and an
59
+ * optional `loc` source location. Additional properties are node-specific
60
+ * (e.g. `value` on Literal, `name` on FunctionCall).
61
+ */
62
+ // deno-lint-ignore no-explicit-any
63
+ export type ASTNode = { type: string; loc?: SourceLocation; [key: string]: any };
64
+
65
+ /** Thrown when the parser encounters a syntax error in the softcode input. */
66
+ export class ParseError extends Error {
67
+ constructor(
68
+ message: string,
69
+ public readonly location?: { line: number; column: number; offset: number },
70
+ ) {
71
+ super(message);
72
+ this.name = "ParseError";
73
+ }
74
+ }
75
+
76
+ /** Which top-level grammar rule to use as the parse entry point. */
77
+ export type StartRule = "Start" | "LockExpr";
78
+
79
+ /**
80
+ * Parse a raw softcode string and return its AST root node.
81
+ *
82
+ * @param text The softcode source to parse.
83
+ * @param startRule Grammar entry point — `"Start"` for normal softcode (default),
84
+ * `"LockExpr"` for lock-expression strings.
85
+ * @throws {@link ParseError} on syntax errors.
86
+ */
87
+ export function parse(text: string, startRule: StartRule = "Start"): ASTNode {
88
+ try {
89
+ return _parse(text, { startRule }) as ASTNode;
90
+ } catch (err) {
91
+ if (err instanceof _SyntaxError) {
92
+ const loc = (err as {
93
+ location?: { start: { line: number; column: number; offset: number } };
94
+ }).location?.start;
95
+ throw new ParseError((err as Error).message, loc);
96
+ }
97
+ throw err;
98
+ }
99
+ }