@cloudpss/expression 0.6.0-beta.1 → 0.6.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.
- package/dist/migrator/utils.d.ts.map +1 -1
- package/dist/migrator/utils.js +2 -3
- package/dist/migrator/utils.js.map +1 -1
- package/dist/scope.d.ts.map +1 -1
- package/dist/scope.js +51 -21
- package/dist/scope.js.map +1 -1
- package/package.json +2 -2
- package/src/migrator/utils.ts +2 -3
- package/src/scope.ts +57 -24
- package/tests/eval-complex.ts +60 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/migrator/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAgD,MAAM,QAAQ,CAAC;AAErF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAIxC,gBAAgB;AAChB,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAKjE;AAED,qBAAqB;AACrB,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAG7D;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/migrator/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAgD,MAAM,QAAQ,CAAC;AAErF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAIxC,gBAAgB;AAChB,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAKjE;AAED,qBAAqB;AACrB,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAG7D;AAED,wBAAwB;AACxB,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAItE;AAED,wBAAwB;AACxB,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAa1F;AAED,aAAa;AACb,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAMpE;AAED,eAAe;AACf,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAOnE;AAaD,YAAY;AACZ,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,GAAG,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAiBzF;AAED,WAAW;AACX,wBAAgB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAkBrD"}
|
package/dist/migrator/utils.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isSymbolNode, isConstantNode, isOperatorNode } from 'mathjs';
|
|
2
|
-
import {
|
|
2
|
+
import { isKeyword } from '@mirascript/mirascript/subtle';
|
|
3
3
|
import { toString } from './to-type.js';
|
|
4
4
|
import { migrateExpr } from './node.js';
|
|
5
5
|
/** 获取全局函数的名字 */
|
|
@@ -15,10 +15,9 @@ export function symbolName(node) {
|
|
|
15
15
|
return undefined;
|
|
16
16
|
return node.name;
|
|
17
17
|
}
|
|
18
|
-
const kw = new Set(keywords());
|
|
19
18
|
/** 转换为 mirascript 符号 */
|
|
20
19
|
export function migrateSymbolName(name, local) {
|
|
21
|
-
if (!
|
|
20
|
+
if (!isKeyword(name))
|
|
22
21
|
return name;
|
|
23
22
|
if (local)
|
|
24
23
|
return `__${name}__`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/migrator/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACrF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/migrator/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/scope.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,KAAK,SAAS,EAEd,KAAK,OAAO,EAGf,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACH,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,iBAAiB,EAGzB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAyF3C,cAAc;AACd,qBAAa,KAAK;IAEV,gBAAgB;IAChB,QAAQ,CAAC,KAAK,EACR,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,iBAAiB,GAAG,SAAS,CAAC,GAChD,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,CAAC,GAC7C,IAAI;IACV,gBAAgB;IAChB,QAAQ,CAAC,MAAM;IACf,aAAa;IACb,QAAQ,CAAC,IAAI;;IARb,gBAAgB;IACP,KAAK,GACR,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,iBAAiB,GAAG,SAAS,CAAC,GAChD,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,SAAS,CAAC,GAC7C,IAAW;IACjB,gBAAgB;IACP,MAAM,UAAO;IACtB,aAAa;IACJ,IAAI,SAAgB;IAEjC,cAAc;IACd,UAAU,EAAE,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAQ;IAC/D,cAAc;IACd,SAAS,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC,GAAG,IAAI,GAAG,SAAS,CAAQ;IAE3E,aAAa;IACb,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAQ;IAC7C,WAAW;IACX,SAAS,CAAC,WAAW,SAAK;IAC1B,YAAY;IACZ,KAAK,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,IAAI;IAU9C,mBAAmB;IACnB,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAQ;IAC1C,mBAAmB;IACnB,IAAI,KAAK,IAAI,SAAS,CA4CrB;IAED,oDAAoD;IACpD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAYzB,kDAAkD;IAClD,GAAG,CAAC,CAAC,SAAS,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAalD,cAAc;IACd,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,kBAAkB,EAAE,IAAI,EAAE,SAAS,WAAW,EAAE,GAAG,OAAO;CA2B3F;AA2BD,eAAe;AACf,wBAAgB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAErC"}
|
package/dist/scope.js
CHANGED
|
@@ -1,45 +1,50 @@
|
|
|
1
|
-
import { createVmContext,
|
|
1
|
+
import { createVmContext, isVmWrapper, isVmFunction, } from '@mirascript/mirascript';
|
|
2
2
|
import { ExpressionTag, isExpression, } from './expression.js';
|
|
3
3
|
import { evaluateEval } from './eval.js';
|
|
4
4
|
import { parse } from './parser.js';
|
|
5
5
|
import { TypeInfo } from './type.js';
|
|
6
|
-
const { hasOwn } = Object;
|
|
6
|
+
const { hasOwn, keys } = Object;
|
|
7
|
+
const { isArray } = Array;
|
|
7
8
|
const RAW = Symbol.for('@private/expression:raw');
|
|
8
9
|
/** 是否需要创建代理对象 */
|
|
10
|
+
function isSpecialHostObject(value) {
|
|
11
|
+
return (value instanceof Date ||
|
|
12
|
+
value instanceof Promise ||
|
|
13
|
+
value instanceof RegExp ||
|
|
14
|
+
ArrayBuffer.isView(value) ||
|
|
15
|
+
value instanceof ArrayBuffer ||
|
|
16
|
+
(typeof SharedArrayBuffer != 'undefined' && value instanceof SharedArrayBuffer));
|
|
17
|
+
}
|
|
18
|
+
/** 是否需要创建代理对象 */
|
|
9
19
|
function needsProxy(value) {
|
|
10
|
-
|
|
20
|
+
if (value == null || (typeof value != 'object' && typeof value != 'function')) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
11
23
|
if (isExpression(value)) {
|
|
12
24
|
return true;
|
|
13
25
|
}
|
|
14
|
-
if (value
|
|
15
|
-
return false;
|
|
16
|
-
}
|
|
17
|
-
if (isVmExtern(value) || isVmModule(value)) {
|
|
26
|
+
if (isVmWrapper(value) || isVmFunction(value) || isSpecialHostObject(value)) {
|
|
18
27
|
return false;
|
|
19
28
|
}
|
|
20
29
|
return true;
|
|
21
30
|
}
|
|
22
31
|
/** 创建代理对象 */
|
|
23
32
|
function createProxy(value, scope, path) {
|
|
24
|
-
// 先检查 isExpression,因为 'function' 也有可能是 Expression
|
|
25
33
|
if (isExpression(value)) {
|
|
26
34
|
return scope.eval(value, path);
|
|
27
35
|
}
|
|
28
36
|
if (typeof value != 'object' || value == null) {
|
|
29
37
|
return value;
|
|
30
38
|
}
|
|
31
|
-
if (value
|
|
32
|
-
value
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
value
|
|
36
|
-
(typeof SharedArrayBuffer != 'undefined' && value instanceof SharedArrayBuffer)) {
|
|
37
|
-
return value;
|
|
39
|
+
if (isArray(value)) {
|
|
40
|
+
return new Proxy(value, new ArrayScopeProxyHandler(scope, path));
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
return new Proxy(value, new RecordScopeProxyHandler(scope, path));
|
|
38
44
|
}
|
|
39
|
-
return new Proxy(value, new ScopeProxyHandler(scope, path));
|
|
40
45
|
}
|
|
41
46
|
/** 函数的执行环境 */
|
|
42
|
-
class
|
|
47
|
+
class ArrayScopeProxyHandler {
|
|
43
48
|
constructor(scope, path) {
|
|
44
49
|
this.scope = scope;
|
|
45
50
|
this.path = path;
|
|
@@ -52,7 +57,27 @@ class ScopeProxyHandler {
|
|
|
52
57
|
return target;
|
|
53
58
|
}
|
|
54
59
|
const value = Reflect.get(target, p);
|
|
55
|
-
if (
|
|
60
|
+
if (typeof p == 'symbol' || String(Number(p)) !== p || !needsProxy(value)) {
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
return createProxy(value, this.scope, [...this.path, p]);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** 函数的执行环境 */
|
|
67
|
+
class RecordScopeProxyHandler {
|
|
68
|
+
constructor(scope, path) {
|
|
69
|
+
this.scope = scope;
|
|
70
|
+
this.path = path;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* @inheritdoc
|
|
74
|
+
*/
|
|
75
|
+
get(target, p) {
|
|
76
|
+
if (p === RAW) {
|
|
77
|
+
return target;
|
|
78
|
+
}
|
|
79
|
+
const value = Reflect.get(target, p);
|
|
80
|
+
if (typeof p == 'symbol' || !hasOwn(target, p) || !needsProxy(value)) {
|
|
56
81
|
return value;
|
|
57
82
|
}
|
|
58
83
|
return createProxy(value, this.scope, [...this.path, p]);
|
|
@@ -216,16 +241,21 @@ function unwrapCore(value) {
|
|
|
216
241
|
if (value == null || (typeof value != 'object' && typeof value != 'function')) {
|
|
217
242
|
return undefined;
|
|
218
243
|
}
|
|
244
|
+
if (isVmWrapper(value) || isVmFunction(value) || isSpecialHostObject(value)) {
|
|
245
|
+
return undefined;
|
|
246
|
+
}
|
|
247
|
+
// 是否有 proxy
|
|
219
248
|
const raw = value[RAW];
|
|
249
|
+
// 不论是否被代理,均须递归处理子项
|
|
220
250
|
const obj = raw ?? value;
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
continue;
|
|
251
|
+
// 只处理 own enumerable 属性
|
|
252
|
+
for (const key of keys(obj)) {
|
|
224
253
|
const unwrapped = unwrapCore(obj[key]);
|
|
225
254
|
if (unwrapped !== undefined) {
|
|
226
255
|
obj[key] = unwrapped;
|
|
227
256
|
}
|
|
228
257
|
}
|
|
258
|
+
// 返回被代理的对象,如没有 proxy 则返回 undefined
|
|
229
259
|
return raw;
|
|
230
260
|
}
|
|
231
261
|
/** 移除 PROXY */
|
package/dist/scope.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,eAAe,
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudpss/expression",
|
|
3
|
-
"version": "0.6.0
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"author": "CloudPSS",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"./*": "./dist/*.js"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@mirascript/mirascript": "^0.1.
|
|
15
|
+
"@mirascript/mirascript": "^0.1.26",
|
|
16
16
|
"klona": "^2.0.6",
|
|
17
17
|
"lru-cache": "^11.2.4",
|
|
18
18
|
"mathjs": "^15.1.0",
|
package/src/migrator/utils.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type MathNode, isSymbolNode, isConstantNode, isOperatorNode } from 'mathjs';
|
|
2
|
-
import {
|
|
2
|
+
import { isKeyword } from '@mirascript/mirascript/subtle';
|
|
3
3
|
import type { Result } from './interface.js';
|
|
4
4
|
import type { State } from './state.js';
|
|
5
5
|
import { toString } from './to-type.js';
|
|
@@ -19,10 +19,9 @@ export function symbolName(node: MathNode): string | undefined {
|
|
|
19
19
|
return node.name;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
const kw = new Set(keywords());
|
|
23
22
|
/** 转换为 mirascript 符号 */
|
|
24
23
|
export function migrateSymbolName(name: string, local: boolean): string {
|
|
25
|
-
if (!
|
|
24
|
+
if (!isKeyword(name)) return name;
|
|
26
25
|
if (local) return `__${name}__`;
|
|
27
26
|
return `global.${name}`;
|
|
28
27
|
}
|
package/src/scope.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createVmContext,
|
|
3
|
-
isVmExtern,
|
|
4
3
|
type VmAny,
|
|
5
4
|
type VmArray,
|
|
6
5
|
type VmContext,
|
|
7
6
|
type VmRecord,
|
|
8
7
|
type VmValue,
|
|
9
|
-
|
|
8
|
+
isVmWrapper,
|
|
9
|
+
isVmFunction,
|
|
10
10
|
} from '@mirascript/mirascript';
|
|
11
11
|
import {
|
|
12
12
|
type CompiledExpression,
|
|
@@ -19,48 +19,53 @@ import { evaluateEval } from './eval.js';
|
|
|
19
19
|
import { parse } from './parser.js';
|
|
20
20
|
import { TypeInfo } from './type.js';
|
|
21
21
|
import type { Evaluator } from './main.js';
|
|
22
|
-
const { hasOwn } = Object;
|
|
22
|
+
const { hasOwn, keys } = Object;
|
|
23
|
+
const { isArray } = Array;
|
|
23
24
|
|
|
24
25
|
const RAW = Symbol.for('@private/expression:raw');
|
|
25
26
|
|
|
27
|
+
/** 是否需要创建代理对象 */
|
|
28
|
+
function isSpecialHostObject(value: object): boolean {
|
|
29
|
+
return (
|
|
30
|
+
value instanceof Date ||
|
|
31
|
+
value instanceof Promise ||
|
|
32
|
+
value instanceof RegExp ||
|
|
33
|
+
ArrayBuffer.isView(value) ||
|
|
34
|
+
value instanceof ArrayBuffer ||
|
|
35
|
+
(typeof SharedArrayBuffer != 'undefined' && value instanceof SharedArrayBuffer)
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
26
39
|
/** 是否需要创建代理对象 */
|
|
27
40
|
function needsProxy(value: ExpressionOrValue | undefined): value is Expression | VmArray | VmRecord {
|
|
28
|
-
|
|
41
|
+
if (value == null || (typeof value != 'object' && typeof value != 'function')) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
29
44
|
if (isExpression(value)) {
|
|
30
45
|
return true;
|
|
31
46
|
}
|
|
32
|
-
if (value
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
|
-
if (isVmExtern(value) || isVmModule(value)) {
|
|
47
|
+
if (isVmWrapper(value) || isVmFunction(value) || isSpecialHostObject(value)) {
|
|
36
48
|
return false;
|
|
37
49
|
}
|
|
38
50
|
return true;
|
|
39
51
|
}
|
|
40
52
|
|
|
41
53
|
/** 创建代理对象 */
|
|
42
|
-
function createProxy(value: Expression |
|
|
43
|
-
// 先检查 isExpression,因为 'function' 也有可能是 Expression
|
|
54
|
+
function createProxy(value: Expression | VmArray | VmRecord, scope: Scope, path: readonly PropertyKey[]): unknown {
|
|
44
55
|
if (isExpression(value)) {
|
|
45
56
|
return scope.eval(value, path);
|
|
46
57
|
}
|
|
47
58
|
if (typeof value != 'object' || value == null) {
|
|
48
59
|
return value;
|
|
49
60
|
}
|
|
50
|
-
if (
|
|
51
|
-
value
|
|
52
|
-
|
|
53
|
-
value
|
|
54
|
-
ArrayBuffer.isView(value) ||
|
|
55
|
-
value instanceof ArrayBuffer ||
|
|
56
|
-
(typeof SharedArrayBuffer != 'undefined' && value instanceof SharedArrayBuffer)
|
|
57
|
-
) {
|
|
58
|
-
return value;
|
|
61
|
+
if (isArray(value)) {
|
|
62
|
+
return new Proxy(value, new ArrayScopeProxyHandler(scope, path));
|
|
63
|
+
} else {
|
|
64
|
+
return new Proxy(value, new RecordScopeProxyHandler(scope, path));
|
|
59
65
|
}
|
|
60
|
-
return new Proxy(value, new ScopeProxyHandler(scope, path));
|
|
61
66
|
}
|
|
62
67
|
/** 函数的执行环境 */
|
|
63
|
-
class
|
|
68
|
+
class ArrayScopeProxyHandler implements ProxyHandler<object> {
|
|
64
69
|
constructor(
|
|
65
70
|
readonly scope: Scope,
|
|
66
71
|
readonly path: readonly PropertyKey[],
|
|
@@ -73,7 +78,27 @@ class ScopeProxyHandler implements ProxyHandler<object> {
|
|
|
73
78
|
return target;
|
|
74
79
|
}
|
|
75
80
|
const value = Reflect.get(target, p) as ExpressionOrValue;
|
|
76
|
-
if (
|
|
81
|
+
if (typeof p == 'symbol' || String(Number(p)) !== p || !needsProxy(value)) {
|
|
82
|
+
return value;
|
|
83
|
+
}
|
|
84
|
+
return createProxy(value, this.scope, [...this.path, p]);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** 函数的执行环境 */
|
|
88
|
+
class RecordScopeProxyHandler implements ProxyHandler<object> {
|
|
89
|
+
constructor(
|
|
90
|
+
readonly scope: Scope,
|
|
91
|
+
readonly path: readonly PropertyKey[],
|
|
92
|
+
) {}
|
|
93
|
+
/**
|
|
94
|
+
* @inheritdoc
|
|
95
|
+
*/
|
|
96
|
+
get(target: object, p: string | symbol): unknown {
|
|
97
|
+
if (p === RAW) {
|
|
98
|
+
return target;
|
|
99
|
+
}
|
|
100
|
+
const value = Reflect.get(target, p) as ExpressionOrValue;
|
|
101
|
+
if (typeof p == 'symbol' || !hasOwn(target, p) || !needsProxy(value)) {
|
|
77
102
|
return value;
|
|
78
103
|
}
|
|
79
104
|
return createProxy(value, this.scope, [...this.path, p]);
|
|
@@ -226,15 +251,23 @@ function unwrapCore<T>(value: T): T | undefined {
|
|
|
226
251
|
if (value == null || (typeof value != 'object' && typeof value != 'function')) {
|
|
227
252
|
return undefined;
|
|
228
253
|
}
|
|
254
|
+
if (isVmWrapper(value) || isVmFunction(value) || isSpecialHostObject(value)) {
|
|
255
|
+
return undefined;
|
|
256
|
+
}
|
|
257
|
+
// 是否有 proxy
|
|
229
258
|
const raw = (value as T & { [RAW]?: T })[RAW];
|
|
259
|
+
|
|
260
|
+
// 不论是否被代理,均须递归处理子项
|
|
230
261
|
const obj = raw ?? value;
|
|
231
|
-
|
|
232
|
-
|
|
262
|
+
// 只处理 own enumerable 属性
|
|
263
|
+
for (const key of keys(obj) as Array<Extract<keyof T, string>>) {
|
|
233
264
|
const unwrapped = unwrapCore(obj[key]);
|
|
234
265
|
if (unwrapped !== undefined) {
|
|
235
266
|
obj[key] = unwrapped;
|
|
236
267
|
}
|
|
237
268
|
}
|
|
269
|
+
|
|
270
|
+
// 返回被代理的对象,如没有 proxy 则返回 undefined
|
|
238
271
|
return raw;
|
|
239
272
|
}
|
|
240
273
|
|
package/tests/eval-complex.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { VmExtern } from '@mirascript/mirascript';
|
|
2
|
-
import { Evaluator, Expression, Scope } from '../dist/index.js';
|
|
2
|
+
import { Evaluator, Expression, isExpression, Scope } from '../dist/index.js';
|
|
3
3
|
|
|
4
4
|
const e = new Evaluator();
|
|
5
5
|
|
|
@@ -55,10 +55,12 @@ describe('Evaluator should work correctly', () => {
|
|
|
55
55
|
expect(result?.value).toStrictEqual(Expression('1'));
|
|
56
56
|
});
|
|
57
57
|
it('should eval deep with compiled expression', () => {
|
|
58
|
+
const b = e.compile(Expression('c+d'));
|
|
59
|
+
expect(isExpression(b)).toBe(true);
|
|
58
60
|
const s = new Scope(
|
|
59
61
|
{
|
|
60
62
|
a: Expression('b+d'),
|
|
61
|
-
b:
|
|
63
|
+
b: b,
|
|
62
64
|
c: 12,
|
|
63
65
|
d: Expression('c'),
|
|
64
66
|
},
|
|
@@ -67,6 +69,62 @@ describe('Evaluator should work correctly', () => {
|
|
|
67
69
|
const result = e.evaluate(Expression('a'), s);
|
|
68
70
|
expect(result).toBe(36);
|
|
69
71
|
});
|
|
72
|
+
it('should eval deep with object and array', () => {
|
|
73
|
+
const s = new Scope(
|
|
74
|
+
{
|
|
75
|
+
arr: [1, 2, Expression('arr.0 + obj.x'), Expression('arr.2 + obj.y')],
|
|
76
|
+
obj: { x: 3, y: Expression('arr.1 + obj.x') },
|
|
77
|
+
arr_copy: Expression('[..arr]'),
|
|
78
|
+
},
|
|
79
|
+
false,
|
|
80
|
+
);
|
|
81
|
+
const result = e.evaluate<{
|
|
82
|
+
arr: number[];
|
|
83
|
+
obj: Record<string, number>;
|
|
84
|
+
}>(Expression('(arr: [..arr], obj: (..obj))'), s)!;
|
|
85
|
+
expect(result).toStrictEqual({ arr: [1, 2, 4, 9], obj: { x: 3, y: 5 } });
|
|
86
|
+
expect(result).not.toBeProxy();
|
|
87
|
+
expect(result.arr).not.toBeProxy();
|
|
88
|
+
expect(result.obj).not.toBeProxy();
|
|
89
|
+
const copy = e.evaluate<number[]>(Expression('[..arr_copy]'), s);
|
|
90
|
+
expect(copy).toStrictEqual([1, 2, 4, 9]);
|
|
91
|
+
expect(copy).not.toBeProxy();
|
|
92
|
+
});
|
|
93
|
+
it('should eval with arr expr', () => {
|
|
94
|
+
const s = new Scope(
|
|
95
|
+
{
|
|
96
|
+
arr: Expression('[a0, 2, 3..5]'),
|
|
97
|
+
a0: Expression('0.4 + 0.6'),
|
|
98
|
+
start: Expression('0'),
|
|
99
|
+
end: Expression('start + 2'),
|
|
100
|
+
},
|
|
101
|
+
false,
|
|
102
|
+
);
|
|
103
|
+
const result = e.evaluate<number[]>(Expression('arr'), s);
|
|
104
|
+
expect(result).toStrictEqual([1, 2, 3, 4, 5]);
|
|
105
|
+
expect(result).not.toBeProxy();
|
|
106
|
+
const slice = e.evaluate<number[]>(Expression('arr[start..end]'), s);
|
|
107
|
+
expect(slice).toStrictEqual([1, 2, 3]);
|
|
108
|
+
expect(slice).not.toBeProxy();
|
|
109
|
+
const field = e.evaluate<number>(Expression('arr.0'), s);
|
|
110
|
+
expect(field).toBe(1);
|
|
111
|
+
});
|
|
112
|
+
it('should eval with obj expr', () => {
|
|
113
|
+
const s = new Scope(
|
|
114
|
+
{
|
|
115
|
+
o0: Expression('"s$(arr)"'),
|
|
116
|
+
arr: Expression('[1, 2, 3..5]'),
|
|
117
|
+
obj: Expression('(x: o0, y: 2 + arr.0, z: arr[1..arr.1 + 2])'),
|
|
118
|
+
},
|
|
119
|
+
false,
|
|
120
|
+
);
|
|
121
|
+
const result = e.evaluate<{ x: string; y: number; z: number[] }>(Expression('obj'), s)!;
|
|
122
|
+
expect(result).toStrictEqual({ x: 's1, 2, 3, 4, 5', y: 3, z: [2, 3, 4, 5] });
|
|
123
|
+
expect(result).not.toBeProxy();
|
|
124
|
+
expect(result.z).not.toBeProxy();
|
|
125
|
+
const field = e.evaluate<string>(Expression('obj.x'), s);
|
|
126
|
+
expect(field).toStrictEqual('s1, 2, 3, 4, 5');
|
|
127
|
+
});
|
|
70
128
|
it('should eval complex', () => {
|
|
71
129
|
const s = new Scope(
|
|
72
130
|
{
|