@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.
- package/README.md +393 -5
- package/ROADMAP.md +241 -0
- package/dist/benchmark.d.ts +44 -0
- package/dist/benchmark.d.ts.map +1 -0
- package/dist/benchmark.js +118 -0
- package/dist/benchmark.js.map +1 -0
- package/dist/cli/deploy.d.ts +2 -0
- package/dist/cli/deploy.d.ts.map +1 -0
- package/dist/cli/deploy.js +120 -0
- package/dist/cli/deploy.js.map +1 -0
- package/dist/cli/fmt.d.ts +2 -0
- package/dist/cli/fmt.d.ts.map +1 -0
- package/dist/cli/fmt.js +119 -0
- package/dist/cli/fmt.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +81 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +210 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/validate.d.ts +2 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +126 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/cli/watch.d.ts +2 -0
- package/dist/cli/watch.d.ts.map +1 -0
- package/dist/cli/watch.js +136 -0
- package/dist/cli/watch.js.map +1 -0
- package/dist/client.d.ts +48 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +113 -30
- package/dist/client.js.map +1 -1
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +1 -1
- package/dist/container.js.map +1 -1
- package/dist/deployer.d.ts +86 -0
- package/dist/deployer.d.ts.map +1 -0
- package/dist/deployer.js +154 -0
- package/dist/deployer.js.map +1 -0
- package/dist/expect.d.ts +27 -1
- package/dist/expect.d.ts.map +1 -1
- package/dist/expect.js +47 -2
- package/dist/expect.js.map +1 -1
- package/dist/index.d.ts +10 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +39 -1
- package/dist/index.js.map +1 -1
- package/dist/preflight.d.ts +70 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +121 -0
- package/dist/preflight.js.map +1 -0
- package/dist/reporter.d.ts +2 -0
- package/dist/reporter.d.ts.map +1 -1
- package/dist/reporter.js +24 -1
- package/dist/reporter.js.map +1 -1
- package/dist/runner.d.ts +83 -2
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +137 -8
- package/dist/runner.js.map +1 -1
- package/dist/snapshots.d.ts +84 -0
- package/dist/snapshots.d.ts.map +1 -0
- package/dist/snapshots.js +230 -0
- package/dist/snapshots.js.map +1 -0
- package/dist/validator/builtins.d.ts +18 -0
- package/dist/validator/builtins.d.ts.map +1 -0
- package/dist/validator/builtins.js +265 -0
- package/dist/validator/builtins.js.map +1 -0
- package/dist/validator/checker.d.ts +13 -0
- package/dist/validator/checker.d.ts.map +1 -0
- package/dist/validator/checker.js +111 -0
- package/dist/validator/checker.js.map +1 -0
- package/dist/validator/clobber.d.ts +7 -0
- package/dist/validator/clobber.d.ts.map +1 -0
- package/dist/validator/clobber.js +102 -0
- package/dist/validator/clobber.js.map +1 -0
- package/dist/validator/compat.d.ts +19 -0
- package/dist/validator/compat.d.ts.map +1 -0
- package/dist/validator/compat.js +58 -0
- package/dist/validator/compat.js.map +1 -0
- package/dist/validator/formatter.d.ts +21 -0
- package/dist/validator/formatter.d.ts.map +1 -0
- package/dist/validator/formatter.js +120 -0
- package/dist/validator/formatter.js.map +1 -0
- package/dist/validator/index.d.ts +57 -0
- package/dist/validator/index.d.ts.map +1 -0
- package/dist/validator/index.js +133 -0
- package/dist/validator/index.js.map +1 -0
- package/dist/validator/parser.d.ts +16 -0
- package/dist/validator/parser.d.ts.map +1 -0
- package/dist/validator/parser.js +260 -0
- package/dist/validator/parser.js.map +1 -0
- package/dist/validator/tokenizer.d.ts +28 -0
- package/dist/validator/tokenizer.d.ts.map +1 -0
- package/dist/validator/tokenizer.js +174 -0
- package/dist/validator/tokenizer.js.map +1 -0
- package/dist/validator/types.d.ts +55 -0
- package/dist/validator/types.d.ts.map +1 -0
- package/dist/validator/types.js +6 -0
- package/dist/validator/types.js.map +1 -0
- package/dist/watcher.d.ts +44 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +297 -0
- package/dist/watcher.js.map +1 -0
- package/dist/world.d.ts +79 -0
- package/dist/world.d.ts.map +1 -1
- package/dist/world.js +167 -1
- package/dist/world.js.map +1 -1
- 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":"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"}
|
|
@@ -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":";AAAA,8EAA8E;AAC9E,0CAA0C;AAC1C,EAAE;AACF,0EAA0E;AAC1E,4EAA4E;AAC5E,uEAAuE;AACvE,iEAAiE;AACjE,EAAE;AACF,uEAAuE;AACvE,8DAA8D;AAC9D,8EAA8E;;AA4B9E,oDAIC;AA5BD,oEAAoE;AACpE,6DAA6D;AAC7D,8DAA8D;AAC9D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAiB;IAC3C,CAAC,MAAM,EAAO,CAAC,CAAC,EAAI,wBAAwB;IAC5C,CAAC,OAAO,EAAM,CAAC,CAAC,EAAI,yBAAyB;IAC7C,CAAC,QAAQ,EAAK,CAAC,CAAC,EAAI,+BAA+B;IACnD,CAAC,WAAW,EAAE,CAAC,CAAC,EAAI,kCAAkC;IACtD,CAAC,KAAK,EAAQ,CAAC,CAAC,EAAI,4BAA4B;IAChD,CAAC,MAAM,EAAO,CAAC,CAAC,EAAI,mCAAmC;IACvD,CAAC,MAAM,EAAO,CAAC,CAAC,EAAI,6BAA6B;IACjD,CAAC,OAAO,EAAM,CAAC,CAAC,EAAI,8BAA8B;IAClD,CAAC,UAAU,EAAG,CAAC,CAAC,EAAI,2DAA2D;IAC/E,CAAC,SAAS,EAAI,CAAC,CAAC,EAAI,8BAA8B;IAClD,CAAC,QAAQ,EAAK,CAAC,CAAC,EAAI,+BAA+B;CACtD,CAAC,CAAC;AAEH,+DAA+D;AAC/D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AAE7C;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,KAAgB;IACjD,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IACrC,OAAO,WAAW,CAAC;AACvB,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,SAAS,SAAS,CAAC,KAAgB,EAAE,MAAe,EAAE,GAAiB;IACnE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,IAAa,EAAE,MAAe,EAAE,GAAiB;IAC/D,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,aAAa;YACd,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YACnC,MAAM;QAEV,KAAK,cAAc;YACf,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YACpC,MAAM;QAEV,4CAA4C;QAC5C;YACI,MAAM;IACd,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAsB,EAAE,MAAe,EAAE,GAAiB;IAChF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAEpC,kEAAkE;IAClE,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,wBAAwB;QACxD,CAAC;QACD,OAAO;IACX,CAAC;IAED,0CAA0C;IAC1C,IAAI,MAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC;YACL,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,MAAM;YACZ,OAAO,EACH,yEAAyE;gBACzE,+DAA+D;YACnE,MAAM,EAAE,IAAI,CAAC,UAAU;YACvB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;SAC3B,CAAC,CAAC;QACH,+DAA+D;QAC/D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,CAAC;QACD,OAAO;IACX,CAAC;IAED,MAAM,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,0FAA0F;YAC1F,MAAM,SAAS,GAAG,CAAC,IAAI,YAAY,CAAC;YACpC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO;IACX,CAAC;IAED,oDAAoD;IACpD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,CAAC;AACL,CAAC"}
|
|
@@ -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"}
|