@rhost/testkit 0.1.1 → 1.3.1

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 (110) hide show
  1. package/README.md +393 -5
  2. package/ROADMAP.md +241 -0
  3. package/dist/benchmark.d.ts +44 -0
  4. package/dist/benchmark.d.ts.map +1 -0
  5. package/dist/benchmark.js +118 -0
  6. package/dist/benchmark.js.map +1 -0
  7. package/dist/cli/deploy.d.ts +2 -0
  8. package/dist/cli/deploy.d.ts.map +1 -0
  9. package/dist/cli/deploy.js +120 -0
  10. package/dist/cli/deploy.js.map +1 -0
  11. package/dist/cli/fmt.d.ts +2 -0
  12. package/dist/cli/fmt.d.ts.map +1 -0
  13. package/dist/cli/fmt.js +119 -0
  14. package/dist/cli/fmt.js.map +1 -0
  15. package/dist/cli/index.d.ts +3 -0
  16. package/dist/cli/index.d.ts.map +1 -0
  17. package/dist/cli/index.js +81 -0
  18. package/dist/cli/index.js.map +1 -0
  19. package/dist/cli/init.d.ts +2 -0
  20. package/dist/cli/init.d.ts.map +1 -0
  21. package/dist/cli/init.js +210 -0
  22. package/dist/cli/init.js.map +1 -0
  23. package/dist/cli/validate.d.ts +2 -0
  24. package/dist/cli/validate.d.ts.map +1 -0
  25. package/dist/cli/validate.js +126 -0
  26. package/dist/cli/validate.js.map +1 -0
  27. package/dist/cli/watch.d.ts +2 -0
  28. package/dist/cli/watch.d.ts.map +1 -0
  29. package/dist/cli/watch.js +136 -0
  30. package/dist/cli/watch.js.map +1 -0
  31. package/dist/client.d.ts +48 -0
  32. package/dist/client.d.ts.map +1 -1
  33. package/dist/client.js +113 -30
  34. package/dist/client.js.map +1 -1
  35. package/dist/container.d.ts.map +1 -1
  36. package/dist/container.js +1 -1
  37. package/dist/container.js.map +1 -1
  38. package/dist/deployer.d.ts +86 -0
  39. package/dist/deployer.d.ts.map +1 -0
  40. package/dist/deployer.js +154 -0
  41. package/dist/deployer.js.map +1 -0
  42. package/dist/expect.d.ts +27 -1
  43. package/dist/expect.d.ts.map +1 -1
  44. package/dist/expect.js +47 -2
  45. package/dist/expect.js.map +1 -1
  46. package/dist/index.d.ts +10 -3
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +39 -1
  49. package/dist/index.js.map +1 -1
  50. package/dist/preflight.d.ts +70 -0
  51. package/dist/preflight.d.ts.map +1 -0
  52. package/dist/preflight.js +121 -0
  53. package/dist/preflight.js.map +1 -0
  54. package/dist/reporter.d.ts +2 -0
  55. package/dist/reporter.d.ts.map +1 -1
  56. package/dist/reporter.js +24 -1
  57. package/dist/reporter.js.map +1 -1
  58. package/dist/runner.d.ts +83 -2
  59. package/dist/runner.d.ts.map +1 -1
  60. package/dist/runner.js +137 -8
  61. package/dist/runner.js.map +1 -1
  62. package/dist/snapshots.d.ts +84 -0
  63. package/dist/snapshots.d.ts.map +1 -0
  64. package/dist/snapshots.js +230 -0
  65. package/dist/snapshots.js.map +1 -0
  66. package/dist/validator/builtins.d.ts +18 -0
  67. package/dist/validator/builtins.d.ts.map +1 -0
  68. package/dist/validator/builtins.js +265 -0
  69. package/dist/validator/builtins.js.map +1 -0
  70. package/dist/validator/checker.d.ts +13 -0
  71. package/dist/validator/checker.d.ts.map +1 -0
  72. package/dist/validator/checker.js +111 -0
  73. package/dist/validator/checker.js.map +1 -0
  74. package/dist/validator/clobber.d.ts +7 -0
  75. package/dist/validator/clobber.d.ts.map +1 -0
  76. package/dist/validator/clobber.js +102 -0
  77. package/dist/validator/clobber.js.map +1 -0
  78. package/dist/validator/compat.d.ts +19 -0
  79. package/dist/validator/compat.d.ts.map +1 -0
  80. package/dist/validator/compat.js +58 -0
  81. package/dist/validator/compat.js.map +1 -0
  82. package/dist/validator/formatter.d.ts +21 -0
  83. package/dist/validator/formatter.d.ts.map +1 -0
  84. package/dist/validator/formatter.js +120 -0
  85. package/dist/validator/formatter.js.map +1 -0
  86. package/dist/validator/index.d.ts +57 -0
  87. package/dist/validator/index.d.ts.map +1 -0
  88. package/dist/validator/index.js +133 -0
  89. package/dist/validator/index.js.map +1 -0
  90. package/dist/validator/parser.d.ts +16 -0
  91. package/dist/validator/parser.d.ts.map +1 -0
  92. package/dist/validator/parser.js +260 -0
  93. package/dist/validator/parser.js.map +1 -0
  94. package/dist/validator/tokenizer.d.ts +28 -0
  95. package/dist/validator/tokenizer.d.ts.map +1 -0
  96. package/dist/validator/tokenizer.js +174 -0
  97. package/dist/validator/tokenizer.js.map +1 -0
  98. package/dist/validator/types.d.ts +55 -0
  99. package/dist/validator/types.d.ts.map +1 -0
  100. package/dist/validator/types.js +6 -0
  101. package/dist/validator/types.js.map +1 -0
  102. package/dist/watcher.d.ts +44 -0
  103. package/dist/watcher.d.ts.map +1 -0
  104. package/dist/watcher.js +297 -0
  105. package/dist/watcher.js.map +1 -0
  106. package/dist/world.d.ts +79 -0
  107. package/dist/world.d.ts.map +1 -1
  108. package/dist/world.js +167 -1
  109. package/dist/world.js.map +1 -1
  110. package/package.json +19 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtins.d.ts","sourceRoot":"","sources":["../../src/validator/builtins.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;CACxB;AAwQD,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAKpE,CAAC"}
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // RhostMUSH built-in function signature database
4
+ // ---------------------------------------------------------------------------
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BUILTIN_FUNCTIONS = void 0;
7
+ // minArgs, maxArgs shorthand builder
8
+ function sig(minArgs, maxArgs, opts = {}) {
9
+ return { name: '', minArgs, maxArgs, ...opts };
10
+ }
11
+ const INF = Infinity;
12
+ const DEFINITIONS = [
13
+ // -------------------------------------------------------------------------
14
+ // Math
15
+ // -------------------------------------------------------------------------
16
+ ['abs', 1, 1],
17
+ ['add', 2, INF],
18
+ ['sub', 2, 2],
19
+ ['mul', 2, INF],
20
+ ['div', 2, 2],
21
+ ['fdiv', 2, 2],
22
+ ['mod', 2, 2],
23
+ ['modulo', 2, 2],
24
+ ['remainder', 2, 2],
25
+ ['power', 2, 2],
26
+ ['sqrt', 1, 1],
27
+ ['ceil', 1, 1],
28
+ ['floor', 1, 1],
29
+ ['round', 1, 2],
30
+ ['trunc', 1, 1],
31
+ ['max', 1, INF],
32
+ ['min', 1, INF],
33
+ ['sign', 1, 1],
34
+ ['gt', 2, 2],
35
+ ['gte', 2, 2],
36
+ ['lt', 2, 2],
37
+ ['lte', 2, 2],
38
+ ['eq', 2, 2],
39
+ ['neq', 2, 2],
40
+ ['and', 2, INF],
41
+ ['or', 2, INF],
42
+ ['not', 1, 1],
43
+ ['xor', 2, 2],
44
+ ['nand', 2, INF],
45
+ ['nor', 2, INF],
46
+ ['band', 2, 2],
47
+ ['bor', 2, 2],
48
+ ['bxor', 2, 2],
49
+ ['bnot', 1, 1],
50
+ ['bshl', 2, 2],
51
+ ['bshr', 2, 2],
52
+ ['pi', 0, 0],
53
+ ['e', 0, 0],
54
+ ['sin', 1, 2],
55
+ ['cos', 1, 2],
56
+ ['tan', 1, 2],
57
+ ['asin', 1, 2],
58
+ ['acos', 1, 2],
59
+ ['atan', 1, 3],
60
+ ['exp', 1, 1],
61
+ ['ln', 1, 1],
62
+ ['log', 1, 2],
63
+ ['dist2d', 4, 4],
64
+ ['dist3d', 6, 6],
65
+ ['isnum', 1, 1],
66
+ ['isint', 1, 1],
67
+ // -------------------------------------------------------------------------
68
+ // String
69
+ // -------------------------------------------------------------------------
70
+ ['strlen', 1, 1],
71
+ ['len', 1, 1],
72
+ ['lcstr', 1, 1],
73
+ ['ucstr', 1, 1],
74
+ ['capstr', 1, 1],
75
+ ['left', 2, 2],
76
+ ['right', 2, 2],
77
+ ['mid', 3, 3],
78
+ ['first', 1, 2],
79
+ ['last', 1, 2],
80
+ ['rest', 1, 2],
81
+ ['before', 2, 2],
82
+ ['after', 2, 2],
83
+ ['cat', 1, INF],
84
+ ['strcat', 1, INF],
85
+ ['trim', 1, 3],
86
+ ['ltrim', 1, 2],
87
+ ['rtrim', 1, 2],
88
+ ['space', 1, 1],
89
+ ['ljust', 2, 3],
90
+ ['rjust', 2, 3],
91
+ ['center', 2, 3],
92
+ ['repeat', 2, 2],
93
+ ['edit', 3, INF],
94
+ ['replace', 3, 4],
95
+ ['revwords', 1, 2],
96
+ ['words', 1, 2],
97
+ ['word', 2, 3],
98
+ ['wordpos', 2, 3],
99
+ ['numwords', 1, 2],
100
+ ['index', 3, 4],
101
+ ['rindex', 3, 3],
102
+ ['pos', 2, 2],
103
+ ['lpos', 2, 3],
104
+ ['comp', 2, 2],
105
+ ['strcmp', 2, 2],
106
+ ['strmatch', 2, 3],
107
+ ['wildmatch', 2, 3],
108
+ ['pmatch', 1, INF],
109
+ ['escape', 1, 1],
110
+ ['decompose', 1, 1],
111
+ ['secure', 1, 1],
112
+ ['stripansi', 1, 1],
113
+ ['ansi', 2, 2],
114
+ ['soundex', 1, 1, { platforms: ['rhost', 'penn'] }],
115
+ ['soundslike', 2, 2],
116
+ ['strdistance', 2, 2, { rhostOnly: true, platforms: ['rhost'] }],
117
+ ['checkstr', 1, 1],
118
+ ['strinsert', 3, 3],
119
+ ['encrypt', 2, 2],
120
+ ['decrypt', 2, 2],
121
+ ['encode64', 1, 1, { rhostOnly: true, platforms: ['rhost'] }],
122
+ ['decode64', 1, 1, { rhostOnly: true, platforms: ['rhost'] }],
123
+ ['digest', 2, 2, { rhostOnly: true, platforms: ['rhost'] }],
124
+ ['crypt', 2, 2],
125
+ ['tr', 3, 3],
126
+ ['flip', 0, 1],
127
+ ['lit', 1, 1],
128
+ ['readable', 1, 1],
129
+ ['visible', 2, 2],
130
+ ['valid', 2, 2],
131
+ ['hastype', 2, 2],
132
+ // -------------------------------------------------------------------------
133
+ // List
134
+ // -------------------------------------------------------------------------
135
+ ['member', 2, 3],
136
+ ['elements', 2, 3],
137
+ ['insert', 3, 4],
138
+ ['remove', 2, 3],
139
+ ['sort', 1, 4],
140
+ ['lsort', 1, 4],
141
+ ['sortby', 2, 4],
142
+ ['shuffle', 1, 3],
143
+ ['setunion', 2, 4],
144
+ ['setinter', 2, 4],
145
+ ['setdiff', 2, 4],
146
+ ['setq', 2, INF],
147
+ ['getq', 1, 1],
148
+ ['r', 1, 1],
149
+ ['filter', 2, 4],
150
+ ['filterfun', 2, INF],
151
+ ['map', 2, 5],
152
+ ['fold', 2, 4],
153
+ ['iter', 2, 4],
154
+ ['parse', 2, 4],
155
+ ['itext', 1, 1],
156
+ ['inum', 1, 1],
157
+ ['lnum', 1, 4],
158
+ ['list', 2, INF],
159
+ ['grab', 2, 3],
160
+ ['graball', 2, 4],
161
+ ['match', 2, 3],
162
+ ['matchall', 2, 4],
163
+ ['splice', 2, 3],
164
+ ['unique', 1, 3],
165
+ ['munge', 3, 5],
166
+ ['step', 3, 5],
167
+ ['table', 1, 6],
168
+ // -------------------------------------------------------------------------
169
+ // Object / database
170
+ // -------------------------------------------------------------------------
171
+ ['name', 1, 1],
172
+ ['fullname', 1, 1],
173
+ ['alias', 1, 1],
174
+ ['owner', 1, 1],
175
+ ['loc', 1, 1],
176
+ ['rloc', 2, 2],
177
+ ['con', 1, 1],
178
+ ['next', 1, 1],
179
+ ['num', 1, 1],
180
+ ['dbref', 1, 1],
181
+ ['locate', 3, 3],
182
+ ['nearby', 2, 2],
183
+ ['flags', 1, 2],
184
+ ['hasflag', 2, 2],
185
+ ['haspower', 2, 2],
186
+ ['powers', 1, 1],
187
+ ['type', 1, 1],
188
+ ['istype', 2, 2],
189
+ ['isobject', 1, 1],
190
+ ['isroom', 1, 1],
191
+ ['isplayer', 1, 1],
192
+ ['isthing', 1, 1],
193
+ ['isexit', 1, 1],
194
+ ['isdbref', 1, 1],
195
+ ['get', 1, 1],
196
+ ['xget', 2, 2],
197
+ ['get_eval', 1, 1],
198
+ ['v', 1, 1],
199
+ ['attr', 2, 2],
200
+ ['lattr', 1, 2],
201
+ ['lattrp', 1, 2],
202
+ ['lcon', 1, 2],
203
+ ['lexits', 1, 1],
204
+ ['create', 1, 2],
205
+ ['open', 1, 2],
206
+ ['link', 2, 2],
207
+ ['zone', 1, 1],
208
+ ['parent', 1, 1],
209
+ ['children', 1, 1],
210
+ ['lparent', 1, 2],
211
+ // -------------------------------------------------------------------------
212
+ // Control / evaluation
213
+ // -------------------------------------------------------------------------
214
+ ['u', 1, INF],
215
+ ['ulocal', 1, INF],
216
+ ['ufun', 2, INF],
217
+ ['udefault', 2, INF],
218
+ ['ulambda', 2, INF],
219
+ ['default', 2, 2],
220
+ ['edefault', 2, 2],
221
+ ['switch', 3, INF],
222
+ ['switchall', 3, INF],
223
+ ['cond', 2, INF],
224
+ ['condall', 2, INF],
225
+ ['if', 2, 3],
226
+ ['ifelse', 3, 3],
227
+ ['when', 2, 2],
228
+ ['null', 0, INF],
229
+ ['nop', 0, INF],
230
+ ['localize', 1, 1, { platforms: ['rhost', 'penn'] }],
231
+ ['objeval', 2, 2],
232
+ ['eval', 2, 2],
233
+ ['apply', 2, 3],
234
+ ['zfun', 1, INF],
235
+ // -------------------------------------------------------------------------
236
+ // Time / random
237
+ // -------------------------------------------------------------------------
238
+ ['time', 0, 1],
239
+ ['secs', 0, 1],
240
+ ['convsecs', 1, 1],
241
+ ['convtime', 1, 1],
242
+ ['timestring', 1, 2],
243
+ ['rand', 1, 2],
244
+ ['die', 2, 2],
245
+ // -------------------------------------------------------------------------
246
+ // Registers / misc
247
+ // -------------------------------------------------------------------------
248
+ ['setvars', 2, 2],
249
+ ['xvars', 2, 2],
250
+ ['lvars', 0, 1],
251
+ ['execscript', 1, INF, { rhostOnly: true, platforms: ['rhost'] }],
252
+ ['pemit', 2, 2],
253
+ ['emit', 1, 1],
254
+ ['remit', 2, 2],
255
+ ['lemit', 1, 1],
256
+ ['zemit', 2, 2],
257
+ ['think', 1, 1],
258
+ ['select', 3, INF],
259
+ ];
260
+ /** Pre-built map of lowercase function name → signature for O(1) lookup */
261
+ exports.BUILTIN_FUNCTIONS = new Map(DEFINITIONS.map(([name, min, max, opts]) => [
262
+ name,
263
+ { name: name, minArgs: min, maxArgs: max, ...(opts ?? {}) },
264
+ ]));
265
+ //# sourceMappingURL=builtins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtins.js","sourceRoot":"","sources":["../../src/validator/builtins.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,iDAAiD;AACjD,8EAA8E;;;AAmB9E,qCAAqC;AACrC,SAAS,GAAG,CAAC,OAAe,EAAE,OAAe,EAAE,OAAmC,EAAE;IAClF,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,GAAG,GAAG,QAAQ,CAAC;AAErB,MAAM,WAAW,GAA4D;IAC3E,4EAA4E;IAC5E,OAAO;IACP,4EAA4E;IAC5E,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,WAAW,EAAG,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,KAAK,EAAS,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,IAAI,EAAU,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,IAAI,EAAU,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,IAAI,EAAU,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,IAAI,EAAU,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,KAAK,EAAS,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,IAAI,EAAU,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,GAAG,EAAW,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,IAAI,EAAU,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IAEpB,4EAA4E;IAC5E,SAAS;IACT,4EAA4E;IAC5E,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,QAAQ,EAAM,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,SAAS,EAAK,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,SAAS,EAAK,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,WAAW,EAAG,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,WAAW,EAAG,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,WAAW,EAAG,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,SAAS,EAAK,CAAC,EAAE,CAAC,EAAI,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;IACxD,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,aAAa,EAAC,CAAC,EAAE,CAAC,EAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACjE,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,WAAW,EAAG,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,SAAS,EAAK,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,SAAS,EAAK,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,EAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACjE,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,EAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACjE,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,EAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACjE,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,IAAI,EAAU,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,SAAS,EAAK,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,SAAS,EAAK,CAAC,EAAE,CAAC,CAAC;IAEpB,4EAA4E;IAC5E,OAAO;IACP,4EAA4E;IAC5E,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,SAAS,EAAK,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,SAAS,EAAK,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,GAAG,EAAW,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,WAAW,EAAG,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,SAAS,EAAK,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IAEpB,4EAA4E;IAC5E,oBAAoB;IACpB,4EAA4E;IAC5E,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,SAAS,EAAK,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,SAAS,EAAK,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,SAAS,EAAK,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,GAAG,EAAW,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,SAAS,EAAK,CAAC,EAAE,CAAC,CAAC;IAEpB,4EAA4E;IAC5E,uBAAuB;IACvB,4EAA4E;IAC5E,CAAC,GAAG,EAAW,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,QAAQ,EAAM,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,MAAM,EAAQ,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,UAAU,EAAI,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,SAAS,EAAK,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,SAAS,EAAK,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,WAAW,EAAG,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,MAAM,EAAQ,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,SAAS,EAAK,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,IAAI,EAAU,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,KAAK,EAAS,CAAC,EAAE,GAAG,CAAC;IACtB,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,EAAI,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;IACxD,CAAC,SAAS,EAAK,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,GAAG,CAAC;IAEtB,4EAA4E;IAC5E,gBAAgB;IAChB,4EAA4E;IAC5E,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,UAAU,EAAI,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,KAAK,EAAS,CAAC,EAAE,CAAC,CAAC;IAEpB,4EAA4E;IAC5E,mBAAmB;IACnB,4EAA4E;IAC5E,CAAC,SAAS,EAAK,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,YAAY,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACjE,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,MAAM,EAAQ,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,OAAO,EAAO,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC,QAAQ,EAAM,CAAC,EAAE,GAAG,CAAC;CACvB,CAAC;AAEF,2EAA2E;AAC9D,QAAA,iBAAiB,GAA2C,IAAI,GAAG,CAC9E,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;IAC1C,IAAc;IACd,EAAE,IAAI,EAAE,IAAc,EAAE,OAAO,EAAE,GAAa,EAAE,OAAO,EAAE,GAAa,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE;CAC1F,CAAC,CACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { ASTNode, Diagnostic } from './types';
2
+ /**
3
+ * Walk the AST and emit semantic diagnostics.
4
+ *
5
+ * Checks performed per `FunctionCallNode`:
6
+ * E005 — Unknown function (warning, not error — may be a UDF)
7
+ * E006 — Too few arguments
8
+ * E007 — Too many arguments
9
+ * W002 — Empty argument
10
+ * W003 — Deprecated function
11
+ */
12
+ export declare function semanticCheck(nodes: ASTNode[]): Diagnostic[];
13
+ //# sourceMappingURL=checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../../src/validator/checker.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAoB,MAAM,SAAS,CAAC;AAOhE;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAI5D"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // Semantic checker: validates the AST against the built-in function database
4
+ // ---------------------------------------------------------------------------
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.semanticCheck = semanticCheck;
7
+ const builtins_1 = require("./builtins");
8
+ // ---------------------------------------------------------------------------
9
+ // Public entry point
10
+ // ---------------------------------------------------------------------------
11
+ /**
12
+ * Walk the AST and emit semantic diagnostics.
13
+ *
14
+ * Checks performed per `FunctionCallNode`:
15
+ * E005 — Unknown function (warning, not error — may be a UDF)
16
+ * E006 — Too few arguments
17
+ * E007 — Too many arguments
18
+ * W002 — Empty argument
19
+ * W003 — Deprecated function
20
+ */
21
+ function semanticCheck(nodes) {
22
+ const diagnostics = [];
23
+ walkNodes(nodes, diagnostics);
24
+ return diagnostics;
25
+ }
26
+ // ---------------------------------------------------------------------------
27
+ // AST walkers
28
+ // ---------------------------------------------------------------------------
29
+ function walkNodes(nodes, diagnostics) {
30
+ for (const node of nodes) {
31
+ walkNode(node, diagnostics);
32
+ }
33
+ }
34
+ function walkNode(node, diagnostics) {
35
+ switch (node.type) {
36
+ case 'FunctionCall':
37
+ checkFunctionCall(node, diagnostics);
38
+ break;
39
+ case 'BracketEval':
40
+ walkNodes(node.nodes, diagnostics);
41
+ break;
42
+ case 'RawText':
43
+ case 'Substitution':
44
+ // Nothing to validate at the leaf level
45
+ break;
46
+ }
47
+ }
48
+ function checkFunctionCall(node, diagnostics) {
49
+ const key = node.name.toLowerCase();
50
+ const sig = builtins_1.BUILTIN_FUNCTIONS.get(key);
51
+ if (!sig) {
52
+ // Unknown function — warn rather than error because MUSHcoders heavily
53
+ // use user-defined @functions and inline u() attribute patterns.
54
+ diagnostics.push({
55
+ severity: 'warning',
56
+ code: 'W005',
57
+ message: `Unknown function '${node.name}' — not in built-in database (may be a UDF or @function)`,
58
+ offset: node.nameOffset,
59
+ length: node.name.length,
60
+ });
61
+ }
62
+ else {
63
+ const argCount = node.args.length;
64
+ if (argCount < sig.minArgs) {
65
+ diagnostics.push({
66
+ severity: 'error',
67
+ code: 'E006',
68
+ message: argCount === 0
69
+ ? `'${node.name}' requires at least ${sig.minArgs} argument${sig.minArgs !== 1 ? 's' : ''}, but got none`
70
+ : `'${node.name}' requires at least ${sig.minArgs} argument${sig.minArgs !== 1 ? 's' : ''}, but got ${argCount}`,
71
+ offset: node.nameOffset,
72
+ length: node.name.length,
73
+ });
74
+ }
75
+ else if (isFinite(sig.maxArgs) && argCount > sig.maxArgs) {
76
+ diagnostics.push({
77
+ severity: 'error',
78
+ code: 'E007',
79
+ message: `'${node.name}' accepts at most ${sig.maxArgs} argument${sig.maxArgs !== 1 ? 's' : ''}, but got ${argCount}`,
80
+ offset: node.nameOffset,
81
+ length: node.name.length,
82
+ });
83
+ }
84
+ if (sig.deprecated) {
85
+ diagnostics.push({
86
+ severity: 'warning',
87
+ code: 'W003',
88
+ message: `'${node.name}' is deprecated`,
89
+ offset: node.nameOffset,
90
+ length: node.name.length,
91
+ });
92
+ }
93
+ }
94
+ // Check for empty arguments (potential typos like `add(,3)`)
95
+ for (let i = 0; i < node.args.length; i++) {
96
+ if (node.args[i].length === 0) {
97
+ diagnostics.push({
98
+ severity: 'warning',
99
+ code: 'W002',
100
+ message: `Argument ${i + 1} of '${node.name}' is empty`,
101
+ offset: node.offset,
102
+ length: 1,
103
+ });
104
+ }
105
+ }
106
+ // Recurse into each argument's nodes
107
+ for (const arg of node.args) {
108
+ walkNodes(arg, diagnostics);
109
+ }
110
+ }
111
+ //# sourceMappingURL=checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checker.js","sourceRoot":"","sources":["../../src/validator/checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { ASTNode, Diagnostic } from './types';
2
+ /**
3
+ * Walk the AST and emit W006 warnings for every `setq()` call that appears
4
+ * inside a loop-body argument without an intervening `localize()`.
5
+ */
6
+ export declare function registerClobberCheck(nodes: ASTNode[]): Diagnostic[];
7
+ //# sourceMappingURL=clobber.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clobber.d.ts","sourceRoot":"","sources":["../../src/validator/clobber.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAoB,MAAM,SAAS,CAAC;AAsBhE;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAInE"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // Register clobber / re-entrancy analyzer
4
+ //
5
+ // Detects `setq()` calls inside loop-body arguments (iter, parse, filter,
6
+ // map, fold, step, munge, filterfun). Because MUSH registers (%q0–%q9) are
7
+ // scoped per queue entry, concurrent or nested invocations of the same
8
+ // attribute can silently overwrite each other's register values.
9
+ //
10
+ // Safe escape hatch: wrapping the body in `localize()` creates a fresh
11
+ // register scope, so setq() inside localize() is not flagged.
12
+ // ---------------------------------------------------------------------------
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.registerClobberCheck = registerClobberCheck;
15
+ // Functions whose body argument is evaluated once per list element.
16
+ // Value is the index of the first "body" argument (0-based).
17
+ // All arguments at index >= bodyArgIndex are treated as body.
18
+ const LOOP_FUNCTIONS = new Map([
19
+ ['iter', 1], // iter(list, BODY, ...)
20
+ ['parse', 1], // parse(list, BODY, ...)
21
+ ['filter', 0], // filter(BODY/attr, list, ...)
22
+ ['filterfun', 0], // filterfun(BODY/attr, list, ...)
23
+ ['map', 0], // map(BODY/attr, list, ...)
24
+ ['fold', 0], // fold(BODY/attr, base, list, ...)
25
+ ['step', 0], // step(BODY/attr, list, ...)
26
+ ['munge', 0], // munge(BODY/attr, list, ...)
27
+ ['matchall', 1], // matchall(list, pattern, ...) — pattern is text, not code
28
+ ['graball', 1], // graball(list, pattern, ...)
29
+ ['sortby', 0], // sortby(BODY/attr, list, ...)
30
+ ]);
31
+ // Functions that create a new register scope — safe for setq()
32
+ const SCOPE_WRAPPERS = new Set(['localize']);
33
+ /**
34
+ * Walk the AST and emit W006 warnings for every `setq()` call that appears
35
+ * inside a loop-body argument without an intervening `localize()`.
36
+ */
37
+ function registerClobberCheck(nodes) {
38
+ const diagnostics = [];
39
+ walkNodes(nodes, false, diagnostics);
40
+ return diagnostics;
41
+ }
42
+ // ---------------------------------------------------------------------------
43
+ // Internal walkers
44
+ // ---------------------------------------------------------------------------
45
+ function walkNodes(nodes, inLoop, out) {
46
+ for (const node of nodes) {
47
+ walkNode(node, inLoop, out);
48
+ }
49
+ }
50
+ function walkNode(node, inLoop, out) {
51
+ switch (node.type) {
52
+ case 'BracketEval':
53
+ walkNodes(node.nodes, inLoop, out);
54
+ break;
55
+ case 'FunctionCall':
56
+ walkFunctionCall(node, inLoop, out);
57
+ break;
58
+ // RawText / Substitution — nothing to check
59
+ default:
60
+ break;
61
+ }
62
+ }
63
+ function walkFunctionCall(node, inLoop, out) {
64
+ const key = node.name.toLowerCase();
65
+ // localize() creates a new register scope — safe to setq() inside
66
+ if (SCOPE_WRAPPERS.has(key)) {
67
+ for (const arg of node.args) {
68
+ walkNodes(arg, false, out); // reset inLoop to false
69
+ }
70
+ return;
71
+ }
72
+ // setq() inside a loop body is the hazard
73
+ if (inLoop && key === 'setq') {
74
+ out.push({
75
+ severity: 'warning',
76
+ code: 'W006',
77
+ message: `'setq' inside a loop body risks register clobber on re-entrant calls — ` +
78
+ `wrap the body with localize() to create a safe register scope`,
79
+ offset: node.nameOffset,
80
+ length: node.name.length,
81
+ });
82
+ // Still recurse so nested loops / deeper setqs are also caught
83
+ for (const arg of node.args) {
84
+ walkNodes(arg, inLoop, out);
85
+ }
86
+ return;
87
+ }
88
+ const bodyArgIndex = LOOP_FUNCTIONS.get(key);
89
+ if (bodyArgIndex !== undefined) {
90
+ for (let i = 0; i < node.args.length; i++) {
91
+ // Arguments before the body start index are data (list, base value, etc.) — not loop body
92
+ const isBodyArg = i >= bodyArgIndex;
93
+ walkNodes(node.args[i], isBodyArg, out);
94
+ }
95
+ return;
96
+ }
97
+ // Regular function — propagate current inLoop state
98
+ for (const arg of node.args) {
99
+ walkNodes(arg, inLoop, out);
100
+ }
101
+ }
102
+ //# sourceMappingURL=clobber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clobber.js","sourceRoot":"","sources":["../../src/validator/clobber.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { ASTNode } from './types';
2
+ import { Platform } from './builtins';
3
+ export interface CompatibilityEntry {
4
+ name: string;
5
+ /** Platforms that support this function. */
6
+ platforms: Platform[];
7
+ }
8
+ export interface CompatibilityReport {
9
+ /** Functions that are not available on all platforms. */
10
+ restricted: CompatibilityEntry[];
11
+ /** true if every known function in the expression is universally portable. */
12
+ portable: boolean;
13
+ }
14
+ /**
15
+ * Walk a parsed AST and collect any platform-restricted function calls.
16
+ * Called internally by `compatibilityReport` in the validator index.
17
+ */
18
+ export declare function compatibilityCheck(nodes: ASTNode[]): CompatibilityReport;
19
+ //# sourceMappingURL=compat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../../src/validator/compat.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAoB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAqB,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,SAAS,EAAE,QAAQ,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAChC,yDAAyD;IACzD,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,8EAA8E;IAC9E,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,mBAAmB,CAYxE"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // Dialect compatibility report
4
+ //
5
+ // Walks the AST and reports which functions are restricted to specific
6
+ // platforms (Rhost-only, Penn+Rhost, etc.) vs. universally available.
7
+ // ---------------------------------------------------------------------------
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.compatibilityCheck = compatibilityCheck;
10
+ const builtins_1 = require("./builtins");
11
+ /**
12
+ * Walk a parsed AST and collect any platform-restricted function calls.
13
+ * Called internally by `compatibilityReport` in the validator index.
14
+ */
15
+ function compatibilityCheck(nodes) {
16
+ const seen = new Map();
17
+ walkNodes(nodes, seen);
18
+ const restricted = Array.from(seen.entries()).map(([name, platforms]) => ({ name, platforms }));
19
+ return {
20
+ restricted,
21
+ portable: restricted.length === 0,
22
+ };
23
+ }
24
+ // ---------------------------------------------------------------------------
25
+ // Internal walkers
26
+ // ---------------------------------------------------------------------------
27
+ function walkNodes(nodes, seen) {
28
+ for (const node of nodes) {
29
+ walkNode(node, seen);
30
+ }
31
+ }
32
+ function walkNode(node, seen) {
33
+ switch (node.type) {
34
+ case 'FunctionCall':
35
+ checkFunction(node, seen);
36
+ break;
37
+ case 'BracketEval':
38
+ walkNodes(node.nodes, seen);
39
+ break;
40
+ default:
41
+ break;
42
+ }
43
+ }
44
+ function checkFunction(node, seen) {
45
+ const key = node.name.toLowerCase();
46
+ const sig = builtins_1.BUILTIN_FUNCTIONS.get(key);
47
+ if (sig?.platforms && sig.platforms.length > 0) {
48
+ // Deduplicate — only record each restricted function once
49
+ if (!seen.has(key)) {
50
+ seen.set(key, sig.platforms);
51
+ }
52
+ }
53
+ // Recurse into arguments
54
+ for (const arg of node.args) {
55
+ walkNodes(arg, seen);
56
+ }
57
+ }
58
+ //# sourceMappingURL=compat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compat.js","sourceRoot":"","sources":["../../src/validator/compat.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,+BAA+B;AAC/B,EAAE;AACF,uEAAuE;AACvE,sEAAsE;AACtE,8EAA8E;;AAsB9E,gDAYC;AA/BD,yCAAyD;AAezD;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,KAAgB;IAC/C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC3C,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAEvB,MAAM,UAAU,GAAyB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CACnE,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAC/C,CAAC;IAEF,OAAO;QACH,UAAU;QACV,QAAQ,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC;KACpC,CAAC;AACN,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,SAAS,SAAS,CAAC,KAAgB,EAAE,IAA6B;IAC9D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzB,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,IAAa,EAAE,IAA6B;IAC1D,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,cAAc;YACf,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC1B,MAAM;QACV,KAAK,aAAa;YACd,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC5B,MAAM;QACV;YACI,MAAM;IACd,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,IAAsB,EAAE,IAA6B;IACxE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,GAAG,GAAG,4BAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEvC,IAAI,GAAG,EAAE,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,0DAA0D;QAC1D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;IACL,CAAC;IAED,yBAAyB;IACzB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACzB,CAAC;AACL,CAAC"}
@@ -0,0 +1,21 @@
1
+ export interface FormatOptions {
2
+ /** Add newlines + indentation for human readability. Default: false. */
3
+ pretty?: boolean;
4
+ /** Lowercase all function names. Default: false. */
5
+ lowercase?: boolean;
6
+ }
7
+ export interface FormatResult {
8
+ formatted: string;
9
+ changed: boolean;
10
+ }
11
+ /**
12
+ * Format a MUSHcode expression.
13
+ *
14
+ * Compact mode (default): strips extra whitespace around `(`, `,`, `)` while
15
+ * preserving whitespace inside argument text.
16
+ *
17
+ * Pretty mode: additionally adds newlines + indentation at each nesting level
18
+ * for human readability. Not suitable for direct upload to a MUSH server.
19
+ */
20
+ export declare function format(expr: string, options?: FormatOptions): FormatResult;
21
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/validator/formatter.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,aAAa;IAC5B,wEAAwE;IACxE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oDAAoD;IACpD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY,CAO9E"}