mancha 0.16.7 → 0.17.0

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 (67) hide show
  1. package/README.md +22 -19
  2. package/dist/browser.d.ts +40 -3
  3. package/dist/browser.js +1 -1
  4. package/dist/browser.js.map +1 -1
  5. package/dist/dome.d.ts +1 -2
  6. package/dist/dome.js +2 -0
  7. package/dist/dome.js.map +1 -1
  8. package/dist/expressions/ast.d.ts +79 -0
  9. package/dist/expressions/ast.js +6 -0
  10. package/dist/expressions/ast.js.map +1 -0
  11. package/dist/expressions/ast.test.d.ts +1 -0
  12. package/dist/expressions/ast.test.js +122 -0
  13. package/dist/expressions/ast.test.js.map +1 -0
  14. package/dist/expressions/ast_factory.d.ts +37 -0
  15. package/dist/expressions/ast_factory.js +119 -0
  16. package/dist/expressions/ast_factory.js.map +1 -0
  17. package/dist/expressions/ast_factory.test.d.ts +1 -0
  18. package/dist/expressions/ast_factory.test.js +88 -0
  19. package/dist/expressions/ast_factory.test.js.map +1 -0
  20. package/dist/expressions/constants.d.ts +6 -0
  21. package/dist/expressions/constants.js +72 -0
  22. package/dist/expressions/constants.js.map +1 -0
  23. package/dist/expressions/constants.test.d.ts +1 -0
  24. package/dist/expressions/constants.test.js +84 -0
  25. package/dist/expressions/constants.test.js.map +1 -0
  26. package/dist/expressions/eval.d.ts +101 -0
  27. package/dist/expressions/eval.js +375 -0
  28. package/dist/expressions/eval.js.map +1 -0
  29. package/dist/expressions/eval.test.d.ts +1 -0
  30. package/dist/expressions/eval.test.js +141 -0
  31. package/dist/expressions/eval.test.js.map +1 -0
  32. package/dist/expressions/expressions.test.d.ts +6 -0
  33. package/dist/expressions/expressions.test.js +7 -0
  34. package/dist/expressions/expressions.test.js.map +1 -0
  35. package/dist/expressions/index.d.ts +6 -0
  36. package/dist/expressions/index.js +7 -0
  37. package/dist/expressions/index.js.map +1 -0
  38. package/dist/expressions/parser.d.ts +32 -0
  39. package/dist/expressions/parser.js +336 -0
  40. package/dist/expressions/parser.js.map +1 -0
  41. package/dist/expressions/parser.test.d.ts +1 -0
  42. package/dist/expressions/parser.test.js +132 -0
  43. package/dist/expressions/parser.test.js.map +1 -0
  44. package/dist/expressions/tokenizer.d.ts +49 -0
  45. package/dist/expressions/tokenizer.js +253 -0
  46. package/dist/expressions/tokenizer.js.map +1 -0
  47. package/dist/expressions/tokenizer.test.d.ts +1 -0
  48. package/dist/expressions/tokenizer.test.js +99 -0
  49. package/dist/expressions/tokenizer.test.js.map +1 -0
  50. package/dist/mancha.d.ts +1 -1
  51. package/dist/mancha.js +1 -1
  52. package/dist/mancha.js.map +1 -1
  53. package/dist/renderer.d.ts +5 -2
  54. package/dist/renderer.js +2 -0
  55. package/dist/renderer.js.map +1 -1
  56. package/dist/safe_browser.d.ts +4 -3
  57. package/dist/safe_browser.js +1 -1
  58. package/dist/safe_browser.js.map +1 -1
  59. package/dist/store.d.ts +51 -11
  60. package/dist/store.js +89 -31
  61. package/dist/store.js.map +1 -1
  62. package/dist/type_checker.d.ts +1 -0
  63. package/dist/type_checker.js +68 -27
  64. package/dist/type_checker.js.map +1 -1
  65. package/docs/quickstart.md +36 -0
  66. package/gulpfile.js +5 -1
  67. package/package.json +18 -5
