amis-formula 2.8.0 → 2.9.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.
@@ -0,0 +1,1074 @@
1
+ /**
2
+ * amis-formula v2.9.0
3
+ * Copyright 2021-2023 fex
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ Object.defineProperty(exports, '__esModule', { value: true });
9
+
10
+ var tslib = require('tslib');
11
+ var evalutor = require('./evalutor.js');
12
+
13
+ function runSequence(arr, fn) {
14
+ return tslib.__awaiter(this, void 0, void 0, function () {
15
+ var result;
16
+ var _this = this;
17
+ return tslib.__generator(this, function (_a) {
18
+ switch (_a.label) {
19
+ case 0:
20
+ result = [];
21
+ return [4 /*yield*/, arr.reduce(function (promise, item, index) { return tslib.__awaiter(_this, void 0, void 0, function () {
22
+ var _a, _b;
23
+ return tslib.__generator(this, function (_c) {
24
+ switch (_c.label) {
25
+ case 0: return [4 /*yield*/, promise];
26
+ case 1:
27
+ _c.sent();
28
+ _b = (_a = result).push;
29
+ return [4 /*yield*/, fn(item, index)];
30
+ case 2:
31
+ _b.apply(_a, [_c.sent()]);
32
+ return [2 /*return*/];
33
+ }
34
+ });
35
+ }); }, Promise.resolve())];
36
+ case 1:
37
+ _a.sent();
38
+ return [2 /*return*/, result];
39
+ }
40
+ });
41
+ });
42
+ }
43
+ var AsyncEvaluator = /** @class */ (function (_super) {
44
+ tslib.__extends(AsyncEvaluator, _super);
45
+ function AsyncEvaluator(data, options) {
46
+ return _super.call(this, data, options) || this;
47
+ }
48
+ AsyncEvaluator.prototype.document = function (ast) {
49
+ return tslib.__awaiter(this, void 0, void 0, function () {
50
+ var isString, content;
51
+ var _this = this;
52
+ return tslib.__generator(this, function (_a) {
53
+ switch (_a.label) {
54
+ case 0:
55
+ if (!ast.body.length) {
56
+ return [2 /*return*/, undefined];
57
+ }
58
+ isString = ast.body.length > 1;
59
+ return [4 /*yield*/, runSequence(ast.body, function (item) { return tslib.__awaiter(_this, void 0, void 0, function () {
60
+ var result;
61
+ return tslib.__generator(this, function (_a) {
62
+ result = this.evalute(item);
63
+ if (isString && result == null) {
64
+ // 不要出现 undefined, null 之类的文案
65
+ return [2 /*return*/, ''];
66
+ }
67
+ return [2 /*return*/, result];
68
+ });
69
+ }); })];
70
+ case 1:
71
+ content = _a.sent();
72
+ return [2 /*return*/, content.length === 1 ? content[0] : content.join('')];
73
+ }
74
+ });
75
+ });
76
+ };
77
+ AsyncEvaluator.prototype.filter = function (ast) {
78
+ return tslib.__awaiter(this, void 0, void 0, function () {
79
+ var input, filters, context, result;
80
+ var _this = this;
81
+ return tslib.__generator(this, function (_a) {
82
+ switch (_a.label) {
83
+ case 0: return [4 /*yield*/, this.evalute(ast.input)];
84
+ case 1:
85
+ input = _a.sent();
86
+ filters = ast.filters.concat();
87
+ context = {
88
+ filter: undefined,
89
+ data: this.context,
90
+ restFilters: filters
91
+ };
92
+ return [4 /*yield*/, filters.reduce(function (ps, filter, index) { return tslib.__awaiter(_this, void 0, void 0, function () {
93
+ var input, fn, argsRes;
94
+ var _this = this;
95
+ return tslib.__generator(this, function (_a) {
96
+ switch (_a.label) {
97
+ case 0: return [4 /*yield*/, ps];
98
+ case 1:
99
+ input = _a.sent();
100
+ fn = this.filters[filter.name];
101
+ if (!fn) {
102
+ throw new Error("filter `".concat(filter.name, "` not exists."));
103
+ }
104
+ context.filter = filter;
105
+ return [4 /*yield*/, filter.args.reduce(function (promise, item) { return tslib.__awaiter(_this, void 0, void 0, function () {
106
+ var _this = this;
107
+ return tslib.__generator(this, function (_a) {
108
+ switch (_a.label) {
109
+ case 0: return [4 /*yield*/, promise];
110
+ case 1:
111
+ _a.sent();
112
+ if ((item === null || item === void 0 ? void 0 : item.type) === 'mixed') {
113
+ return [2 /*return*/, runSequence(item.body, function (item) {
114
+ return typeof item === 'string' ? item : _this.evalute(item);
115
+ })];
116
+ }
117
+ else if (item.type) {
118
+ return [2 /*return*/, this.evalute(item)];
119
+ }
120
+ return [2 /*return*/, item];
121
+ }
122
+ });
123
+ }); }, Promise.resolve([]))];
124
+ case 2:
125
+ argsRes = _a.sent();
126
+ return [2 /*return*/, fn.apply(context, [input].concat(argsRes))];
127
+ }
128
+ });
129
+ }); }, Promise.resolve(input))];
130
+ case 2:
131
+ result = _a.sent();
132
+ return [2 /*return*/, result];
133
+ }
134
+ });
135
+ });
136
+ };
137
+ AsyncEvaluator.prototype.template = function (ast) {
138
+ return tslib.__awaiter(this, void 0, void 0, function () {
139
+ var args;
140
+ var _this = this;
141
+ return tslib.__generator(this, function (_a) {
142
+ switch (_a.label) {
143
+ case 0: return [4 /*yield*/, runSequence(ast.body, function (arg) { return _this.evalute(arg); })];
144
+ case 1:
145
+ args = _a.sent();
146
+ return [2 /*return*/, args.join('')];
147
+ }
148
+ });
149
+ });
150
+ };
151
+ // 下标获取
152
+ AsyncEvaluator.prototype.getter = function (ast) {
153
+ var _a;
154
+ return tslib.__awaiter(this, void 0, void 0, function () {
155
+ var host, key;
156
+ return tslib.__generator(this, function (_b) {
157
+ switch (_b.label) {
158
+ case 0: return [4 /*yield*/, this.evalute(ast.host)];
159
+ case 1:
160
+ host = _b.sent();
161
+ return [4 /*yield*/, this.evalute(ast.key)];
162
+ case 2:
163
+ key = _b.sent();
164
+ if (typeof key === 'undefined' && ((_a = ast.key) === null || _a === void 0 ? void 0 : _a.type) === 'variable') {
165
+ key = ast.key.name;
166
+ }
167
+ return [2 /*return*/, host === null || host === void 0 ? void 0 : host[key]];
168
+ }
169
+ });
170
+ });
171
+ };
172
+ // 位操作如 +2 ~3 !
173
+ AsyncEvaluator.prototype.unary = function (ast) {
174
+ return tslib.__awaiter(this, void 0, void 0, function () {
175
+ var value;
176
+ return tslib.__generator(this, function (_a) {
177
+ switch (_a.label) {
178
+ case 0: return [4 /*yield*/, this.evalute(ast.value)];
179
+ case 1:
180
+ value = _a.sent();
181
+ switch (ast.op) {
182
+ case '+':
183
+ return [2 /*return*/, +value];
184
+ case '-':
185
+ return [2 /*return*/, -value];
186
+ case '~':
187
+ return [2 /*return*/, ~value];
188
+ case '!':
189
+ return [2 /*return*/, !value];
190
+ }
191
+ return [2 /*return*/];
192
+ }
193
+ });
194
+ });
195
+ };
196
+ AsyncEvaluator.prototype.power = function (ast) {
197
+ return tslib.__awaiter(this, void 0, void 0, function () {
198
+ var left, right;
199
+ return tslib.__generator(this, function (_a) {
200
+ switch (_a.label) {
201
+ case 0: return [4 /*yield*/, this.evalute(ast.left)];
202
+ case 1:
203
+ left = _a.sent();
204
+ return [4 /*yield*/, this.evalute(ast.right)];
205
+ case 2:
206
+ right = _a.sent();
207
+ return [2 /*return*/, Math.pow(this.formatNumber(left), this.formatNumber(right))];
208
+ }
209
+ });
210
+ });
211
+ };
212
+ AsyncEvaluator.prototype.multiply = function (ast) {
213
+ return tslib.__awaiter(this, void 0, void 0, function () {
214
+ var left, right;
215
+ return tslib.__generator(this, function (_a) {
216
+ switch (_a.label) {
217
+ case 0: return [4 /*yield*/, this.evalute(ast.left)];
218
+ case 1:
219
+ left = _a.sent();
220
+ return [4 /*yield*/, this.evalute(ast.right)];
221
+ case 2:
222
+ right = _a.sent();
223
+ return [2 /*return*/, evalutor.stripNumber(this.formatNumber(left) * this.formatNumber(right))];
224
+ }
225
+ });
226
+ });
227
+ };
228
+ AsyncEvaluator.prototype.divide = function (ast) {
229
+ return tslib.__awaiter(this, void 0, void 0, function () {
230
+ var left, right;
231
+ return tslib.__generator(this, function (_a) {
232
+ switch (_a.label) {
233
+ case 0: return [4 /*yield*/, this.evalute(ast.left)];
234
+ case 1:
235
+ left = _a.sent();
236
+ return [4 /*yield*/, this.evalute(ast.right)];
237
+ case 2:
238
+ right = _a.sent();
239
+ return [2 /*return*/, evalutor.stripNumber(this.formatNumber(left) / this.formatNumber(right))];
240
+ }
241
+ });
242
+ });
243
+ };
244
+ AsyncEvaluator.prototype.remainder = function (ast) {
245
+ return tslib.__awaiter(this, void 0, void 0, function () {
246
+ var left, right;
247
+ return tslib.__generator(this, function (_a) {
248
+ switch (_a.label) {
249
+ case 0: return [4 /*yield*/, this.evalute(ast.left)];
250
+ case 1:
251
+ left = _a.sent();
252
+ return [4 /*yield*/, this.evalute(ast.right)];
253
+ case 2:
254
+ right = _a.sent();
255
+ return [2 /*return*/, this.formatNumber(left) % this.formatNumber(right)];
256
+ }
257
+ });
258
+ });
259
+ };
260
+ AsyncEvaluator.prototype.add = function (ast) {
261
+ return tslib.__awaiter(this, void 0, void 0, function () {
262
+ var left, right;
263
+ return tslib.__generator(this, function (_a) {
264
+ switch (_a.label) {
265
+ case 0: return [4 /*yield*/, this.evalute(ast.left)];
266
+ case 1:
267
+ left = _a.sent();
268
+ return [4 /*yield*/, this.evalute(ast.right)];
269
+ case 2:
270
+ right = _a.sent();
271
+ // 如果有一个不是数字就变成字符串拼接
272
+ if (isNaN(left) || isNaN(right)) {
273
+ return [2 /*return*/, left + right];
274
+ }
275
+ return [2 /*return*/, evalutor.stripNumber(this.formatNumber(left) + this.formatNumber(right))];
276
+ }
277
+ });
278
+ });
279
+ };
280
+ AsyncEvaluator.prototype.minus = function (ast) {
281
+ return tslib.__awaiter(this, void 0, void 0, function () {
282
+ var left, right;
283
+ return tslib.__generator(this, function (_a) {
284
+ switch (_a.label) {
285
+ case 0: return [4 /*yield*/, this.evalute(ast.left)];
286
+ case 1:
287
+ left = _a.sent();
288
+ return [4 /*yield*/, this.evalute(ast.right)];
289
+ case 2:
290
+ right = _a.sent();
291
+ return [2 /*return*/, evalutor.stripNumber(this.formatNumber(left) - this.formatNumber(right))];
292
+ }
293
+ });
294
+ });
295
+ };
296
+ AsyncEvaluator.prototype.shift = function (ast) {
297
+ return tslib.__awaiter(this, void 0, void 0, function () {
298
+ var left, right;
299
+ return tslib.__generator(this, function (_a) {
300
+ switch (_a.label) {
301
+ case 0: return [4 /*yield*/, this.evalute(ast.left)];
302
+ case 1:
303
+ left = _a.sent();
304
+ return [4 /*yield*/, this.formatNumber(this.evalute(ast.right), true)];
305
+ case 2:
306
+ right = _a.sent();
307
+ if (ast.op === '<<') {
308
+ return [2 /*return*/, left << right];
309
+ }
310
+ else if (ast.op == '>>') {
311
+ return [2 /*return*/, left >> right];
312
+ }
313
+ else {
314
+ return [2 /*return*/, left >>> right];
315
+ }
316
+ }
317
+ });
318
+ });
319
+ };
320
+ AsyncEvaluator.prototype.lt = function (ast) {
321
+ return tslib.__awaiter(this, void 0, void 0, function () {
322
+ var left, right;
323
+ return tslib.__generator(this, function (_a) {
324
+ switch (_a.label) {
325
+ case 0: return [4 /*yield*/, this.evalute(ast.left)];
326
+ case 1:
327
+ left = _a.sent();
328
+ return [4 /*yield*/, this.evalute(ast.right)];
329
+ case 2:
330
+ right = _a.sent();
331
+ // todo 如果是日期的对比,这个地方可以优化一下。
332
+ return [2 /*return*/, left < right];
333
+ }
334
+ });
335
+ });
336
+ };
337
+ AsyncEvaluator.prototype.gt = function (ast) {
338
+ return tslib.__awaiter(this, void 0, void 0, function () {
339
+ var left, right;
340
+ return tslib.__generator(this, function (_a) {
341
+ switch (_a.label) {
342
+ case 0: return [4 /*yield*/, this.evalute(ast.left)];
343
+ case 1:
344
+ left = _a.sent();
345
+ return [4 /*yield*/, this.evalute(ast.right)];
346
+ case 2:
347
+ right = _a.sent();
348
+ // todo 如果是日期的对比,这个地方可以优化一下。
349
+ return [2 /*return*/, left > right];
350
+ }
351
+ });
352
+ });
353
+ };
354
+ AsyncEvaluator.prototype.le = function (ast) {
355
+ return tslib.__awaiter(this, void 0, void 0, function () {
356
+ var left, right;
357
+ return tslib.__generator(this, function (_a) {
358
+ switch (_a.label) {
359
+ case 0: return [4 /*yield*/, this.evalute(ast.left)];
360
+ case 1:
361
+ left = _a.sent();
362
+ return [4 /*yield*/, this.evalute(ast.right)];
363
+ case 2:
364
+ right = _a.sent();
365
+ // todo 如果是日期的对比,这个地方可以优化一下。
366
+ return [2 /*return*/, left <= right];
367
+ }
368
+ });
369
+ });
370
+ };
371
+ AsyncEvaluator.prototype.ge = function (ast) {
372
+ return tslib.__awaiter(this, void 0, void 0, function () {
373
+ var left, right;
374
+ return tslib.__generator(this, function (_a) {
375
+ switch (_a.label) {
376
+ case 0: return [4 /*yield*/, this.evalute(ast.left)];
377
+ case 1:
378
+ left = _a.sent();
379
+ return [4 /*yield*/, this.evalute(ast.right)];
380
+ case 2:
381
+ right = _a.sent();
382
+ // todo 如果是日期的对比,这个地方可以优化一下。
383
+ return [2 /*return*/, left >= right];
384
+ }
385
+ });
386
+ });
387
+ };
388
+ AsyncEvaluator.prototype.eq = function (ast) {
389
+ return tslib.__awaiter(this, void 0, void 0, function () {
390
+ var left, right;
391
+ return tslib.__generator(this, function (_a) {
392
+ switch (_a.label) {
393
+ case 0: return [4 /*yield*/, this.evalute(ast.left)];
394
+ case 1:
395
+ left = _a.sent();
396
+ return [4 /*yield*/, this.evalute(ast.right)];
397
+ case 2:
398
+ right = _a.sent();
399
+ // todo 如果是日期的对比,这个地方可以优化一下。
400
+ return [2 /*return*/, left == right];
401
+ }
402
+ });
403
+ });
404
+ };
405
+ AsyncEvaluator.prototype.ne = function (ast) {
406
+ return tslib.__awaiter(this, void 0, void 0, function () {
407
+ var left, right;
408
+ return tslib.__generator(this, function (_a) {
409
+ switch (_a.label) {
410
+ case 0: return [4 /*yield*/, this.evalute(ast.left)];
411
+ case 1:
412
+ left = _a.sent();
413
+ return [4 /*yield*/, this.evalute(ast.right)];
414
+ case 2:
415
+ right = _a.sent();
416
+ // todo 如果是日期的对比,这个地方可以优化一下。
417
+ return [2 /*return*/, left != right];
418
+ }
419
+ });
420
+ });
421
+ };
422
+ AsyncEvaluator.prototype.streq = function (ast) {
423
+ return tslib.__awaiter(this, void 0, void 0, function () {
424
+ var left, right;
425
+ return tslib.__generator(this, function (_a) {
426
+ switch (_a.label) {
427
+ case 0: return [4 /*yield*/, this.evalute(ast.left)];
428
+ case 1:
429
+ left = _a.sent();
430
+ return [4 /*yield*/, this.evalute(ast.right)];
431
+ case 2:
432
+ right = _a.sent();
433
+ // todo 如果是日期的对比,这个地方可以优化一下。
434
+ return [2 /*return*/, left === right];
435
+ }
436
+ });
437
+ });
438
+ };
439
+ AsyncEvaluator.prototype.strneq = function (ast) {
440
+ return tslib.__awaiter(this, void 0, void 0, function () {
441
+ var left, right;
442
+ return tslib.__generator(this, function (_a) {
443
+ switch (_a.label) {
444
+ case 0: return [4 /*yield*/, this.evalute(ast.left)];
445
+ case 1:
446
+ left = _a.sent();
447
+ return [4 /*yield*/, this.evalute(ast.right)];
448
+ case 2:
449
+ right = _a.sent();
450
+ // todo 如果是日期的对比,这个地方可以优化一下。
451
+ return [2 /*return*/, left !== right];
452
+ }
453
+ });
454
+ });
455
+ };
456
+ AsyncEvaluator.prototype.binary = function (ast) {
457
+ return tslib.__awaiter(this, void 0, void 0, function () {
458
+ var left, right;
459
+ return tslib.__generator(this, function (_a) {
460
+ switch (_a.label) {
461
+ case 0: return [4 /*yield*/, this.evalute(ast.left)];
462
+ case 1:
463
+ left = _a.sent();
464
+ return [4 /*yield*/, this.evalute(ast.right)];
465
+ case 2:
466
+ right = _a.sent();
467
+ if (ast.op === '&') {
468
+ return [2 /*return*/, left & right];
469
+ }
470
+ else if (ast.op === '^') {
471
+ return [2 /*return*/, left ^ right];
472
+ }
473
+ else {
474
+ return [2 /*return*/, left | right];
475
+ }
476
+ }
477
+ });
478
+ });
479
+ };
480
+ AsyncEvaluator.prototype.and = function (ast) {
481
+ return tslib.__awaiter(this, void 0, void 0, function () {
482
+ var left;
483
+ return tslib.__generator(this, function (_a) {
484
+ switch (_a.label) {
485
+ case 0: return [4 /*yield*/, this.evalute(ast.left)];
486
+ case 1:
487
+ left = _a.sent();
488
+ return [2 /*return*/, left && this.evalute(ast.right)];
489
+ }
490
+ });
491
+ });
492
+ };
493
+ AsyncEvaluator.prototype.or = function (ast) {
494
+ return tslib.__awaiter(this, void 0, void 0, function () {
495
+ var left;
496
+ return tslib.__generator(this, function (_a) {
497
+ switch (_a.label) {
498
+ case 0: return [4 /*yield*/, this.evalute(ast.left)];
499
+ case 1:
500
+ left = _a.sent();
501
+ return [2 /*return*/, left || this.evalute(ast.right)];
502
+ }
503
+ });
504
+ });
505
+ };
506
+ AsyncEvaluator.prototype.array = function (ast) {
507
+ var _this = this;
508
+ return runSequence(ast.members, function (member) { return _this.evalute(member); });
509
+ };
510
+ AsyncEvaluator.prototype.object = function (ast) {
511
+ return tslib.__awaiter(this, void 0, void 0, function () {
512
+ var object;
513
+ var _this = this;
514
+ return tslib.__generator(this, function (_a) {
515
+ switch (_a.label) {
516
+ case 0:
517
+ object = {};
518
+ return [4 /*yield*/, ast.members.reduce(function (promise, _a, index) {
519
+ var key = _a.key, value = _a.value;
520
+ return tslib.__awaiter(_this, void 0, void 0, function () {
521
+ var objKey, objVal;
522
+ return tslib.__generator(this, function (_b) {
523
+ switch (_b.label) {
524
+ case 0: return [4 /*yield*/, promise];
525
+ case 1:
526
+ _b.sent();
527
+ return [4 /*yield*/, this.evalute(key)];
528
+ case 2:
529
+ objKey = _b.sent();
530
+ return [4 /*yield*/, this.evalute(value)];
531
+ case 3:
532
+ objVal = _b.sent();
533
+ object[objKey] = objVal;
534
+ return [2 /*return*/];
535
+ }
536
+ });
537
+ });
538
+ }, Promise.resolve())];
539
+ case 1:
540
+ _a.sent();
541
+ return [2 /*return*/, object];
542
+ }
543
+ });
544
+ });
545
+ };
546
+ AsyncEvaluator.prototype.conditional = function (ast) {
547
+ return tslib.__awaiter(this, void 0, void 0, function () {
548
+ var _a;
549
+ return tslib.__generator(this, function (_b) {
550
+ switch (_b.label) {
551
+ case 0: return [4 /*yield*/, this.evalute(ast.test)];
552
+ case 1:
553
+ if (!(_b.sent())) return [3 /*break*/, 3];
554
+ return [4 /*yield*/, this.evalute(ast.consequent)];
555
+ case 2:
556
+ _a = _b.sent();
557
+ return [3 /*break*/, 5];
558
+ case 3: return [4 /*yield*/, this.evalute(ast.alternate)];
559
+ case 4:
560
+ _a = _b.sent();
561
+ _b.label = 5;
562
+ case 5: return [2 /*return*/, _a];
563
+ }
564
+ });
565
+ });
566
+ };
567
+ AsyncEvaluator.prototype.funcCall = function (ast) {
568
+ return tslib.__awaiter(this, void 0, void 0, function () {
569
+ var fnName, fn, args;
570
+ var _this = this;
571
+ return tslib.__generator(this, function (_a) {
572
+ switch (_a.label) {
573
+ case 0:
574
+ fnName = "fn".concat(ast.identifier);
575
+ fn = this.functions[fnName] ||
576
+ this[fnName] ||
577
+ (this.filters.hasOwnProperty(ast.identifier) &&
578
+ this.filters[ast.identifier]);
579
+ if (!fn) {
580
+ throw new Error("".concat(ast.identifier, "\u51FD\u6570\u6CA1\u6709\u5B9A\u4E49"));
581
+ }
582
+ args = ast.args;
583
+ if (!~['IF', 'AND', 'OR', 'XOR', 'IFS'].indexOf(ast.identifier)) return [3 /*break*/, 1];
584
+ args = args.map(function (a) { return function () { return _this.evalute(a); }; });
585
+ return [3 /*break*/, 3];
586
+ case 1: return [4 /*yield*/, runSequence(args, function (a) { return _this.evalute(a); })];
587
+ case 2:
588
+ args = _a.sent();
589
+ _a.label = 3;
590
+ case 3: return [2 /*return*/, fn.apply(this, args)];
591
+ }
592
+ });
593
+ });
594
+ };
595
+ AsyncEvaluator.prototype.callAnonymousFunction = function (ast, args) {
596
+ return tslib.__awaiter(this, void 0, void 0, function () {
597
+ var ctx, result;
598
+ return tslib.__generator(this, function (_a) {
599
+ switch (_a.label) {
600
+ case 0:
601
+ ctx = evalutor.createObject(this.contextStack[this.contextStack.length - 1]('&') || {}, {});
602
+ ast.args.forEach(function (arg) {
603
+ if (arg.type !== 'variable') {
604
+ throw new Error('expected a variable as argument');
605
+ }
606
+ ctx[arg.name] = args.shift();
607
+ });
608
+ this.contextStack.push(function (varName) {
609
+ return varName === '&' ? ctx : ctx[varName];
610
+ });
611
+ return [4 /*yield*/, this.evalute(ast.return)];
612
+ case 1:
613
+ result = _a.sent();
614
+ this.contextStack.pop();
615
+ return [2 /*return*/, result];
616
+ }
617
+ });
618
+ });
619
+ };
620
+ /**
621
+ * 示例:IF(A, B, C)
622
+ *
623
+ * 如果满足条件A,则返回B,否则返回C,支持多层嵌套IF函数。
624
+ *
625
+ * 也可以用表达式如:A ? B : C
626
+ *
627
+ * @example IF(condition, consequent, alternate)
628
+ * @param {expression} condition - 条件表达式.
629
+ * @param {any} consequent 条件判断通过的返回结果
630
+ * @param {any} alternate 条件判断不通过的返回结果
631
+ * @namespace 逻辑函数
632
+ *
633
+ * @returns {any} 根据条件返回不同的结果
634
+ */
635
+ AsyncEvaluator.prototype.fnIF = function (condition, trueValue, falseValue) {
636
+ return tslib.__awaiter(this, void 0, void 0, function () {
637
+ var _a;
638
+ return tslib.__generator(this, function (_b) {
639
+ switch (_b.label) {
640
+ case 0: return [4 /*yield*/, condition()];
641
+ case 1:
642
+ if (!(_b.sent())) return [3 /*break*/, 3];
643
+ return [4 /*yield*/, trueValue()];
644
+ case 2:
645
+ _a = _b.sent();
646
+ return [3 /*break*/, 5];
647
+ case 3: return [4 /*yield*/, falseValue()];
648
+ case 4:
649
+ _a = _b.sent();
650
+ _b.label = 5;
651
+ case 5: return [2 /*return*/, _a];
652
+ }
653
+ });
654
+ });
655
+ };
656
+ /**
657
+ * 条件全部符合,返回 true,否则返回 false
658
+ *
659
+ * 示例:AND(语文成绩>80, 数学成绩>80)
660
+ *
661
+ * 语文成绩和数学成绩都大于 80,则返回 true,否则返回 false
662
+ *
663
+ * 也可以直接用表达式如:语文成绩>80 && 数学成绩>80
664
+ *
665
+ * @example AND(expression1, expression2, ...expressionN)
666
+ * @param {...expression} conditions - 条件表达式.
667
+ * @namespace 逻辑函数
668
+ *
669
+ * @returns {boolean}
670
+ */
671
+ AsyncEvaluator.prototype.fnAND = function () {
672
+ var condtions = [];
673
+ for (var _i = 0; _i < arguments.length; _i++) {
674
+ condtions[_i] = arguments[_i];
675
+ }
676
+ return tslib.__awaiter(this, void 0, void 0, function () {
677
+ var _this = this;
678
+ return tslib.__generator(this, function (_a) {
679
+ if (!condtions.length) {
680
+ return [2 /*return*/, false];
681
+ }
682
+ return [2 /*return*/, condtions.reduce(function (promise, c) { return tslib.__awaiter(_this, void 0, void 0, function () {
683
+ var result;
684
+ return tslib.__generator(this, function (_a) {
685
+ switch (_a.label) {
686
+ case 0: return [4 /*yield*/, promise];
687
+ case 1:
688
+ result = _a.sent();
689
+ if (result) {
690
+ return [2 /*return*/, c()];
691
+ }
692
+ return [2 /*return*/, result];
693
+ }
694
+ });
695
+ }); }, Promise.resolve(true))];
696
+ });
697
+ });
698
+ };
699
+ /**
700
+ * 条件任意一个满足条件,返回 true,否则返回 false
701
+ *
702
+ * 示例:OR(语文成绩>80, 数学成绩>80)
703
+ *
704
+ * 语文成绩和数学成绩任意一个大于 80,则返回 true,否则返回 false
705
+ *
706
+ * 也可以直接用表达式如:语文成绩>80 || 数学成绩>80
707
+ *
708
+ * @example OR(expression1, expression2, ...expressionN)
709
+ * @param {...expression} conditions - 条件表达式.
710
+ * @namespace 逻辑函数
711
+ *
712
+ * @returns {boolean}
713
+ */
714
+ AsyncEvaluator.prototype.fnOR = function () {
715
+ var condtions = [];
716
+ for (var _i = 0; _i < arguments.length; _i++) {
717
+ condtions[_i] = arguments[_i];
718
+ }
719
+ return tslib.__awaiter(this, void 0, void 0, function () {
720
+ var _this = this;
721
+ return tslib.__generator(this, function (_a) {
722
+ if (!condtions.length) {
723
+ return [2 /*return*/, false];
724
+ }
725
+ return [2 /*return*/, condtions.reduce(function (promise, c) { return tslib.__awaiter(_this, void 0, void 0, function () {
726
+ var result;
727
+ return tslib.__generator(this, function (_a) {
728
+ switch (_a.label) {
729
+ case 0: return [4 /*yield*/, promise];
730
+ case 1:
731
+ result = _a.sent();
732
+ if (result) {
733
+ return [2 /*return*/, true];
734
+ }
735
+ return [2 /*return*/, c()];
736
+ }
737
+ });
738
+ }); }, Promise.resolve(false))];
739
+ });
740
+ });
741
+ };
742
+ /**
743
+ * 异或处理,多个表达式组中存在奇数个真时认为真。
744
+ *
745
+ * @example XOR(condition1, condition2)
746
+ * @param {expression} condition1 - 条件表达式1
747
+ * @param {expression} condition2 - 条件表达式2
748
+ * @namespace 逻辑函数
749
+ *
750
+ * @returns {boolean}
751
+ */
752
+ AsyncEvaluator.prototype.fnXOR = function () {
753
+ var condtions = [];
754
+ for (var _i = 0; _i < arguments.length; _i++) {
755
+ condtions[_i] = arguments[_i];
756
+ }
757
+ return tslib.__awaiter(this, void 0, void 0, function () {
758
+ return tslib.__generator(this, function (_a) {
759
+ switch (_a.label) {
760
+ case 0:
761
+ if (!condtions.length) {
762
+ return [2 /*return*/, false];
763
+ }
764
+ return [4 /*yield*/, runSequence(condtions, function (c) { return c(); })];
765
+ case 1: return [2 /*return*/, !!((_a.sent()).filter(function (item) { return item; }).length % 2)];
766
+ }
767
+ });
768
+ });
769
+ };
770
+ /**
771
+ * 判断函数集合,相当于多个 else if 合并成一个。
772
+ *
773
+ * 示例:IFS(语文成绩 > 80, "优秀", 语文成绩 > 60, "良", "继续努力")
774
+ *
775
+ * 如果语文成绩大于 80,则返回优秀,否则判断大于 60 分,则返回良,否则返回继续努力。
776
+ *
777
+ * @example IFS(condition1, result1, condition2, result2,...conditionN, resultN)
778
+ * @param {...any} args - 条件,返回值集合
779
+ * @namespace 逻辑函数
780
+ * @returns {any} 第一个满足条件的结果,没有命中的返回 false。
781
+ */
782
+ AsyncEvaluator.prototype.fnIFS = function () {
783
+ var args = [];
784
+ for (var _i = 0; _i < arguments.length; _i++) {
785
+ args[_i] = arguments[_i];
786
+ }
787
+ return tslib.__awaiter(this, void 0, void 0, function () {
788
+ var c, v;
789
+ return tslib.__generator(this, function (_a) {
790
+ switch (_a.label) {
791
+ case 0:
792
+ if (args.length % 2) {
793
+ args.splice(args.length - 1, 0, function () { return true; });
794
+ }
795
+ _a.label = 1;
796
+ case 1:
797
+ if (!args.length) return [3 /*break*/, 5];
798
+ c = args.shift();
799
+ v = args.shift();
800
+ return [4 /*yield*/, c()];
801
+ case 2:
802
+ if (!_a.sent()) return [3 /*break*/, 4];
803
+ return [4 /*yield*/, v()];
804
+ case 3: return [2 /*return*/, _a.sent()];
805
+ case 4: return [3 /*break*/, 1];
806
+ case 5: return [2 /*return*/];
807
+ }
808
+ });
809
+ });
810
+ };
811
+ /**
812
+ * 数组做数据转换,需要搭配箭头函数一起使用,注意箭头函数只支持单表达式用法。
813
+ *
814
+ * @param {Array<any>} arr 数组
815
+ * @param {Function<any>} iterator 箭头函数
816
+ * @namespace 数组
817
+ * @example ARRAYMAP(arr, item => item)
818
+ * @returns {boolean} 结果
819
+ */
820
+ AsyncEvaluator.prototype.fnARRAYMAP = function (value, iterator) {
821
+ var _this = this;
822
+ if (!iterator || iterator.type !== 'anonymous_function') {
823
+ throw new Error('expected an anonymous function get ' + iterator);
824
+ }
825
+ return (Array.isArray(value) ? value : []).reduce(function (promise, item, index) { return tslib.__awaiter(_this, void 0, void 0, function () {
826
+ var arr, _a, _b;
827
+ return tslib.__generator(this, function (_c) {
828
+ switch (_c.label) {
829
+ case 0: return [4 /*yield*/, promise];
830
+ case 1:
831
+ arr = _c.sent();
832
+ _b = (_a = arr).push;
833
+ return [4 /*yield*/, this.callAnonymousFunction(iterator, [item, index])];
834
+ case 2:
835
+ _b.apply(_a, [_c.sent()]);
836
+ return [2 /*return*/, arr];
837
+ }
838
+ });
839
+ }); }, Promise.resolve([]));
840
+ };
841
+ /**
842
+ * 数据做数据过滤,需要搭配箭头函数一起使用,注意箭头函数只支持单表达式用法。
843
+ * 将第二个箭头函数返回为 false 的成员过滤掉。
844
+ *
845
+ * @param {Array<any>} arr 数组
846
+ * @param {Function<any>} iterator 箭头函数
847
+ * @namespace 数组
848
+ * @example ARRAYFILTER(arr, item => item)
849
+ * @returns {boolean} 结果
850
+ */
851
+ AsyncEvaluator.prototype.fnARRAYFILTER = function (value, iterator) {
852
+ return tslib.__awaiter(this, void 0, void 0, function () {
853
+ var _this = this;
854
+ return tslib.__generator(this, function (_a) {
855
+ switch (_a.label) {
856
+ case 0:
857
+ if (!iterator || iterator.type !== 'anonymous_function') {
858
+ throw new Error('expected an anonymous function get ' + iterator);
859
+ }
860
+ return [4 /*yield*/, (Array.isArray(value) ? value : []).reduce(function (promise, item, index) { return tslib.__awaiter(_this, void 0, void 0, function () {
861
+ var arr, hit;
862
+ return tslib.__generator(this, function (_a) {
863
+ switch (_a.label) {
864
+ case 0: return [4 /*yield*/, promise];
865
+ case 1:
866
+ arr = _a.sent();
867
+ return [4 /*yield*/, this.callAnonymousFunction(iterator, [item, index])];
868
+ case 2:
869
+ hit = _a.sent();
870
+ if (hit) {
871
+ arr.push(item);
872
+ }
873
+ return [2 /*return*/, arr];
874
+ }
875
+ });
876
+ }); }, Promise.resolve([]))];
877
+ case 1: return [2 /*return*/, _a.sent()];
878
+ }
879
+ });
880
+ });
881
+ };
882
+ /**
883
+ * 数据做数据查找,需要搭配箭头函数一起使用,注意箭头函数只支持单表达式用法。
884
+ * 找出第二个箭头函数返回为 true 的成员的索引。
885
+ *
886
+ * 示例:
887
+ *
888
+ * ARRAYFINDINDEX([0, 2, false], item => item === 2) 得到 1
889
+ *
890
+ * @param {Array<any>} arr 数组
891
+ * @param {Function<any>} iterator 箭头函数
892
+ * @namespace 数组
893
+ * @example ARRAYFINDINDEX(arr, item => item === 2)
894
+ * @returns {number} 结果
895
+ */
896
+ AsyncEvaluator.prototype.fnARRAYFINDINDEX = function (arr, iterator) {
897
+ return tslib.__awaiter(this, void 0, void 0, function () {
898
+ var hitIndex;
899
+ var _this = this;
900
+ return tslib.__generator(this, function (_a) {
901
+ switch (_a.label) {
902
+ case 0:
903
+ if (!iterator || iterator.type !== 'anonymous_function') {
904
+ throw new Error('expected an anonymous function get ' + iterator);
905
+ }
906
+ hitIndex = -1;
907
+ return [4 /*yield*/, (Array.isArray(arr) ? arr : []).reduce(function (promise, item, index) { return tslib.__awaiter(_this, void 0, void 0, function () {
908
+ var hit;
909
+ return tslib.__generator(this, function (_a) {
910
+ switch (_a.label) {
911
+ case 0: return [4 /*yield*/, promise];
912
+ case 1:
913
+ _a.sent();
914
+ return [4 /*yield*/, this.callAnonymousFunction(iterator, [item, index])];
915
+ case 2:
916
+ hit = _a.sent();
917
+ if (hit) {
918
+ hitIndex = index;
919
+ }
920
+ return [2 /*return*/];
921
+ }
922
+ });
923
+ }); }, Promise.resolve())];
924
+ case 1:
925
+ _a.sent();
926
+ return [2 /*return*/, hitIndex];
927
+ }
928
+ });
929
+ });
930
+ };
931
+ /**
932
+ * 数据做数据查找,需要搭配箭头函数一起使用,注意箭头函数只支持单表达式用法。
933
+ * 找出第二个箭头函数返回为 true 的成员。
934
+ *
935
+ * 示例:
936
+ *
937
+ * ARRAYFIND([0, 2, false], item => item === 2) 得到 2
938
+ *
939
+ * @param {Array<any>} arr 数组
940
+ * @param {Function<any>} iterator 箭头函数
941
+ * @namespace 数组
942
+ * @example ARRAYFIND(arr, item => item === 2)
943
+ * @returns {any} 结果
944
+ */
945
+ AsyncEvaluator.prototype.fnARRAYFIND = function (arr, iterator) {
946
+ return tslib.__awaiter(this, void 0, void 0, function () {
947
+ var hitItem;
948
+ var _this = this;
949
+ return tslib.__generator(this, function (_a) {
950
+ switch (_a.label) {
951
+ case 0:
952
+ if (!iterator || iterator.type !== 'anonymous_function') {
953
+ throw new Error('expected an anonymous function get ' + iterator);
954
+ }
955
+ hitItem = undefined;
956
+ return [4 /*yield*/, (Array.isArray(arr) ? arr : []).reduce(function (promise, item, index) { return tslib.__awaiter(_this, void 0, void 0, function () {
957
+ var hit;
958
+ return tslib.__generator(this, function (_a) {
959
+ switch (_a.label) {
960
+ case 0: return [4 /*yield*/, promise];
961
+ case 1:
962
+ _a.sent();
963
+ return [4 /*yield*/, this.callAnonymousFunction(iterator, [item, index])];
964
+ case 2:
965
+ hit = _a.sent();
966
+ if (hit) {
967
+ hitItem = item;
968
+ }
969
+ return [2 /*return*/];
970
+ }
971
+ });
972
+ }); }, Promise.resolve())];
973
+ case 1:
974
+ _a.sent();
975
+ return [2 /*return*/, hitItem];
976
+ }
977
+ });
978
+ });
979
+ };
980
+ /**
981
+ * 数据做数据遍历判断,需要搭配箭头函数一起使用,注意箭头函数只支持单表达式用法。
982
+ * 判断第二个箭头函数是否存在返回为 true 的成员。
983
+ *
984
+ * 示例:
985
+ *
986
+ * ARRAYSOME([0, 2, false], item => item === 2) 得到 true
987
+ *
988
+ * @param {Array<any>} arr 数组
989
+ * @param {Function<any>} iterator 箭头函数
990
+ * @namespace 数组
991
+ * @example ARRAYSOME(arr, item => item === 2)
992
+ * @returns {boolean} 结果
993
+ */
994
+ AsyncEvaluator.prototype.fnARRAYSOME = function (arr, iterator) {
995
+ return tslib.__awaiter(this, void 0, void 0, function () {
996
+ var result;
997
+ var _this = this;
998
+ return tslib.__generator(this, function (_a) {
999
+ switch (_a.label) {
1000
+ case 0:
1001
+ if (!iterator || iterator.type !== 'anonymous_function') {
1002
+ throw new Error('expected an anonymous function get ' + iterator);
1003
+ }
1004
+ return [4 /*yield*/, (Array.isArray(arr) ? arr : []).reduce(function (promise, item, index) { return tslib.__awaiter(_this, void 0, void 0, function () {
1005
+ var prev, hit;
1006
+ return tslib.__generator(this, function (_a) {
1007
+ switch (_a.label) {
1008
+ case 0: return [4 /*yield*/, promise];
1009
+ case 1:
1010
+ prev = _a.sent();
1011
+ return [4 /*yield*/, this.callAnonymousFunction(iterator, [item, index])];
1012
+ case 2:
1013
+ hit = _a.sent();
1014
+ return [2 /*return*/, prev || hit];
1015
+ }
1016
+ });
1017
+ }); }, Promise.resolve(false))];
1018
+ case 1:
1019
+ result = _a.sent();
1020
+ return [2 /*return*/, result];
1021
+ }
1022
+ });
1023
+ });
1024
+ };
1025
+ /**
1026
+ * 数据做数据遍历判断,需要搭配箭头函数一起使用,注意箭头函数只支持单表达式用法。
1027
+ * 判断第二个箭头函数返回是否都为 true。
1028
+ *
1029
+ * 示例:
1030
+ *
1031
+ * ARRAYEVERY([0, 2, false], item => item === 2) 得到 false
1032
+ *
1033
+ * @param {Array<any>} arr 数组
1034
+ * @param {Function<any>} iterator 箭头函数
1035
+ * @namespace 数组
1036
+ * @example ARRAYEVERY(arr, item => item === 2)
1037
+ * @returns {boolean} 结果
1038
+ */
1039
+ AsyncEvaluator.prototype.fnARRAYEVERY = function (arr, iterator) {
1040
+ return tslib.__awaiter(this, void 0, void 0, function () {
1041
+ var result;
1042
+ var _this = this;
1043
+ return tslib.__generator(this, function (_a) {
1044
+ switch (_a.label) {
1045
+ case 0:
1046
+ if (!iterator || iterator.type !== 'anonymous_function') {
1047
+ throw new Error('expected an anonymous function get ' + iterator);
1048
+ }
1049
+ return [4 /*yield*/, (Array.isArray(arr) ? arr : []).reduce(function (promise, item, index) { return tslib.__awaiter(_this, void 0, void 0, function () {
1050
+ var prev, hit;
1051
+ return tslib.__generator(this, function (_a) {
1052
+ switch (_a.label) {
1053
+ case 0: return [4 /*yield*/, promise];
1054
+ case 1:
1055
+ prev = _a.sent();
1056
+ return [4 /*yield*/, this.callAnonymousFunction(iterator, [item, index])];
1057
+ case 2:
1058
+ hit = _a.sent();
1059
+ return [2 /*return*/, prev && hit];
1060
+ }
1061
+ });
1062
+ }); }, Promise.resolve(true))];
1063
+ case 1:
1064
+ result = _a.sent();
1065
+ return [2 /*return*/, result];
1066
+ }
1067
+ });
1068
+ });
1069
+ };
1070
+ return AsyncEvaluator;
1071
+ }(evalutor.Evaluator));
1072
+
1073
+ exports.AsyncEvaluator = AsyncEvaluator;
1074
+ exports.runSequence = runSequence;