@cloudpss/expression 0.6.0-alpha.2 → 0.6.0-alpha.20
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/analyze.d.ts +6 -3
- package/dist/analyze.d.ts.map +1 -1
- package/dist/analyze.js +67 -33
- package/dist/analyze.js.map +1 -1
- package/dist/definitions/argument.d.ts +3 -11
- package/dist/definitions/argument.d.ts.map +1 -1
- package/dist/definitions/constraint.d.ts +2 -2
- package/dist/definitions/constraint.d.ts.map +1 -1
- package/dist/definitions/constraint.js +1 -1
- package/dist/definitions/constraint.js.map +1 -1
- package/dist/definitions/parameter-decoration.d.ts +3 -3
- package/dist/definitions/parameter-decoration.d.ts.map +1 -1
- package/dist/definitions/parameter-decoration.js +0 -7
- package/dist/definitions/parameter-decoration.js.map +1 -1
- package/dist/definitions/parameter-group.d.ts +0 -4
- package/dist/definitions/parameter-group.d.ts.map +1 -1
- package/dist/definitions/parameter-group.js +5 -17
- package/dist/definitions/parameter-group.js.map +1 -1
- package/dist/definitions/parameter.d.ts +47 -40
- package/dist/definitions/parameter.d.ts.map +1 -1
- package/dist/definitions/parameter.js +9 -21
- package/dist/definitions/parameter.js.map +1 -1
- package/dist/definitions/utils.d.ts +28 -0
- package/dist/definitions/utils.d.ts.map +1 -0
- package/dist/definitions/utils.js +209 -0
- package/dist/definitions/utils.js.map +1 -0
- package/dist/definitions/variable.d.ts +0 -2
- package/dist/definitions/variable.d.ts.map +1 -1
- package/dist/definitions/variable.js +1 -5
- package/dist/definitions/variable.js.map +1 -1
- package/dist/definitions.d.ts +1 -0
- package/dist/definitions.d.ts.map +1 -1
- package/dist/definitions.js +1 -0
- package/dist/definitions.js.map +1 -1
- package/dist/eval.d.ts +3 -5
- package/dist/eval.d.ts.map +1 -1
- package/dist/eval.js +12 -20
- package/dist/eval.js.map +1 -1
- package/dist/expression.d.ts +10 -4
- package/dist/expression.d.ts.map +1 -1
- package/dist/expression.js +6 -6
- package/dist/expression.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/interface.d.ts +30 -0
- package/dist/interface.d.ts.map +1 -0
- package/dist/interface.js +6 -0
- package/dist/interface.js.map +1 -0
- package/dist/main.d.ts +41 -28
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +149 -147
- package/dist/main.js.map +1 -1
- package/dist/migrate.d.ts +3 -2
- package/dist/migrate.d.ts.map +1 -1
- package/dist/migrate.js +25 -3
- package/dist/migrate.js.map +1 -1
- package/dist/migrator/access.d.ts.map +1 -1
- package/dist/migrator/access.js +45 -25
- package/dist/migrator/access.js.map +1 -1
- package/dist/migrator/call.d.ts.map +1 -1
- package/dist/migrator/call.js +298 -201
- package/dist/migrator/call.js.map +1 -1
- package/dist/migrator/concat.d.ts.map +1 -1
- package/dist/migrator/concat.js +15 -2
- package/dist/migrator/concat.js.map +1 -1
- package/dist/migrator/function.d.ts +6 -0
- package/dist/migrator/function.d.ts.map +1 -0
- package/dist/migrator/function.js +25 -0
- package/dist/migrator/function.js.map +1 -0
- package/dist/migrator/interface.d.ts +3 -1
- package/dist/migrator/interface.d.ts.map +1 -1
- package/dist/migrator/interface.js.map +1 -1
- package/dist/migrator/node.d.ts.map +1 -1
- package/dist/migrator/node.js +35 -6
- package/dist/migrator/node.js.map +1 -1
- package/dist/migrator/operator.d.ts.map +1 -1
- package/dist/migrator/operator.js +107 -60
- package/dist/migrator/operator.js.map +1 -1
- package/dist/migrator/serialize.d.ts +4 -0
- package/dist/migrator/serialize.d.ts.map +1 -0
- package/dist/migrator/serialize.js +21 -0
- package/dist/migrator/serialize.js.map +1 -0
- package/dist/migrator/special.d.ts.map +1 -1
- package/dist/migrator/special.js +31 -0
- package/dist/migrator/special.js.map +1 -1
- package/dist/migrator/state.d.ts +2 -2
- package/dist/migrator/state.d.ts.map +1 -1
- package/dist/migrator/state.js +30 -33
- package/dist/migrator/state.js.map +1 -1
- package/dist/migrator/symbol.d.ts.map +1 -1
- package/dist/migrator/symbol.js +23 -9
- package/dist/migrator/symbol.js.map +1 -1
- package/dist/migrator/to-type.d.ts.map +1 -1
- package/dist/migrator/to-type.js +21 -4
- package/dist/migrator/to-type.js.map +1 -1
- package/dist/migrator/utils.d.ts +6 -0
- package/dist/migrator/utils.d.ts.map +1 -1
- package/dist/migrator/utils.js +35 -0
- package/dist/migrator/utils.js.map +1 -1
- package/dist/parser.d.ts +2 -2
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +27 -8
- package/dist/parser.js.map +1 -1
- package/dist/re-exports.d.ts +4 -0
- package/dist/re-exports.d.ts.map +1 -0
- package/dist/re-exports.js +3 -0
- package/dist/re-exports.js.map +1 -0
- package/dist/scope.d.ts +17 -18
- package/dist/scope.d.ts.map +1 -1
- package/dist/scope.js +84 -53
- package/dist/scope.js.map +1 -1
- package/dist/type.d.ts +27 -6
- package/dist/type.d.ts.map +1 -1
- package/dist/type.js +34 -15
- package/dist/type.js.map +1 -1
- package/package.json +8 -5
- package/src/analyze.ts +77 -37
- package/src/definitions/argument.ts +3 -13
- package/src/definitions/constraint.ts +3 -3
- package/src/definitions/parameter-decoration.ts +3 -9
- package/src/definitions/parameter-group.ts +4 -19
- package/src/definitions/parameter.ts +70 -62
- package/src/definitions/utils.ts +224 -0
- package/src/definitions/variable.ts +1 -6
- package/src/definitions.ts +1 -0
- package/src/eval.ts +16 -25
- package/src/expression.ts +16 -8
- package/src/index.ts +3 -1
- package/src/interface.ts +35 -0
- package/src/main.ts +217 -199
- package/src/migrate.ts +30 -6
- package/src/migrator/access.ts +50 -33
- package/src/migrator/call.ts +287 -190
- package/src/migrator/concat.ts +15 -2
- package/src/migrator/function.ts +27 -0
- package/src/migrator/interface.ts +3 -1
- package/src/migrator/node.ts +36 -5
- package/src/migrator/operator.ts +110 -64
- package/src/migrator/serialize.ts +21 -0
- package/src/migrator/special.ts +31 -0
- package/src/migrator/state.ts +30 -33
- package/src/migrator/symbol.ts +23 -9
- package/src/migrator/to-type.ts +23 -4
- package/src/migrator/utils.ts +38 -0
- package/src/parser.ts +33 -8
- package/src/re-exports.ts +47 -0
- package/src/scope.ts +101 -65
- package/src/type.ts +52 -18
- package/tests/analyze.ts +40 -6
- package/tests/compile.ts +65 -0
- package/tests/condition.ts +33 -17
- package/tests/definition.ts +237 -18
- package/tests/eval-complex.ts +19 -11
- package/tests/eval.ts +59 -12
- package/tests/import.ts +21 -7
- package/tests/main.ts +58 -0
- package/tests/migrate.ts +308 -0
- package/tests/scope.ts +3 -3
- package/tests/template.ts +36 -0
- package/dist/context.d.ts +0 -41
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js +0 -18
- package/dist/context.js.map +0 -1
- package/jest.config.js +0 -3
- package/src/context.ts +0 -54
- package/tests/tsconfig.json +0 -3
- package/tsconfig.json +0 -3
package/dist/scope.js
CHANGED
|
@@ -1,13 +1,23 @@
|
|
|
1
|
-
import { createVmContext, isVmExtern } from '@mirascript/mirascript';
|
|
1
|
+
import { createVmContext, isVmExtern, isVmModule, } from '@mirascript/mirascript';
|
|
2
2
|
import { ExpressionTag, isExpression, } from './expression.js';
|
|
3
|
-
import {
|
|
3
|
+
import { evaluateEval } from './eval.js';
|
|
4
4
|
import { parse } from './parser.js';
|
|
5
5
|
import { TypeInfo } from './type.js';
|
|
6
6
|
const { hasOwn } = Object;
|
|
7
7
|
const RAW = Symbol.for('@private/expression:raw');
|
|
8
8
|
/** 是否需要创建代理对象 */
|
|
9
9
|
function needsProxy(value) {
|
|
10
|
-
|
|
10
|
+
// 先检查 isExpression,因为 'function' 也有可能是 Expression
|
|
11
|
+
if (isExpression(value)) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
if (value == null || typeof value != 'object') {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
if (isVmExtern(value) || isVmModule(value)) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
11
21
|
}
|
|
12
22
|
/** 创建代理对象 */
|
|
13
23
|
function createProxy(value, scope, path) {
|
|
@@ -42,22 +52,19 @@ class ScopeProxyHandler {
|
|
|
42
52
|
return target;
|
|
43
53
|
}
|
|
44
54
|
const value = Reflect.get(target, p);
|
|
45
|
-
if (!needsProxy(value)) {
|
|
55
|
+
if (isVmExtern(target) || !needsProxy(value)) {
|
|
46
56
|
return value;
|
|
47
57
|
}
|
|
48
|
-
if (isVmExtern(target)) {
|
|
49
|
-
return createProxy(value, this.scope, this.path);
|
|
50
|
-
}
|
|
51
58
|
return createProxy(value, this.scope, [...this.path, p]);
|
|
52
59
|
}
|
|
53
60
|
}
|
|
61
|
+
/** 最大求值计数 */
|
|
62
|
+
const MAX_RECURSION = 500;
|
|
54
63
|
/** 函数的执行环境 */
|
|
55
64
|
export class Scope {
|
|
56
|
-
/** 最大求值计数 */
|
|
57
|
-
static { this.MAX_RECURSION = 500; }
|
|
58
65
|
constructor(
|
|
59
66
|
/** 生成环境的工厂函数 */
|
|
60
|
-
scope,
|
|
67
|
+
scope = null,
|
|
61
68
|
/** 求值失败是否抛异常 */
|
|
62
69
|
throws = true,
|
|
63
70
|
/** 执行环境名称 */
|
|
@@ -65,51 +72,84 @@ export class Scope {
|
|
|
65
72
|
this.scope = scope;
|
|
66
73
|
this.throws = throws;
|
|
67
74
|
this.name = name;
|
|
68
|
-
/**
|
|
69
|
-
this.
|
|
75
|
+
/** 枚举环境中的值 */
|
|
76
|
+
this.enumerator = null;
|
|
77
|
+
/** 描述环境中的值 */
|
|
78
|
+
this.describer = null;
|
|
79
|
+
/** 执行器上下文 */
|
|
80
|
+
this.evaluator = null;
|
|
70
81
|
/** 求值计数 */
|
|
71
82
|
this.evalCounter = 0;
|
|
83
|
+
/** 函数的执行环境,惰性求值 */
|
|
84
|
+
this._proxy = null;
|
|
85
|
+
}
|
|
86
|
+
/** 重置执行器 */
|
|
87
|
+
reset(evaluator) {
|
|
88
|
+
const oldEvaluator = this.evaluator;
|
|
89
|
+
const oldCounter = this.evalCounter;
|
|
90
|
+
this.evaluator = evaluator;
|
|
91
|
+
this.evalCounter = 0;
|
|
92
|
+
return () => {
|
|
93
|
+
this.evaluator = oldEvaluator;
|
|
94
|
+
this.evalCounter = oldCounter;
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/** 函数的执行环境,惰性求值 */
|
|
98
|
+
get proxy() {
|
|
99
|
+
if (this._proxy != null)
|
|
100
|
+
return this._proxy;
|
|
101
|
+
let getter;
|
|
102
|
+
let enumerate;
|
|
103
|
+
let describe;
|
|
104
|
+
const { scope, enumerator, describer } = this;
|
|
72
105
|
if (scope == null) {
|
|
73
|
-
|
|
106
|
+
getter = (key) => this.evaluator?.imported.get(key);
|
|
107
|
+
enumerate = () => this.evaluator?.imported.keys() ?? [];
|
|
108
|
+
describe = () => undefined;
|
|
74
109
|
}
|
|
75
110
|
else if (typeof scope == 'function') {
|
|
76
|
-
|
|
111
|
+
getter = (key) => {
|
|
77
112
|
const v = scope(key);
|
|
78
113
|
if (v === undefined)
|
|
79
|
-
return this.
|
|
114
|
+
return this.evaluator?.imported.get(key);
|
|
80
115
|
if (!needsProxy(v))
|
|
81
116
|
return v;
|
|
82
117
|
return createProxy(v, this, [key]);
|
|
83
118
|
};
|
|
84
119
|
}
|
|
85
120
|
else {
|
|
86
|
-
|
|
121
|
+
getter = (key) => {
|
|
87
122
|
if (!hasOwn(scope, key))
|
|
88
|
-
return this.
|
|
123
|
+
return this.evaluator?.imported.get(key);
|
|
89
124
|
const v = scope[key];
|
|
90
125
|
if (!needsProxy(v))
|
|
91
126
|
return v;
|
|
92
127
|
return createProxy(v, this, [key]);
|
|
93
128
|
};
|
|
94
129
|
}
|
|
130
|
+
if (typeof enumerator == 'function') {
|
|
131
|
+
enumerate = () => {
|
|
132
|
+
const keys = enumerator();
|
|
133
|
+
const imported = this.evaluator?.imported.keys() ?? [];
|
|
134
|
+
return [...keys, ...imported];
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
enumerate = () => this.evaluator?.imported.keys() ?? [];
|
|
139
|
+
}
|
|
140
|
+
if (typeof describer == 'function') {
|
|
141
|
+
describe = (key) => {
|
|
142
|
+
const d = describer(key);
|
|
143
|
+
if (d)
|
|
144
|
+
return d;
|
|
145
|
+
return undefined;
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const proxy = createVmContext(getter, enumerate, describe);
|
|
149
|
+
this._proxy = proxy;
|
|
150
|
+
return proxy;
|
|
95
151
|
}
|
|
96
|
-
/**
|
|
97
|
-
reset(context) {
|
|
98
|
-
const oldContext = this.context;
|
|
99
|
-
const oldCounter = this.evalCounter;
|
|
100
|
-
this.context = context;
|
|
101
|
-
this.evalCounter = 0;
|
|
102
|
-
return () => {
|
|
103
|
-
this.context = oldContext;
|
|
104
|
-
this.evalCounter = oldCounter;
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
/** 函数的执行环境,惰性求值 */
|
|
108
|
-
get proxy() {
|
|
109
|
-
this._proxy ??= createVmContext(this.getter);
|
|
110
|
-
return this._proxy;
|
|
111
|
-
}
|
|
112
|
-
/** 检查环境中是否有值 */
|
|
152
|
+
/** 检查环境中是否有值,不包含 evaluator 和 default context 中的值 */
|
|
113
153
|
has(key) {
|
|
114
154
|
const { scope } = this;
|
|
115
155
|
if (scope == null)
|
|
@@ -123,7 +163,7 @@ export class Scope {
|
|
|
123
163
|
}
|
|
124
164
|
return v !== undefined;
|
|
125
165
|
}
|
|
126
|
-
/**
|
|
166
|
+
/** 获取环境中的值,不包含 evaluator 和 default context 中的值 */
|
|
127
167
|
get(key) {
|
|
128
168
|
const { scope } = this;
|
|
129
169
|
if (scope == null)
|
|
@@ -139,41 +179,32 @@ export class Scope {
|
|
|
139
179
|
return v;
|
|
140
180
|
return this.eval(v, [key]);
|
|
141
181
|
}
|
|
142
|
-
/**
|
|
143
|
-
* 表达式递归求值
|
|
144
|
-
*/
|
|
182
|
+
/** 表达式递归求值 */
|
|
145
183
|
eval(expression, path) {
|
|
146
|
-
if (this.evalCounter >=
|
|
184
|
+
if (this.evalCounter >= MAX_RECURSION) {
|
|
185
|
+
this.evalCounter = 0;
|
|
147
186
|
throw new Error(`Execution recursion exceeds limit`);
|
|
148
187
|
}
|
|
149
188
|
this.evalCounter++;
|
|
150
189
|
try {
|
|
151
|
-
let result;
|
|
190
|
+
let result = null;
|
|
152
191
|
if (typeof expression == 'function') {
|
|
153
|
-
result = expression(this);
|
|
192
|
+
result = expression(this, this.evaluator);
|
|
154
193
|
}
|
|
155
194
|
else {
|
|
156
|
-
const {
|
|
157
|
-
|
|
158
|
-
throw new Error(`Undefined context`);
|
|
159
|
-
}
|
|
160
|
-
const exp = parse(context, expression.source, this.throws);
|
|
195
|
+
const { evaluator } = this;
|
|
196
|
+
const exp = parse(evaluator, expression.source, this.throws, false);
|
|
161
197
|
if (exp.func != null) {
|
|
162
|
-
result = evaluateEval(
|
|
198
|
+
result = evaluateEval(evaluator, exp, this);
|
|
163
199
|
}
|
|
164
200
|
else if (exp.error != null) {
|
|
165
201
|
throw exp.error;
|
|
166
202
|
}
|
|
167
|
-
else {
|
|
168
|
-
result = DEFAULTS;
|
|
169
|
-
}
|
|
170
203
|
}
|
|
171
|
-
if (result === DEFAULTS)
|
|
172
|
-
return null;
|
|
173
204
|
const tag = expression[ExpressionTag];
|
|
174
205
|
if (!tag)
|
|
175
206
|
return result;
|
|
176
|
-
return TypeInfo.to(result,
|
|
207
|
+
return TypeInfo.to(result, tag);
|
|
177
208
|
}
|
|
178
209
|
catch (ex) {
|
|
179
210
|
throw new Error(`${ex.message || String(ex)}\nIn ${this.name}: @ ${path.join('/')}`);
|
package/dist/scope.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,eAAe,EACf,UAAU,EAMV,UAAU,GACb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAIH,aAAa,EACb,YAAY,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;AAE1B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAElD,iBAAiB;AACjB,SAAS,UAAU,CAAC,KAAoC;IACpD,kDAAkD;IAClD,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,aAAa;AACb,SAAS,WAAW,CAAC,KAA0B,EAAE,KAAY,EAAE,IAA4B;IACvF,kDAAkD;IAClD,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,OAAO,KAAK,IAAI,QAAQ,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IACI,KAAK,YAAY,IAAI;QACrB,KAAK,YAAY,OAAO;QACxB,KAAK,YAAY,MAAM;QACvB,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;QACzB,KAAK,YAAY,WAAW;QAC5B,CAAC,OAAO,iBAAiB,IAAI,WAAW,IAAI,KAAK,YAAY,iBAAiB,CAAC,EACjF,CAAC;QACC,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAChE,CAAC;AACD,cAAc;AACd,MAAM,iBAAiB;IACnB,YACa,KAAY,EACZ,IAA4B;QAD5B,UAAK,GAAL,KAAK,CAAO;QACZ,SAAI,GAAJ,IAAI,CAAwB;IACtC,CAAC;IACJ;;OAEG;IACH,GAAG,CAAC,MAAc,EAAE,CAAkB;QAClC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACZ,OAAO,MAAM,CAAC;QAClB,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAsB,CAAC;QAC1D,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;CACJ;AAED,aAAa;AACb,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,cAAc;AACd,MAAM,OAAO,KAAK;IACd;IACI,gBAAgB;IACP,QAGI,IAAI;IACjB,gBAAgB;IACP,SAAS,IAAI;IACtB,aAAa;IACJ,OAAO,aAAa;QAPpB,UAAK,GAAL,KAAK,CAGG;QAER,WAAM,GAAN,MAAM,CAAO;QAEb,SAAI,GAAJ,IAAI,CAAgB;QAEjC,cAAc;QACd,eAAU,GAAgD,IAAI,CAAC;QAC/D,cAAc;QACd,cAAS,GAA6D,IAAI,CAAC;QAE3E,aAAa;QACH,cAAS,GAAqB,IAAI,CAAC;QAC7C,WAAW;QACD,gBAAW,GAAG,CAAC,CAAC;QAY1B,mBAAmB;QACT,WAAM,GAAqB,IAAI,CAAC;IAtBvC,CAAC;IAUJ,YAAY;IACZ,KAAK,CAAC,SAA2B;QAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACrB,OAAO,GAAG,EAAE;YACR,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC;YAC9B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;QAClC,CAAC,CAAC;IACN,CAAC;IAGD,mBAAmB;IACnB,IAAI,KAAK;QACL,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QAC5C,IAAI,MAA8B,CAAC;QACnC,IAAI,SAAiC,CAAC;QACtC,IAAI,QAA2D,CAAC;QAChE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;QAC9C,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAChB,MAAM,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACpD,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;YACxD,QAAQ,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC;QAC/B,CAAC;aAAM,IAAI,OAAO,KAAK,IAAI,UAAU,EAAE,CAAC;YACpC,MAAM,GAAG,CAAC,GAAG,EAAE,EAAE;gBACb,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;gBACrB,IAAI,CAAC,KAAK,SAAS;oBAAE,OAAO,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC9D,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;oBAAE,OAAO,CAAC,CAAC;gBAC7B,OAAO,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAY,CAAC;YAClD,CAAC,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,MAAM,GAAG,CAAC,GAAG,EAAE,EAAE;gBACb,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC;oBAAE,OAAO,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAClE,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;gBACrB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;oBAAE,OAAO,CAAC,CAAC;gBAC7B,OAAO,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAY,CAAC;YAClD,CAAC,CAAC;QACN,CAAC;QACD,IAAI,OAAO,UAAU,IAAI,UAAU,EAAE,CAAC;YAClC,SAAS,GAAG,GAAG,EAAE;gBACb,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;gBAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;gBACvD,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC;YAClC,CAAC,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;QAC5D,CAAC;QACD,IAAI,OAAO,SAAS,IAAI,UAAU,EAAE,CAAC;YACjC,QAAQ,GAAG,CAAC,GAAG,EAAE,EAAE;gBACf,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;gBACzB,IAAI,CAAC;oBAAE,OAAO,CAAC,CAAC;gBAChB,OAAO,SAAS,CAAC;YACrB,CAAC,CAAC;QACN,CAAC;QACD,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,oDAAoD;IACpD,GAAG,CAAC,GAAW;QACX,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QACvB,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,KAAK,CAAC;QAChC,IAAI,CAAC,CAAC;QACN,IAAI,OAAO,KAAK,IAAI,UAAU,EAAE,CAAC;YAC7B,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YAC5B,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,OAAO,CAAC,KAAK,SAAS,CAAC;IAC3B,CAAC;IAED,kDAAkD;IAClD,GAAG,CAAoB,GAAW;QAC9B,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QACvB,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,SAAS,CAAC;QACpC,IAAI,CAAC,CAAC;QACN,IAAI,OAAO,KAAK,IAAI,UAAU,EAAE,CAAC;YAC7B,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YAC5B,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YAAE,OAAO,CAAgD,CAAC;QAC9E,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAwB,CAAC;IACtD,CAAC;IAED,cAAc;IACd,IAAI,CAAC,UAA2C,EAAE,IAA4B;QAC1E,IAAI,IAAI,CAAC,WAAW,IAAI,aAAa,EAAE,CAAC;YACpC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC;YACD,IAAI,MAAM,GAAmB,IAAI,CAAC;YAClC,IAAI,OAAO,UAAU,IAAI,UAAU,EAAE,CAAC;gBAClC,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,SAAU,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACJ,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;gBAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBACpE,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;oBACnB,MAAM,GAAG,YAAY,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;gBAChD,CAAC;qBAAM,IAAI,GAAG,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;oBAC3B,MAAM,GAAG,CAAC,KAAK,CAAC;gBACpB,CAAC;YACL,CAAC;YACD,MAAM,GAAG,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;YACtC,IAAI,CAAC,GAAG;gBAAE,OAAO,MAAM,CAAC;YACxB,OAAO,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,GAAI,EAAY,CAAC,OAAO,IAAI,MAAM,CAAC,EAAE,CAAC,QAAQ,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpG,CAAC;IACL,CAAC;CACJ;AAED,eAAe;AACf,SAAS,UAAU,CAAI,KAAQ;IAC3B,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,QAAQ,IAAI,OAAO,KAAK,IAAI,UAAU,CAAC,EAAE,CAAC;QAC5E,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,GAAG,GAAI,KAA2B,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC;IACzB,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;YAAE,SAAS;QAChC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACvC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC1B,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;QACzB,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,eAAe;AACf,MAAM,UAAU,MAAM,CAAI,KAAQ;IAC9B,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;AACtC,CAAC"}
|
package/dist/type.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { VmValue, VmValueMap } from '@mirascript/mirascript';
|
|
2
|
+
import { convert } from '@mirascript/mirascript/subtle';
|
|
2
3
|
/** 类型信息 */
|
|
3
4
|
export type TypeInfo = 'string' | 'number' | 'boolean';
|
|
4
5
|
/** 类型映射 */
|
|
@@ -6,16 +7,36 @@ type TypeMap = VmValueMap & {
|
|
|
6
7
|
s: string;
|
|
7
8
|
f: number;
|
|
8
9
|
b: boolean;
|
|
10
|
+
'': VmValue;
|
|
9
11
|
};
|
|
10
12
|
/** Ts 类型 */
|
|
11
|
-
export type TsTypeOf<T extends TypeInfo | LegacyType> = TypeMap[T];
|
|
13
|
+
export type TsTypeOf<T extends TypeInfo | LegacyType | '', I extends VmValue = VmValue> = T extends '' ? I : TypeMap[T];
|
|
12
14
|
/** 兼容的旧类型 */
|
|
13
15
|
export type LegacyType = 's' | 'f' | 'b';
|
|
14
16
|
/** 类型信息 */
|
|
15
|
-
export declare
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
export declare namespace TypeInfo {
|
|
18
|
+
/** 解析类型 */
|
|
19
|
+
export function parse(type: TypeInfo | LegacyType): TypeInfo;
|
|
20
|
+
/** 判断类型 */
|
|
21
|
+
export function is<T extends TypeInfo | LegacyType>(value: VmValue | undefined, type: T): value is TsTypeOf<T>;
|
|
22
|
+
/** 转换类型 */
|
|
23
|
+
export function to<T extends TypeInfo | LegacyType | '', I extends VmValue = VmValue, F = undefined>(value: I | undefined, type: T, fallback?: F): TsTypeOf<T> | Exclude<F, undefined>;
|
|
24
|
+
/** 不转换 */
|
|
25
|
+
function identity<T extends VmValue, F = undefined>(value: T | undefined, _fallback?: F): T;
|
|
26
|
+
/** 获取转换器 */
|
|
27
|
+
type Converters = {
|
|
28
|
+
string: typeof convert.toString;
|
|
29
|
+
s: typeof convert.toString;
|
|
30
|
+
number: typeof convert.toNumber;
|
|
31
|
+
f: typeof convert.toNumber;
|
|
32
|
+
boolean: typeof convert.toBoolean;
|
|
33
|
+
b: typeof convert.toBoolean;
|
|
34
|
+
'': typeof identity;
|
|
35
|
+
};
|
|
36
|
+
/** 获取转换器 */
|
|
37
|
+
export function converter<T extends TypeInfo | LegacyType | ''>(type: T): Converters[T];
|
|
38
|
+
export const toBoolean: typeof convert.toBoolean, toFormat: typeof convert.toFormat, toNumber: typeof convert.toNumber, toString: typeof convert.toString;
|
|
39
|
+
export {};
|
|
40
|
+
}
|
|
20
41
|
export {};
|
|
21
42
|
//# sourceMappingURL=type.d.ts.map
|
package/dist/type.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAExD,WAAW;AACX,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAKvD,WAAW;AACX,KAAK,OAAO,GAAG,UAAU,GAAG;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,OAAO,CAAC;IACX,EAAE,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,YAAY;AACZ,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,QAAQ,GAAG,UAAU,GAAG,EAAE,EAAE,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAExH,aAAa;AACb,MAAM,MAAM,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAEzC,WAAW;AACX,yBAAiB,QAAQ,CAAC;IACtB,WAAW;IACX,MAAM,UAAU,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAK3D;IACD,WAAW;IACX,MAAM,UAAU,EAAE,CAAC,CAAC,SAAS,QAAQ,GAAG,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,EAAE,IAAI,EAAE,CAAC,GAAG,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC,CAe7G;IAED,WAAW;IACX,MAAM,UAAU,EAAE,CAAC,CAAC,SAAS,QAAQ,GAAG,UAAU,GAAG,EAAE,EAAE,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,CAAC,GAAG,SAAS,EAC/F,KAAK,EAAE,CAAC,GAAG,SAAS,EACpB,IAAI,EAAE,CAAC,EACP,QAAQ,CAAC,EAAE,CAAC,GACb,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAGrC;IAED,UAAU;IACV,SAAS,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,GAAG,SAAS,EAC9C,KAAK,EAAE,CAAC,GAAG,SAAS,EACpB,SAAS,CAAC,EAAE,CAAC,GACd,CAAC,CAGH;IAED,YAAY;IACZ,KAAK,UAAU,GAAG;QACd,MAAM,EAAE,OAAO,OAAO,CAAC,QAAQ,CAAC;QAChC,CAAC,EAAE,OAAO,OAAO,CAAC,QAAQ,CAAC;QAC3B,MAAM,EAAE,OAAO,OAAO,CAAC,QAAQ,CAAC;QAChC,CAAC,EAAE,OAAO,OAAO,CAAC,QAAQ,CAAC;QAC3B,OAAO,EAAE,OAAO,OAAO,CAAC,SAAS,CAAC;QAClC,CAAC,EAAE,OAAO,OAAO,CAAC,SAAS,CAAC;QAC5B,EAAE,EAAE,OAAO,QAAQ,CAAC;KACvB,CAAC;IACF,YAAY;IACZ,MAAM,UAAU,SAAS,CAAC,CAAC,SAAS,QAAQ,GAAG,UAAU,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAgBtF;IAED,MAAM,CAAC,MAAQ,SAAS,4BAAE,QAAQ,2BAAE,QAAQ,2BAAE,QAAQ,yBAAY,CAAC;;CACtE"}
|
package/dist/type.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { convert } from '@mirascript/mirascript/subtle';
|
|
2
2
|
const x = 'boolean';
|
|
3
3
|
x;
|
|
4
4
|
/** 类型信息 */
|
|
5
|
-
export
|
|
6
|
-
|
|
5
|
+
export var TypeInfo;
|
|
6
|
+
(function (TypeInfo) {
|
|
7
|
+
/** 解析类型 */
|
|
8
|
+
function parse(type) {
|
|
7
9
|
if (type === 's' || type === 'string')
|
|
8
10
|
return 'string';
|
|
9
11
|
if (type === 'f' || type === 'number')
|
|
@@ -11,8 +13,10 @@ export const TypeInfo = {
|
|
|
11
13
|
if (type === 'b' || type === 'boolean')
|
|
12
14
|
return 'boolean';
|
|
13
15
|
throw new TypeError(`Invalid type '${String(type)}'`);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
+
}
|
|
17
|
+
TypeInfo.parse = parse;
|
|
18
|
+
/** 判断类型 */
|
|
19
|
+
function is(value, type) {
|
|
16
20
|
switch (type) {
|
|
17
21
|
case 'b':
|
|
18
22
|
case 'boolean':
|
|
@@ -27,24 +31,39 @@ export const TypeInfo = {
|
|
|
27
31
|
(type);
|
|
28
32
|
return false;
|
|
29
33
|
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
}
|
|
35
|
+
TypeInfo.is = is;
|
|
36
|
+
/** 转换类型 */
|
|
37
|
+
function to(value, type, fallback) {
|
|
38
|
+
const c = converter(type);
|
|
39
|
+
return c(value, fallback);
|
|
40
|
+
}
|
|
41
|
+
TypeInfo.to = to;
|
|
42
|
+
/** 不转换 */
|
|
43
|
+
function identity(value, _fallback) {
|
|
44
|
+
if (value == null)
|
|
45
|
+
return null;
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
/** 获取转换器 */
|
|
49
|
+
function converter(type) {
|
|
50
|
+
// eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check
|
|
34
51
|
switch (type) {
|
|
35
52
|
case 'b':
|
|
36
53
|
case 'boolean':
|
|
37
|
-
return
|
|
54
|
+
return TypeInfo.toBoolean;
|
|
38
55
|
case 'f':
|
|
39
56
|
case 'number':
|
|
40
|
-
return
|
|
57
|
+
return TypeInfo.toNumber;
|
|
41
58
|
case 's':
|
|
42
59
|
case 'string':
|
|
43
|
-
return
|
|
60
|
+
return TypeInfo.toString;
|
|
44
61
|
default:
|
|
45
62
|
(type);
|
|
46
|
-
return
|
|
63
|
+
return identity;
|
|
47
64
|
}
|
|
48
|
-
}
|
|
49
|
-
|
|
65
|
+
}
|
|
66
|
+
TypeInfo.converter = converter;
|
|
67
|
+
TypeInfo.toBoolean = convert.toBoolean, TypeInfo.toFormat = convert.toFormat, TypeInfo.toNumber = convert.toNumber, TypeInfo.toString = convert.toString;
|
|
68
|
+
})(TypeInfo || (TypeInfo = {}));
|
|
50
69
|
//# sourceMappingURL=type.js.map
|
package/dist/type.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.js","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAKxD,MAAM,CAAC,GAAa,SAAS,CAAC;AAC9B,CAAoB,CAAC;AAgBrB,WAAW;AACX,MAAM,KAAW,QAAQ,CA2ExB;AA3ED,WAAiB,QAAQ;IACrB,WAAW;IACX,SAAgB,KAAK,CAAC,IAA2B;QAC7C,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC;QACvD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC;QACvD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACzD,MAAM,IAAI,SAAS,CAAC,iBAAiB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1D,CAAC;IALe,cAAK,QAKpB,CAAA;IACD,WAAW;IACX,SAAgB,EAAE,CAAkC,KAA0B,EAAE,IAAO;QACnF,QAAQ,IAAI,EAAE,CAAC;YACX,KAAK,GAAG,CAAC;YACT,KAAK,SAAS;gBACV,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC;YACtC,KAAK,GAAG,CAAC;YACT,KAAK,QAAQ;gBACT,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;YACrC,KAAK,GAAG,CAAC;YACT,KAAK,QAAQ;gBACT,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;YACrC;gBACI,CAAC,IAAI,CAAiB,CAAC;gBACvB,OAAO,KAAK,CAAC;QACrB,CAAC;IACL,CAAC;IAfe,WAAE,KAejB,CAAA;IAED,WAAW;IACX,SAAgB,EAAE,CACd,KAAoB,EACpB,IAAO,EACP,QAAY;QAEZ,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1B,OAAQ,CAA6B,CAAC,KAAK,EAAE,QAAQ,CAAgB,CAAC;IAC1E,CAAC;IAPe,WAAE,KAOjB,CAAA;IAED,UAAU;IACV,SAAS,QAAQ,CACb,KAAoB,EACpB,SAAa;QAEb,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,IAAS,CAAC;QACpC,OAAO,KAAK,CAAC;IACjB,CAAC;IAYD,YAAY;IACZ,SAAgB,SAAS,CAAuC,IAAO;QACnE,0EAA0E;QAC1E,QAAQ,IAAI,EAAE,CAAC;YACX,KAAK,GAAG,CAAC;YACT,KAAK,SAAS;gBACV,OAAO,SAAA,SAA0B,CAAC;YACtC,KAAK,GAAG,CAAC;YACT,KAAK,QAAQ;gBACT,OAAO,SAAA,QAAyB,CAAC;YACrC,KAAK,GAAG,CAAC;YACT,KAAK,QAAQ;gBACT,OAAO,SAAA,QAAyB,CAAC;YACrC;gBACI,CAAC,IAAI,CAAc,CAAC;gBACpB,OAAO,QAAyB,CAAC;QACzC,CAAC;IACL,CAAC;IAhBe,kBAAS,YAgBxB,CAAA;IAEc,kBAAS,GAAmC,OAAO,UAA1C,EAAE,iBAAQ,GAAyB,OAAO,SAAhC,EAAE,iBAAQ,GAAe,OAAO,SAAtB,EAAE,iBAAQ,GAAK,OAAO,SAAZ,CAAa;AACvE,CAAC,EA3EgB,QAAQ,KAAR,QAAQ,QA2ExB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudpss/expression",
|
|
3
|
-
"version": "0.6.0-alpha.
|
|
3
|
+
"version": "0.6.0-alpha.20",
|
|
4
4
|
"author": "CloudPSS",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -12,11 +12,14 @@
|
|
|
12
12
|
"./*": "./dist/*.js"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@mirascript/mirascript": "^0.
|
|
15
|
+
"@mirascript/mirascript": "^0.1.22",
|
|
16
16
|
"klona": "^2.0.6",
|
|
17
|
-
"lru-cache": "^11.2.
|
|
18
|
-
"mathjs": "^
|
|
19
|
-
"type-fest": "^5.
|
|
17
|
+
"lru-cache": "^11.2.4",
|
|
18
|
+
"mathjs": "^15.1.0",
|
|
19
|
+
"type-fest": "^5.3.1"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"dedent": "^1.7.0"
|
|
20
23
|
},
|
|
21
24
|
"scripts": {
|
|
22
25
|
"build": "pnpm clean && tsc --build --force",
|
package/src/analyze.ts
CHANGED
|
@@ -1,44 +1,84 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
parseDiagnostics,
|
|
3
|
+
generateBytecodeSync,
|
|
4
|
+
DiagnosticCode,
|
|
5
|
+
DefaultVmContext,
|
|
6
|
+
} from '@mirascript/mirascript/subtle';
|
|
7
|
+
import type { TranspileOptions } from '@mirascript/mirascript';
|
|
8
|
+
import type { EvalExpressionCache } from './parser.js';
|
|
9
|
+
import type { Scope } from './scope.js';
|
|
10
|
+
import type { Evaluator } from './main.js';
|
|
11
|
+
|
|
12
|
+
/** 一个访问链,第一个元素为变量名称 */
|
|
13
|
+
export type AccessChain = readonly [string, ...ReadonlyArray<string | number>];
|
|
14
|
+
|
|
15
|
+
const config: TranspileOptions = Object.freeze({
|
|
16
|
+
input_mode: 'Script',
|
|
17
|
+
diagnostic_position_encoding: 'Utf16',
|
|
18
|
+
diagnostic_error: false,
|
|
19
|
+
diagnostic_warning: false,
|
|
20
|
+
diagnostic_info: false,
|
|
21
|
+
diagnostic_hint: false,
|
|
22
|
+
diagnostic_reference: false,
|
|
23
|
+
diagnostic_tag: true,
|
|
24
|
+
trivia: false,
|
|
25
|
+
} satisfies TranspileOptions);
|
|
3
26
|
|
|
4
27
|
/**
|
|
5
28
|
* 分析依赖
|
|
6
29
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
+
function analyzeImpl(expression: string): readonly AccessChain[] {
|
|
31
|
+
if (expression.trim() === '') {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
const [code, diagnostics] = generateBytecodeSync(expression, config);
|
|
35
|
+
if (code == null || diagnostics.length === 0) {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
const parsedDiagnostics = parseDiagnostics(expression, diagnostics);
|
|
39
|
+
const globals = parsedDiagnostics.tags.filter((t) => t.code === DiagnosticCode.GlobalVariable);
|
|
40
|
+
if (globals.length === 0) {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
const lines = expression.split(/\r?\n/);
|
|
44
|
+
const result = new Set<string>();
|
|
45
|
+
for (const global of globals) {
|
|
46
|
+
// 分析每个全局变量访问
|
|
47
|
+
const line = lines[global.range.startLineNumber - 1];
|
|
48
|
+
if (!line) continue;
|
|
49
|
+
const access = line.slice(global.range.startColumn - 1);
|
|
50
|
+
const chain =
|
|
51
|
+
/^((?:@+|\$+|[a-zA-Z_])[a-zA-Z0-9_]*)(?:\s*!?\.\s*(?:\d+|(?:@+|\$+|[a-zA-Z_])[a-zA-Z0-9_]*))*/.exec(access);
|
|
52
|
+
if (chain == null) continue;
|
|
53
|
+
const globalName = chain[1];
|
|
54
|
+
if (globalName?.length !== global.range.endColumn - global.range.startColumn) continue;
|
|
55
|
+
const chainStr = chain[0].split(/\s*!?\.\s*/).join('.');
|
|
56
|
+
result.add(chainStr);
|
|
57
|
+
}
|
|
58
|
+
const accessChains: AccessChain[] = [];
|
|
59
|
+
for (const chainStr of result) {
|
|
60
|
+
const parts = chainStr.split('.').map((part) => {
|
|
61
|
+
const num = Number.parseInt(part, 10);
|
|
62
|
+
return Number.isNaN(num) ? part : num;
|
|
63
|
+
});
|
|
64
|
+
accessChains.push(parts as unknown as AccessChain);
|
|
65
|
+
}
|
|
66
|
+
return accessChains;
|
|
67
|
+
}
|
|
30
68
|
|
|
31
|
-
|
|
32
|
-
// }
|
|
33
|
-
// return undefined;
|
|
34
|
-
// };
|
|
69
|
+
const kAnalyze = Symbol('cloudpss.expression.analyzeCache');
|
|
35
70
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
71
|
+
/**
|
|
72
|
+
* 分析依赖
|
|
73
|
+
*/
|
|
74
|
+
export function analyze(expression: EvalExpressionCache, evaluator: Evaluator, scope: Scope): readonly AccessChain[] {
|
|
75
|
+
let result = (expression as EvalExpressionCache & { [kAnalyze]?: readonly AccessChain[] })[kAnalyze];
|
|
76
|
+
if (result == null) {
|
|
77
|
+
result = analyzeImpl(expression.source);
|
|
78
|
+
(expression as EvalExpressionCache & { [kAnalyze]?: readonly AccessChain[] })[kAnalyze] = result;
|
|
79
|
+
}
|
|
80
|
+
return result.filter(([global]) => {
|
|
81
|
+
if (scope.has(global)) return true;
|
|
82
|
+
return !(evaluator.imported.has(global) || DefaultVmContext.has(global));
|
|
83
|
+
});
|
|
44
84
|
}
|
|
@@ -6,7 +6,7 @@ import type { Evaluator } from '../main.js';
|
|
|
6
6
|
/**
|
|
7
7
|
* 表示一个具有类似表达式功能的 JS 函数,与某个 {@link ArgumentValue} 相关联,在其之后求值
|
|
8
8
|
*/
|
|
9
|
-
export type
|
|
9
|
+
export type ArgumentFunction<out R, in V extends VmValue = ArgumentValue> = (
|
|
10
10
|
/** 相关联的参数值 */
|
|
11
11
|
value: V,
|
|
12
12
|
/** 当前作用域 */
|
|
@@ -15,26 +15,16 @@ export type ExpressionFunction<R, V extends VmValue = ArgumentValue> = (
|
|
|
15
15
|
evaluator: Evaluator,
|
|
16
16
|
) => R;
|
|
17
17
|
|
|
18
|
-
/**
|
|
19
|
-
* 表示一个具有类似表达式功能的 JS 函数,与某个 {@link ArgumentValue} 相关联,在其之前求值
|
|
20
|
-
*/
|
|
21
|
-
export type ParameterFunction<R> = (
|
|
22
|
-
/** 当前作用域 */
|
|
23
|
-
scope: Scope,
|
|
24
|
-
/** 当前求值器 */
|
|
25
|
-
evaluator: Evaluator,
|
|
26
|
-
) => R;
|
|
27
|
-
|
|
28
18
|
/** 条件表达式 */
|
|
29
19
|
export type ConditionExpression = boolean | ExpressionSource<boolean>;
|
|
30
20
|
|
|
31
21
|
/** 条件函数 */
|
|
32
|
-
export type ConditionFunction<V extends VmValue = ArgumentValue> =
|
|
22
|
+
export type ConditionFunction<in V extends VmValue = ArgumentValue> = ArgumentFunction<boolean, V>;
|
|
33
23
|
|
|
34
24
|
/** 参数值 */
|
|
35
25
|
export type ArgumentValue = NonNullable<VmConst>;
|
|
36
26
|
|
|
37
27
|
/** 未求值的参数表 */
|
|
38
28
|
export type ArgumentMap<T extends Record<string, ArgumentValue> = Record<string, ArgumentValue>> = {
|
|
39
|
-
[K in keyof T
|
|
29
|
+
[K in keyof T]?: ExpressionOrValue<NonNullable<T[K]>>;
|
|
40
30
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { VmRecord, VmValue } from '@mirascript/mirascript';
|
|
2
|
-
import type { ArgumentValue, ConditionExpression, ConditionFunction,
|
|
2
|
+
import type { ArgumentValue, ConditionExpression, ConditionFunction, ArgumentFunction } from './argument.js';
|
|
3
3
|
import type { ExpressionSource } from '../expression.js';
|
|
4
4
|
|
|
5
5
|
export const ConstraintLevel = Object.freeze(['info', 'warning', 'error'] as const);
|
|
@@ -23,7 +23,7 @@ export interface Constraint<V extends VmValue = ArgumentValue> {
|
|
|
23
23
|
/**
|
|
24
24
|
* 不满足条件的提示附加参数
|
|
25
25
|
*/
|
|
26
|
-
messageData?: ExpressionSource<VmRecord> | VmRecord |
|
|
26
|
+
messageData?: ExpressionSource<VmRecord> | VmRecord | ArgumentFunction<VmRecord, V>;
|
|
27
27
|
/**
|
|
28
28
|
* 约束条件
|
|
29
29
|
*/
|
|
@@ -33,7 +33,7 @@ export interface Constraint<V extends VmValue = ArgumentValue> {
|
|
|
33
33
|
/** 检查是否为 Constraint */
|
|
34
34
|
export function isConstraint(value: unknown): value is Constraint {
|
|
35
35
|
if (value == null || typeof value !== 'object') return false;
|
|
36
|
-
if ('key' in value || 'description' in value) return false;
|
|
36
|
+
if ('key' in value || 'name' in value || 'description' in value || 'items' in value) return false;
|
|
37
37
|
|
|
38
38
|
const v = value as Constraint;
|
|
39
39
|
if (typeof v.message != 'string') return false;
|
|
@@ -22,8 +22,10 @@ export interface ParameterDecorationMap {
|
|
|
22
22
|
label: ParameterLabelDecoration;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
/** 参数界面装饰 type */
|
|
26
|
+
export type ParameterDecorationType = keyof ParameterDecorationMap;
|
|
25
27
|
/** 参数界面装饰 */
|
|
26
|
-
export type ParameterDecoration = ParameterDecorationMap[
|
|
28
|
+
export type ParameterDecoration = ParameterDecorationMap[ParameterDecorationType];
|
|
27
29
|
|
|
28
30
|
/** 是否为参数界面装饰 */
|
|
29
31
|
export function isParameterDecoration(value: unknown): value is ParameterDecoration {
|
|
@@ -32,11 +34,3 @@ export function isParameterDecoration(value: unknown): value is ParameterDecorat
|
|
|
32
34
|
if ('key' in v || 'name' in v || 'description' in v) return false;
|
|
33
35
|
return typeof v.type == 'string' && v.type.length > 0;
|
|
34
36
|
}
|
|
35
|
-
|
|
36
|
-
/** 创建参数界面装饰 */
|
|
37
|
-
export function ParameterDecoration(): ParameterLabelDecoration {
|
|
38
|
-
return {
|
|
39
|
-
type: 'label',
|
|
40
|
-
label: '',
|
|
41
|
-
};
|
|
42
|
-
}
|