mancha 0.16.7 → 0.17.3
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/.github/workflows/ci.yml +8 -7
- package/README.md +88 -25
- package/dist/browser.d.ts +42 -3
- package/dist/browser.js +1 -1
- package/dist/browser.js.map +1 -1
- package/dist/css_gen_utils.js +323 -412
- package/dist/css_gen_utils.js.map +1 -1
- package/dist/dome.d.ts +2 -2
- package/dist/dome.js +17 -0
- package/dist/dome.js.map +1 -1
- package/dist/expressions/ast.d.ts +79 -0
- package/dist/expressions/ast.js +6 -0
- package/dist/expressions/ast.js.map +1 -0
- package/dist/expressions/ast.test.d.ts +1 -0
- package/dist/expressions/ast.test.js +122 -0
- package/dist/expressions/ast.test.js.map +1 -0
- package/dist/expressions/ast_factory.d.ts +37 -0
- package/dist/expressions/ast_factory.js +119 -0
- package/dist/expressions/ast_factory.js.map +1 -0
- package/dist/expressions/ast_factory.test.d.ts +1 -0
- package/dist/expressions/ast_factory.test.js +88 -0
- package/dist/expressions/ast_factory.test.js.map +1 -0
- package/dist/expressions/constants.d.ts +6 -0
- package/dist/expressions/constants.js +72 -0
- package/dist/expressions/constants.js.map +1 -0
- package/dist/expressions/constants.test.d.ts +1 -0
- package/dist/expressions/constants.test.js +84 -0
- package/dist/expressions/constants.test.js.map +1 -0
- package/dist/expressions/eval.d.ts +101 -0
- package/dist/expressions/eval.js +375 -0
- package/dist/expressions/eval.js.map +1 -0
- package/dist/expressions/eval.test.d.ts +1 -0
- package/dist/expressions/eval.test.js +141 -0
- package/dist/expressions/eval.test.js.map +1 -0
- package/dist/expressions/expressions.test.d.ts +6 -0
- package/dist/expressions/expressions.test.js +7 -0
- package/dist/expressions/expressions.test.js.map +1 -0
- package/dist/expressions/index.d.ts +6 -0
- package/dist/expressions/index.js +7 -0
- package/dist/expressions/index.js.map +1 -0
- package/dist/expressions/parser.d.ts +32 -0
- package/dist/expressions/parser.js +341 -0
- package/dist/expressions/parser.js.map +1 -0
- package/dist/expressions/parser.test.d.ts +1 -0
- package/dist/expressions/parser.test.js +176 -0
- package/dist/expressions/parser.test.js.map +1 -0
- package/dist/expressions/tokenizer.d.ts +49 -0
- package/dist/expressions/tokenizer.js +253 -0
- package/dist/expressions/tokenizer.js.map +1 -0
- package/dist/expressions/tokenizer.test.d.ts +1 -0
- package/dist/expressions/tokenizer.test.js +99 -0
- package/dist/expressions/tokenizer.test.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +1 -1
- package/dist/mancha.d.ts +1 -1
- package/dist/mancha.js +1 -1
- package/dist/mancha.js.map +1 -1
- package/dist/plugins.js +94 -23
- package/dist/plugins.js.map +1 -1
- package/dist/renderer.d.ts +5 -2
- package/dist/renderer.js +6 -2
- package/dist/renderer.js.map +1 -1
- package/dist/safe_browser.d.ts +4 -3
- package/dist/safe_browser.js +1 -1
- package/dist/safe_browser.js.map +1 -1
- package/dist/store.d.ts +59 -13
- package/dist/store.js +112 -38
- package/dist/store.js.map +1 -1
- package/dist/test_utils.d.ts +2 -0
- package/dist/test_utils.js +14 -1
- package/dist/test_utils.js.map +1 -1
- package/dist/trusted_attributes.js +2 -0
- package/dist/trusted_attributes.js.map +1 -1
- package/dist/type_checker.d.ts +1 -0
- package/dist/type_checker.js +113 -41
- package/dist/type_checker.js.map +1 -1
- package/dist/worker.d.ts +2 -0
- package/dist/worker.js +1 -0
- package/dist/worker.js.map +1 -1
- package/docs/quickstart.md +200 -0
- package/gulpfile.js +5 -1
- package/package.json +19 -6
- package/tsec_exemptions.json +1 -1
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { assert } from "../test_utils.js";
|
|
2
|
+
import { DefaultAstFactory } from './ast_factory.js';
|
|
3
|
+
describe("DefaultAstFactory", () => {
|
|
4
|
+
let factory;
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
factory = new DefaultAstFactory();
|
|
7
|
+
});
|
|
8
|
+
it("should create Literal nodes", () => {
|
|
9
|
+
const node = factory.literal(123);
|
|
10
|
+
assert.deepEqual(node, { type: 'Literal', value: 123 });
|
|
11
|
+
});
|
|
12
|
+
it("should create ID nodes", () => {
|
|
13
|
+
const node = factory.id('myVar');
|
|
14
|
+
assert.deepEqual(node, { type: 'ID', value: 'myVar' });
|
|
15
|
+
});
|
|
16
|
+
it("should create Unary nodes", () => {
|
|
17
|
+
const child = factory.id('x');
|
|
18
|
+
const node = factory.unary('-', child);
|
|
19
|
+
assert.deepEqual(node, { type: 'Unary', operator: '-', child });
|
|
20
|
+
});
|
|
21
|
+
it("should create Binary nodes", () => {
|
|
22
|
+
const left = factory.id('x');
|
|
23
|
+
const right = factory.id('y');
|
|
24
|
+
const node = factory.binary(left, '+', right);
|
|
25
|
+
assert.deepEqual(node, { type: 'Binary', operator: '+', left, right });
|
|
26
|
+
});
|
|
27
|
+
it("should create Getter nodes", () => {
|
|
28
|
+
const receiver = factory.id('obj');
|
|
29
|
+
const node = factory.getter(receiver, 'prop', true);
|
|
30
|
+
assert.deepEqual(node, { type: 'Getter', receiver, name: 'prop', optional: true });
|
|
31
|
+
});
|
|
32
|
+
it("should create Invoke nodes", () => {
|
|
33
|
+
const receiver = factory.id('fn');
|
|
34
|
+
const arg = factory.literal(1);
|
|
35
|
+
const node = factory.invoke(receiver, 'callMe', [arg], true);
|
|
36
|
+
assert.deepEqual(node, { type: 'Invoke', receiver, method: 'callMe', arguments: [arg], optional: true });
|
|
37
|
+
});
|
|
38
|
+
it("should create Index nodes", () => {
|
|
39
|
+
const receiver = factory.id('arr');
|
|
40
|
+
const argument = factory.literal(0);
|
|
41
|
+
const node = factory.index(receiver, argument, true);
|
|
42
|
+
assert.deepEqual(node, { type: 'Index', receiver, argument, optional: true });
|
|
43
|
+
});
|
|
44
|
+
it("should create Ternary nodes", () => {
|
|
45
|
+
const condition = factory.id('x');
|
|
46
|
+
const trueExpr = factory.literal(1);
|
|
47
|
+
const falseExpr = factory.literal(0);
|
|
48
|
+
const node = factory.ternary(condition, trueExpr, falseExpr);
|
|
49
|
+
assert.deepEqual(node, { type: 'Ternary', condition, trueExpr, falseExpr });
|
|
50
|
+
});
|
|
51
|
+
it("should create Map nodes", () => {
|
|
52
|
+
const prop1 = factory.property('a', factory.literal(1));
|
|
53
|
+
const prop2 = factory.spreadProperty(factory.id('obj'));
|
|
54
|
+
const node = factory.map([prop1, prop2]);
|
|
55
|
+
assert.deepEqual(node, { type: 'Map', properties: [prop1, prop2] });
|
|
56
|
+
});
|
|
57
|
+
it("should create List nodes", () => {
|
|
58
|
+
const item1 = factory.literal(1);
|
|
59
|
+
const item2 = factory.spreadElement(factory.id('arr'));
|
|
60
|
+
const node = factory.list([item1, item2]);
|
|
61
|
+
assert.deepEqual(node, { type: 'List', items: [item1, item2] });
|
|
62
|
+
});
|
|
63
|
+
it("should create ArrowFunction nodes", () => {
|
|
64
|
+
const body = factory.binary(factory.id('x'), '+', factory.id('y'));
|
|
65
|
+
const node = factory.arrowFunction(['x', 'y'], body);
|
|
66
|
+
assert.deepEqual(node, { type: 'ArrowFunction', params: ['x', 'y'], body });
|
|
67
|
+
});
|
|
68
|
+
it("should create SpreadProperty nodes", () => {
|
|
69
|
+
const expr = factory.id('obj');
|
|
70
|
+
const node = factory.spreadProperty(expr);
|
|
71
|
+
assert.deepEqual(node, { type: 'SpreadProperty', expression: expr });
|
|
72
|
+
});
|
|
73
|
+
it("should create SpreadElement nodes", () => {
|
|
74
|
+
const expr = factory.id('arr');
|
|
75
|
+
const node = factory.spreadElement(expr);
|
|
76
|
+
assert.deepEqual(node, { type: 'SpreadElement', expression: expr });
|
|
77
|
+
});
|
|
78
|
+
it("should create Property nodes", () => {
|
|
79
|
+
const value = factory.literal(1);
|
|
80
|
+
const node = factory.property('key', value);
|
|
81
|
+
assert.deepEqual(node, { type: 'Property', key: 'key', value });
|
|
82
|
+
});
|
|
83
|
+
it("should create Empty node", () => {
|
|
84
|
+
const node = factory.empty();
|
|
85
|
+
assert.deepEqual(node, { type: 'Empty' });
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=ast_factory.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast_factory.test.js","sourceRoot":"","sources":["../../src/expressions/ast_factory.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const KEYWORDS: Set<string>;
|
|
2
|
+
export declare const WORD_OPERATORS: Set<string>;
|
|
3
|
+
export declare const UNARY_OPERATORS: Set<string>;
|
|
4
|
+
export declare const BINARY_OPERATORS: Set<string>;
|
|
5
|
+
export declare const PRECEDENCE: Record<string, number>;
|
|
6
|
+
export declare const POSTFIX_PRECEDENCE = 13;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* @license
|
|
3
|
+
* Portions Copyright (c) 2013, the Dart project authors.
|
|
4
|
+
*/
|
|
5
|
+
export const KEYWORDS = new Set(['this', 'typeof']);
|
|
6
|
+
// Word-based operators (alphabetic tokens that are operators, not keywords)
|
|
7
|
+
export const WORD_OPERATORS = new Set(['in']);
|
|
8
|
+
export const UNARY_OPERATORS = new Set(['+', '-', '!', 'typeof']);
|
|
9
|
+
export const BINARY_OPERATORS = new Set([
|
|
10
|
+
'=',
|
|
11
|
+
'+',
|
|
12
|
+
'-',
|
|
13
|
+
'*',
|
|
14
|
+
'/',
|
|
15
|
+
'%',
|
|
16
|
+
'^',
|
|
17
|
+
'==',
|
|
18
|
+
'!=',
|
|
19
|
+
'>',
|
|
20
|
+
'<',
|
|
21
|
+
'>=',
|
|
22
|
+
'<=',
|
|
23
|
+
'||',
|
|
24
|
+
'&&',
|
|
25
|
+
'??',
|
|
26
|
+
'&',
|
|
27
|
+
'===',
|
|
28
|
+
'!==',
|
|
29
|
+
'|',
|
|
30
|
+
'in',
|
|
31
|
+
]);
|
|
32
|
+
export const PRECEDENCE = {
|
|
33
|
+
'!': 0,
|
|
34
|
+
':': 0,
|
|
35
|
+
',': 0,
|
|
36
|
+
')': 0,
|
|
37
|
+
']': 0,
|
|
38
|
+
'}': 0,
|
|
39
|
+
'?': 2,
|
|
40
|
+
'??': 3,
|
|
41
|
+
'||': 4,
|
|
42
|
+
'&&': 5,
|
|
43
|
+
'|': 6,
|
|
44
|
+
'^': 7,
|
|
45
|
+
'&': 8,
|
|
46
|
+
// equality
|
|
47
|
+
'!=': 9,
|
|
48
|
+
'==': 9,
|
|
49
|
+
'!==': 9,
|
|
50
|
+
'===': 9,
|
|
51
|
+
// relational
|
|
52
|
+
'>=': 10,
|
|
53
|
+
'>': 10,
|
|
54
|
+
'<=': 10,
|
|
55
|
+
'<': 10,
|
|
56
|
+
'in': 10,
|
|
57
|
+
// additive
|
|
58
|
+
'+': 11,
|
|
59
|
+
'-': 11,
|
|
60
|
+
// multiplicative
|
|
61
|
+
'%': 12,
|
|
62
|
+
'/': 12,
|
|
63
|
+
'*': 12,
|
|
64
|
+
// postfix
|
|
65
|
+
'(': 13,
|
|
66
|
+
'[': 13,
|
|
67
|
+
'.': 13,
|
|
68
|
+
'?.': 13,
|
|
69
|
+
'{': 13, // not sure this is correct
|
|
70
|
+
};
|
|
71
|
+
export const POSTFIX_PRECEDENCE = 13;
|
|
72
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/expressions/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEpD,4EAA4E;AAC5E,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9C,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IACtC,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,KAAK;IACL,KAAK;IACL,GAAG;IACH,IAAI;CACL,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAA2B;IAChD,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IAEN,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IACN,GAAG,EAAE,CAAC;IAEN,WAAW;IACX,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,CAAC;IAER,aAAa;IACb,IAAI,EAAE,EAAE;IACR,GAAG,EAAE,EAAE;IACP,IAAI,EAAE,EAAE;IACR,GAAG,EAAE,EAAE;IACP,IAAI,EAAE,EAAE;IAER,WAAW;IACX,GAAG,EAAE,EAAE;IACP,GAAG,EAAE,EAAE;IAEP,iBAAiB;IACjB,GAAG,EAAE,EAAE;IACP,GAAG,EAAE,EAAE;IACP,GAAG,EAAE,EAAE;IAEP,UAAU;IACV,GAAG,EAAE,EAAE;IACP,GAAG,EAAE,EAAE;IACP,GAAG,EAAE,EAAE;IACP,IAAI,EAAE,EAAE;IACR,GAAG,EAAE,EAAE,EAAE,2BAA2B;CACrC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { assert } from "../test_utils.js";
|
|
2
|
+
import { KEYWORDS, WORD_OPERATORS, UNARY_OPERATORS, BINARY_OPERATORS, PRECEDENCE, POSTFIX_PRECEDENCE, } from './constants.js';
|
|
3
|
+
describe("Expression Constants", () => {
|
|
4
|
+
it("should define KEYWORDS correctly", () => {
|
|
5
|
+
assert.deepEqual(KEYWORDS, new Set(['this', 'typeof']));
|
|
6
|
+
});
|
|
7
|
+
it("should define WORD_OPERATORS correctly", () => {
|
|
8
|
+
assert.deepEqual(WORD_OPERATORS, new Set(['in']));
|
|
9
|
+
});
|
|
10
|
+
it("should define UNARY_OPERATORS correctly", () => {
|
|
11
|
+
assert.deepEqual(UNARY_OPERATORS, new Set(['+', '-', '!', 'typeof']));
|
|
12
|
+
});
|
|
13
|
+
it("should define BINARY_OPERATORS correctly", () => {
|
|
14
|
+
assert.deepEqual(BINARY_OPERATORS, new Set([
|
|
15
|
+
'=',
|
|
16
|
+
'+',
|
|
17
|
+
'-',
|
|
18
|
+
'*',
|
|
19
|
+
'/',
|
|
20
|
+
'%',
|
|
21
|
+
'^',
|
|
22
|
+
'==',
|
|
23
|
+
'!=',
|
|
24
|
+
'>',
|
|
25
|
+
'<',
|
|
26
|
+
'>=',
|
|
27
|
+
'<=',
|
|
28
|
+
'||',
|
|
29
|
+
'&&',
|
|
30
|
+
'??',
|
|
31
|
+
'&',
|
|
32
|
+
'===',
|
|
33
|
+
'!==',
|
|
34
|
+
'|',
|
|
35
|
+
'in',
|
|
36
|
+
]));
|
|
37
|
+
});
|
|
38
|
+
it("should define PRECEDENCE correctly", () => {
|
|
39
|
+
const expectedPrecedence = {
|
|
40
|
+
'!': 0,
|
|
41
|
+
':': 0,
|
|
42
|
+
',': 0,
|
|
43
|
+
')': 0,
|
|
44
|
+
']': 0,
|
|
45
|
+
'}': 0,
|
|
46
|
+
'?': 2,
|
|
47
|
+
'??': 3,
|
|
48
|
+
'||': 4,
|
|
49
|
+
'&&': 5,
|
|
50
|
+
'|': 6,
|
|
51
|
+
'^': 7,
|
|
52
|
+
'&': 8,
|
|
53
|
+
// equality
|
|
54
|
+
'!=': 9,
|
|
55
|
+
'==': 9,
|
|
56
|
+
'!==': 9,
|
|
57
|
+
'===': 9,
|
|
58
|
+
// relational
|
|
59
|
+
'>=': 10,
|
|
60
|
+
'>': 10,
|
|
61
|
+
'<=': 10,
|
|
62
|
+
'<': 10,
|
|
63
|
+
'in': 10,
|
|
64
|
+
// additive
|
|
65
|
+
'+': 11,
|
|
66
|
+
'-': 11,
|
|
67
|
+
// multiplicative
|
|
68
|
+
'%': 12,
|
|
69
|
+
'/': 12,
|
|
70
|
+
'*': 12,
|
|
71
|
+
// postfix
|
|
72
|
+
'(': 13,
|
|
73
|
+
'[': 13,
|
|
74
|
+
'.': 13,
|
|
75
|
+
'?.': 13,
|
|
76
|
+
'{': 13,
|
|
77
|
+
};
|
|
78
|
+
assert.deepEqual(PRECEDENCE, expectedPrecedence);
|
|
79
|
+
});
|
|
80
|
+
it("should define POSTFIX_PRECEDENCE correctly", () => {
|
|
81
|
+
assert.equal(POSTFIX_PRECEDENCE, 13);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=constants.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.test.js","sourceRoot":"","sources":["../../src/expressions/constants.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EACL,QAAQ,EACR,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AAExB,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,SAAS,CAAC,gBAAgB,EAAE,IAAI,GAAG,CAAC;YACzC,GAAG;YACH,GAAG;YACH,GAAG;YACH,GAAG;YACH,GAAG;YACH,GAAG;YACH,GAAG;YACH,IAAI;YACJ,IAAI;YACJ,GAAG;YACH,GAAG;YACH,IAAI;YACJ,IAAI;YACJ,IAAI;YACJ,IAAI;YACJ,IAAI;YACJ,GAAG;YACH,KAAK;YACL,KAAK;YACL,GAAG;YACH,IAAI;SACL,CAAC,CAAC,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,kBAAkB,GAA2B;YACjD,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,CAAC;YAEN,GAAG,EAAE,CAAC;YACN,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,CAAC;YACP,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,CAAC;YAEN,WAAW;YACX,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,CAAC;YAER,aAAa;YACb,IAAI,EAAE,EAAE;YACR,GAAG,EAAE,EAAE;YACP,IAAI,EAAE,EAAE;YACR,GAAG,EAAE,EAAE;YACP,IAAI,EAAE,EAAE;YAER,WAAW;YACX,GAAG,EAAE,EAAE;YACP,GAAG,EAAE,EAAE;YAEP,iBAAiB;YACjB,GAAG,EAAE,EAAE;YACP,GAAG,EAAE,EAAE;YACP,GAAG,EAAE,EAAE;YAEP,UAAU;YACV,GAAG,EAAE,EAAE;YACP,GAAG,EAAE,EAAE;YACP,GAAG,EAAE,EAAE;YACP,IAAI,EAAE,EAAE;YACR,GAAG,EAAE,EAAE;SACR,CAAC;QACF,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -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
|
+
}
|