vue2-client 1.11.4 → 1.11.6-alpha
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/.babelrc +3 -0
- package/babel.config.js +18 -21
- package/jest.config.js +22 -21
- package/package.json +5 -4
- package/src/base-client/components/common/CitySelect/CitySelect.vue +366 -342
- package/src/base-client/components/common/Upload/Upload.vue +322 -322
- package/src/base-client/components/common/XDescriptions/XDescriptionsGroup.vue +314 -304
- package/src/base-client/components/common/XDescriptions/demo.vue +51 -50
- package/src/base-client/components/common/XFormGroup/demo.vue +39 -46
- package/src/base-client/components/common/XFormTable/demo.vue +60 -60
- package/src/components/STable/index.js +426 -426
- package/src/expression/ExpressionRunner.js +26 -0
- package/src/expression/TestExpression.js +508 -0
- package/src/expression/core/Delegate.js +113 -0
- package/src/expression/core/Expression.js +1323 -0
- package/src/expression/core/Program.js +933 -0
- package/src/expression/core/Token.js +27 -0
- package/src/expression/enums/ExpressionType.js +81 -0
- package/src/expression/enums/TokenType.js +11 -0
- package/src/expression/exception/BreakWayException.js +2 -0
- package/src/expression/exception/ContinueWayException.js +2 -0
- package/src/expression/exception/ExpressionException.js +28 -0
- package/src/expression/exception/ReturnWayException.js +14 -0
- package/src/expression/exception/ServiceException.js +22 -0
- package/src/expression/instances/JSONArray.js +48 -0
- package/src/expression/instances/JSONObject.js +122 -0
- package/src/expression/instances/LogicConsole.js +45 -0
- package/src/expression/ts/ExpressionRunner.ts +28 -0
- package/src/expression/ts/TestExpression.ts +509 -0
- package/src/expression/ts/core/Delegate.ts +114 -0
- package/src/expression/ts/core/Expression.ts +1309 -0
- package/src/expression/ts/core/Program.ts +950 -0
- package/src/expression/ts/core/Token.ts +29 -0
- package/src/expression/ts/enums/ExpressionType.ts +81 -0
- package/src/expression/ts/enums/TokenType.ts +13 -0
- package/src/expression/ts/exception/BreakWayException.ts +2 -0
- package/src/expression/ts/exception/ContinueWayException.ts +2 -0
- package/src/expression/ts/exception/ExpressionException.ts +28 -0
- package/src/expression/ts/exception/ReturnWayException.ts +14 -0
- package/src/expression/ts/exception/ServiceException.ts +22 -0
- package/src/expression/ts/instances/JSONArray.ts +48 -0
- package/src/expression/ts/instances/JSONObject.ts +109 -0
- package/src/expression/ts/instances/LogicConsole.ts +32 -0
- package/src/logic/LogicRunner.js +67 -0
- package/src/logic/TestLogic.js +13 -0
- package/src/logic/plugins/common/DateTools.js +32 -0
- package/src/logic/plugins/index.js +5 -0
- package/src/logic/ts/LogicRunner.ts +67 -0
- package/src/logic/ts/TestLogic.ts +13 -0
- package/src/pages/LogicCallExample/index.vue +30 -0
- package/src/router/async/router.map.js +4 -2
- package/src/services/user.js +2 -0
- package/src/store/mutation-types.js +1 -0
- package/src/utils/EncryptUtil.js +23 -0
- package/src/utils/indexedDB.js +234 -234
- package/src/utils/request.js +382 -362
- package/test/request.test.js +17 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import Program from './core/Program'
|
|
2
|
+
|
|
3
|
+
export default class ExpressionRunner {
|
|
4
|
+
/**
|
|
5
|
+
* Runs an expression with parameters
|
|
6
|
+
*
|
|
7
|
+
* @param source Expression source
|
|
8
|
+
* @param params Expression parameters
|
|
9
|
+
* @returns The result of the expression
|
|
10
|
+
*/
|
|
11
|
+
static async run (source, params) {
|
|
12
|
+
const delegate = this.getDelegate(source)
|
|
13
|
+
return await delegate.invoke(params)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Gets the delegate for the expression
|
|
18
|
+
*
|
|
19
|
+
* @param source Expression source
|
|
20
|
+
* @returns A delegate to invoke
|
|
21
|
+
*/
|
|
22
|
+
static getDelegate (source) {
|
|
23
|
+
// Parse the source and return a delegate
|
|
24
|
+
return new Program(source).parse()
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
import Program from './core/Program'
|
|
2
|
+
import JSONObject from './instances/JSONObject'
|
|
3
|
+
import LogicConsole from './instances/LogicConsole'
|
|
4
|
+
|
|
5
|
+
runTest()
|
|
6
|
+
|
|
7
|
+
async function runTest () {
|
|
8
|
+
console.debug('1.========testValidate========')
|
|
9
|
+
await testValidate()
|
|
10
|
+
console.debug('2.========testAssert========')
|
|
11
|
+
await testAssert()
|
|
12
|
+
console.debug('3.========testTry========')
|
|
13
|
+
await testTry()
|
|
14
|
+
console.debug('4.========testPropertyType========')
|
|
15
|
+
await testPropertyType()
|
|
16
|
+
console.debug('5.========testJSONArrayIndex========')
|
|
17
|
+
await testJSONArrayIndex()
|
|
18
|
+
console.debug('6.========testArrayIndex========')
|
|
19
|
+
await testArrayIndex()
|
|
20
|
+
console.debug('7.========testCompare========')
|
|
21
|
+
await testCompare()
|
|
22
|
+
console.debug('8.========testJSONObject========')
|
|
23
|
+
await testJSONObject()
|
|
24
|
+
console.debug('9.========testJSONArray========')
|
|
25
|
+
await testJSONArray()
|
|
26
|
+
console.debug('10.========testFunctionCall========')
|
|
27
|
+
await testFunctionCall()
|
|
28
|
+
console.debug('11.========testMath========')
|
|
29
|
+
await testMath()
|
|
30
|
+
console.debug('12.========testString========')
|
|
31
|
+
await testString()
|
|
32
|
+
console.debug('13.========testCondition========')
|
|
33
|
+
await testCondition()
|
|
34
|
+
console.debug('14.========testThrow========')
|
|
35
|
+
await testThrow()
|
|
36
|
+
console.debug('15.========testJSONArrayLoop========')
|
|
37
|
+
await testJSONArrayLoop()
|
|
38
|
+
console.debug('16.========testJSONObjectLoop========')
|
|
39
|
+
await testJSONObjectLoop()
|
|
40
|
+
console.debug('17.========testIntLoop========')
|
|
41
|
+
await testIntLoop()
|
|
42
|
+
console.debug('18.========testContinueAndBreak========')
|
|
43
|
+
await testContinueAndBreak()
|
|
44
|
+
console.debug('19.========testComment========')
|
|
45
|
+
await testComment()
|
|
46
|
+
console.debug('20.========testReturn========')
|
|
47
|
+
await testReturn()
|
|
48
|
+
console.debug('21.========testLambda========')
|
|
49
|
+
await testLambda()
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* validate
|
|
54
|
+
*/
|
|
55
|
+
async function testValidate () {
|
|
56
|
+
const expression = `
|
|
57
|
+
validate {
|
|
58
|
+
model: {
|
|
59
|
+
required: true,
|
|
60
|
+
},
|
|
61
|
+
visible: {
|
|
62
|
+
default: 1 + 1,
|
|
63
|
+
},
|
|
64
|
+
isAep: {
|
|
65
|
+
default: 3
|
|
66
|
+
},
|
|
67
|
+
testJson: {
|
|
68
|
+
required: true,
|
|
69
|
+
items: {
|
|
70
|
+
userid: {
|
|
71
|
+
required: true
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
testGroup: {
|
|
76
|
+
mode: "atLeastOne",
|
|
77
|
+
fields: [
|
|
78
|
+
"test1",
|
|
79
|
+
"test2"
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
data.isAep == 3 :(
|
|
84
|
+
log.info(123)
|
|
85
|
+
),null,
|
|
86
|
+
log.info(data)
|
|
87
|
+
`
|
|
88
|
+
const data = {
|
|
89
|
+
model: 'a',
|
|
90
|
+
test1: 'b',
|
|
91
|
+
isAep: null,
|
|
92
|
+
testJson: {
|
|
93
|
+
userid: {}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
await runExpression(expression, data)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* assert
|
|
101
|
+
*/
|
|
102
|
+
async function testAssert () {
|
|
103
|
+
const expression = `
|
|
104
|
+
c = 1,
|
|
105
|
+
assert c == 1,
|
|
106
|
+
log.debug("ok"),
|
|
107
|
+
a = 1 + c,
|
|
108
|
+
assert a == 2,
|
|
109
|
+
log.debug("ok2")`
|
|
110
|
+
await runExpression(expression)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* try
|
|
115
|
+
*/
|
|
116
|
+
async function testTry () {
|
|
117
|
+
const expression = `
|
|
118
|
+
a = 0,
|
|
119
|
+
log.debug(a),
|
|
120
|
+
try {
|
|
121
|
+
assert c == 2
|
|
122
|
+
} catch (WebException e) {
|
|
123
|
+
log.debug(e),
|
|
124
|
+
a = 1 + 1
|
|
125
|
+
} catch (Exception e) {
|
|
126
|
+
log.debug(e),
|
|
127
|
+
a = 1 + 2
|
|
128
|
+
},
|
|
129
|
+
log.debug(a)
|
|
130
|
+
`
|
|
131
|
+
await runExpression(expression)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* property
|
|
136
|
+
*/
|
|
137
|
+
async function testPropertyType () {
|
|
138
|
+
const expression = `
|
|
139
|
+
a = 1,
|
|
140
|
+
b = 2.0,
|
|
141
|
+
c = {
|
|
142
|
+
d: 1,
|
|
143
|
+
e: {
|
|
144
|
+
str: "123",
|
|
145
|
+
你好: "中国"
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
c.a = 1,
|
|
149
|
+
log.debug(c.e.你好),
|
|
150
|
+
log.debug(c["e"].str),
|
|
151
|
+
e = c.d,
|
|
152
|
+
f = "123",
|
|
153
|
+
g = [],
|
|
154
|
+
名称 = "123=>",
|
|
155
|
+
log.debug(data.testArray[0]),
|
|
156
|
+
return 名称
|
|
157
|
+
`
|
|
158
|
+
const data = {
|
|
159
|
+
testArray: 'zhang|b|c'.split('\|')
|
|
160
|
+
}
|
|
161
|
+
await runExpression(expression, data)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* JSONArray index
|
|
166
|
+
*/
|
|
167
|
+
async function testJSONArrayIndex () {
|
|
168
|
+
const expression = `
|
|
169
|
+
a = [1,2,3,4,5],
|
|
170
|
+
return a[4]
|
|
171
|
+
`
|
|
172
|
+
await runExpression(expression)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* array index
|
|
177
|
+
*/
|
|
178
|
+
async function testArrayIndex () {
|
|
179
|
+
const expression = `
|
|
180
|
+
return data.a[4]
|
|
181
|
+
`
|
|
182
|
+
const data = {
|
|
183
|
+
a: [1, 2, 3, 4, 5]
|
|
184
|
+
}
|
|
185
|
+
await runExpression(expression, data)
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
async function testCompare () {
|
|
189
|
+
const expression = `
|
|
190
|
+
a = 0,
|
|
191
|
+
a >= 0 :(
|
|
192
|
+
a = a + 1,
|
|
193
|
+
b = 1,
|
|
194
|
+
a == b :(
|
|
195
|
+
c = 3.0,
|
|
196
|
+
a < c :(
|
|
197
|
+
a + 2,
|
|
198
|
+
a <= c :(
|
|
199
|
+
strA = $a$,
|
|
200
|
+
strB = $b$,
|
|
201
|
+
strC = $c$,
|
|
202
|
+
strA < strB && strA != strC :(
|
|
203
|
+
return $ok$
|
|
204
|
+
),null
|
|
205
|
+
),null
|
|
206
|
+
),null
|
|
207
|
+
),null
|
|
208
|
+
),null
|
|
209
|
+
`
|
|
210
|
+
await runExpression(expression)
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* JSONObject
|
|
215
|
+
*/
|
|
216
|
+
async function testJSONObject () {
|
|
217
|
+
const expression = `
|
|
218
|
+
datas = {
|
|
219
|
+
name: "张三",
|
|
220
|
+
年龄: 15,
|
|
221
|
+
},
|
|
222
|
+
datas
|
|
223
|
+
`
|
|
224
|
+
await runExpression(expression)
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* JSONArray
|
|
229
|
+
*/
|
|
230
|
+
async function testJSONArray () {
|
|
231
|
+
const expression = `
|
|
232
|
+
datas = ["a","b","c"],
|
|
233
|
+
datas
|
|
234
|
+
`
|
|
235
|
+
await runExpression(expression)
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* function call
|
|
240
|
+
*/
|
|
241
|
+
async function testFunctionCall () {
|
|
242
|
+
const expression = `
|
|
243
|
+
log.debug("test is ok")
|
|
244
|
+
`
|
|
245
|
+
await runExpression(expression)
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* math
|
|
250
|
+
*/
|
|
251
|
+
async function testMath () {
|
|
252
|
+
const expression = `
|
|
253
|
+
a = 1,
|
|
254
|
+
b = 2,
|
|
255
|
+
c = a + b,
|
|
256
|
+
c = c - 1,
|
|
257
|
+
d = 5 * 8,
|
|
258
|
+
e = d / 10,
|
|
259
|
+
e = e % 2,
|
|
260
|
+
c
|
|
261
|
+
`
|
|
262
|
+
await runExpression(expression)
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* string
|
|
267
|
+
*/
|
|
268
|
+
async function testString () {
|
|
269
|
+
const expression = `
|
|
270
|
+
test1 = {}.toString(),
|
|
271
|
+
log.debug(test1),
|
|
272
|
+
a = $part1$,
|
|
273
|
+
log.debug(a),
|
|
274
|
+
b = "part2",
|
|
275
|
+
log.debug(b),
|
|
276
|
+
c = "{a}:{b}",
|
|
277
|
+
log.debug(c),
|
|
278
|
+
d = "{name}:张三",
|
|
279
|
+
log.debug(d),
|
|
280
|
+
e = "\\{name\\}:张三",
|
|
281
|
+
log.debug(e),
|
|
282
|
+
f = "\\"123\\"",
|
|
283
|
+
log.debug(f),
|
|
284
|
+
g = "\\$15.7",
|
|
285
|
+
log.debug(g),
|
|
286
|
+
h = $\\$15.7$,
|
|
287
|
+
log.debug(h),
|
|
288
|
+
i = "http:\\\\www.baidu.com",
|
|
289
|
+
log.debug(i),
|
|
290
|
+
j = $http://www.baidu.com$,
|
|
291
|
+
log.debug(j)
|
|
292
|
+
`
|
|
293
|
+
await runExpression(expression)
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* condition
|
|
298
|
+
*/
|
|
299
|
+
async function testCondition () {
|
|
300
|
+
const expression = `
|
|
301
|
+
1 != 1 :(
|
|
302
|
+
throw "异常"
|
|
303
|
+
),null,
|
|
304
|
+
1 + 1 != 2 :(
|
|
305
|
+
throw "异常"
|
|
306
|
+
),null,
|
|
307
|
+
!(2 > 3) && !(3 > 2):(
|
|
308
|
+
throw "异常"
|
|
309
|
+
),null,
|
|
310
|
+
2 > 3 :(
|
|
311
|
+
throw "异常"
|
|
312
|
+
),null,
|
|
313
|
+
!(3 > 2) :(
|
|
314
|
+
throw "异常"
|
|
315
|
+
),null,
|
|
316
|
+
y = 1 > 0,
|
|
317
|
+
!y && 1 > 0 :(
|
|
318
|
+
throw "异常"
|
|
319
|
+
),null
|
|
320
|
+
`
|
|
321
|
+
const data = {
|
|
322
|
+
type: '1'
|
|
323
|
+
}
|
|
324
|
+
await runExpression(expression, data)
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* throw
|
|
329
|
+
*/
|
|
330
|
+
async function testThrow () {
|
|
331
|
+
const expression = `
|
|
332
|
+
data.type == 2 :(
|
|
333
|
+
throw "error",
|
|
334
|
+
log.debug(result)
|
|
335
|
+
),null
|
|
336
|
+
`
|
|
337
|
+
const data = {
|
|
338
|
+
type: '1'
|
|
339
|
+
}
|
|
340
|
+
await runExpression(expression, data)
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* JSONArray loop
|
|
345
|
+
*/
|
|
346
|
+
async function testJSONArrayLoop () {
|
|
347
|
+
const expression = `
|
|
348
|
+
log.debug("test-JSONArray"),
|
|
349
|
+
datas = [1,2,3,4,5],
|
|
350
|
+
datas.each(
|
|
351
|
+
log.debug(\${row}\$)
|
|
352
|
+
),
|
|
353
|
+
log.debug("test-Set"),
|
|
354
|
+
data.testSet.each(
|
|
355
|
+
log.debug(\${row}\$)
|
|
356
|
+
),
|
|
357
|
+
log.debug("test-Array"),
|
|
358
|
+
data.testArray.each(
|
|
359
|
+
log.debug(\${row}\$)
|
|
360
|
+
)
|
|
361
|
+
`
|
|
362
|
+
const data = {
|
|
363
|
+
testSet: [1, 2, 3, 4, 5],
|
|
364
|
+
testArray: 'a|b|c'.split('\|')
|
|
365
|
+
}
|
|
366
|
+
await runExpression(expression, data)
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/**
|
|
370
|
+
* JSONObject loop
|
|
371
|
+
*/
|
|
372
|
+
async function testJSONObjectLoop () {
|
|
373
|
+
const expression = `
|
|
374
|
+
log.debug("test-JSONObject"),
|
|
375
|
+
datas = {name: 1, age: 2},
|
|
376
|
+
datas.each(
|
|
377
|
+
log.debug(\${rowKey}:{row}$)
|
|
378
|
+
),
|
|
379
|
+
log.debug("test-Map"),
|
|
380
|
+
data.testMap.each(
|
|
381
|
+
log.debug(\${rowKey}:{row}$)
|
|
382
|
+
)
|
|
383
|
+
`
|
|
384
|
+
const data = {
|
|
385
|
+
testMap: {
|
|
386
|
+
name: 'xxx',
|
|
387
|
+
age: 18,
|
|
388
|
+
gender: '男'
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
await runExpression(expression, data)
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* int loop
|
|
396
|
+
*/
|
|
397
|
+
async function testIntLoop () {
|
|
398
|
+
const expression = `
|
|
399
|
+
a = 5,
|
|
400
|
+
a.each(
|
|
401
|
+
log.debug(row)
|
|
402
|
+
),
|
|
403
|
+
(0,5).each(
|
|
404
|
+
log.debug(row)
|
|
405
|
+
),
|
|
406
|
+
null
|
|
407
|
+
`
|
|
408
|
+
await runExpression(expression)
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* continue and break
|
|
413
|
+
*/
|
|
414
|
+
async function testContinueAndBreak () {
|
|
415
|
+
const expression = `
|
|
416
|
+
datas = [1,2,3,4,5,6,7],
|
|
417
|
+
datas.each(
|
|
418
|
+
row == 3 :(
|
|
419
|
+
continue
|
|
420
|
+
),row == 5:(
|
|
421
|
+
break
|
|
422
|
+
),
|
|
423
|
+
log.debug(row)
|
|
424
|
+
)
|
|
425
|
+
`
|
|
426
|
+
await runExpression(expression)
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* comment
|
|
431
|
+
*/
|
|
432
|
+
async function testComment () {
|
|
433
|
+
const expression = `
|
|
434
|
+
$//排序单表查询
|
|
435
|
+
select {items}
|
|
436
|
+
from {tablename}
|
|
437
|
+
where {condition}
|
|
438
|
+
order by {orderitem}
|
|
439
|
+
`
|
|
440
|
+
await runExpression(expression)
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* return
|
|
445
|
+
*/
|
|
446
|
+
async function testReturn () {
|
|
447
|
+
const expression = `
|
|
448
|
+
data.type == 1 :(
|
|
449
|
+
return "123",
|
|
450
|
+
log.debug(123)
|
|
451
|
+
),(
|
|
452
|
+
return 2
|
|
453
|
+
),
|
|
454
|
+
log.debug(123)
|
|
455
|
+
`
|
|
456
|
+
const data = {
|
|
457
|
+
type: 1
|
|
458
|
+
}
|
|
459
|
+
await runExpression(expression, data)
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/**
|
|
463
|
+
* lambda
|
|
464
|
+
*/
|
|
465
|
+
async function testLambda () {
|
|
466
|
+
const expression = `
|
|
467
|
+
log.debug("进入外层逻辑,参数:{data}"),
|
|
468
|
+
age = 13,
|
|
469
|
+
// 声明一个lambda块
|
|
470
|
+
lambdaObj = (data) => {
|
|
471
|
+
index = 1,
|
|
472
|
+
log.debug("进入lambda了"),
|
|
473
|
+
log.debug("传入lambda块的参数:{data}"),
|
|
474
|
+
log.debug("外层的只读参数:{age}"),
|
|
475
|
+
return "执行lambda完成"
|
|
476
|
+
},
|
|
477
|
+
log.debug("age参数:{age}"),
|
|
478
|
+
result = lambdaObj.apply({
|
|
479
|
+
name: "江超"
|
|
480
|
+
}),
|
|
481
|
+
result = lambdaObj.apply({
|
|
482
|
+
name: "大神"
|
|
483
|
+
}),
|
|
484
|
+
log.debug("result:{result}"),
|
|
485
|
+
return {
|
|
486
|
+
func: lambdaObj
|
|
487
|
+
}
|
|
488
|
+
`
|
|
489
|
+
const data = {
|
|
490
|
+
type: 1
|
|
491
|
+
}
|
|
492
|
+
await runExpression(expression, data)
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
async function runExpression (expression, data) {
|
|
496
|
+
const program = new Program(expression)
|
|
497
|
+
const d = program.parse()
|
|
498
|
+
const params = {}
|
|
499
|
+
if (data == null) {
|
|
500
|
+
data = {}
|
|
501
|
+
}
|
|
502
|
+
params.data = data
|
|
503
|
+
params.log = new LogicConsole()
|
|
504
|
+
params.b = 5
|
|
505
|
+
const result = await d.invoke(new JSONObject(params))
|
|
506
|
+
console.log(result)
|
|
507
|
+
return result
|
|
508
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import ExpressionType from '../enums/ExpressionType'
|
|
2
|
+
import ReturnWayException from '../exception/ReturnWayException'
|
|
3
|
+
import JSONObject from '../instances/JSONObject'
|
|
4
|
+
|
|
5
|
+
export default class Delegate {
|
|
6
|
+
exp
|
|
7
|
+
source
|
|
8
|
+
lambdaOutProps = []
|
|
9
|
+
objectNames
|
|
10
|
+
|
|
11
|
+
constructor (exp, source, objectNames) {
|
|
12
|
+
this.exp = exp
|
|
13
|
+
this.source = source
|
|
14
|
+
if (objectNames) {
|
|
15
|
+
this.objectNames = objectNames
|
|
16
|
+
} else {
|
|
17
|
+
this.objectNames = new JSONObject()
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// 执行程序,执行前,参数必须实例化
|
|
22
|
+
async invoke (params) {
|
|
23
|
+
if (params == null) {
|
|
24
|
+
params = new JSONObject()
|
|
25
|
+
}
|
|
26
|
+
// 把初始参数给参数表
|
|
27
|
+
this.objectNames = params
|
|
28
|
+
// 沿根Expression节点遍历,把delegate传递下去
|
|
29
|
+
this.putDelegate(this.exp)
|
|
30
|
+
// 调用exp的执行过程
|
|
31
|
+
try {
|
|
32
|
+
return await this.exp.invoke()
|
|
33
|
+
} catch (returnWay) {
|
|
34
|
+
if (returnWay instanceof ReturnWayException) {
|
|
35
|
+
return returnWay.getReturnObject()
|
|
36
|
+
}
|
|
37
|
+
throw returnWay
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// 沿根节点递归,传递delegate的过程
|
|
42
|
+
putDelegate (parent) {
|
|
43
|
+
for (const child of parent.children) {
|
|
44
|
+
// 有些节点会放空的子节点
|
|
45
|
+
if (child == null) {
|
|
46
|
+
continue
|
|
47
|
+
}
|
|
48
|
+
// try特殊处理
|
|
49
|
+
if (child.type === ExpressionType.Try) {
|
|
50
|
+
const exps = child.value
|
|
51
|
+
if (exps[0] != null) {
|
|
52
|
+
exps[0].setDelegate(this)
|
|
53
|
+
this.putDelegate(exps[0])
|
|
54
|
+
}
|
|
55
|
+
if (exps[1] != null) {
|
|
56
|
+
exps[1].setDelegate(this)
|
|
57
|
+
this.putDelegate(exps[1])
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
child.setDelegate(this)
|
|
61
|
+
this.putDelegate(child)
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// 获取表达式
|
|
66
|
+
getExp () {
|
|
67
|
+
return this.exp
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// 获取对象值存储
|
|
71
|
+
getObjectNames () {
|
|
72
|
+
return this.objectNames
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// 获取lambda外层参数名
|
|
76
|
+
getLambdaOutProps () {
|
|
77
|
+
return this.lambdaOutProps
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// 存储对象值
|
|
81
|
+
put (key, value) {
|
|
82
|
+
this.objectNames.put(key, value)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// 获取对象值
|
|
86
|
+
get (key) {
|
|
87
|
+
return this.objectNames.get(key)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// 检查是否包含某个键
|
|
91
|
+
containsKey (key) {
|
|
92
|
+
return this.objectNames.has(key)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// 获取源代码
|
|
96
|
+
getSource () {
|
|
97
|
+
return this.source
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// 使用参数调用
|
|
101
|
+
async apply (params) {
|
|
102
|
+
if (params === null) {
|
|
103
|
+
params = new JSONObject()
|
|
104
|
+
}
|
|
105
|
+
const map = this.objectNames
|
|
106
|
+
if (this.lambdaOutProps.length === 0) {
|
|
107
|
+
this.lambdaOutProps.push(...map.keySet())
|
|
108
|
+
}
|
|
109
|
+
const lambdaMap = new JSONObject(map)
|
|
110
|
+
lambdaMap.put('data', params)
|
|
111
|
+
return await this.invoke(lambdaMap)
|
|
112
|
+
}
|
|
113
|
+
}
|