amis-formula 3.4.1 → 3.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/doc.js +23 -1
- package/esm/doc.md +11 -0
- package/esm/error.js +1 -1
- package/esm/evalutor.d.ts +24 -0
- package/esm/evalutor.js +82 -4
- package/esm/evalutorForAsync.js +1 -1
- package/esm/filter.js +1 -1
- package/esm/function.js +1 -1
- package/esm/index.js +1 -1
- package/esm/lexer.js +1 -1
- package/esm/parser.js +1 -1
- package/lib/doc.js +23 -1
- package/lib/doc.md +11 -0
- package/lib/error.js +1 -1
- package/lib/evalutor.d.ts +24 -0
- package/lib/evalutor.js +83 -4
- package/lib/evalutorForAsync.js +1 -1
- package/lib/filter.js +1 -1
- package/lib/function.js +1 -1
- package/lib/index.js +1 -1
- package/lib/lexer.js +1 -1
- package/lib/parser.js +1 -1
- package/package.json +2 -2
package/esm/doc.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* amis-formula v3.4.
|
|
2
|
+
* amis-formula v3.4.3
|
|
3
3
|
* Copyright 2021-2023 fex
|
|
4
4
|
*/
|
|
5
5
|
|
|
@@ -443,6 +443,28 @@ var doc = [
|
|
|
443
443
|
},
|
|
444
444
|
namespace: "数学函数"
|
|
445
445
|
},
|
|
446
|
+
{
|
|
447
|
+
name: "POW",
|
|
448
|
+
description: "返回基数的指数次幂,参数base为基数,exponent为指数,如果参数值不合法则返回基数本身,计算结果不合法,则返回NaN。",
|
|
449
|
+
example: "POW(base, exponent)",
|
|
450
|
+
params: [
|
|
451
|
+
{
|
|
452
|
+
type: "number",
|
|
453
|
+
name: "base",
|
|
454
|
+
description: "基数"
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
type: "number",
|
|
458
|
+
name: "exponent",
|
|
459
|
+
description: "指数"
|
|
460
|
+
}
|
|
461
|
+
],
|
|
462
|
+
returns: {
|
|
463
|
+
type: "number",
|
|
464
|
+
description: "基数的指数次幂"
|
|
465
|
+
},
|
|
466
|
+
namespace: "数学函数"
|
|
467
|
+
},
|
|
446
468
|
{
|
|
447
469
|
name: "LEFT",
|
|
448
470
|
description: "返回传入文本左侧的指定长度字符串。",
|
package/esm/doc.md
CHANGED
|
@@ -268,6 +268,17 @@
|
|
|
268
268
|
|
|
269
269
|
取数据最后一个。
|
|
270
270
|
|
|
271
|
+
### POW
|
|
272
|
+
|
|
273
|
+
用法:`POW(base, exponent)`
|
|
274
|
+
|
|
275
|
+
* `base:number` 基数
|
|
276
|
+
* `exponent:number` 指数
|
|
277
|
+
|
|
278
|
+
返回:`number` 基数的指数次幂
|
|
279
|
+
|
|
280
|
+
返回基数的指数次幂,参数base为基数,exponent为指数,如果参数值不合法则返回基数本身,计算结果不合法,则返回NaN。
|
|
281
|
+
|
|
271
282
|
## 文本函数
|
|
272
283
|
|
|
273
284
|
### LEFT
|
package/esm/error.js
CHANGED
package/esm/evalutor.d.ts
CHANGED
|
@@ -137,6 +137,19 @@ export declare class Evaluator {
|
|
|
137
137
|
value: any;
|
|
138
138
|
raw: string;
|
|
139
139
|
}): any;
|
|
140
|
+
/**
|
|
141
|
+
* 名字空间下获取变量,可能存在变量名中带-的特殊情况,目前无法直接获取 ${ns:xxx-xxx}
|
|
142
|
+
* 想借助 ${ns:&['xxx-xxx']} 用法来支持特殊字符。
|
|
143
|
+
*
|
|
144
|
+
* 而 cookie, localstorage, sessionstorage 都不支持获取全量数据,如 ${ns: &}
|
|
145
|
+
* 所以当存在上述用法时,将 & 作为一个占位
|
|
146
|
+
*
|
|
147
|
+
* 比如 cookie 中有一个 key 为 xxx-xxx 的值,那么可以通过 &['xxx-xxx'] 来获取。
|
|
148
|
+
* 而无法通过 ${cookie:xxx-xxx} 来获取。 因为这样会被认为是减操作
|
|
149
|
+
* @param ast
|
|
150
|
+
* @returns
|
|
151
|
+
*/
|
|
152
|
+
convertHostGetterToVariable(ast: any): any;
|
|
140
153
|
nsVariable(ast: {
|
|
141
154
|
namespace: string;
|
|
142
155
|
body: any;
|
|
@@ -451,6 +464,17 @@ export declare class Evaluator {
|
|
|
451
464
|
* @returns {any} 最后一个值
|
|
452
465
|
*/
|
|
453
466
|
fnLAST(arr: Array<any>): any;
|
|
467
|
+
/**
|
|
468
|
+
* 返回基数的指数次幂,参数base为基数,exponent为指数,如果参数值不合法则返回基数本身,计算结果不合法,则返回NaN。
|
|
469
|
+
*
|
|
470
|
+
* @example POW(base, exponent)
|
|
471
|
+
* @param {number} base 基数
|
|
472
|
+
* @param {number} exponent 指数
|
|
473
|
+
* @namespace 数学函数
|
|
474
|
+
*
|
|
475
|
+
* @returns {number} 基数的指数次幂
|
|
476
|
+
*/
|
|
477
|
+
fnPOW(base: number, exponent: number): number;
|
|
454
478
|
normalizeText(raw: any): string;
|
|
455
479
|
/**
|
|
456
480
|
* 返回传入文本左侧的指定长度字符串。
|
package/esm/evalutor.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* amis-formula v3.4.
|
|
2
|
+
* amis-formula v3.4.3
|
|
3
3
|
* Copyright 2021-2023 fex
|
|
4
4
|
*/
|
|
5
5
|
|
|
@@ -15,6 +15,7 @@ import uniqBy from 'lodash/uniqBy';
|
|
|
15
15
|
import isEqual from 'lodash/isEqual';
|
|
16
16
|
import isPlainObject from 'lodash/isPlainObject';
|
|
17
17
|
import get from 'lodash/get';
|
|
18
|
+
import isNumber from 'lodash/isNumber';
|
|
18
19
|
import { FormulaEvalError } from './error.js';
|
|
19
20
|
|
|
20
21
|
/**
|
|
@@ -292,19 +293,66 @@ var Evaluator = /** @class */ (function () {
|
|
|
292
293
|
// todo 以后可以在这支持大数字。
|
|
293
294
|
return ast.value;
|
|
294
295
|
};
|
|
296
|
+
/**
|
|
297
|
+
* 名字空间下获取变量,可能存在变量名中带-的特殊情况,目前无法直接获取 ${ns:xxx-xxx}
|
|
298
|
+
* 想借助 ${ns:&['xxx-xxx']} 用法来支持特殊字符。
|
|
299
|
+
*
|
|
300
|
+
* 而 cookie, localstorage, sessionstorage 都不支持获取全量数据,如 ${ns: &}
|
|
301
|
+
* 所以当存在上述用法时,将 & 作为一个占位
|
|
302
|
+
*
|
|
303
|
+
* 比如 cookie 中有一个 key 为 xxx-xxx 的值,那么可以通过 &['xxx-xxx'] 来获取。
|
|
304
|
+
* 而无法通过 ${cookie:xxx-xxx} 来获取。 因为这样会被认为是减操作
|
|
305
|
+
* @param ast
|
|
306
|
+
* @returns
|
|
307
|
+
*/
|
|
308
|
+
Evaluator.prototype.convertHostGetterToVariable = function (ast) {
|
|
309
|
+
var _a, _b;
|
|
310
|
+
if (ast.type !== 'getter') {
|
|
311
|
+
return ast;
|
|
312
|
+
}
|
|
313
|
+
var gettter = ast;
|
|
314
|
+
var keys = [];
|
|
315
|
+
while (((_a = gettter.host) === null || _a === void 0 ? void 0 : _a.type) === 'getter') {
|
|
316
|
+
keys.push('host');
|
|
317
|
+
gettter = gettter.host;
|
|
318
|
+
}
|
|
319
|
+
if (((_b = gettter.host) === null || _b === void 0 ? void 0 : _b.type) === 'variable' && gettter.host.name === '&') {
|
|
320
|
+
var ret = {
|
|
321
|
+
host: ast
|
|
322
|
+
};
|
|
323
|
+
var host = keys.reduce(function (host, key) {
|
|
324
|
+
host[key] = __assign({}, host[key]);
|
|
325
|
+
return host[key];
|
|
326
|
+
}, ret);
|
|
327
|
+
host.host = {
|
|
328
|
+
start: host.host.start,
|
|
329
|
+
end: host.host.end,
|
|
330
|
+
type: 'variable',
|
|
331
|
+
name: this.evalute(host.host.key)
|
|
332
|
+
};
|
|
333
|
+
return ret.host;
|
|
334
|
+
}
|
|
335
|
+
return ast;
|
|
336
|
+
};
|
|
295
337
|
Evaluator.prototype.nsVariable = function (ast) {
|
|
338
|
+
var _this = this;
|
|
339
|
+
var body = ast.body;
|
|
296
340
|
if (ast.namespace === 'window') {
|
|
297
341
|
this.contextStack.push(function (name) {
|
|
298
342
|
return name === '&' ? window : window[name];
|
|
299
343
|
});
|
|
300
344
|
}
|
|
301
345
|
else if (ast.namespace === 'cookie') {
|
|
346
|
+
// 可能会利用 &['xxx-xxx'] 来取需要特殊变量
|
|
347
|
+
body = this.convertHostGetterToVariable(body);
|
|
302
348
|
this.contextStack.push(function (name) {
|
|
303
349
|
return getCookie(name);
|
|
304
350
|
});
|
|
305
351
|
}
|
|
306
352
|
else if (ast.namespace === 'ls' || ast.namespace === 'ss') {
|
|
307
353
|
var ns_1 = ast.namespace;
|
|
354
|
+
// 可能会利用 &['xxx-xxx'] 来取需要特殊变量
|
|
355
|
+
body = this.convertHostGetterToVariable(body);
|
|
308
356
|
this.contextStack.push(function (name) {
|
|
309
357
|
var raw = ns_1 === 'ss'
|
|
310
358
|
? sessionStorage.getItem(name)
|
|
@@ -324,8 +372,10 @@ var Evaluator = /** @class */ (function () {
|
|
|
324
372
|
else {
|
|
325
373
|
throw new Error('Unsupported namespace: ' + ast.namespace);
|
|
326
374
|
}
|
|
327
|
-
var result = this.evalute(
|
|
328
|
-
|
|
375
|
+
var result = this.evalute(body);
|
|
376
|
+
(result === null || result === void 0 ? void 0 : result.then)
|
|
377
|
+
? result.then(function () { return _this.contextStack.pop(); })
|
|
378
|
+
: this.contextStack.pop();
|
|
329
379
|
return result;
|
|
330
380
|
};
|
|
331
381
|
Evaluator.prototype.variable = function (ast) {
|
|
@@ -918,6 +968,22 @@ var Evaluator = /** @class */ (function () {
|
|
|
918
968
|
Evaluator.prototype.fnLAST = function (arr) {
|
|
919
969
|
return arr.length ? arr[arr.length - 1] : null;
|
|
920
970
|
};
|
|
971
|
+
/**
|
|
972
|
+
* 返回基数的指数次幂,参数base为基数,exponent为指数,如果参数值不合法则返回基数本身,计算结果不合法,则返回NaN。
|
|
973
|
+
*
|
|
974
|
+
* @example POW(base, exponent)
|
|
975
|
+
* @param {number} base 基数
|
|
976
|
+
* @param {number} exponent 指数
|
|
977
|
+
* @namespace 数学函数
|
|
978
|
+
*
|
|
979
|
+
* @returns {number} 基数的指数次幂
|
|
980
|
+
*/
|
|
981
|
+
Evaluator.prototype.fnPOW = function (base, exponent) {
|
|
982
|
+
if (!isNumber(base) || !isNumber(exponent)) {
|
|
983
|
+
return base;
|
|
984
|
+
}
|
|
985
|
+
return Math.pow(base, exponent);
|
|
986
|
+
};
|
|
921
987
|
// 文本函数
|
|
922
988
|
Evaluator.prototype.normalizeText = function (raw) {
|
|
923
989
|
if (raw instanceof Date) {
|
|
@@ -1147,6 +1213,7 @@ var Evaluator = /** @class */ (function () {
|
|
|
1147
1213
|
Evaluator.prototype.fnBEFORELAST = function (text, delimiter) {
|
|
1148
1214
|
if (delimiter === void 0) { delimiter = '.'; }
|
|
1149
1215
|
text = this.normalizeText(text);
|
|
1216
|
+
delimiter = this.normalizeText(delimiter);
|
|
1150
1217
|
return text.split(delimiter).slice(0, -1).join(delimiter) || text + '';
|
|
1151
1218
|
};
|
|
1152
1219
|
/**
|
|
@@ -1226,6 +1293,7 @@ var Evaluator = /** @class */ (function () {
|
|
|
1226
1293
|
* @returns {string} 判断结果
|
|
1227
1294
|
*/
|
|
1228
1295
|
Evaluator.prototype.fnSTARTSWITH = function (text, search) {
|
|
1296
|
+
search = this.normalizeText(search);
|
|
1229
1297
|
if (!search) {
|
|
1230
1298
|
return false;
|
|
1231
1299
|
}
|
|
@@ -1243,6 +1311,7 @@ var Evaluator = /** @class */ (function () {
|
|
|
1243
1311
|
* @returns {string} 判断结果
|
|
1244
1312
|
*/
|
|
1245
1313
|
Evaluator.prototype.fnENDSWITH = function (text, search) {
|
|
1314
|
+
search = this.normalizeText(search);
|
|
1246
1315
|
if (!search) {
|
|
1247
1316
|
return false;
|
|
1248
1317
|
}
|
|
@@ -1260,6 +1329,7 @@ var Evaluator = /** @class */ (function () {
|
|
|
1260
1329
|
* @returns {string} 判断结果
|
|
1261
1330
|
*/
|
|
1262
1331
|
Evaluator.prototype.fnCONTAINS = function (text, search) {
|
|
1332
|
+
search = this.normalizeText(search);
|
|
1263
1333
|
if (!search) {
|
|
1264
1334
|
return false;
|
|
1265
1335
|
}
|
|
@@ -1279,7 +1349,12 @@ var Evaluator = /** @class */ (function () {
|
|
|
1279
1349
|
*/
|
|
1280
1350
|
Evaluator.prototype.fnREPLACE = function (text, search, replace) {
|
|
1281
1351
|
text = this.normalizeText(text);
|
|
1352
|
+
search = this.normalizeText(search);
|
|
1353
|
+
replace = this.normalizeText(replace);
|
|
1282
1354
|
var result = text;
|
|
1355
|
+
if (typeof replace === 'undefined' || !search) {
|
|
1356
|
+
return result;
|
|
1357
|
+
}
|
|
1283
1358
|
while (true) {
|
|
1284
1359
|
var idx = result.indexOf(search);
|
|
1285
1360
|
if (!~idx) {
|
|
@@ -1305,10 +1380,11 @@ var Evaluator = /** @class */ (function () {
|
|
|
1305
1380
|
*/
|
|
1306
1381
|
Evaluator.prototype.fnSEARCH = function (text, search, start) {
|
|
1307
1382
|
if (start === void 0) { start = 0; }
|
|
1383
|
+
search = this.normalizeText(search);
|
|
1308
1384
|
text = this.normalizeText(text);
|
|
1309
1385
|
start = this.formatNumber(start);
|
|
1310
1386
|
var idx = text.indexOf(search, start);
|
|
1311
|
-
if (~idx) {
|
|
1387
|
+
if (~idx && search) {
|
|
1312
1388
|
return idx;
|
|
1313
1389
|
}
|
|
1314
1390
|
return -1;
|
|
@@ -1326,6 +1402,8 @@ var Evaluator = /** @class */ (function () {
|
|
|
1326
1402
|
*/
|
|
1327
1403
|
Evaluator.prototype.fnMID = function (text, from, len) {
|
|
1328
1404
|
text = this.normalizeText(text);
|
|
1405
|
+
from = this.formatNumber(from);
|
|
1406
|
+
len = this.formatNumber(len);
|
|
1329
1407
|
return text.substring(from, from + len);
|
|
1330
1408
|
};
|
|
1331
1409
|
/**
|
package/esm/evalutorForAsync.js
CHANGED
package/esm/filter.js
CHANGED
package/esm/function.js
CHANGED
package/esm/index.js
CHANGED
package/esm/lexer.js
CHANGED
package/esm/parser.js
CHANGED
package/lib/doc.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* amis-formula v3.4.
|
|
2
|
+
* amis-formula v3.4.3
|
|
3
3
|
* Copyright 2021-2023 fex
|
|
4
4
|
*/
|
|
5
5
|
|
|
@@ -447,6 +447,28 @@ var doc = [
|
|
|
447
447
|
},
|
|
448
448
|
namespace: "数学函数"
|
|
449
449
|
},
|
|
450
|
+
{
|
|
451
|
+
name: "POW",
|
|
452
|
+
description: "返回基数的指数次幂,参数base为基数,exponent为指数,如果参数值不合法则返回基数本身,计算结果不合法,则返回NaN。",
|
|
453
|
+
example: "POW(base, exponent)",
|
|
454
|
+
params: [
|
|
455
|
+
{
|
|
456
|
+
type: "number",
|
|
457
|
+
name: "base",
|
|
458
|
+
description: "基数"
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
type: "number",
|
|
462
|
+
name: "exponent",
|
|
463
|
+
description: "指数"
|
|
464
|
+
}
|
|
465
|
+
],
|
|
466
|
+
returns: {
|
|
467
|
+
type: "number",
|
|
468
|
+
description: "基数的指数次幂"
|
|
469
|
+
},
|
|
470
|
+
namespace: "数学函数"
|
|
471
|
+
},
|
|
450
472
|
{
|
|
451
473
|
name: "LEFT",
|
|
452
474
|
description: "返回传入文本左侧的指定长度字符串。",
|
package/lib/doc.md
CHANGED
|
@@ -268,6 +268,17 @@
|
|
|
268
268
|
|
|
269
269
|
取数据最后一个。
|
|
270
270
|
|
|
271
|
+
### POW
|
|
272
|
+
|
|
273
|
+
用法:`POW(base, exponent)`
|
|
274
|
+
|
|
275
|
+
* `base:number` 基数
|
|
276
|
+
* `exponent:number` 指数
|
|
277
|
+
|
|
278
|
+
返回:`number` 基数的指数次幂
|
|
279
|
+
|
|
280
|
+
返回基数的指数次幂,参数base为基数,exponent为指数,如果参数值不合法则返回基数本身,计算结果不合法,则返回NaN。
|
|
281
|
+
|
|
271
282
|
## 文本函数
|
|
272
283
|
|
|
273
284
|
### LEFT
|
package/lib/error.js
CHANGED
package/lib/evalutor.d.ts
CHANGED
|
@@ -137,6 +137,19 @@ export declare class Evaluator {
|
|
|
137
137
|
value: any;
|
|
138
138
|
raw: string;
|
|
139
139
|
}): any;
|
|
140
|
+
/**
|
|
141
|
+
* 名字空间下获取变量,可能存在变量名中带-的特殊情况,目前无法直接获取 ${ns:xxx-xxx}
|
|
142
|
+
* 想借助 ${ns:&['xxx-xxx']} 用法来支持特殊字符。
|
|
143
|
+
*
|
|
144
|
+
* 而 cookie, localstorage, sessionstorage 都不支持获取全量数据,如 ${ns: &}
|
|
145
|
+
* 所以当存在上述用法时,将 & 作为一个占位
|
|
146
|
+
*
|
|
147
|
+
* 比如 cookie 中有一个 key 为 xxx-xxx 的值,那么可以通过 &['xxx-xxx'] 来获取。
|
|
148
|
+
* 而无法通过 ${cookie:xxx-xxx} 来获取。 因为这样会被认为是减操作
|
|
149
|
+
* @param ast
|
|
150
|
+
* @returns
|
|
151
|
+
*/
|
|
152
|
+
convertHostGetterToVariable(ast: any): any;
|
|
140
153
|
nsVariable(ast: {
|
|
141
154
|
namespace: string;
|
|
142
155
|
body: any;
|
|
@@ -451,6 +464,17 @@ export declare class Evaluator {
|
|
|
451
464
|
* @returns {any} 最后一个值
|
|
452
465
|
*/
|
|
453
466
|
fnLAST(arr: Array<any>): any;
|
|
467
|
+
/**
|
|
468
|
+
* 返回基数的指数次幂,参数base为基数,exponent为指数,如果参数值不合法则返回基数本身,计算结果不合法,则返回NaN。
|
|
469
|
+
*
|
|
470
|
+
* @example POW(base, exponent)
|
|
471
|
+
* @param {number} base 基数
|
|
472
|
+
* @param {number} exponent 指数
|
|
473
|
+
* @namespace 数学函数
|
|
474
|
+
*
|
|
475
|
+
* @returns {number} 基数的指数次幂
|
|
476
|
+
*/
|
|
477
|
+
fnPOW(base: number, exponent: number): number;
|
|
454
478
|
normalizeText(raw: any): string;
|
|
455
479
|
/**
|
|
456
480
|
* 返回传入文本左侧的指定长度字符串。
|
package/lib/evalutor.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* amis-formula v3.4.
|
|
2
|
+
* amis-formula v3.4.3
|
|
3
3
|
* Copyright 2021-2023 fex
|
|
4
4
|
*/
|
|
5
5
|
|
|
@@ -19,6 +19,7 @@ var uniqBy = require('lodash/uniqBy');
|
|
|
19
19
|
var isEqual = require('lodash/isEqual');
|
|
20
20
|
var isPlainObject = require('lodash/isPlainObject');
|
|
21
21
|
var get = require('lodash/get');
|
|
22
|
+
var isNumber = require('lodash/isNumber');
|
|
22
23
|
var error = require('./error.js');
|
|
23
24
|
|
|
24
25
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
@@ -34,6 +35,7 @@ var uniqBy__default = /*#__PURE__*/_interopDefaultLegacy(uniqBy);
|
|
|
34
35
|
var isEqual__default = /*#__PURE__*/_interopDefaultLegacy(isEqual);
|
|
35
36
|
var isPlainObject__default = /*#__PURE__*/_interopDefaultLegacy(isPlainObject);
|
|
36
37
|
var get__default = /*#__PURE__*/_interopDefaultLegacy(get);
|
|
38
|
+
var isNumber__default = /*#__PURE__*/_interopDefaultLegacy(isNumber);
|
|
37
39
|
|
|
38
40
|
/**
|
|
39
41
|
* @file 公式内置函数
|
|
@@ -310,19 +312,66 @@ var Evaluator = /** @class */ (function () {
|
|
|
310
312
|
// todo 以后可以在这支持大数字。
|
|
311
313
|
return ast.value;
|
|
312
314
|
};
|
|
315
|
+
/**
|
|
316
|
+
* 名字空间下获取变量,可能存在变量名中带-的特殊情况,目前无法直接获取 ${ns:xxx-xxx}
|
|
317
|
+
* 想借助 ${ns:&['xxx-xxx']} 用法来支持特殊字符。
|
|
318
|
+
*
|
|
319
|
+
* 而 cookie, localstorage, sessionstorage 都不支持获取全量数据,如 ${ns: &}
|
|
320
|
+
* 所以当存在上述用法时,将 & 作为一个占位
|
|
321
|
+
*
|
|
322
|
+
* 比如 cookie 中有一个 key 为 xxx-xxx 的值,那么可以通过 &['xxx-xxx'] 来获取。
|
|
323
|
+
* 而无法通过 ${cookie:xxx-xxx} 来获取。 因为这样会被认为是减操作
|
|
324
|
+
* @param ast
|
|
325
|
+
* @returns
|
|
326
|
+
*/
|
|
327
|
+
Evaluator.prototype.convertHostGetterToVariable = function (ast) {
|
|
328
|
+
var _a, _b;
|
|
329
|
+
if (ast.type !== 'getter') {
|
|
330
|
+
return ast;
|
|
331
|
+
}
|
|
332
|
+
var gettter = ast;
|
|
333
|
+
var keys = [];
|
|
334
|
+
while (((_a = gettter.host) === null || _a === void 0 ? void 0 : _a.type) === 'getter') {
|
|
335
|
+
keys.push('host');
|
|
336
|
+
gettter = gettter.host;
|
|
337
|
+
}
|
|
338
|
+
if (((_b = gettter.host) === null || _b === void 0 ? void 0 : _b.type) === 'variable' && gettter.host.name === '&') {
|
|
339
|
+
var ret = {
|
|
340
|
+
host: ast
|
|
341
|
+
};
|
|
342
|
+
var host = keys.reduce(function (host, key) {
|
|
343
|
+
host[key] = tslib.__assign({}, host[key]);
|
|
344
|
+
return host[key];
|
|
345
|
+
}, ret);
|
|
346
|
+
host.host = {
|
|
347
|
+
start: host.host.start,
|
|
348
|
+
end: host.host.end,
|
|
349
|
+
type: 'variable',
|
|
350
|
+
name: this.evalute(host.host.key)
|
|
351
|
+
};
|
|
352
|
+
return ret.host;
|
|
353
|
+
}
|
|
354
|
+
return ast;
|
|
355
|
+
};
|
|
313
356
|
Evaluator.prototype.nsVariable = function (ast) {
|
|
357
|
+
var _this = this;
|
|
358
|
+
var body = ast.body;
|
|
314
359
|
if (ast.namespace === 'window') {
|
|
315
360
|
this.contextStack.push(function (name) {
|
|
316
361
|
return name === '&' ? window : window[name];
|
|
317
362
|
});
|
|
318
363
|
}
|
|
319
364
|
else if (ast.namespace === 'cookie') {
|
|
365
|
+
// 可能会利用 &['xxx-xxx'] 来取需要特殊变量
|
|
366
|
+
body = this.convertHostGetterToVariable(body);
|
|
320
367
|
this.contextStack.push(function (name) {
|
|
321
368
|
return getCookie(name);
|
|
322
369
|
});
|
|
323
370
|
}
|
|
324
371
|
else if (ast.namespace === 'ls' || ast.namespace === 'ss') {
|
|
325
372
|
var ns_1 = ast.namespace;
|
|
373
|
+
// 可能会利用 &['xxx-xxx'] 来取需要特殊变量
|
|
374
|
+
body = this.convertHostGetterToVariable(body);
|
|
326
375
|
this.contextStack.push(function (name) {
|
|
327
376
|
var raw = ns_1 === 'ss'
|
|
328
377
|
? sessionStorage.getItem(name)
|
|
@@ -342,8 +391,10 @@ var Evaluator = /** @class */ (function () {
|
|
|
342
391
|
else {
|
|
343
392
|
throw new Error('Unsupported namespace: ' + ast.namespace);
|
|
344
393
|
}
|
|
345
|
-
var result = this.evalute(
|
|
346
|
-
|
|
394
|
+
var result = this.evalute(body);
|
|
395
|
+
(result === null || result === void 0 ? void 0 : result.then)
|
|
396
|
+
? result.then(function () { return _this.contextStack.pop(); })
|
|
397
|
+
: this.contextStack.pop();
|
|
347
398
|
return result;
|
|
348
399
|
};
|
|
349
400
|
Evaluator.prototype.variable = function (ast) {
|
|
@@ -936,6 +987,22 @@ var Evaluator = /** @class */ (function () {
|
|
|
936
987
|
Evaluator.prototype.fnLAST = function (arr) {
|
|
937
988
|
return arr.length ? arr[arr.length - 1] : null;
|
|
938
989
|
};
|
|
990
|
+
/**
|
|
991
|
+
* 返回基数的指数次幂,参数base为基数,exponent为指数,如果参数值不合法则返回基数本身,计算结果不合法,则返回NaN。
|
|
992
|
+
*
|
|
993
|
+
* @example POW(base, exponent)
|
|
994
|
+
* @param {number} base 基数
|
|
995
|
+
* @param {number} exponent 指数
|
|
996
|
+
* @namespace 数学函数
|
|
997
|
+
*
|
|
998
|
+
* @returns {number} 基数的指数次幂
|
|
999
|
+
*/
|
|
1000
|
+
Evaluator.prototype.fnPOW = function (base, exponent) {
|
|
1001
|
+
if (!isNumber__default["default"](base) || !isNumber__default["default"](exponent)) {
|
|
1002
|
+
return base;
|
|
1003
|
+
}
|
|
1004
|
+
return Math.pow(base, exponent);
|
|
1005
|
+
};
|
|
939
1006
|
// 文本函数
|
|
940
1007
|
Evaluator.prototype.normalizeText = function (raw) {
|
|
941
1008
|
if (raw instanceof Date) {
|
|
@@ -1165,6 +1232,7 @@ var Evaluator = /** @class */ (function () {
|
|
|
1165
1232
|
Evaluator.prototype.fnBEFORELAST = function (text, delimiter) {
|
|
1166
1233
|
if (delimiter === void 0) { delimiter = '.'; }
|
|
1167
1234
|
text = this.normalizeText(text);
|
|
1235
|
+
delimiter = this.normalizeText(delimiter);
|
|
1168
1236
|
return text.split(delimiter).slice(0, -1).join(delimiter) || text + '';
|
|
1169
1237
|
};
|
|
1170
1238
|
/**
|
|
@@ -1244,6 +1312,7 @@ var Evaluator = /** @class */ (function () {
|
|
|
1244
1312
|
* @returns {string} 判断结果
|
|
1245
1313
|
*/
|
|
1246
1314
|
Evaluator.prototype.fnSTARTSWITH = function (text, search) {
|
|
1315
|
+
search = this.normalizeText(search);
|
|
1247
1316
|
if (!search) {
|
|
1248
1317
|
return false;
|
|
1249
1318
|
}
|
|
@@ -1261,6 +1330,7 @@ var Evaluator = /** @class */ (function () {
|
|
|
1261
1330
|
* @returns {string} 判断结果
|
|
1262
1331
|
*/
|
|
1263
1332
|
Evaluator.prototype.fnENDSWITH = function (text, search) {
|
|
1333
|
+
search = this.normalizeText(search);
|
|
1264
1334
|
if (!search) {
|
|
1265
1335
|
return false;
|
|
1266
1336
|
}
|
|
@@ -1278,6 +1348,7 @@ var Evaluator = /** @class */ (function () {
|
|
|
1278
1348
|
* @returns {string} 判断结果
|
|
1279
1349
|
*/
|
|
1280
1350
|
Evaluator.prototype.fnCONTAINS = function (text, search) {
|
|
1351
|
+
search = this.normalizeText(search);
|
|
1281
1352
|
if (!search) {
|
|
1282
1353
|
return false;
|
|
1283
1354
|
}
|
|
@@ -1297,7 +1368,12 @@ var Evaluator = /** @class */ (function () {
|
|
|
1297
1368
|
*/
|
|
1298
1369
|
Evaluator.prototype.fnREPLACE = function (text, search, replace) {
|
|
1299
1370
|
text = this.normalizeText(text);
|
|
1371
|
+
search = this.normalizeText(search);
|
|
1372
|
+
replace = this.normalizeText(replace);
|
|
1300
1373
|
var result = text;
|
|
1374
|
+
if (typeof replace === 'undefined' || !search) {
|
|
1375
|
+
return result;
|
|
1376
|
+
}
|
|
1301
1377
|
while (true) {
|
|
1302
1378
|
var idx = result.indexOf(search);
|
|
1303
1379
|
if (!~idx) {
|
|
@@ -1323,10 +1399,11 @@ var Evaluator = /** @class */ (function () {
|
|
|
1323
1399
|
*/
|
|
1324
1400
|
Evaluator.prototype.fnSEARCH = function (text, search, start) {
|
|
1325
1401
|
if (start === void 0) { start = 0; }
|
|
1402
|
+
search = this.normalizeText(search);
|
|
1326
1403
|
text = this.normalizeText(text);
|
|
1327
1404
|
start = this.formatNumber(start);
|
|
1328
1405
|
var idx = text.indexOf(search, start);
|
|
1329
|
-
if (~idx) {
|
|
1406
|
+
if (~idx && search) {
|
|
1330
1407
|
return idx;
|
|
1331
1408
|
}
|
|
1332
1409
|
return -1;
|
|
@@ -1344,6 +1421,8 @@ var Evaluator = /** @class */ (function () {
|
|
|
1344
1421
|
*/
|
|
1345
1422
|
Evaluator.prototype.fnMID = function (text, from, len) {
|
|
1346
1423
|
text = this.normalizeText(text);
|
|
1424
|
+
from = this.formatNumber(from);
|
|
1425
|
+
len = this.formatNumber(len);
|
|
1347
1426
|
return text.substring(from, from + len);
|
|
1348
1427
|
};
|
|
1349
1428
|
/**
|
package/lib/evalutorForAsync.js
CHANGED
package/lib/filter.js
CHANGED
package/lib/function.js
CHANGED
package/lib/index.js
CHANGED
package/lib/lexer.js
CHANGED
package/lib/parser.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "amis-formula",
|
|
3
|
-
"version": "3.4.
|
|
3
|
+
"version": "3.4.3",
|
|
4
4
|
"description": "负责 amis 里面的表达式实现,内置公式,编辑器等",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "esm/index.js",
|
|
@@ -118,5 +118,5 @@
|
|
|
118
118
|
"printBasicPrototype": false
|
|
119
119
|
}
|
|
120
120
|
},
|
|
121
|
-
"gitHead": "
|
|
121
|
+
"gitHead": "a0973fc96e9308311a2002e76cfaf9ee39ad7118"
|
|
122
122
|
}
|