@@ -0,0 +1,101 @@
1
+ import * as ast from './ast.js';
2
+ import { AstFactory } from './ast_factory.js';
3
+ export interface Scope {
4
+ [key: string]: unknown;
5
+ }
6
+ export interface Evaluatable {
7
+ evaluate(scope: Scope): unknown;
8
+ getIds(idents: string[]): string[];
9
+ }
10
+ export type Expression = Literal | Empty | ID | Unary | Binary | Getter | Invoke | Index | Ternary | Map | List | ArrowFunction | SpreadProperty | SpreadElement | Property;
11
+ export interface Literal extends Evaluatable {
12
+ type: 'Literal';
13
+ value: ast.LiteralValue;
14
+ }
15
+ export interface Empty extends Evaluatable {
16
+ type: 'Empty';
17
+ }
18
+ export interface ID extends Evaluatable {
19
+ type: 'ID';
20
+ value: string;
21
+ }
22
+ export interface Unary extends Evaluatable {
23
+ type: 'Unary';
24
+ operator: string;
25
+ child: Expression;
26
+ }
27
+ export interface Binary extends Evaluatable {
28
+ type: 'Binary';
29
+ operator: string;
30
+ left: Expression;
31
+ right: Expression;
32
+ }
33
+ export interface Getter extends Evaluatable {
34
+ type: 'Getter';
35
+ receiver: Expression;
36
+ name: string;
37
+ optional?: boolean;
38
+ }
39
+ export interface Invoke extends Evaluatable {
40
+ type: 'Invoke';
41
+ receiver: Expression;
42
+ method: string | undefined;
43
+ arguments: Array<Expression> | undefined;
44
+ optional?: boolean;
45
+ }
46
+ export interface Index extends Evaluatable {
47
+ type: 'Index';
48
+ receiver: Expression;
49
+ argument: Expression;
50
+ optional?: boolean;
51
+ }
52
+ export interface Ternary extends Evaluatable {
53
+ type: 'Ternary';
54
+ condition: Expression;
55
+ trueExpr: Expression;
56
+ falseExpr: Expression;
57
+ }
58
+ export interface Map extends Evaluatable {
59
+ type: 'Map';
60
+ properties?: Array<Property | SpreadProperty> | undefined;
61
+ }
62
+ export interface Property extends Evaluatable {
63
+ type: 'Property';
64
+ key: string;
65
+ value: Expression;
66
+ }
67
+ export interface List extends Evaluatable {
68
+ type: 'List';
69
+ items: Array<Expression> | undefined;
70
+ }
71
+ export interface ArrowFunction extends Evaluatable {
72
+ type: 'ArrowFunction';
73
+ params: Array<string>;
74
+ body: Expression;
75
+ }
76
+ export interface SpreadProperty extends Evaluatable {
77
+ type: 'SpreadProperty';
78
+ expression: Expression;
79
+ }
80
+ export interface SpreadElement extends Evaluatable {
81
+ type: 'SpreadElement';
82
+ expression: Expression;
83
+ }
84
+ export declare class EvalAstFactory implements AstFactory<Expression> {
85
+ empty(): Empty;
86
+ literal(v: ast.LiteralValue): Literal;
87
+ id(v: string): ID;
88
+ unary(op: string, expr: Expression): Unary;
89
+ binary(l: Expression, op: string, r: Expression): Binary;
90
+ getter(g: Expression, n: string, optional?: boolean): Getter;
91
+ invoke(receiver: Expression, method: string | undefined, args: Expression[], optional?: boolean): Invoke;
92
+ paren(e: Expression): Expression;
93
+ index(e: Expression, a: Expression, optional?: boolean): Index;
94
+ ternary(c: Expression, t: Expression, f: Expression): Ternary;
95
+ map(properties: Array<Property | SpreadProperty> | undefined): Map;
96
+ property(key: string, value: Expression): Property;
97
+ list(l: Array<Expression> | undefined): List;
98
+ arrowFunction(params: string[], body: Expression): Expression;
99
+ spreadProperty(expression: Expression): SpreadProperty;
100
+ spreadElement(expression: Expression): SpreadElement;
101
+ }
@@ -0,0 +1,375 @@
1
+ /*
2
+ * @license
3
+ * Portions Copyright (c) 2013, the Dart project authors.
4
+ */
5
+ const _BINARY_OPERATORS = {
6
+ '+': (a, b) => a + b,
7
+ '-': (a, b) => a - b,
8
+ '*': (a, b) => a * b,
9
+ '/': (a, b) => a / b,
10
+ '%': (a, b) => a % b,
11
+ '==': (a, b) => a == b,
12
+ '!=': (a, b) => a != b,
13
+ '===': (a, b) => a === b,
14
+ '!==': (a, b) => a !== b,
15
+ '>': (a, b) => a > b,
16
+ '>=': (a, b) => a >= b,
17
+ '<': (a, b) => a < b,
18
+ '<=': (a, b) => a <= b,
19
+ '||': (a, b) => a || b,
20
+ '&&': (a, b) => a && b,
21
+ '??': (a, b) => a ?? b,
22
+ '|': (a, f) => f(a),
23
+ 'in': (a, b) => a in b,
24
+ };
25
+ const _UNARY_OPERATORS = {
26
+ '+': (a) => a,
27
+ '-': (a) => -a,
28
+ '!': (a) => !a,
29
+ 'typeof': (a) => typeof a,
30
+ };
31
+ export class EvalAstFactory {
32
+ empty() {
33
+ // TODO(justinfagnani): return null instead?
34
+ return {
35
+ type: 'Empty',
36
+ evaluate(scope) {
37
+ return scope;
38
+ },
39
+ getIds(idents) {
40
+ return idents;
41
+ },
42
+ };
43
+ }
44
+ // TODO(justinfagnani): just use a JS literal?
45
+ literal(v) {
46
+ return {
47
+ type: 'Literal',
48
+ value: v,
49
+ evaluate(_scope) {
50
+ return this.value;
51
+ },
52
+ getIds(idents) {
53
+ return idents;
54
+ },
55
+ };
56
+ }
57
+ id(v) {
58
+ return {
59
+ type: 'ID',
60
+ value: v,
61
+ evaluate(scope) {
62
+ // TODO(justinfagnani): this prevents access to properties named 'this'
63
+ if (this.value === 'this')
64
+ return scope;
65
+ return scope?.[this.value];
66
+ },
67
+ getIds(idents) {
68
+ idents.push(this.value);
69
+ return idents;
70
+ },
71
+ };
72
+ }
73
+ unary(op, expr) {
74
+ const f = _UNARY_OPERATORS[op];
75
+ return {
76
+ type: 'Unary',
77
+ operator: op,
78
+ child: expr,
79
+ evaluate(scope) {
80
+ return f(this.child.evaluate(scope));
81
+ },
82
+ getIds(idents) {
83
+ return this.child.getIds(idents);
84
+ },
85
+ };
86
+ }
87
+ binary(l, op, r) {
88
+ const f = _BINARY_OPERATORS[op];
89
+ return {
90
+ type: 'Binary',
91
+ operator: op,
92
+ left: l,
93
+ right: r,
94
+ evaluate(scope) {
95
+ if (this.operator === '=') {
96
+ if (this.left.type !== 'ID' &&
97
+ this.left.type !== 'Getter' &&
98
+ this.left.type !== 'Index') {
99
+ throw new Error(`Invalid assignment target: ${this.left}`);
100
+ }
101
+ const value = this.right.evaluate(scope);
102
+ let receiver = undefined;
103
+ let property;
104
+ if (this.left.type === 'Getter') {
105
+ receiver = this.left.receiver.evaluate(scope);
106
+ property = this.left.name;
107
+ }
108
+ else if (this.left.type === 'Index') {
109
+ receiver = this.left.receiver.evaluate(scope);
110
+ property = String(this.left.argument.evaluate(scope));
111
+ }
112
+ else if (this.left.type === 'ID') {
113
+ // TODO: the id could be a parameter
114
+ receiver = scope;
115
+ property = this.left.value;
116
+ }
117
+ return receiver === undefined
118
+ ? undefined
119
+ : (receiver[property] = value);
120
+ }
121
+ return f(this.left.evaluate(scope), this.right.evaluate(scope));
122
+ },
123
+ getIds(idents) {
124
+ this.left.getIds(idents);
125
+ this.right.getIds(idents);
126
+ return idents;
127
+ },
128
+ };
129
+ }
130
+ getter(g, n, optional) {
131
+ return {
132
+ type: 'Getter',
133
+ receiver: g,
134
+ name: n,
135
+ optional,
136
+ evaluate(scope) {
137
+ const receiver = this.receiver.evaluate(scope);
138
+ if (this.optional && (receiver === null || receiver === undefined)) {
139
+ return undefined;
140
+ }
141
+ return receiver?.[this.name];
142
+ },
143
+ getIds(idents) {
144
+ this.receiver.getIds(idents);
145
+ return idents;
146
+ },
147
+ };
148
+ }
149
+ invoke(receiver, method, args, optional) {
150
+ if (method != null && typeof method !== 'string') {
151
+ throw new Error('method not a string');
152
+ }
153
+ return {
154
+ type: 'Invoke',
155
+ receiver: receiver,
156
+ method: method,
157
+ arguments: args,
158
+ optional,
159
+ evaluate(scope) {
160
+ const receiver = this.receiver.evaluate(scope);
161
+ if (this.optional && (receiver === null || receiver === undefined)) {
162
+ return undefined;
163
+ }
164
+ // TODO(justinfagnani): this might be wrong in cases where we're
165
+ // invoking a top-level function rather than a method. If method is
166
+ // defined on a nested scope, then we should probably set _this to null.
167
+ const _this = this.method ? receiver : scope?.['this'] ?? scope;
168
+ const f = this.method ? receiver?.[this.method] : receiver;
169
+ const args = this.arguments ?? [];
170
+ const argValues = [];
171
+ for (const arg of args) {
172
+ if (arg?.type === 'SpreadElement') {
173
+ const spreadVal = arg.evaluate(scope);
174
+ if (spreadVal && typeof spreadVal[Symbol.iterator] === 'function') {
175
+ argValues.push(...spreadVal);
176
+ }
177
+ }
178
+ else {
179
+ argValues.push(arg?.evaluate(scope));
180
+ }
181
+ }
182
+ return f?.apply?.(_this, argValues);
183
+ },
184
+ getIds(idents) {
185
+ this.receiver.getIds(idents);
186
+ this.arguments?.forEach((a) => a?.getIds(idents));
187
+ return idents;
188
+ },
189
+ };
190
+ }
191
+ paren(e) {
192
+ return e;
193
+ }
194
+ index(e, a, optional) {
195
+ return {
196
+ type: 'Index',
197
+ receiver: e,
198
+ argument: a,
199
+ optional,
200
+ evaluate(scope) {
201
+ const receiver = this.receiver.evaluate(scope);
202
+ if (this.optional && (receiver === null || receiver === undefined)) {
203
+ return undefined;
204
+ }
205
+ const index = this.argument.evaluate(scope);
206
+ return receiver?.[index];
207
+ },
208
+ getIds(idents) {
209
+ this.receiver.getIds(idents);
210
+ return idents;
211
+ },
212
+ };
213
+ }
214
+ ternary(c, t, f) {
215
+ return {
216
+ type: 'Ternary',
217
+ condition: c,
218
+ trueExpr: t,
219
+ falseExpr: f,
220
+ evaluate(scope) {
221
+ const c = this.condition.evaluate(scope);
222
+ if (c) {
223
+ return this.trueExpr.evaluate(scope);
224
+ }
225
+ else {
226
+ return this.falseExpr.evaluate(scope);
227
+ }
228
+ },
229
+ getIds(idents) {
230
+ this.condition.getIds(idents);
231
+ this.trueExpr.getIds(idents);
232
+ this.falseExpr.getIds(idents);
233
+ return idents;
234
+ },
235
+ };
236
+ }
237
+ map(properties) {
238
+ return {
239
+ type: 'Map',
240
+ properties,
241
+ evaluate(scope) {
242
+ const map = {};
243
+ if (properties && this.properties) {
244
+ for (const prop of this.properties) {
245
+ if (prop.type === 'SpreadProperty') {
246
+ Object.assign(map, prop.evaluate(scope));
247
+ }
248
+ else {
249
+ map[prop.key] = prop.value.evaluate(scope);
250
+ }
251
+ }
252
+ }
253
+ return map;
254
+ },
255
+ getIds(idents) {
256
+ if (properties && this.properties) {
257
+ for (const prop of this.properties) {
258
+ if (prop.type === 'SpreadProperty') {
259
+ prop.expression.getIds(idents);
260
+ }
261
+ else {
262
+ prop.value.getIds(idents);
263
+ }
264
+ }
265
+ }
266
+ return idents;
267
+ },
268
+ };
269
+ }
270
+ property(key, value) {
271
+ return {
272
+ type: 'Property',
273
+ key,
274
+ value,
275
+ evaluate(scope) {
276
+ return this.value.evaluate(scope);
277
+ },
278
+ getIds(idents) {
279
+ return this.value.getIds(idents);
280
+ },
281
+ };
282
+ }
283
+ list(l) {
284
+ return {
285
+ type: 'List',
286
+ items: l,
287
+ evaluate(scope) {
288
+ if (!this.items)
289
+ return [];
290
+ const result = [];
291
+ for (const item of this.items) {
292
+ if (item?.type === 'SpreadElement') {
293
+ const spreadVal = item.evaluate(scope);
294
+ if (spreadVal && typeof spreadVal[Symbol.iterator] === 'function') {
295
+ result.push(...spreadVal);
296
+ }
297
+ }
298
+ else {
299
+ result.push(item?.evaluate(scope));
300
+ }
301
+ }
302
+ return result;
303
+ },
304
+ getIds(idents) {
305
+ this.items?.forEach((i) => i?.getIds(idents));
306
+ return idents;
307
+ },
308
+ };
309
+ }
310
+ arrowFunction(params, body) {
311
+ return {
312
+ type: 'ArrowFunction',
313
+ params,
314
+ body,
315
+ evaluate(scope) {
316
+ const params = this.params;
317
+ const body = this.body;
318
+ return function (...args) {
319
+ // TODO: this isn't correct for assignments to variables in outer
320
+ // scopes
321
+ // const newScope = Object.create(scope ?? null);
322
+ const paramsObj = Object.fromEntries(params.map((p, i) => [p, args[i]]));
323
+ const newScope = new Proxy(scope ?? {}, {
324
+ set(target, prop, value) {
325
+ if (paramsObj.hasOwnProperty(prop)) {
326
+ paramsObj[prop] = value;
327
+ }
328
+ return (target[prop] = value);
329
+ },
330
+ get(target, prop) {
331
+ if (paramsObj.hasOwnProperty(prop)) {
332
+ return paramsObj[prop];
333
+ }
334
+ return target[prop];
335
+ },
336
+ });
337
+ return body.evaluate(newScope);
338
+ };
339
+ },
340
+ getIds(idents) {
341
+ // Only return the _free_ variables in the body. Since arrow function
342
+ // parameters are the only way to introduce new variable names, we can
343
+ // assume that any variable in the body that isn't a parameter is free.
344
+ return this.body
345
+ .getIds(idents)
346
+ .filter((id) => !this.params.includes(id));
347
+ },
348
+ };
349
+ }
350
+ spreadProperty(expression) {
351
+ return {
352
+ type: 'SpreadProperty',
353
+ expression,
354
+ evaluate(scope) {
355
+ return this.expression.evaluate(scope);
356
+ },
357
+ getIds(idents) {
358
+ return this.expression.getIds(idents);
359
+ },
360
+ };
361
+ }
362
+ spreadElement(expression) {
363
+ return {
364
+ type: 'SpreadElement',
365
+ expression,
366
+ evaluate(scope) {
367
+ return this.expression.evaluate(scope);
368
+ },
369
+ getIds(idents) {
370
+ return this.expression.getIds(idents);
371
+ },
372
+ };
373
+ }
374
+ }
375
+ //# sourceMappingURL=eval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval.js","sourceRoot":"","sources":["../../src/expressions/eval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,141 @@
1
+ import { assert } from "../test_utils.js";
2
+ import { EvalAstFactory } from './eval.js';
3
+ describe("Evaluator", () => {
4
+ const factory = new EvalAstFactory();
5
+ const evalNode = (node, scope = {}) => node.evaluate(scope);
6
+ it("should evaluate literals", () => {
7
+ assert.equal(evalNode(factory.literal(123)), 123);
8
+ assert.equal(evalNode(factory.literal("hello")), "hello");
9
+ assert.equal(evalNode(factory.literal(true)), true);
10
+ assert.equal(evalNode(factory.literal(null)), null);
11
+ assert.equal(evalNode(factory.literal(undefined)), undefined);
12
+ });
13
+ it("should evaluate identifiers", () => {
14
+ assert.equal(evalNode(factory.id("x"), { x: 42 }), 42);
15
+ assert.equal(evalNode(factory.id("y"), { x: 42 }), undefined);
16
+ });
17
+ it("should evaluate unary expressions", () => {
18
+ assert.equal(evalNode(factory.unary("-", factory.literal(5))), -5);
19
+ assert.equal(evalNode(factory.unary("!", factory.literal(true))), false);
20
+ });
21
+ it("should evaluate binary expressions", () => {
22
+ assert.equal(evalNode(factory.binary(factory.literal(1), "+", factory.literal(2))), 3);
23
+ assert.equal(evalNode(factory.binary(factory.literal(5), "*", factory.literal(2))), 10);
24
+ assert.equal(evalNode(factory.binary(factory.literal(true), "&&", factory.literal(false))), false);
25
+ });
26
+ it("should evaluate property access", () => {
27
+ const scope = { obj: { prop: "val" } };
28
+ assert.equal(evalNode(factory.getter(factory.id("obj"), "prop"), scope), "val");
29
+ });
30
+ it("should evaluate optional property access", () => {
31
+ const scope = { obj: null };
32
+ assert.equal(evalNode(factory.getter(factory.id("obj"), "prop", true), scope), undefined);
33
+ });
34
+ it("should evaluate method invocation", () => {
35
+ const scope = {
36
+ obj: {
37
+ method: (a) => a * 2
38
+ }
39
+ };
40
+ assert.equal(evalNode(factory.invoke(factory.id("obj"), "method", [factory.literal(21)]), scope), 42);
41
+ });
42
+ it("should evaluate optional method invocation", () => {
43
+ const scope = { obj: null };
44
+ assert.equal(evalNode(factory.invoke(factory.id("obj"), "method", [], true), scope), undefined);
45
+ });
46
+ it("should evaluate function invocation", () => {
47
+ const scope = { func: (a) => a + 1 };
48
+ assert.equal(evalNode(factory.invoke(factory.id("func"), undefined, [factory.literal(1)]), scope), 2);
49
+ });
50
+ it("should evaluate index access", () => {
51
+ const scope = { arr: [1, 2, 3] };
52
+ assert.equal(evalNode(factory.index(factory.id("arr"), factory.literal(1)), scope), 2);
53
+ });
54
+ it("should evaluate optional index access", () => {
55
+ const scope = { arr: null };
56
+ assert.equal(evalNode(factory.index(factory.id("arr"), factory.literal(0), true), scope), undefined);
57
+ });
58
+ it("should evaluate ternary", () => {
59
+ assert.equal(evalNode(factory.ternary(factory.literal(true), factory.literal(1), factory.literal(0))), 1);
60
+ assert.equal(evalNode(factory.ternary(factory.literal(false), factory.literal(1), factory.literal(0))), 0);
61
+ });
62
+ it("should evaluate list", () => {
63
+ assert.deepEqual(evalNode(factory.list([factory.literal(1), factory.literal(2)])), [1, 2]);
64
+ });
65
+ it("should evaluate list with spread", () => {
66
+ const scope = { arr: [2, 3] };
67
+ const node = factory.list([
68
+ factory.literal(1),
69
+ factory.spreadElement(factory.id("arr")),
70
+ factory.literal(4)
71
+ ]);
72
+ assert.deepEqual(evalNode(node, scope), [1, 2, 3, 4]);
73
+ });
74
+ it("should evaluate map", () => {
75
+ const node = factory.map([
76
+ factory.property("a", factory.literal(1)),
77
+ factory.property("b", factory.literal(2))
78
+ ]);
79
+ assert.deepEqual(evalNode(node), { a: 1, b: 2 });
80
+ });
81
+ it("should evaluate map with spread", () => {
82
+ const scope = { obj: { b: 2, c: 3 } };
83
+ const node = factory.map([
84
+ factory.property("a", factory.literal(1)),
85
+ factory.spreadProperty(factory.id("obj")),
86
+ factory.property("d", factory.literal(4))
87
+ ]);
88
+ assert.deepEqual(evalNode(node, scope), { a: 1, b: 2, c: 3, d: 4 });
89
+ });
90
+ it("should evaluate arrow function", () => {
91
+ const node = factory.arrowFunction(["x"], factory.binary(factory.id("x"), "+", factory.literal(1)));
92
+ const fn = evalNode(node);
93
+ assert.equal(fn(1), 2);
94
+ });
95
+ it("should evaluate invocation with spread arguments", () => {
96
+ const scope = {
97
+ func: (...args) => args.reduce((a, b) => a + b, 0),
98
+ arr: [1, 2, 3]
99
+ };
100
+ const node = factory.invoke(factory.id("func"), undefined, [factory.spreadElement(factory.id("arr")), factory.literal(4)]);
101
+ assert.equal(evalNode(node, scope), 10);
102
+ });
103
+ describe("'in' operator", () => {
104
+ it("should return true when property exists in object", () => {
105
+ const node = factory.binary(factory.literal("name"), "in", factory.id("obj"));
106
+ assert.equal(evalNode(node, { obj: { name: "test" } }), true);
107
+ });
108
+ it("should return false when property does not exist in object", () => {
109
+ const node = factory.binary(factory.literal("missing"), "in", factory.id("obj"));
110
+ assert.equal(evalNode(node, { obj: { name: "test" } }), false);
111
+ });
112
+ it("should work with inherited properties", () => {
113
+ const parent = { inherited: true };
114
+ const child = Object.create(parent);
115
+ child.own = true;
116
+ const node = factory.binary(factory.literal("inherited"), "in", factory.id("obj"));
117
+ assert.equal(evalNode(node, { obj: child }), true);
118
+ });
119
+ it("should work with array indices", () => {
120
+ const nodeTrue = factory.binary(factory.literal(0), "in", factory.id("arr"));
121
+ const nodeFalse = factory.binary(factory.literal(10), "in", factory.id("arr"));
122
+ assert.equal(evalNode(nodeTrue, { arr: [1, 2, 3] }), true);
123
+ assert.equal(evalNode(nodeFalse, { arr: [1, 2, 3] }), false);
124
+ });
125
+ it("should work with string indices", () => {
126
+ const node = factory.binary(factory.literal("0"), "in", factory.id("arr"));
127
+ assert.equal(evalNode(node, { arr: ["a", "b"] }), true);
128
+ });
129
+ it("should work with computed property names", () => {
130
+ const node = factory.binary(factory.id("key"), "in", factory.id("obj"));
131
+ assert.equal(evalNode(node, { key: "name", obj: { name: "test" } }), true);
132
+ assert.equal(evalNode(node, { key: "missing", obj: { name: "test" } }), false);
133
+ });
134
+ it("should return false for null and undefined objects", () => {
135
+ const node = factory.binary(factory.literal("key"), "in", factory.id("obj"));
136
+ assert.throws(() => evalNode(node, { obj: null }));
137
+ assert.throws(() => evalNode(node, { obj: undefined }));
138
+ });
139
+ });
140
+ });
141
+ //# sourceMappingURL=eval.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval.test.js","sourceRoot":"","sources":["../../src/expressions/eval.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import './ast.test.js';
2
+ import './ast_factory.test.js';
3
+ import './constants.test.js';
4
+ import './tokenizer.test.js';
5
+ import './parser.test.js';
6
+ import './eval.test.js';