amis-formula 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.prettierrc ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "printWidth": 80,
3
+ "tabWidth": 2,
4
+ "useTabs": false,
5
+ "singleQuote": true,
6
+ "semi": true,
7
+ "trailingComma": "none",
8
+ "bracketSpacing": false,
9
+ "quoteProps": "consistent",
10
+ "arrowParens": "avoid",
11
+ "jsxBracketSameLine": false,
12
+ "overrides": [
13
+ {
14
+ "files": "src/locale/*.ts",
15
+ "options": {
16
+ "printWidth": 800
17
+ }
18
+ }
19
+ ]
20
+ }
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021 百度智能云爱速搭
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # amis-tpl
2
+
3
+ 负责 amis 里面的表达式实现,内置公式,编辑器等
4
+
5
+ 属于 [amis](https://github.com/baidu/amis) 子项目
@@ -0,0 +1,233 @@
1
+ /**
2
+ * @file 公式内置函数
3
+ */
4
+ export interface FilterMap {
5
+ [propName: string]: (this: any, input: any, ...args: any[]) => any;
6
+ }
7
+ export interface FunctionMap {
8
+ [propName: string]: (this: Evaluator, ast: Object, data: any) => any;
9
+ }
10
+ export interface EvaluatorOptions {
11
+ /**
12
+ * 可以外部传入 ast 节点处理器,定制或者扩充自定义函数
13
+ */
14
+ functions?: FunctionMap;
15
+ /**
16
+ * 可以外部扩充 filter
17
+ */
18
+ filters?: FilterMap;
19
+ defaultFilter?: string;
20
+ }
21
+ export declare class Evaluator {
22
+ readonly options: EvaluatorOptions;
23
+ readonly filters: FilterMap;
24
+ readonly functions: FunctionMap;
25
+ data: any;
26
+ constructor(options?: EvaluatorOptions);
27
+ evalute(ast: any, data?: any): any;
28
+ document(ast: {
29
+ type: 'document';
30
+ body: Array<any>;
31
+ }, data: any): any;
32
+ filter(ast: {
33
+ type: 'filter';
34
+ input: any;
35
+ fnName: string;
36
+ args: Array<any>;
37
+ }, data: any): any;
38
+ raw(ast: {
39
+ type: 'raw';
40
+ value: string;
41
+ }): string;
42
+ script(ast: {
43
+ type: 'script';
44
+ body: any;
45
+ }, data: any): any;
46
+ expressionList(ast: {
47
+ type: 'expression-list';
48
+ body: Array<any>;
49
+ }, data: any): any;
50
+ template(ast: {
51
+ type: 'template';
52
+ args: Array<any>;
53
+ }, data: any): string;
54
+ templateRaw(ast: {
55
+ type: 'template_raw';
56
+ value: any;
57
+ }): any;
58
+ get(ast: {
59
+ host: any;
60
+ key: any;
61
+ }, data: any): any;
62
+ unary(ast: {
63
+ op: '+' | '-' | '~' | '!';
64
+ value: any;
65
+ }, data: any): number | boolean;
66
+ formatNumber(value: any, int?: boolean): any;
67
+ power(ast: {
68
+ left: any;
69
+ right: any;
70
+ }, data: any): number;
71
+ multiply(ast: {
72
+ left: any;
73
+ right: any;
74
+ }, data: any): number;
75
+ divide(ast: {
76
+ left: any;
77
+ right: any;
78
+ }, data: any): number;
79
+ remainder(ast: {
80
+ left: any;
81
+ right: any;
82
+ }, data: any): number;
83
+ add(ast: {
84
+ left: any;
85
+ right: any;
86
+ }, data: any): any;
87
+ minus(ast: {
88
+ left: any;
89
+ right: any;
90
+ }, data: any): number;
91
+ shift(ast: {
92
+ op: '<<' | '>>' | '>>>';
93
+ left: any;
94
+ right: any;
95
+ }, data: any): number;
96
+ lt(ast: {
97
+ left: any;
98
+ right: any;
99
+ }, data: any): boolean;
100
+ gt(ast: {
101
+ left: any;
102
+ right: any;
103
+ }, data: any): boolean;
104
+ le(ast: {
105
+ left: any;
106
+ right: any;
107
+ }, data: any): boolean;
108
+ ge(ast: {
109
+ left: any;
110
+ right: any;
111
+ }, data: any): boolean;
112
+ eq(ast: {
113
+ left: any;
114
+ right: any;
115
+ }, data: any): boolean;
116
+ ne(ast: {
117
+ left: any;
118
+ right: any;
119
+ }, data: any): boolean;
120
+ streq(ast: {
121
+ left: any;
122
+ right: any;
123
+ }, data: any): boolean;
124
+ strneq(ast: {
125
+ left: any;
126
+ right: any;
127
+ }, data: any): boolean;
128
+ binary(ast: {
129
+ op: '&' | '^' | '|';
130
+ left: any;
131
+ right: any;
132
+ }, data: any): number;
133
+ and(ast: {
134
+ left: any;
135
+ right: any;
136
+ }, data: any): any;
137
+ or(ast: {
138
+ left: any;
139
+ right: any;
140
+ }, data: any): any;
141
+ number(ast: {
142
+ value: any;
143
+ raw: string;
144
+ }, data: any): any;
145
+ variable(ast: {
146
+ name: string;
147
+ }, data: any): any;
148
+ array(ast: {
149
+ type: 'array';
150
+ members: Array<any>;
151
+ }, data: any): any[];
152
+ literal(ast: {
153
+ type: 'literal';
154
+ value: any;
155
+ }): any;
156
+ string(ast: {
157
+ type: 'string';
158
+ value: string;
159
+ }): string;
160
+ object(ast: {
161
+ memebers: Array<{
162
+ key: string;
163
+ value: any;
164
+ }>;
165
+ }, data: any): any;
166
+ conditional(ast: {
167
+ type: 'conditional';
168
+ test: any;
169
+ consequent: any;
170
+ alternate: any;
171
+ }, data: any): any;
172
+ funcCall(this: any, ast: {
173
+ identifier: string;
174
+ args: Array<any>;
175
+ }, data: any): any;
176
+ fnIF(condition: () => any, trueValue: () => any, falseValue: () => any): any;
177
+ fnAND(...condtions: Array<() => any>): boolean;
178
+ fnOR(...condtions: Array<() => any>): boolean;
179
+ fnXOR(c1: () => any, c2: () => any): boolean;
180
+ fnIFS(...args: Array<() => any>): any;
181
+ fnABS(a: number): number;
182
+ fnMax(...args: Array<any>): any;
183
+ fnMin(...args: Array<number>): any;
184
+ fnSUM(...args: Array<number>): any;
185
+ fnINT(n: number): number;
186
+ fnMOD(a: number, b: number): number;
187
+ fnPI(): number;
188
+ fnROUND(a: number, b: number): number;
189
+ fnSQRT(n: number): number;
190
+ fnAVG(...args: Array<any>): number;
191
+ fnUPPERMONEY(): string;
192
+ fnRAND(): number;
193
+ normalizeText(raw: any): string;
194
+ fnLEFT(text: string, len: number): string;
195
+ fnRIGHT(text: string, len: number): string;
196
+ fnLEN(text: string): number;
197
+ fnISEMPTY(text: string): boolean;
198
+ fnCONCATENATE(...args: Array<any>): string;
199
+ fnCHAR(code: number): string;
200
+ fnLOWER(text: string): string;
201
+ fnUPPER(text: string): string;
202
+ fnSPLIT(text: string, sep: string): string[];
203
+ fnTRIM(text: string): string;
204
+ fnSTARTSWITH(text: string, search: string): boolean;
205
+ fnCONTAINS(text: string, search: string): boolean;
206
+ fnREPLACE(text: string, search: string, replace: string): string;
207
+ fnSEARCH(text: string, search: string, start?: number): string | -1;
208
+ fnMID(text: string, from: number, len: number): string;
209
+ fnDATE(year: number, month: number, day: number, hour: number, minute: number, second: number): Date;
210
+ fnTIMESTAMP(date: Date, format?: 'x' | 'X'): number;
211
+ fnTODAY(): Date;
212
+ fnNOW(): Date;
213
+ fnSTARTOF(date: Date, unit?: any): Date;
214
+ fnENDOF(date: Date, unit?: any): Date;
215
+ normalizeDate(raw: any): Date;
216
+ fnYEAR(date: Date): number;
217
+ fnMONTH(date: Date): number;
218
+ fnDAY(date: Date): number;
219
+ fnHOUR(date: Date): number;
220
+ fnHMINUTE(date: Date): number;
221
+ fnSECOND(date: Date): number;
222
+ fnYEARS(endDate: Date, startDate: Date): number;
223
+ fnMINUTES(endDate: Date, startDate: Date): number;
224
+ fnDAYS(endDate: Date, startDate: Date): number;
225
+ fnHOURS(endDate: Date, startDate: Date): number;
226
+ fnDATEMODIFY(date: Date, num: number, format: any): Date;
227
+ fnSTRTODATE(value: any, format?: string): Date;
228
+ fnISBEFORE(a: Date, b: Date, unit?: any): boolean;
229
+ fnISAFTER(a: Date, b: Date, unit?: any): boolean;
230
+ fnISSAMEORBEFORE(a: Date, b: Date, unit?: any): boolean;
231
+ fnISSAMEORAFTER(a: Date, b: Date, unit?: any): boolean;
232
+ fnCOUNT(value: any): number;
233
+ }
@@ -0,0 +1,19 @@
1
+ import moment from 'moment';
2
+ export declare const prettyBytes: (num: number) => string;
3
+ export declare const escapeHtml: (str: string) => string;
4
+ export declare function formatDuration(value: number): string;
5
+ export declare const relativeValueRe: RegExp;
6
+ export declare const filterDate: (value: string, data?: object, format?: string, utc?: boolean) => moment.Moment;
7
+ export declare function parseDuration(str: string): moment.Duration | undefined;
8
+ export declare function stripNumber(number: number): number;
9
+ export declare const filters: {
10
+ [propName: string]: (input: any, ...args: any[]) => any;
11
+ };
12
+ export declare function registerFilter(name: string, fn: (input: any, ...args: any[]) => any): void;
13
+ export declare function getFilters(): {
14
+ [propName: string]: (input: any, ...args: any[]) => any;
15
+ };
16
+ export declare function pickValues(names: string, data: object): any;
17
+ export declare const resolveVariable: (path?: string | undefined, data?: any) => any;
18
+ export declare function isPureVariable(path?: any): path is string;
19
+ export declare const resolveVariableAndFilter: (path?: string | undefined, data?: object, defaultFilter?: string, fallbackValue?: (value: any) => any) => any;
@@ -0,0 +1,6 @@
1
+ import { Evaluator, EvaluatorOptions } from './evalutor';
2
+ import { parse, ParserOptions } from './parser';
3
+ import { lexer } from './lexer';
4
+ export { parse, lexer, Evaluator };
5
+ export * from './util';
6
+ export declare function evaluate(astOrString: string, data: any, options?: ParserOptions & EvaluatorOptions): any;
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ (()=>{"use strict";var t={453:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.Evaluator=void 0;var n=r(752),i=(0,n.__importDefault)(r(245)),o=r(589),u=function(){function t(t){void 0===t&&(t={defaultFilter:"html"}),this.options=t,this.functions={},this.filters=(0,n.__assign)((0,n.__assign)((0,n.__assign)({},this.filters),(0,o.getFilters)()),null==t?void 0:t.filters),this.functions=(0,n.__assign)((0,n.__assign)({},this.functions),null==t?void 0:t.functions)}return t.prototype.evalute=function(t,e){if(void 0===e&&(e={}),this.data=e,t&&t.type){var r=t.type.replace(/(?:_|\-)(\w)/g,(function(t,e){return e.toUpperCase()})),n=this.functions[r]||this[r];if(!n)throw new Error("".concat(t.type," unkown."));return n.call(this,t,e)}return t},t.prototype.document=function(t,e){var r=this;if(t.body.length){var n=t.body.map((function(t){return r.evalute(t,e)}));return 1===n.length?n[0]:n.join("")}},t.prototype.filter=function(t,e){var r=this,n=this.filters[t.fnName];if(!n)throw new Error("filter `".concat(t.fnName,"` not exits"));return n.apply(e,[this.evalute(t.input,e)].concat(t.args.map((function(t){if("mixed"===(null==t?void 0:t.type))return t.body.map((function(t){return"string"==typeof t?t:r.evalute(t,e)})).join("");if("string"==typeof t&&~t.indexOf("$"))try{return new r.constructor(r.options).evalute(t,e)}catch(t){}else if(t.type)return r.evalute(t,e);return t}))))},t.prototype.raw=function(t){return t.value},t.prototype.script=function(t,e){var r,n=this.options.defaultFilter;return n&&"filter"!==(null===(r=t.body)||void 0===r?void 0:r.type)&&(t.body={type:"filter",input:t.body,fnName:n.replace(/^\|\s/,""),args:[]}),this.evalute(t.body,e)},t.prototype.expressionList=function(t,e){var r=this;return t.body.reduce((function(t,n){return r.evalute(n,e)}))},t.prototype.template=function(t,e){var r=this;return t.args.map((function(t){return r.evalute(t,e)})).join("")},t.prototype.templateRaw=function(t){return t.value},t.prototype.get=function(t,e){var r=this.evalute(t.host,e),n=this.evalute(t.key,e);return null==r?void 0:r[n]},t.prototype.unary=function(t,e){var r=this.evalute(t.value,e);switch(t.op){case"+":return+r;case"-":return-r;case"~":return~r;case"!":return!r}},t.prototype.formatNumber=function(t,e){void 0===e&&(e=!1);var r=typeof t;return"string"===r?(e?parseInt(t,10):parseFloat(t))||0:"number"===r&&e?Math.round(t):null!=t?t:0},t.prototype.power=function(t,e){var r=this.evalute(t.left,e),n=this.evalute(t.right,e);return Math.pow(this.formatNumber(r),this.formatNumber(n))},t.prototype.multiply=function(t,e){var r=this.evalute(t.left,e),n=this.evalute(t.right,e);return this.formatNumber(r)*this.formatNumber(n)},t.prototype.divide=function(t,e){var r=this.evalute(t.left,e),n=this.evalute(t.right,e);return this.formatNumber(r)/this.formatNumber(n)},t.prototype.remainder=function(t,e){var r=this.evalute(t.left,e),n=this.evalute(t.right,e);return this.formatNumber(r)%this.formatNumber(n)},t.prototype.add=function(t,e){var r=this.evalute(t.left,e),n=this.evalute(t.right,e);return this.formatNumber(r)+this.formatNumber(n)},t.prototype.minus=function(t,e){var r=this.evalute(t.left,e),n=this.evalute(t.right,e);return this.formatNumber(r)-this.formatNumber(n)},t.prototype.shift=function(t,e){var r=this.evalute(t.left,e),n=this.formatNumber(this.evalute(t.right,e),!0);return"<<"===t.op?r<<n:">>"==t.op?r>>n:r>>>n},t.prototype.lt=function(t,e){return this.evalute(t.left,e)<this.evalute(t.right,e)},t.prototype.gt=function(t,e){return this.evalute(t.left,e)>this.evalute(t.right,e)},t.prototype.le=function(t,e){return this.evalute(t.left,e)<=this.evalute(t.right,e)},t.prototype.ge=function(t,e){return this.evalute(t.left,e)>=this.evalute(t.right,e)},t.prototype.eq=function(t,e){return this.evalute(t.left,e)==this.evalute(t.right,e)},t.prototype.ne=function(t,e){return this.evalute(t.left,e)!=this.evalute(t.right,e)},t.prototype.streq=function(t,e){return this.evalute(t.left,e)===this.evalute(t.right,e)},t.prototype.strneq=function(t,e){return this.evalute(t.left,e)!==this.evalute(t.right,e)},t.prototype.binary=function(t,e){var r=this.evalute(t.left,e),n=this.evalute(t.right,e);return"&"===t.op?r&n:"^"===t.op?r^n:r|n},t.prototype.and=function(t,e){return this.evalute(t.left,e)&&this.evalute(t.right,e)},t.prototype.or=function(t,e){return this.evalute(t.left,e)||this.evalute(t.right,e)},t.prototype.number=function(t,e){return t.value},t.prototype.variable=function(t,e){return"&"===t.name?e:e[t.name]},t.prototype.array=function(t,e){var r=this;return t.members.map((function(t){return r.evalute(t,e)}))},t.prototype.literal=function(t){return t.value},t.prototype.string=function(t){return t.value},t.prototype.object=function(t,e){var r=this,n={};return t.memebers.forEach((function(t){var i=t.key,o=t.value;n[i]=r.evalute(o,e)})),n},t.prototype.conditional=function(t,e){return this.evalute(t.test,e)?this.evalute(t.consequent,e):this.evalute(t.alternate,e)},t.prototype.funcCall=function(t,e){var r=this,n="fn".concat(t.identifier),i=this.functions[n]||this[n]||this.filters[t.identifier];if(!i)throw new Error("".concat(t.identifier,"函数没有定义"));var o=t.args;return o=~["IF","AND","OR","XOR","IFS"].indexOf(t.identifier)?o.map((function(t){return function(){return r.evalute(t,e)}})):o.map((function(t){return r.evalute(t,e)})),i.apply(this,o)},t.prototype.fnIF=function(t,e,r){return t()?e():r()},t.prototype.fnAND=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return t.every((function(t){return t()}))},t.prototype.fnOR=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return t.some((function(t){return t()}))},t.prototype.fnXOR=function(t,e){return!!t()==!!e()},t.prototype.fnIFS=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];for(t.length%2&&t.splice(t.length-1,0,(function(){return!0}));t.length;){var r=t.shift(),n=t.shift();if(r())return n()}},t.prototype.fnABS=function(t){return Math.abs(t)},t.prototype.fnMax=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return Math.max.apply(Math,t)},t.prototype.fnMin=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return Math.min.apply(Math,t)},t.prototype.fnSUM=function(){for(var t=this,e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return e.reduce((function(e,r){return e+t.formatNumber(r)||0}),0)},t.prototype.fnINT=function(t){return Math.floor(t)},t.prototype.fnMOD=function(t,e){return t%e},t.prototype.fnPI=function(){return Math.PI},t.prototype.fnROUND=function(t,e){var r=Math.round(e);if(r){var n=Math.pow(10,r);return Math.round(t*n)/n}return Math.round(t)},t.prototype.fnSQRT=function(t){return Math.sqrt(t)},t.prototype.fnAVG=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return this.fnSUM.apply(this,t)/t.length},t.prototype.fnUPPERMONEY=function(){return"todo"},t.prototype.fnRAND=function(){return Math.random()},t.prototype.normalizeText=function(t){return t instanceof Date?(0,i.default)(t).format():"".concat(t)},t.prototype.fnLEFT=function(t,e){return(t=this.normalizeText(t)).substring(0,e)},t.prototype.fnRIGHT=function(t,e){return(t=this.normalizeText(t)).substring(t.length-e,t.length)},t.prototype.fnLEN=function(t){return null==(t=this.normalizeText(t))?void 0:t.length},t.prototype.fnISEMPTY=function(t){return!t||!String(t).trim()},t.prototype.fnCONCATENATE=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return t.join("")},t.prototype.fnCHAR=function(t){return String.fromCharCode(t)},t.prototype.fnLOWER=function(t){return(t=this.normalizeText(t)).toLowerCase()},t.prototype.fnUPPER=function(t){return(t=this.normalizeText(t)).toUpperCase()},t.prototype.fnSPLIT=function(t,e){return(t=this.normalizeText(t)).split(e)},t.prototype.fnTRIM=function(t){return(t=this.normalizeText(t)).trim()},t.prototype.fnSTARTSWITH=function(t,e){return!!e&&0===(t=this.normalizeText(t)).indexOf(e)},t.prototype.fnCONTAINS=function(t,e){return!!e&&!!~(t=this.normalizeText(t)).indexOf(e)},t.prototype.fnREPLACE=function(t,e,r){for(var n=t=this.normalizeText(t);;){var i=n.indexOf(e);if(!~i)break;n=n.substring(0,i)+r+n.substring(i+e.length)}return n},t.prototype.fnSEARCH=function(t,e,r){var n=t=this.normalizeText(t);(r=r||0)&&(n=n.substring(r));var i=n.indexOf(e);return~i?i+e:-1},t.prototype.fnMID=function(t,e,r){return(t=this.normalizeText(t)).substring(e,e+r)},t.prototype.fnDATE=function(t,e,r,n,i,o){return void 0===e?new Date(t):new Date(t,e,r,n,i,o)},t.prototype.fnTIMESTAMP=function(t,e){return parseInt((0,i.default)(t).format("x"===e?"x":"X"),10)},t.prototype.fnTODAY=function(){return new Date},t.prototype.fnNOW=function(){return new Date},t.prototype.fnSTARTOF=function(t,e){return(0,i.default)(t).startOf(e||"day").toDate()},t.prototype.fnENDOF=function(t,e){return(0,i.default)(t).endOf(e||"day").toDate()},t.prototype.normalizeDate=function(t){if("string"==typeof t)for(var e=["","YYYY-MM-DD HH:mm:ss"];e.length;){var r=e.shift(),n=(0,i.default)(t,r);if(n.isValid())return n.toDate()}else if("number"==typeof t)return new Date(t);return t},t.prototype.fnYEAR=function(t){return(t=this.normalizeDate(t)).getFullYear()},t.prototype.fnMONTH=function(t){return(t=this.normalizeDate(t)).getMonth()+1},t.prototype.fnDAY=function(t){return(t=this.normalizeDate(t)).getDate()},t.prototype.fnHOUR=function(t){return(t=this.normalizeDate(t)).getHours()},t.prototype.fnHMINUTE=function(t){return(t=this.normalizeDate(t)).getMinutes()},t.prototype.fnSECOND=function(t){return(t=this.normalizeDate(t)).getSeconds()},t.prototype.fnYEARS=function(t,e){return t=this.normalizeDate(t),e=this.normalizeDate(e),(0,i.default)(t).diff((0,i.default)(e),"year")},t.prototype.fnMINUTES=function(t,e){return t=this.normalizeDate(t),e=this.normalizeDate(e),(0,i.default)(t).diff((0,i.default)(e),"minutes")},t.prototype.fnDAYS=function(t,e){return t=this.normalizeDate(t),e=this.normalizeDate(e),(0,i.default)(t).diff((0,i.default)(e),"days")},t.prototype.fnHOURS=function(t,e){return t=this.normalizeDate(t),e=this.normalizeDate(e),(0,i.default)(t).diff((0,i.default)(e),"hour")},t.prototype.fnDATEMODIFY=function(t,e,r){return t=this.normalizeDate(t),(0,i.default)(t).add(e,r).toDate()},t.prototype.fnSTRTODATE=function(t,e){return void 0===e&&(e=""),(0,i.default)(t,e).toDate()},t.prototype.fnISBEFORE=function(t,e,r){return void 0===r&&(r="day"),t=this.normalizeDate(t),e=this.normalizeDate(e),(0,i.default)(t).isBefore((0,i.default)(e),r)},t.prototype.fnISAFTER=function(t,e,r){return void 0===r&&(r="day"),t=this.normalizeDate(t),e=this.normalizeDate(e),(0,i.default)(t).isAfter((0,i.default)(e),r)},t.prototype.fnISSAMEORBEFORE=function(t,e,r){return void 0===r&&(r="day"),t=this.normalizeDate(t),e=this.normalizeDate(e),(0,i.default)(t).isSameOrBefore((0,i.default)(e),r)},t.prototype.fnISSAMEORAFTER=function(t,e,r){return void 0===r&&(r="day"),t=this.normalizeDate(t),e=this.normalizeDate(e),(0,i.default)(t).isSameOrAfter((0,i.default)(e),r)},t.prototype.fnCOUNT=function(t){return Array.isArray(t)?t.length:t?1:0},t}();e.Evaluator=u},589:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.resolveVariableAndFilter=e.isPureVariable=e.resolveVariable=e.pickValues=e.getFilters=e.registerFilter=e.filters=e.stripNumber=e.parseDuration=e.filterDate=e.relativeValueRe=e.formatDuration=e.escapeHtml=e.prettyBytes=void 0;var n=r(752),i=(0,n.__importDefault)(r(245)),o=(0,n.__importDefault)(r(341)),u=(0,n.__importDefault)(r(492)),a=(0,n.__importDefault)(r(309)),f=(0,n.__importDefault)(r(459)),l=r(378),s=["B","KB","MB","GB","TB","PB","EB","ZB","YB"];e.prettyBytes=function(t){if(!Number.isFinite(t))throw new TypeError("Expected a finite number, got ".concat(typeof t,": ").concat(t));var e=t<0;if(e&&(t=-t),t<1)return(e?"-":"")+t+" B";var r=Math.min(Math.floor(Math.log(t)/Math.log(1e3)),s.length-1);return(e?"-":"")+Number((t/Math.pow(1e3,r)).toPrecision(3))+" "+s[r]};var c={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#x2F;"};function p(t){for(var e=["秒","分","时","天","月","季","年"],r=[1,60,3600,86400,2592e3,7776e3,31104e3],n=r.length,i=[];n--;)r[n]&&t>=r[n]?(i.push(Math.floor(t/r[n])+e[n]),t%=r[n]):0===n&&t&&i.push((t.toFixed?t.toFixed(2):"0")+e[0]);return i.join("")}e.escapeHtml=function(t){return String(t).replace(/[&<>"'\/]/g,(function(t){return c[t]}))},e.formatDuration=p;var v={year:"Y",month:"M",week:"w",weekday:"W",day:"d",hour:"h",minute:"m",min:"m",second:"s",millisecond:"ms"};function d(t){return"number"==typeof t?parseFloat(t.toPrecision(12)):t}function h(t,r){return/^('|")(.*)\1$/.test(t)?RegExp.$2:/^-?\d+$/.test(t)?parseInt(t,10):/^(-?\d+)\.\d+?$/.test(t)?parseFloat(t):/^\[.*\]$/.test(t)?t.substring(1,t.length-1).split(/\s*,\s*/).filter((function(t){return t})):/,/.test(t)?t.split(/\s*,\s*/).filter((function(t){return t})):(0,e.resolveVariable)(t,r)}function y(t){return t&&"string"==typeof t?/^\[.*\]$/.test(t)?t.substring(1,t.length-1).split(/\s*,\s*/).filter((function(t){return t})):t.split(/\s*,\s*/).filter((function(t){return t})):t}function m(t,e,r,n,i){return e||!e&&n?h(e?r:n,i):t}function g(t,r){var n,i;if(!t||(i=t.split(","))&&i.length<2){var o=t.indexOf("~");if(~o){var u=t.substring(0,o),a=t.substring(o+1);return(n={})[u]=(0,e.resolveVariable)(a,r),n}return(0,e.resolveVariable)(t,r)}var f={};return i.forEach((function(t){var n=t.indexOf("~"),i=t;~n&&(i=t.substring(n+1),t=t.substring(0,n)),(0,l.setVariable)(f,t,(0,e.resolveVariable)(i,r))})),f}function b(t,e){return void 0!==t[e]?t[e]:(0,l.keyToPath)(e.replace(/^{|}$/g,"")).reduce((function(t,e){if(((0,l.isObject)(t)||Array.isArray(t))&&e in t)return t[e]}),t)}e.relativeValueRe=/^(.+)?(\+|-)(\d+)(minute|min|hour|day|week|month|year|weekday|second|millisecond)s?$/i,e.filterDate=function(t,r,n,o){void 0===r&&(r={}),void 0===n&&(n="X"),void 0===o&&(o=!1);var u,a=o?i.default.utc:i.default;if("string"==typeof t&&(t=t.trim()),(t=(0,l.tokenize)(t,r))&&"string"==typeof t&&(u=e.relativeValueRe.exec(t))){var f=new Date,s=parseInt(u[3],10),c=u[1]?(0,e.filterDate)(u[1],r,n,o):a(/(minute|min|hour|second)s?/.test(u[4])?[f.getFullYear(),f.getMonth(),f.getDate(),f.getHours(),f.getMinutes(),f.getSeconds()]:[f.getFullYear(),f.getMonth(),f.getDate()]);return"-"===u[2]?c.subtract(s,v[u[4]]):c.add(s,v[u[4]])}return"now"===t?a():"today"===t?a([(f=new Date).getFullYear(),f.getMonth(),f.getDate()]):a(t,n)},e.parseDuration=function(t){var e=/^((?:\-|\+)?(?:\d*\.)?\d+)(minute|min|hour|day|week|month|quarter|year|weekday|second|millisecond)s?$/.exec(t);if(e){var r=i.default.duration(parseFloat(e[1]),e[2]);if(i.default.isDuration(r))return r}},e.stripNumber=d,e.filters={map:function(t,r){for(var i=[],o=2;o<arguments.length;o++)i[o-2]=arguments[o];return Array.isArray(t)&&e.filters[r]?t.map((function(t){return e.filters[r].apply(e.filters,(0,n.__spreadArray)([t],i,!1))})):t},html:function(t){return(0,e.escapeHtml)(t)},json:function(t,e){return void 0===e&&(e=2),e?JSON.stringify(t,null,parseInt(e,10)):JSON.stringify(t)},toJson:function(t){var e;try{e=JSON.parse(t)}catch(t){e=null}return e},toInt:function(t){return"string"==typeof t?parseInt(t,10):t},toFloat:function(t){return"string"==typeof t?parseFloat(t):t},raw:function(t){return t},now:function(){return new Date},toDate:function(t,e){void 0===e&&(e="");var r=(0,i.default)(t,e);return r.add(),r.isValid()?r.toDate():void 0},fromNow:function(t,e){return void 0===e&&(e=""),(0,i.default)(t,e).fromNow()},dateModify:function(t,e,r,n){return void 0===e&&(e="add"),void 0===r&&(r=0),void 0===n&&(n="days"),t instanceof Date||(t=new Date),"endOf"===e||"startOf"===e?(0,i.default)(t)["endOf"===e?"endOf":"startOf"](r||"day").toDate():(0,i.default)(t)["add"===e?"add":"subtract"](parseInt(r,10)||0,n).toDate()},date:function(t,e,r){return void 0===e&&(e="LLL"),void 0===r&&(r="X"),(0,i.default)(t,r).format(e)},number:function(t){var e=String(t).split(".");return e[0]=e[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),e.join(".")},trim:function(t){return"string"==typeof t?t.trim():t},percent:function(t,e){void 0===e&&(e=0),t=parseFloat(t)||0,e=parseInt(e,10)||0;var r=100*t,n=Math.pow(10,e);return(Math.round(r*n)/n).toFixed(e)+"%"},duration:function(t){return t?p(t):t},bytes:function(t){return t?(0,e.prettyBytes)(parseFloat(t)):t},round:function(t,e){var r;if(void 0===e&&(e=2),isNaN(t))return 0;e=null!==(r=parseInt(e,10))&&void 0!==r?r:2;var n=Math.pow(10,e);return(Math.round(t*n)/n).toFixed(e)},truncate:function(t,e,r){return"string"!=typeof t?t:(r=r||"...",null==e?t:(e=parseInt(e,10)||200,t.substring(0,e)+(t.length>e?r:"")))},url_encode:function(t){return encodeURIComponent(t)},url_decode:function(t){return decodeURIComponent(t)},default:function(t,e,r){var n;return void 0===r&&(r=!1),null!==(n=r?t:t||void 0)&&void 0!==n?n:function(){try{if("undefined"===e)return;return JSON.parse(e)}catch(t){return e}}()},join:function(t,e){return t&&t.join?t.join(e):t},split:function(t,e){return void 0===e&&(e=","),"string"==typeof t?t.split(e):t},sortBy:function(t,r,n,i){return void 0===n&&(n="alpha"),Array.isArray(t)?t.sort(function(t,r,n){return function(i,o){if(!i||!o)return 0;var u=(0,e.resolveVariable)(t,i),a=(0,e.resolveVariable)(t,o);return("numerical"===r?(parseFloat(u)||0)-(parseFloat(a)||0):String(u).localeCompare(String(a)))*("desc"===n?-1:1)}}(r,n,i)):t},objectToArray:function(t,e,r){return void 0===e&&(e="label"),void 0===r&&(r="value"),(0,o.default)(t,(function(t,n,i){var o;(t||(t=[])).push(((o={})[e]=n,o[r]=i,o))}),[])},unique:function(t,e){return Array.isArray(t)?e?(0,a.default)(t,e):(0,f.default)(t):t},topAndOther:function(t,e,r,n){if(void 0===e&&(e=10),void 0===r&&(r="name"),void 0===n&&(n="其他"),Array.isArray(t)&&e){var i=(0,u.default)(t,(function(r){var n=t.indexOf(r)+1;return n>=e?e:n}));return Object.keys(i).map((function(t,o){var u=i[t].reduce((function(t,e){return Object.keys(e).forEach((function(r){t.hasOwnProperty(r)&&"labelField"!==r?"number"==typeof e[r]&&"number"==typeof t[r]?t[r]+=e[r]:"string"==typeof e[r]&&/^(?:\-|\.)\d/.test(e[r])&&"number"==typeof t[r]?t[r]+=parseFloat(e[r])||0:"string"==typeof e[r]&&"string"==typeof t[r]?t[r]+=", ".concat(e[r]):t[r]=e[r]:t[r]=e[r]})),t}),{});return o===e-1&&(u[r]=n||"其他"),u}))}return t},first:function(t){return t&&t[0]},nth:function(t,e){return void 0===e&&(e=0),t&&t[e]},last:function(t){return t&&(t.length?t[t.length-1]:null)},minus:function(t,e){return void 0===e&&(e=1),d((Number(t)||0)-Number(h(e,this)))},plus:function(t,e){return void 0===e&&(e=1),d((Number(t)||0)+Number(h(e,this)))},times:function(t,e){return void 0===e&&(e=1),d((Number(t)||0)*Number(h(e,this)))},division:function(t,e){return void 0===e&&(e=1),d((Number(t)||0)/Number(h(e,this)))},count:function(t){return Array.isArray(t)||"string"==typeof t?t.length:0},sum:function(t,e){return Array.isArray(t)?d(t.reduce((function(t,r){return t+(parseFloat(e?g(e,r):r)||0)}),0)):t},abs:function(t){return"number"==typeof t?Math.abs(t):t},pick:function(t,e){return void 0===e&&(e="&"),Array.isArray(t)&&!/^\d+$/.test(e)?t.map((function(t,r){return g(e,(0,l.createObject)({index:r},t))})):g(e,t)},pick_if_exist:function(t,r){return void 0===r&&(r="&"),Array.isArray(t)?t.map((function(t){return(0,e.resolveVariable)(r,t)||t})):(0,e.resolveVariable)(r,t)||t},str2date:function(t,r,n){return void 0===r&&(r="X"),void 0===n&&(n="X"),t?(0,e.filterDate)(t,this,r).format(n):""},asArray:function(t){return Array.isArray(t)?t:t?[t]:t},concat:function(t){for(var e=this,r=[],n=1;n<arguments.length;n++)r[n-1]=arguments[n];return Array.isArray(t)?t.concat.apply(t,r.map((function(t){return h(t,e)}))):t},filter:function(t,r,n,i){if(!Array.isArray(t)||!r||!n)return t;var o=n,u=function(){return!0};if("isTrue"===o)u=function(t){return!!t};else if("isFalse"===o)u=function(t){return!t};else if("isExists"===o)u=function(t){return void 0!==t};else if("equals"===o||"equal"===o)i=i?h(i,this):"",u=function(t){return i==t};else if("isIn"===o){var a=i?h(i,this):[];a=y(a),a=Array.isArray(a)?a:a?[a]:[],u=function(t){return!a.length||!!~a.indexOf(t)}}else if("notIn"===o){var f=i?h(i,this):[];f=y(f),f=Array.isArray(f)?f:f?[f]:[],u=function(t){return!~f.indexOf(t)}}else{if("match"!==o&&(o="match",i=n),!(i=i?h(i,this):""))return t;var s=(0,l.string2regExp)("".concat(i),!1);u=function(t){return s.test(String(t))}}var c=/\s*\*\s*/.test(r);return r=r.split(/\s*,\s*/),t.filter((function(t){return(c?Object.keys(t):r).some((function(r){return u((0,e.resolveVariable)(r,t),r,t)}))}))},base64Encode:function(t){return btoa(encodeURIComponent(t).replace(/%([0-9A-F]{2})/g,(function(t,e){return String.fromCharCode("0x"+e)})))},base64Decode:function(t){return decodeURIComponent(atob(t).split("").map((function(t){return"%"+("00"+t.charCodeAt(0).toString(16)).slice(-2)})).join(""))},lowerCase:function(t){return t&&"string"==typeof t?t.toLowerCase():t},upperCase:function(t){return t&&"string"==typeof t?t.toUpperCase():t},isTrue:function(t,e,r){return m(t,!!t,e,r,this)},isFalse:function(t,e,r){return m(t,!t,e,r,this)},isMatch:function(t,e,r,n){return m(t,(e=h(e,this))&&(0,l.string2regExp)("".concat(e),!1).test(String(t)),r,n,this)},notMatch:function(t,e,r,n){return m(t,(e=h(e,this))&&!(0,l.string2regExp)("".concat(e),!1).test(String(t)),r,n,this)},isEquals:function(t,e,r,n){return m(t,t===(e=/^\d+$/.test(e)?parseInt(e,10):h(e,this)),r,n,this)},notEquals:function(t,e,r,n){return m(t,t!==(e=/^\d+$/.test(e)?parseInt(e,10):h(e,this)),r,n,this)}},e.registerFilter=function(t,r){e.filters[t]=r},e.getFilters=function(){return e.filters},e.pickValues=g,e.resolveVariable=function(t,e){if(void 0===e&&(e={}),t&&e&&"string"==typeof t){var r=t.split(":"),n=r[0],i=r[1];if(!i&&n&&(i=n,n=""),"window"===n)e=window;else{if("ls"===n||"ss"===n){var o=(0,l.keyToPath)(i.replace(/^{|}$/g,"")),u=o.shift(),a="ss"===n?sessionStorage.getItem(u):localStorage.getItem(u);if("string"==typeof a){var f=function(t,e){try{return JSON.parse(t)}catch(t){return e}}(a,a);return(0,l.isObject)(f)&&o.length?b(f,o.join(".")):f}return}if("cookie"===n)return function(t){var e="; ".concat(document.cookie).split("; ".concat(t,"="));if(2===e.length)return e.pop().split(";").shift()}(u=i.replace(/^{|}$/g,"").trim())}if("$$"===i)return e;if("$"===i[0])i=t.substring(1);else if("&"===i)return e;return b(e,i)}},e.isPureVariable=function(t){return"string"==typeof t&&/^\$(?:((?:\w+\:)?[a-z0-9_.][a-z0-9_.\[\]]*)|{[^}{]+})$/i.test(t)},e.resolveVariableAndFilter=function(t,r,i,o){if(void 0===r&&(r={}),void 0===i&&(i="| html"),void 0===o&&(o=function(t){return t}),t){var u=/^(\\)?\$(?:((?:\w+\:)?[a-z0-9_.][a-z0-9_.\[\]]*)|{([\s\S]+)})$/i.exec(t);if(u){var a=u[0],f=u[1],l=u[2],s=u[3];if(f)return a.substring(1);var c=l||s;c=c.replace(/(\\|\\\$)?\$(?:([a-zA-Z0-9_.][a-zA-Z0-9_.\[\]]*)|{([^}{]+)})/g,(function(t,n){return n?t.substring(1):(0,e.resolveVariableAndFilter)(t,r,i)})),~c.indexOf("|")||(c+=i);var p=c.split(/\s*\|\s*/g),v=c;c=p.shift();var d=(0,e.resolveVariable)(c,r),h=!1;return null!=d||~v.indexOf("default")||~v.indexOf("now")?p.reduce((function(t,i){var o,u,a=i.replace(/([^\\])\\([\:\\])/g,(function(t,e,r){return"".concat(e,"__").concat(":"===r?"colon":"slash","__")})).split(":").map((function(t){return t.replace(/__(slash|colon)__/g,(function(t,e){return"colon"===e?":":"\\"}))})),f=a.shift();if(~["isTrue","isFalse","isMatch","isEquals","notMatch","notEquals"].indexOf(f)){if(h)return t;var l=(o=e.filters[f]).call.apply(o,(0,n.__spreadArray)([r,t],a,!1));return h=l!==t,l}return h=!1,(u=e.filters[f]||e.filters.raw).call.apply(u,(0,n.__spreadArray)([r,t],a,!1))}),d):o(d)}}}},303:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.evaluate=e.Evaluator=e.lexer=e.parse=void 0;var n=r(752),i=r(453);Object.defineProperty(e,"Evaluator",{enumerable:!0,get:function(){return i.Evaluator}});var o=r(833);Object.defineProperty(e,"parse",{enumerable:!0,get:function(){return o.parse}});var u=r(682);Object.defineProperty(e,"lexer",{enumerable:!0,get:function(){return u.lexer}}),(0,n.__exportStar)(r(378),e),e.evaluate=function(t,e,r){return"string"==typeof t&&(t=(0,o.parse)(t,r)),new i.Evaluator(r).evalute(t,e)}},682:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.lexer=e.TokenName=void 0,e.TokenName={},e.TokenName[1]="Boolean",e.TokenName[2]="Raw",e.TokenName[3]="Variable",e.TokenName[4]="OpenScript",e.TokenName[5]="CloseScript",e.TokenName[6]="EOF",e.TokenName[7]="Identifier",e.TokenName[8]="Literal",e.TokenName[9]="Numeric",e.TokenName[10]="Punctuator",e.TokenName[11]="String",e.TokenName[12]="RegularExpression",e.TokenName[13]="TemplateRaw",e.TokenName[14]="TemplateLeftBrace",e.TokenName[15]="TemplateRightBrace",e.TokenName[16]="OpenFilter",e.TokenName[17]="Char";var r=["===","!==","==","!=","<>","<",">","<=",">=","||","&&","++","--","<<",">>",">>>","+=","*=","/=","=","*","/","-","+","^","!","%","&","|","(",")","[","]","{","}","?",":",";",",",".","$"],n={'"':0,"\\":1,"/":2,b:3,f:4,n:5,r:6,t:7,u:8};function i(t){return t>="1"&&t<="9"}function o(t){return t>="0"&&t<="9"}function u(t){return"e"===t||"E"===t}function a(t,e){return void 0===e&&(e=[]),t.replace(/\\(.)/g,(function(t,r){return"b"===r?"\b":"f"===r?"\f":"n"===r?"\n":"r"===r?"\r":"t"===r?"\t":"v"===r?"\v":~e.indexOf(r)?r:t}))}function f(t){return Number(t)}e.lexer=function(t,l){var s=1,c=1,p=0,v=0,d=[v],h=[],y=!1!==(null==l?void 0:l.allowFilter);function m(t){d.push(v=t)}function g(){d.pop(),v=d[d.length-1]}function b(t){if(t&&"string"==typeof t){var e=t.split(/[\r\n]+/);return{index:p+t.length,line:s+e.length-1,column:c+e[e.length-1].length}}return{index:p,line:s,column:c}}function k(){return h.length?h.shift():(1!==v&&2!==v&&3!==v||function(){for(;p<t.length;){var e=t[p];if("\r"===e)p++,s++,c=1,"\n"===t.charAt(p)&&p++;else if("\n"===e)p++,s++,c=1;else{if("\t"!==e&&" "!==e)break;p++,c++}}}(),function(){if(p>=t.length)return{type:e.TokenName[6],value:void 0,start:b(),end:b()}}()||function(){if(0!==v)return null;for(var r="",i=0,o=p;o<t.length;){var u=t[o];if(1===i){if(!n.hasOwnProperty(u)&&"$"!==u){var f=b(r+u);throw new SyntaxError("Unexpected token ".concat(u," in ").concat(f.line,":").concat(f.column))}r+=u,o++,i=0}else{if("\\"===u){r+=u,o++,i=1;continue}if("$"===u){var l=t[o+1];if("{"===l)break;if("$"===l){h.push({type:e.TokenName[3],value:"&",raw:"$$",start:b(t.substring(p,o)),end:b(t.substring(p,o+2))});break}for(var s=o+2;/^[a-zA-Z0-9_.][a-zA-Z0-9_.\[\]]*$/.test(t.substring(o+1,s))&&s<=t.length;)s++;if(s-o>2){h.push({type:e.TokenName[3],value:t.substring(o+1,s),raw:t.substring(o,s),start:b(t.substring(p,o)),end:b(t.substring(p,s))});break}}o++,r+=u}}return o>p?{type:e.TokenName[2],value:a(r,["`","$"]),raw:r,start:b(),end:b(r)}:h.length?h.shift():null}()||function(){if("$"===t[p]&&"{"===t[p+1]){m(1);var r=t.substring(p,p+2);return{type:e.TokenName[4],value:r,start:b(),end:b(r)}}return null}()||function(){if(1!==v&&2!==v&&3!==v&&5!==v)return null;var l,s,c,d,h=(s=t.substring(p,p+4).toLowerCase(),c=s,d=!1,"true"===s||"null"===s?(d=!0,c="true"===s||null):"false"===(s=t.substring(p,p+5).toLowerCase())?(d=!0,c=!1):"undefined"===(s=t.substring(p,p+9).toLowerCase())&&(d=!0,c=void 0),(d?{type:e.TokenName[8],value:c,raw:s,start:b(),end:b(s)}:null)||function(){for(var r=p,n="";r<t.length;){var i=t[r];if(!/^[\u4e00-\u9fa5A-Za-z_$@][\u4e00-\u9fa5A-Za-z0-9_]*$/.test(n+i))break;n+=i,r++}if(r>p){var o=t.substring(p,r);return{type:e.TokenName[7],value:o,start:b(),end:b(o)}}return null}()||function(){var r=p,n=r,a=0;t:for(;r<t.length;){var l=t.charAt(r);switch(a){case 0:if("-"===l)a=1;else if("0"===l)n=r+1,a=2;else{if(!i(l))return null;n=r+1,a=3}break;case 1:if("0"===l)n=r+1,a=2;else{if(!i(l))return null;n=r+1,a=3}break;case 2:if("."===l)a=4;else{if(!u(l))break t;a=6}break;case 3:if(o(l))n=r+1;else if("."===l)a=4;else{if(!u(l))break t;a=6}break;case 4:if(!o(l))break t;n=r+1,a=5;break;case 5:if(o(l))n=r+1;else{if(!u(l))break t;a=6}break;case 6:if("+"===l||"-"===l)a=7;else{if(!o(l))break t;n=r+1,a=7}break;case 7:if(!o(l))break t;n=r+1}r++}if(n>0){var s=t.slice(p,n);return{type:e.TokenName[9],value:f(s),raw:s,start:b(),end:b(s)}}return null}()||function(){for(var r='"',i=0,o=p;o<t.length;){var u=t[o];if(0===i){if('"'!==u&&"'"!==u)break;r=u,o++,i=1}else if(2===i){if(!n.hasOwnProperty(u)&&u!==r){var f=b(t.substring(p,o+1));throw new SyntaxError("Unexpected token ".concat(u," in ").concat(f.line,":").concat(f.column))}o++,i=1}else if("\\"===u)o++,i=2;else{if(u===r){o++;break}o++}}if(o>p){var l=t.substring(p,o);return{type:e.TokenName[11],value:a(l.substring(1,l.length-1),[r]),raw:l,start:b(),end:b(l)}}return null}()||((l=r.find((function(e){return t.substring(p,p+e.length)===e})))?{type:e.TokenName[10],value:l,start:b(),end:b(l)}:null)||function(){if(5!==v)return null;var i=p,o=t[i];if("\\"===o){var u=t[i+1];if("$"!==u&&!~r.indexOf(u)&&!n.hasOwnProperty(u)){var a=b(t.substring(p,p+1));throw new SyntaxError("Unexpected token ".concat(o," in ").concat(a.line,":").concat(a.column))}i++,o="b"===u?"\b":"f"===u?"\f":"n"===u?"\n":"r"===u?"\r":"t"===u?"\t":"v"===u?"\v":u}return{type:e.TokenName[17],value:o,start:b(),end:b(t.substring(p,i+1))}}());if("{"===(null==h?void 0:h.value))m(3);else if("}"===(null==h?void 0:h.value)){5===v&&g();var k=v;if(g(),1===k||2===k)return{type:e.TokenName[2===k?15:5],value:h.value,start:b(),end:b(h.value)}}return 1===v&&"|"===(null==h?void 0:h.value)&&y?(m(5),{type:e.TokenName[16],value:"|",start:b(),end:b("|")}):5===v&&"|"===(null==h?void 0:h.value)?{type:e.TokenName[16],value:"|",start:b(),end:b("|")}:h||"`"!==t[p]?h:(m(4),{type:e.TokenName[10],value:"`",start:b(),end:b("`")})}()||function(){if(4!==v)return null;for(var r=0,i=p;i<t.length;){var o=t[i];if(2===r){if(!n.hasOwnProperty(o)&&"`"!==o&&"$"!==o){var u=b(t.substring(p,i+1));throw new SyntaxError("Unexpected token ".concat(o," in ").concat(u.line,":").concat(u.column))}i++,r=1}else if("\\"===o)i++,r=2;else{if("`"===o){g(),h.push({type:e.TokenName[10],value:"`",start:b(t.substring(p,i)),end:b(t.substring(p,i+1))});break}if("$"===o){if("{"===t[i+1]){m(2),h.push({type:e.TokenName[14],value:"${",start:b(t.substring(p,i)),end:b(t.substring(p,i+2))});break}i++}else i++}}if(i>p){var f=t.substring(p,i);return{type:e.TokenName[13],value:a(f,["`","$"]),raw:f,start:b(),end:b(f)}}return h.length?h.shift():null}())}return(null==l?void 0:l.evalMode)&&m(2),{next:function(){var e=k();if(e)return p=e.end.index,s=e.end.line,c=e.end.column,e;var r=b();throw new SyntaxError('unexpected character "'.concat(t[p],'" at ').concat(r.line,":").concat(r.column))}}}},833:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.parse=void 0;var n=r(682);e.parse=function(t,e){var r,i,o=(0,n.lexer)(t,e),u=[],a=[];function f(){if(!(i=a.length?a.shift():o.next()))throw new TypeError("next token is undefined");u.push(i)}function l(t){return i.type===n.TokenName[10]&&(Array.isArray(t)?~t.indexOf(i.value):i.value===t)}function s(){throw TypeError("Unexpected token <".concat(i.type,">").concat(i.value," in ").concat(i.start.line,":").concat(i.start.column))}function c(t){return t||s(),t}function p(){return j()}function v(){for(;i.type===n.TokenName[17]&&/^\s+$/m.test(i.value);)f()}function d(){for(var t=[];!l(":")&&i.type!==n.TokenName[16]&&i.type!==n.TokenName[5];){var e=M()||D()||S()||I()||z();e?t.push(e):(c(~[n.TokenName[7],n.TokenName[10],n.TokenName[17]].indexOf(i.type)),t.length&&"string"==typeof t[t.length-1]?t[t.length-1]+=i.raw||i.value:t.push(i.raw||i.value),f())}return t.length&&"string"==typeof t[t.length-1]&&(t[t.length-1]=t[t.length-1].replace(/\s+$/,"")),t}function h(t,e,r,n,i,o){var u;void 0===n&&(n=r),void 0===i&&(i="left"),void 0===o&&(o="right");var a=r();if(!a)return null;if(l(e))for(;l(e);){f();var s=c(n());(u={type:t,op:e})[i]=a,u[o]=s,a=u}return a}function y(){return h("and","&&",m)}function m(){return h("binary","|",g)}function g(){return h("binary","^",b)}function b(){return h("binary","&",k)}function k(){return h("eq","==",(function(){return h("ne","!=",(function(){return h("streq","===",(function(){return h("strneq","!==",T)}))}))}))}function T(){return h("lt","<",(function(){return h("gt",">",(function(){return h("le","<=",(function(){return h("ge",">=",N)}))}))}))}function N(){return h("shift","<<",(function(){return h("shift",">>",(function(){return h("shift",">>>",w)}))}))}function w(){return h("add","+",(function(){return h("minus","-",O)}))}function O(){return h("multiply","*",(function(){return h("divide","/",(function(){return h("remainder","%",x)}))}))}function x(){return h("power","**",_)}function _(){for(var t=["+","-","~","!"],e=[];l(t);)e.push(i),f();var r=function(){var t=function(){if(i.type===n.TokenName[7]){var t=i;if(f(),l("(")){var e=F();return{type:"func_call",identifier:t.value,args:null==e?void 0:e.body}}a.unshift(u.pop()),i=u[u.length-1]}return null}()||E()||M()||D()||S()||z()||function(){var t=F();return 1===(null==t?void 0:t.body.length)?t.body[0]:t}()||I();if(!t)return null;for(;l("[")||l(".");){var e=l(".");f();var r=c(e?E()||I():A());e||(l("]")?f():s()),t={type:"get",host:t,key:r}}return t}();for(c(!e.length||r);e.length;)r={type:"unary",op:e.pop().value,value:r};return r}function A(){if(i.type===n.TokenName[7]){var t=i;return f(),t.value}return function(){if(i.type===n.TokenName[11]){var t=i;return f(),{type:"string",value:t.value}}return null}()||D()}function D(){if(l("`")){f();for(var t=0,e={type:"template",body:[]};;)if(1===t){var r=c(p());e.body.push(r),c(i.type===n.TokenName[15]),t=0,f()}else{if(l("`")){f();break}i.type===n.TokenName[14]?(f(),t=1):i.type===n.TokenName[13]&&(e.body.push({type:"template_raw",value:i.value}),f())}return e}return null}function E(){if(i.type===n.TokenName[7]){var t=i;return f(),{type:"variable",name:t.value}}return null}function M(){if(i.type===n.TokenName[8]||i.type===n.TokenName[9]||i.type===n.TokenName[11]){var t=i.value;return f(),{type:"literal",value:t}}return null}function S(){if(l("[")){var t=F("[","]");return{type:"array",members:null==t?void 0:t.body}}return null}function F(t,e){if(void 0===t&&(t="("),void 0===e&&(e=")"),l(t)){f();for(var r=[],n=0;;)if(1!==n&&l(e)){if(l(e)){f();break}}else{var i=c(p());r.push(i),n=0,l(",")&&(f(),n=1)}return{type:"expression-list",body:r}}return null}function z(){if(l("{")){f();for(var t={type:"object",members:[]},e=0,r=void 0,n=void 0;;)if(1===e)c(l(":")),f(),e=2;else if(2===e)n=c(p()),t.members.push({key:r,value:n}),e=3;else if(3===e){if(l(","))f(),e=4;else if(l("}")){f();break}}else{if(4!=e&&l("}")){f();break}r=c(A()),e=1}return t}return null}function j(){return function(){var t=h("or","||",y);if(!t)return null;if(l("?")){f();var e=j();c(e),c(l(":")),f();var r=j();return c(r),{type:"conditional",test:t,consequent:e,alternate:r}}return t}()}function $(){if(i.type!==n.TokenName[2])return null;var t=i;return f(),{type:"raw",value:t.value}}function I(){if(i.type!==n.TokenName[4])return null;f();var t=function(){for(var t=p();i.type===n.TokenName[16];){f(),v();var e=c(E()).name,r=[];for(v();l(":");){f(),v();var o=d();1===o.length?o=o[0]:o.length||(o=""),r.push(Array.isArray(o)?{type:"mixed",body:o}:o)}t={type:"filter",input:t,fnName:e,args:r}}return t}();if(!t)throw TypeError("Unexpected token ".concat(i.value," in ").concat(i.start.line,":").concat(i.start.column));if(i.type!==n.TokenName[5])throw TypeError("expect ".concat(n.TokenName[5]," got ").concat(i.type));return f(),{type:"script",body:t}}function P(){if(i.type!==n.TokenName[3])return null;var t=i;return f(),{type:"script",body:{type:"variable",name:t.value}}}f();var R=(null==e?void 0:e.evalMode)?p():function(){for(var t={type:"document",body:[]};i.type!==n.TokenName[6];){var e=$()||I()||P();if(!e)break;t.body.push(e)}return t}();return c((null===(r=i)||void 0===r?void 0:r.type)===n.TokenName[6]),R}},378:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.tokenize=e.keyToPath=e.deleteVariable=e.setVariable=e.getVariable=e.string2regExp=e.isObject=e.cloneObject=e.createObject=void 0;var n=r(752),i=(0,n.__importDefault)(r(452)),o=r(453),u=r(833);function a(t,e){void 0===e&&(e=!0);var r=t&&t.__super?Object.create(t.__super,{__super:{value:t.__super,writable:!1,enumerable:!1}}):Object.create(Object.prototype);return e&&t&&Object.keys(t).forEach((function(e){return r[e]=t[e]})),r}function f(t){var e=typeof t;return t&&"string"!==e&&"number"!==e&&"boolean"!==e&&"function"!==e&&!Array.isArray(t)}e.createObject=function(t,e,r){t&&Object.isFrozen(t)&&(t=a(t));var i=t?Object.create(t,(0,n.__assign)((0,n.__assign)({},r),{__super:{value:t,writable:!1,enumerable:!1}})):Object.create(Object.prototype,r);return e&&f(e)&&Object.keys(e).forEach((function(t){return i[t]=e[t]})),i},e.cloneObject=a,e.isObject=f,e.string2regExp=function(t,e){if(void 0===e&&(e=!1),"string"!=typeof t)throw new TypeError("Expected a string");return new RegExp(t.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d"),e?"":"i")},e.getVariable=function(t,r,n){if(void 0===n&&(n=!0),t&&r)return(n?r in t:t.hasOwnProperty(r))?t[r]:(0,e.keyToPath)(r).reduce((function(t,e){return t&&"object"==typeof t&&(n?e in t:t.hasOwnProperty(e))?t[e]:void 0}),t)},e.setVariable=function(t,r,o,u){if(r in(t=t||{}))t[r]=o;else{for(var a=!1!==u?(0,e.keyToPath)(r):[r],f=a.pop();a.length;){var l=a.shift();(0,i.default)(t[l])?t=t[l]=(0,n.__assign)({},t[l]):Array.isArray(t[l])?(t[l]=t[l].concat(),t=t[l]):(t[l],t[l]={},t=t[l])}t[f]=o}},e.deleteVariable=function(t,r){if(t)if(t.hasOwnProperty(r))delete t[r];else{for(var o=(0,e.keyToPath)(r),u=o.pop();o.length;){var a=o.shift();if(!(0,i.default)(t[a])){if(t[a])throw new Error("目标路径不是纯对象,不能修改");break}t=t[a]=(0,n.__assign)({},t[a])}t&&t.hasOwnProperty&&t.hasOwnProperty(u)&&delete t[u]}},e.keyToPath=function(t){var e=[];return t.charCodeAt(0)===".".charCodeAt(0)&&e.push(""),t.replace(new RegExp("[^.[\\]]+|\\[(?:([^\"'][^[]*)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))","g"),(function(t,r,n,i){var o=t;return n?o=i.replace(/\\(\\)?/g,"$1"):r&&(o=r.trim()),e.push(o),""})),e},e.tokenize=function(t,e,r){if(void 0===r&&(r="| html"),!t||"string"!=typeof t)return t;var n=(0,u.parse)(t,{evalMode:!1,allowFilter:!0});return"".concat(new o.Evaluator({defaultFilter:r}).evalute(n,e))}},492:t=>{t.exports=require("lodash/groupBy")},452:t=>{t.exports=require("lodash/isPlainObject")},341:t=>{t.exports=require("lodash/transform")},459:t=>{t.exports=require("lodash/uniq")},309:t=>{t.exports=require("lodash/uniqBy")},245:t=>{t.exports=require("moment")},752:t=>{t.exports=require("tslib")}},e={},r=function r(n){var i=e[n];if(void 0!==i)return i.exports;var o=e[n]={exports:{}};return t[n](o,o.exports,r),o.exports}(303),n=exports;for(var i in r)n[i]=r[i];r.__esModule&&Object.defineProperty(n,"__esModule",{value:!0})})();
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","mappings":"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","sources":["webpack:///src/Users/liaoxuezhi/project/amis-formula/src/evalutor.ts","webpack:///src/Users/liaoxuezhi/project/amis-formula/src/filter.ts","webpack:///src/Users/liaoxuezhi/project/amis-formula/src/index.ts","webpack:///src/Users/liaoxuezhi/project/amis-formula/src/lexer.ts","webpack:///src/Users/liaoxuezhi/project/amis-formula/src/parser.ts","webpack:///src/Users/liaoxuezhi/project/amis-formula/src/util.ts","webpack:///external commonjs \"lodash/groupBy\"","webpack:///external commonjs \"lodash/isPlainObject\"","webpack:///external commonjs \"lodash/transform\"","webpack:///external commonjs \"lodash/uniq\"","webpack:///external commonjs \"lodash/uniqBy\"","webpack:///external commonjs \"moment\"","webpack:///external commonjs \"tslib\"","webpack:///webpack/bootstrap","webpack:///webpack/startup"],"sourcesContent":["/**\n * @file 公式内置函数\n */\n\nimport moment from 'moment';\nimport {getFilters} from './filter';\n\nexport interface FilterMap {\n [propName: string]: (this: any, input: any, ...args: any[]) => any;\n}\n\nexport interface FunctionMap {\n [propName: string]: (this: Evaluator, ast: Object, data: any) => any;\n}\n\nexport interface EvaluatorOptions {\n /**\n * 可以外部传入 ast 节点处理器,定制或者扩充自定义函数\n */\n functions?: FunctionMap;\n\n /**\n * 可以外部扩充 filter\n */\n filters?: FilterMap;\n\n defaultFilter?: string;\n}\n\nexport class Evaluator {\n readonly filters: FilterMap;\n readonly functions: FunctionMap = {};\n data: any;\n\n constructor(\n readonly options: EvaluatorOptions = {\n defaultFilter: 'html'\n }\n ) {\n this.filters = {\n ...this.filters,\n ...getFilters(),\n ...options?.filters\n };\n this.functions = {\n ...this.functions,\n ...options?.functions\n };\n }\n\n // 主入口\n evalute(ast: any, data: any = {}) {\n this.data = data;\n if (ast && ast.type) {\n const name = (ast.type as string).replace(/(?:_|\\-)(\\w)/g, (_, l) =>\n l.toUpperCase()\n );\n const fn = this.functions[name] || (this as any)[name];\n\n if (!fn) {\n throw new Error(`${ast.type} unkown.`);\n }\n\n return fn.call(this, ast, data);\n } else {\n return ast;\n }\n }\n\n document(ast: {type: 'document'; body: Array<any>}, data: any) {\n if (!ast.body.length) {\n return undefined;\n }\n\n const content = ast.body.map(item => this.evalute(item, data));\n return content.length === 1 ? content[0] : content.join('');\n }\n\n filter(\n ast: {type: 'filter'; input: any; fnName: string; args: Array<any>},\n data: any\n ) {\n const fn = this.filters[ast.fnName];\n if (!fn) {\n throw new Error(`filter \\`${ast.fnName}\\` not exits`);\n }\n return fn.apply(\n data,\n [this.evalute(ast.input, data)].concat(\n ast.args.map((item: any) => {\n if (item?.type === 'mixed') {\n return item.body\n .map((item: any) =>\n typeof item === 'string' ? item : this.evalute(item, data)\n )\n .join('');\n } else if (typeof item === 'string' && ~item.indexOf('$')) {\n try {\n return new (this.constructor as typeof Evaluator)(\n this.options\n ).evalute(item, data);\n } catch (e) {}\n } else if (item.type) {\n return this.evalute(item, data);\n }\n return item;\n })\n )\n );\n }\n\n raw(ast: {type: 'raw'; value: string}) {\n return ast.value;\n }\n\n script(ast: {type: 'script'; body: any}, data: any) {\n const defaultFilter = this.options.defaultFilter;\n\n if (defaultFilter && ast.body?.type !== 'filter') {\n ast.body = {\n type: 'filter',\n input: ast.body,\n fnName: defaultFilter.replace(/^\\|\\s/, ''),\n args: []\n };\n }\n\n return this.evalute(ast.body, data);\n }\n\n expressionList(ast: {type: 'expression-list'; body: Array<any>}, data: any) {\n return ast.body.reduce((prev, current) => this.evalute(current, data));\n }\n\n template(ast: {type: 'template'; args: Array<any>}, data: any) {\n return ast.args.map(arg => this.evalute(arg, data)).join('');\n }\n\n templateRaw(ast: {type: 'template_raw'; value: any}) {\n return ast.value;\n }\n\n // 下标获取\n get(ast: {host: any; key: any}, data: any) {\n const host = this.evalute(ast.host, data);\n const key = this.evalute(ast.key, data);\n return host?.[key];\n }\n\n // 位操作如 +2 ~3 !\n unary(ast: {op: '+' | '-' | '~' | '!'; value: any}, data: any) {\n let value = this.evalute(ast.value, data);\n\n switch (ast.op) {\n case '+':\n return +value;\n case '-':\n return -value;\n case '~':\n return ~value;\n case '!':\n return !value;\n }\n }\n\n formatNumber(value: any, int = false) {\n const typeName = typeof value;\n if (typeName === 'string') {\n return (int ? parseInt(value, 10) : parseFloat(value)) || 0;\n } else if (typeName === 'number' && int) {\n return Math.round(value);\n }\n\n return value ?? 0;\n }\n\n power(ast: {left: any; right: any}, data: any) {\n const left = this.evalute(ast.left, data);\n const right = this.evalute(ast.right, data);\n return Math.pow(this.formatNumber(left), this.formatNumber(right));\n }\n\n multiply(ast: {left: any; right: any}, data: any) {\n const left = this.evalute(ast.left, data);\n const right = this.evalute(ast.right, data);\n return this.formatNumber(left) * this.formatNumber(right);\n }\n\n divide(ast: {left: any; right: any}, data: any) {\n const left = this.evalute(ast.left, data);\n const right = this.evalute(ast.right, data);\n return this.formatNumber(left) / this.formatNumber(right);\n }\n\n remainder(ast: {left: any; right: any}, data: any) {\n const left = this.evalute(ast.left, data);\n const right = this.evalute(ast.right, data);\n return this.formatNumber(left) % this.formatNumber(right);\n }\n\n add(ast: {left: any; right: any}, data: any) {\n const left = this.evalute(ast.left, data);\n const right = this.evalute(ast.right, data);\n return this.formatNumber(left) + this.formatNumber(right);\n }\n\n minus(ast: {left: any; right: any}, data: any) {\n const left = this.evalute(ast.left, data);\n const right = this.evalute(ast.right, data);\n return this.formatNumber(left) - this.formatNumber(right);\n }\n\n shift(ast: {op: '<<' | '>>' | '>>>'; left: any; right: any}, data: any) {\n const left = this.evalute(ast.left, data);\n const right = this.formatNumber(this.evalute(ast.right, data), true);\n\n if (ast.op === '<<') {\n return left << right;\n } else if (ast.op == '>>') {\n return left >> right;\n } else {\n return left >>> right;\n }\n }\n\n lt(ast: {left: any; right: any}, data: any) {\n const left = this.evalute(ast.left, data);\n const right = this.evalute(ast.right, data);\n\n // todo 如果是日期的对比,这个地方可以优化一下。\n\n return left < right;\n }\n\n gt(ast: {left: any; right: any}, data: any) {\n const left = this.evalute(ast.left, data);\n const right = this.evalute(ast.right, data);\n\n // todo 如果是日期的对比,这个地方可以优化一下。\n return left > right;\n }\n\n le(ast: {left: any; right: any}, data: any) {\n const left = this.evalute(ast.left, data);\n const right = this.evalute(ast.right, data);\n\n // todo 如果是日期的对比,这个地方可以优化一下。\n\n return left <= right;\n }\n\n ge(ast: {left: any; right: any}, data: any) {\n const left = this.evalute(ast.left, data);\n const right = this.evalute(ast.right, data);\n\n // todo 如果是日期的对比,这个地方可以优化一下。\n\n return left >= right;\n }\n\n eq(ast: {left: any; right: any}, data: any) {\n const left = this.evalute(ast.left, data);\n const right = this.evalute(ast.right, data);\n\n // todo 如果是日期的对比,这个地方可以优化一下。\n\n return left == right;\n }\n\n ne(ast: {left: any; right: any}, data: any) {\n const left = this.evalute(ast.left, data);\n const right = this.evalute(ast.right, data);\n\n // todo 如果是日期的对比,这个地方可以优化一下。\n\n return left != right;\n }\n\n streq(ast: {left: any; right: any}, data: any) {\n const left = this.evalute(ast.left, data);\n const right = this.evalute(ast.right, data);\n\n // todo 如果是日期的对比,这个地方可以优化一下。\n\n return left === right;\n }\n\n strneq(ast: {left: any; right: any}, data: any) {\n const left = this.evalute(ast.left, data);\n const right = this.evalute(ast.right, data);\n\n // todo 如果是日期的对比,这个地方可以优化一下。\n\n return left !== right;\n }\n\n binary(ast: {op: '&' | '^' | '|'; left: any; right: any}, data: any) {\n const left = this.evalute(ast.left, data);\n const right = this.evalute(ast.right, data);\n\n if (ast.op === '&') {\n return left & right;\n } else if (ast.op === '^') {\n return left ^ right;\n } else {\n return left | right;\n }\n }\n\n and(ast: {left: any; right: any}, data: any) {\n const left = this.evalute(ast.left, data);\n return left && this.evalute(ast.right, data);\n }\n\n or(ast: {left: any; right: any}, data: any) {\n const left = this.evalute(ast.left, data);\n return left || this.evalute(ast.right, data);\n }\n\n number(ast: {value: any; raw: string}, data: any) {\n // todo 以后可以在这支持大数字。\n return ast.value;\n }\n\n variable(ast: {name: string}, data: any) {\n return ast.name === '&' ? data : data[ast.name];\n }\n\n array(ast: {type: 'array'; members: Array<any>}, data: any) {\n return ast.members.map(member => this.evalute(member, data));\n }\n\n literal(ast: {type: 'literal'; value: any}) {\n return ast.value;\n }\n\n string(ast: {type: 'string'; value: string}) {\n return ast.value;\n }\n\n object(ast: {memebers: Array<{key: string; value: any}>}, data: any) {\n let object: any = {};\n ast.memebers.forEach(({key, value}) => {\n object[key] = this.evalute(value, data);\n });\n return object;\n }\n\n conditional(\n ast: {type: 'conditional'; test: any; consequent: any; alternate: any},\n data: any\n ) {\n return this.evalute(ast.test, data)\n ? this.evalute(ast.consequent, data)\n : this.evalute(ast.alternate, data);\n }\n\n funcCall(this: any, ast: {identifier: string; args: Array<any>}, data: any) {\n const fnName = `fn${ast.identifier}`;\n const fn =\n this.functions[fnName] || this[fnName] || this.filters[ast.identifier];\n\n if (!fn) {\n throw new Error(`${ast.identifier}函数没有定义`);\n }\n\n let args: Array<any> = ast.args;\n\n // 逻辑函数特殊处理,因为有时候有些运算是可以跳过的。\n if (~['IF', 'AND', 'OR', 'XOR', 'IFS'].indexOf(ast.identifier)) {\n args = args.map(a => () => this.evalute(a, data));\n } else {\n args = args.map(a => this.evalute(a, data));\n }\n\n return fn.apply(this, args);\n }\n\n // 逻辑函数\n\n fnIF(condition: () => any, trueValue: () => any, falseValue: () => any) {\n return condition() ? trueValue() : falseValue();\n }\n\n fnAND(...condtions: Array<() => any>) {\n return condtions.every(c => c());\n }\n\n fnOR(...condtions: Array<() => any>) {\n return condtions.some(c => c());\n }\n\n fnXOR(c1: () => any, c2: () => any) {\n return !!c1() === !!c2();\n }\n\n fnIFS(...args: Array<() => any>) {\n if (args.length % 2) {\n args.splice(args.length - 1, 0, () => true);\n }\n\n while (args.length) {\n const c = args.shift()!;\n const v = args.shift()!;\n\n if (c()) {\n return v();\n }\n }\n return;\n }\n\n // 数学函数\n\n fnABS(a: number) {\n return Math.abs(a);\n }\n\n fnMax(...args: Array<any>) {\n return Math.max.apply(Math, args);\n }\n\n fnMin(...args: Array<number>) {\n return Math.min.apply(Math, args);\n }\n\n fnSUM(...args: Array<number>) {\n return args.reduce((sum, a) => sum + this.formatNumber(a) || 0, 0);\n }\n\n fnINT(n: number) {\n return Math.floor(n);\n }\n\n fnMOD(a: number, b: number) {\n return a % b;\n }\n\n fnPI() {\n return Math.PI;\n }\n\n fnROUND(a: number, b: number) {\n const bResult = Math.round(b);\n\n if (bResult) {\n const c = Math.pow(10, bResult);\n return Math.round(a * c) / c;\n }\n\n return Math.round(a);\n }\n\n fnSQRT(n: number) {\n return Math.sqrt(n);\n }\n\n fnAVG(...args: Array<any>) {\n return this.fnSUM.apply(this, args) / args.length;\n }\n\n fnUPPERMONEY() {\n return 'todo';\n }\n\n fnRAND() {\n return Math.random();\n }\n\n // 文本函数\n\n normalizeText(raw: any) {\n if (raw instanceof Date) {\n return moment(raw).format();\n }\n\n return `${raw}`;\n }\n\n fnLEFT(text: string, len: number) {\n text = this.normalizeText(text);\n return text.substring(0, len);\n }\n\n fnRIGHT(text: string, len: number) {\n text = this.normalizeText(text);\n return text.substring(text.length - len, text.length);\n }\n\n fnLEN(text: string) {\n text = this.normalizeText(text);\n return text?.length;\n }\n\n fnISEMPTY(text: string) {\n return !text || !String(text).trim();\n }\n\n fnCONCATENATE(...args: Array<any>) {\n return args.join('');\n }\n\n fnCHAR(code: number) {\n return String.fromCharCode(code);\n }\n\n fnLOWER(text: string) {\n text = this.normalizeText(text);\n return text.toLowerCase();\n }\n\n fnUPPER(text: string) {\n text = this.normalizeText(text);\n return text.toUpperCase();\n }\n\n fnSPLIT(text: string, sep: string) {\n text = this.normalizeText(text);\n return text.split(sep);\n }\n\n fnTRIM(text: string) {\n text = this.normalizeText(text);\n return text.trim();\n }\n\n fnSTARTSWITH(text: string, search: string) {\n if (!search) {\n return false;\n }\n\n text = this.normalizeText(text);\n return text.indexOf(search) === 0;\n }\n\n fnCONTAINS(text: string, search: string) {\n if (!search) {\n return false;\n }\n\n text = this.normalizeText(text);\n return !!~text.indexOf(search);\n }\n\n fnREPLACE(text: string, search: string, replace: string) {\n text = this.normalizeText(text);\n let result = text;\n\n while (true) {\n const idx = result.indexOf(search);\n\n if (!~idx) {\n break;\n }\n\n result =\n result.substring(0, idx) +\n replace +\n result.substring(idx + search.length);\n }\n\n return result;\n }\n\n fnSEARCH(text: string, search: string, start?: number) {\n text = this.normalizeText(text);\n start = start || 0;\n let str = text;\n\n if (start) {\n str = str.substring(start);\n }\n\n const idx = str.indexOf(search);\n if (~idx) {\n return idx + search;\n }\n\n return -1;\n }\n\n fnMID(text: string, from: number, len: number) {\n text = this.normalizeText(text);\n return text.substring(from, from + len);\n }\n\n // 日期函数\n fnDATE(\n year: number,\n month: number,\n day: number,\n hour: number,\n minute: number,\n second: number\n ) {\n if (month === undefined) {\n return new Date(year);\n }\n\n return new Date(year, month, day, hour, minute, second);\n }\n\n fnTIMESTAMP(date: Date, format?: 'x' | 'X') {\n return parseInt(moment(date).format(format === 'x' ? 'x' : 'X'), 10);\n }\n\n fnTODAY() {\n return new Date();\n }\n\n fnNOW() {\n return new Date();\n }\n\n fnSTARTOF(date: Date, unit?: any) {\n return moment(date)\n .startOf(unit || 'day')\n .toDate();\n }\n\n fnENDOF(date: Date, unit?: any) {\n return moment(date)\n .endOf(unit || 'day')\n .toDate();\n }\n\n normalizeDate(raw: any): Date {\n if (typeof raw === 'string') {\n const formats = ['', 'YYYY-MM-DD HH:mm:ss'];\n\n while (formats.length) {\n const format = formats.shift()!;\n const date = moment(raw, format);\n\n if (date.isValid()) {\n return date.toDate();\n }\n }\n } else if (typeof raw === 'number') {\n return new Date(raw);\n }\n\n return raw;\n }\n\n fnYEAR(date: Date) {\n date = this.normalizeDate(date);\n return date.getFullYear();\n }\n\n fnMONTH(date: Date) {\n date = this.normalizeDate(date);\n return date.getMonth() + 1;\n }\n\n fnDAY(date: Date) {\n date = this.normalizeDate(date);\n return date.getDate();\n }\n\n fnHOUR(date: Date) {\n date = this.normalizeDate(date);\n return date.getHours();\n }\n\n fnHMINUTE(date: Date) {\n date = this.normalizeDate(date);\n return date.getMinutes();\n }\n\n fnSECOND(date: Date) {\n date = this.normalizeDate(date);\n return date.getSeconds();\n }\n\n fnYEARS(endDate: Date, startDate: Date) {\n endDate = this.normalizeDate(endDate);\n startDate = this.normalizeDate(startDate);\n return moment(endDate).diff(moment(startDate), 'year');\n }\n\n fnMINUTES(endDate: Date, startDate: Date) {\n endDate = this.normalizeDate(endDate);\n startDate = this.normalizeDate(startDate);\n return moment(endDate).diff(moment(startDate), 'minutes');\n }\n\n fnDAYS(endDate: Date, startDate: Date) {\n endDate = this.normalizeDate(endDate);\n startDate = this.normalizeDate(startDate);\n return moment(endDate).diff(moment(startDate), 'days');\n }\n\n fnHOURS(endDate: Date, startDate: Date) {\n endDate = this.normalizeDate(endDate);\n startDate = this.normalizeDate(startDate);\n return moment(endDate).diff(moment(startDate), 'hour');\n }\n\n fnDATEMODIFY(date: Date, num: number, format: any) {\n date = this.normalizeDate(date);\n return moment(date).add(num, format).toDate();\n }\n\n fnSTRTODATE(value: any, format: string = '') {\n return moment(value, format).toDate();\n }\n\n fnISBEFORE(a: Date, b: Date, unit: any = 'day') {\n a = this.normalizeDate(a);\n b = this.normalizeDate(b);\n return moment(a).isBefore(moment(b), unit);\n }\n\n fnISAFTER(a: Date, b: Date, unit: any = 'day') {\n a = this.normalizeDate(a);\n b = this.normalizeDate(b);\n return moment(a).isAfter(moment(b), unit);\n }\n\n fnISSAMEORBEFORE(a: Date, b: Date, unit: any = 'day') {\n a = this.normalizeDate(a);\n b = this.normalizeDate(b);\n return moment(a).isSameOrBefore(moment(b), unit);\n }\n\n fnISSAMEORAFTER(a: Date, b: Date, unit: any = 'day') {\n a = this.normalizeDate(a);\n b = this.normalizeDate(b);\n return moment(a).isSameOrAfter(moment(b), unit);\n }\n\n fnCOUNT(value: any) {\n return Array.isArray(value) ? value.length : value ? 1 : 0;\n }\n}\n","import moment from 'moment';\nimport transform from 'lodash/transform';\nimport groupBy from 'lodash/groupBy';\nimport uniqBy from 'lodash/uniqBy';\nimport uniq from 'lodash/uniq';\nimport {\n createObject,\n isObject,\n keyToPath,\n setVariable,\n string2regExp,\n tokenize\n} from './util';\n\nconst UNITS = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\nexport const prettyBytes = (num: number) => {\n if (!Number.isFinite(num)) {\n throw new TypeError(`Expected a finite number, got ${typeof num}: ${num}`);\n }\n\n const neg = num < 0;\n\n if (neg) {\n num = -num;\n }\n\n if (num < 1) {\n return (neg ? '-' : '') + num + ' B';\n }\n\n const exponent = Math.min(\n Math.floor(Math.log(num) / Math.log(1000)),\n UNITS.length - 1\n );\n const numStr = Number((num / Math.pow(1000, exponent)).toPrecision(3));\n const unit = UNITS[exponent];\n\n return (neg ? '-' : '') + numStr + ' ' + unit;\n};\n\nconst entityMap: {\n [propName: string]: string;\n} = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n '/': '&#x2F;'\n};\nexport const escapeHtml = (str: string) =>\n String(str).replace(/[&<>\"'\\/]/g, function (s) {\n return entityMap[s];\n });\n\nexport function formatDuration(value: number): string {\n const unit = ['秒', '分', '时', '天', '月', '季', '年'];\n const steps = [1, 60, 3600, 86400, 2592000, 7776000, 31104000];\n let len = steps.length;\n const parts = [];\n\n while (len--) {\n if (steps[len] && value >= steps[len]) {\n parts.push(Math.floor(value / steps[len]) + unit[len]);\n value %= steps[len];\n } else if (len === 0 && value) {\n parts.push((value.toFixed ? value.toFixed(2) : '0') + unit[0]);\n }\n }\n\n return parts.join('');\n}\n\nfunction makeSorter(\n key: string,\n method?: 'alpha' | 'numerical',\n order?: 'desc' | 'asc'\n) {\n return function (a: any, b: any) {\n if (!a || !b) {\n return 0;\n }\n\n const va = resolveVariable(key, a);\n const vb = resolveVariable(key, b);\n let result = 0;\n\n if (method === 'numerical') {\n result = (parseFloat(va) || 0) - (parseFloat(vb) || 0);\n } else {\n result = String(va).localeCompare(String(vb));\n }\n\n return result * (order === 'desc' ? -1 : 1);\n };\n}\n\nconst timeUnitMap: {\n [propName: string]: string;\n} = {\n year: 'Y',\n month: 'M',\n week: 'w',\n weekday: 'W',\n day: 'd',\n hour: 'h',\n minute: 'm',\n min: 'm',\n second: 's',\n millisecond: 'ms'\n};\n\nexport const relativeValueRe =\n /^(.+)?(\\+|-)(\\d+)(minute|min|hour|day|week|month|year|weekday|second|millisecond)s?$/i;\nexport const filterDate = (\n value: string,\n data: object = {},\n format = 'X',\n utc: boolean = false\n): moment.Moment => {\n let m,\n mm = utc ? moment.utc : moment;\n\n if (typeof value === 'string') {\n value = value.trim();\n }\n\n // todo\n value = tokenize(value, data);\n\n if (value && typeof value === 'string' && (m = relativeValueRe.exec(value))) {\n const date = new Date();\n const step = parseInt(m[3], 10);\n const from = m[1]\n ? filterDate(m[1], data, format, utc)\n : mm(\n /(minute|min|hour|second)s?/.test(m[4])\n ? [\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n date.getHours(),\n date.getMinutes(),\n date.getSeconds()\n ]\n : [date.getFullYear(), date.getMonth(), date.getDate()]\n );\n\n return m[2] === '-'\n ? from.subtract(step, timeUnitMap[m[4]] as moment.DurationInputArg2)\n : from.add(step, timeUnitMap[m[4]] as moment.DurationInputArg2);\n // return from[m[2] === '-' ? 'subtract' : 'add'](step, mapping[m[4]] || m[4]);\n } else if (value === 'now') {\n return mm();\n } else if (value === 'today') {\n const date = new Date();\n return mm([date.getFullYear(), date.getMonth(), date.getDate()]);\n } else {\n return mm(value, format);\n }\n};\n\nexport function parseDuration(str: string): moment.Duration | undefined {\n const matches =\n /^((?:\\-|\\+)?(?:\\d*\\.)?\\d+)(minute|min|hour|day|week|month|quarter|year|weekday|second|millisecond)s?$/.exec(\n str\n );\n\n if (matches) {\n const duration = moment.duration(parseFloat(matches[1]), matches[2] as any);\n\n if (moment.isDuration(duration)) {\n return duration;\n }\n }\n\n return;\n}\n\n// 主要用于解决 0.1+0.2 结果的精度问题导致太长\nexport function stripNumber(number: number) {\n if (typeof number === 'number') {\n return parseFloat(number.toPrecision(12));\n } else {\n return number;\n }\n}\n\nexport const filters: {\n [propName: string]: (input: any, ...args: any[]) => any;\n} = {\n map: (input: Array<unknown>, fn: string, ...arg: any) =>\n Array.isArray(input) && filters[fn]\n ? input.map(item => filters[fn](item, ...arg))\n : input,\n html: (input: string) => escapeHtml(input),\n json: (input, tabSize: number | string = 2) =>\n tabSize\n ? JSON.stringify(input, null, parseInt(tabSize as string, 10))\n : JSON.stringify(input),\n toJson: input => {\n let ret;\n try {\n ret = JSON.parse(input);\n } catch (e) {\n ret = null;\n }\n return ret;\n },\n toInt: input => (typeof input === 'string' ? parseInt(input, 10) : input),\n toFloat: input => (typeof input === 'string' ? parseFloat(input) : input),\n raw: input => input,\n now: () => new Date(),\n toDate: (input: any, inputFormat = '') => {\n const data = moment(input, inputFormat);\n data.add();\n return data.isValid() ? data.toDate() : undefined;\n },\n fromNow: (input: any, inputFormat = '') =>\n moment(input, inputFormat).fromNow(),\n dateModify: (\n input: any,\n modifier: 'add' | 'subtract' | 'endOf' | 'startOf' = 'add',\n amount = 0,\n unit = 'days'\n ) => {\n if (!(input instanceof Date)) {\n input = new Date();\n }\n\n if (modifier === 'endOf' || modifier === 'startOf') {\n return moment(input)\n [modifier === 'endOf' ? 'endOf' : 'startOf'](amount || 'day')\n .toDate();\n }\n\n return moment(input)\n [modifier === 'add' ? 'add' : 'subtract'](parseInt(amount, 10) || 0, unit)\n .toDate();\n },\n date: (input, format = 'LLL', inputFormat = 'X') =>\n moment(input, inputFormat).format(format),\n number: input => {\n let parts = String(input).split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return parts.join('.');\n },\n trim: input => (typeof input === 'string' ? input.trim() : input),\n percent: (input, decimals = 0) => {\n input = parseFloat(input) || 0;\n decimals = parseInt(decimals, 10) || 0;\n\n let whole = input * 100;\n let multiplier = Math.pow(10, decimals);\n\n return (\n (Math.round(whole * multiplier) / multiplier).toFixed(decimals) + '%'\n );\n },\n duration: input => (input ? formatDuration(input) : input),\n bytes: input => (input ? prettyBytes(parseFloat(input)) : input),\n round: (input, decimals = 2) => {\n if (isNaN(input)) {\n return 0;\n }\n\n decimals = parseInt(decimals, 10) ?? 2;\n\n let multiplier = Math.pow(10, decimals);\n return (Math.round(input * multiplier) / multiplier).toFixed(decimals);\n },\n truncate: (input, length, end) => {\n if (typeof input !== 'string') {\n return input;\n }\n\n end = end || '...';\n\n if (length == null) {\n return input;\n }\n\n length = parseInt(length, 10) || 200;\n\n return input.substring(0, length) + (input.length > length ? end : '');\n },\n url_encode: input => encodeURIComponent(input),\n url_decode: input => decodeURIComponent(input),\n default: (input, defaultValue, strict = false) =>\n (strict ? input : input ? input : undefined) ??\n (() => {\n try {\n if (defaultValue === 'undefined') {\n return undefined;\n }\n\n return JSON.parse(defaultValue);\n } catch (e) {\n return defaultValue;\n }\n })(),\n join: (input, glue) => (input && input.join ? input.join(glue) : input),\n split: (input, delimiter = ',') =>\n typeof input === 'string' ? input.split(delimiter) : input,\n sortBy: (\n input: any,\n key: string,\n method: 'alpha' | 'numerical' = 'alpha',\n order?: 'asc' | 'desc'\n ) =>\n Array.isArray(input) ? input.sort(makeSorter(key, method, order)) : input,\n objectToArray: (\n input: any,\n label: string = 'label',\n value: string = 'value'\n ) =>\n transform(\n input,\n (result: any, v, k) => {\n (result || (result = [])).push({\n [label]: v,\n [value]: k\n });\n },\n []\n ),\n unique: (input: any, key?: string) =>\n Array.isArray(input) ? (key ? uniqBy(input, key) : uniq(input)) : input,\n topAndOther: (\n input: any,\n len: number = 10,\n labelField: string = 'name',\n restLabel = '其他'\n ) => {\n if (Array.isArray(input) && len) {\n const grouped = groupBy(input, (item: any) => {\n const index = input.indexOf(item) + 1;\n return index >= len ? len : index;\n });\n\n return Object.keys(grouped).map((key, index) => {\n const group = grouped[key];\n const obj = group.reduce((obj, item) => {\n Object.keys(item).forEach(key => {\n if (!obj.hasOwnProperty(key) || key === 'labelField') {\n obj[key] = item[key];\n } else if (\n typeof item[key] === 'number' &&\n typeof obj[key] === 'number'\n ) {\n obj[key] += item[key];\n } else if (\n typeof item[key] === 'string' &&\n /^(?:\\-|\\.)\\d/.test(item[key]) &&\n typeof obj[key] === 'number'\n ) {\n obj[key] += parseFloat(item[key]) || 0;\n } else if (\n typeof item[key] === 'string' &&\n typeof obj[key] === 'string'\n ) {\n obj[key] += `, ${item[key]}`;\n } else {\n obj[key] = item[key];\n }\n });\n\n return obj;\n }, {});\n\n if (index === len - 1) {\n obj[labelField] = restLabel || '其他';\n }\n return obj;\n });\n }\n return input;\n },\n first: input => input && input[0],\n nth: (input, nth = 0) => input && input[nth],\n last: input => input && (input.length ? input[input.length - 1] : null),\n minus(input, step = 1) {\n return stripNumber(\n (Number(input) || 0) - Number(getStrOrVariable(step, this))\n );\n },\n plus(input, step = 1) {\n return stripNumber(\n (Number(input) || 0) + Number(getStrOrVariable(step, this))\n );\n },\n times(input, step = 1) {\n return stripNumber(\n (Number(input) || 0) * Number(getStrOrVariable(step, this))\n );\n },\n division(input, step = 1) {\n return stripNumber(\n (Number(input) || 0) / Number(getStrOrVariable(step, this))\n );\n },\n count: (input: any) =>\n Array.isArray(input) || typeof input === 'string' ? input.length : 0,\n sum: (input, field) => {\n if (!Array.isArray(input)) {\n return input;\n }\n const restult = input.reduce(\n (sum, item) =>\n sum + (parseFloat(field ? pickValues(field, item) : item) || 0),\n 0\n );\n return stripNumber(restult);\n },\n abs: (input: any) => (typeof input === 'number' ? Math.abs(input) : input),\n pick: (input, path = '&') =>\n Array.isArray(input) && !/^\\d+$/.test(path)\n ? input.map((item, index) =>\n pickValues(path, createObject({index}, item))\n )\n : pickValues(path, input),\n pick_if_exist: (input, path = '&') =>\n Array.isArray(input)\n ? input.map(item => resolveVariable(path, item) || item)\n : resolveVariable(path, input) || input,\n str2date: function (input, inputFormat = 'X', outputFormat = 'X') {\n return input\n ? filterDate(input, this, inputFormat).format(outputFormat)\n : '';\n },\n asArray: input => (Array.isArray(input) ? input : input ? [input] : input),\n concat(input, ...args: any[]) {\n return Array.isArray(input)\n ? input.concat(...args.map(arg => getStrOrVariable(arg, this)))\n : input;\n },\n filter: function (input, keys, expOrDirective, arg1) {\n if (!Array.isArray(input) || !keys || !expOrDirective) {\n return input;\n }\n\n let directive = expOrDirective;\n let fn: (value: any, key: string, item: any) => boolean = () => true;\n\n if (directive === 'isTrue') {\n fn = value => !!value;\n } else if (directive === 'isFalse') {\n fn = value => !value;\n } else if (directive === 'isExists') {\n fn = value => typeof value !== 'undefined';\n } else if (directive === 'equals' || directive === 'equal') {\n arg1 = arg1 ? getStrOrVariable(arg1, this) : '';\n fn = value => arg1 == value;\n } else if (directive === 'isIn') {\n let list: any = arg1 ? getStrOrVariable(arg1, this) : [];\n\n list = str2array(list);\n list = Array.isArray(list) ? list : list ? [list] : [];\n fn = value => (list.length ? !!~list.indexOf(value) : true);\n } else if (directive === 'notIn') {\n let list: Array<any> = arg1 ? getStrOrVariable(arg1, this) : [];\n list = str2array(list);\n list = Array.isArray(list) ? list : list ? [list] : [];\n fn = value => !~list.indexOf(value);\n } else {\n if (directive !== 'match') {\n directive = 'match';\n arg1 = expOrDirective;\n }\n arg1 = arg1 ? getStrOrVariable(arg1, this) : '';\n\n // 比对的值是空时直接返回。\n if (!arg1) {\n return input;\n }\n\n let reg = string2regExp(`${arg1}`, false);\n fn = value => reg.test(String(value));\n }\n\n // 判断keys是否为*\n const isAsterisk = /\\s*\\*\\s*/.test(keys);\n keys = keys.split(/\\s*,\\s*/);\n return input.filter((item: any) =>\n // 当keys为*时从item中获取key\n (isAsterisk ? Object.keys(item) : keys).some((key: string) =>\n fn(resolveVariable(key, item), key, item)\n )\n );\n },\n base64Encode(str) {\n return btoa(\n encodeURIComponent(str).replace(\n /%([0-9A-F]{2})/g,\n function toSolidBytes(match, p1) {\n return String.fromCharCode(('0x' + p1) as any);\n }\n )\n );\n },\n\n base64Decode(str) {\n return decodeURIComponent(\n atob(str)\n .split('')\n .map(function (c) {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n })\n .join('')\n );\n },\n\n lowerCase: input =>\n input && typeof input === 'string' ? input.toLowerCase() : input,\n upperCase: input =>\n input && typeof input === 'string' ? input.toUpperCase() : input,\n\n isTrue(input, trueValue, falseValue) {\n return getConditionValue(input, !!input, trueValue, falseValue, this);\n },\n isFalse(input, trueValue, falseValue) {\n return getConditionValue(input, !input, trueValue, falseValue, this);\n },\n isMatch(input, matchArg, trueValue, falseValue) {\n matchArg = getStrOrVariable(matchArg, this as any);\n return getConditionValue(\n input,\n matchArg && string2regExp(`${matchArg}`, false).test(String(input)),\n trueValue,\n falseValue,\n this\n );\n },\n notMatch(input, matchArg, trueValue, falseValue) {\n matchArg = getStrOrVariable(matchArg, this as any);\n return getConditionValue(\n input,\n matchArg && !string2regExp(`${matchArg}`, false).test(String(input)),\n trueValue,\n falseValue,\n this\n );\n },\n isEquals(input, equalsValue, trueValue, falseValue) {\n equalsValue = /^\\d+$/.test(equalsValue)\n ? parseInt(equalsValue, 10)\n : getStrOrVariable(equalsValue, this as any);\n return getConditionValue(\n input,\n input === equalsValue,\n trueValue,\n falseValue,\n this\n );\n },\n notEquals(input, equalsValue, trueValue, falseValue) {\n equalsValue = /^\\d+$/.test(equalsValue)\n ? parseInt(equalsValue, 10)\n : getStrOrVariable(equalsValue, this as any);\n return getConditionValue(\n input,\n input !== equalsValue,\n trueValue,\n falseValue,\n this\n );\n }\n};\n\n/**\n * 如果当前传入字符为:'xxx'或者\"xxx\",则返回字符xxx\n * 否则去数据域中,获取变量xxx\n *\n * @param value 传入字符\n * @param data 数据域\n */\nfunction getStrOrVariable(value: string, data: any) {\n return /^('|\")(.*)\\1$/.test(value)\n ? RegExp.$2\n : /^-?\\d+$/.test(value)\n ? parseInt(value, 10)\n : /^(-?\\d+)\\.\\d+?$/.test(value)\n ? parseFloat(value)\n : /^\\[.*\\]$/.test(value)\n ? value\n .substring(1, value.length - 1)\n .split(/\\s*,\\s*/)\n .filter(item => item)\n : /,/.test(value)\n ? value.split(/\\s*,\\s*/).filter(item => item)\n : resolveVariable(value, data);\n}\n\nfunction str2array(list: any) {\n if (list && typeof list === 'string') {\n if (/^\\[.*\\]$/.test(list)) {\n return list\n .substring(1, list.length - 1)\n .split(/\\s*,\\s*/)\n .filter(item => item);\n } else {\n return list.split(/\\s*,\\s*/).filter(item => item);\n }\n }\n return list;\n}\n\nfunction getConditionValue(\n input: string,\n isTrue: boolean,\n trueValue: string,\n falseValue: string,\n data: any\n) {\n return isTrue || (!isTrue && falseValue)\n ? getStrOrVariable(isTrue ? trueValue : falseValue, data)\n : input;\n}\n\nexport function registerFilter(\n name: string,\n fn: (input: any, ...args: any[]) => any\n): void {\n filters[name] = fn;\n}\n\nexport function getFilters() {\n return filters;\n}\n\nexport function pickValues(names: string, data: object) {\n let arr: Array<string>;\n if (!names || ((arr = names.split(',')) && arr.length < 2)) {\n let idx = names.indexOf('~');\n if (~idx) {\n let key = names.substring(0, idx);\n let target = names.substring(idx + 1);\n return {\n [key]: resolveVariable(target, data)\n };\n }\n return resolveVariable(names, data);\n }\n\n let ret: any = {};\n arr.forEach(name => {\n let idx = name.indexOf('~');\n let target = name;\n\n if (~idx) {\n target = name.substring(idx + 1);\n name = name.substring(0, idx);\n }\n\n setVariable(ret, name, resolveVariable(target, data));\n });\n return ret;\n}\n\nfunction objectGet(data: any, path: string) {\n if (typeof data[path] !== 'undefined') {\n return data[path];\n }\n\n let parts = keyToPath(path.replace(/^{|}$/g, ''));\n return parts.reduce((data, path) => {\n if ((isObject(data) || Array.isArray(data)) && path in data) {\n return (data as {[propName: string]: any})[path];\n }\n\n return undefined;\n }, data);\n}\n\nfunction parseJson(str: string, defaultValue?: any) {\n try {\n return JSON.parse(str);\n } catch (e) {\n return defaultValue;\n }\n}\n\nfunction getCookie(name: string) {\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) {\n return parts.pop()!.split(';').shift();\n }\n return undefined;\n}\n\nexport const resolveVariable = (path?: string, data: any = {}): any => {\n if (!path || !data || typeof path !== 'string') {\n return undefined;\n }\n\n let [ns, varname] = path.split(':');\n\n if (!varname && ns) {\n varname = ns;\n ns = '';\n }\n\n if (ns === 'window') {\n data = window;\n } else if (ns === 'ls' || ns === 'ss') {\n let parts = keyToPath(varname.replace(/^{|}$/g, ''));\n const key = parts.shift()!;\n const raw =\n ns === 'ss' ? sessionStorage.getItem(key) : localStorage.getItem(key);\n\n if (typeof raw === 'string') {\n const data = parseJson(raw, raw);\n\n if (isObject(data) && parts.length) {\n return objectGet(data, parts.join('.'));\n }\n\n return data;\n }\n\n return undefined;\n } else if (ns === 'cookie') {\n const key = varname.replace(/^{|}$/g, '').trim();\n return getCookie(key);\n }\n\n if (varname === '$$') {\n return data;\n } else if (varname[0] === '$') {\n varname = path.substring(1);\n } else if (varname === '&') {\n return data;\n }\n\n return objectGet(data, varname);\n};\n\nexport function isPureVariable(path?: any): path is string {\n return typeof path === 'string'\n ? /^\\$(?:((?:\\w+\\:)?[a-z0-9_.][a-z0-9_.\\[\\]]*)|{[^}{]+})$/i.test(path)\n : false;\n}\nexport const resolveVariableAndFilter = (\n path?: string,\n data: object = {},\n defaultFilter: string = '| html',\n fallbackValue = (value: any) => value\n): any => {\n if (!path) {\n return undefined;\n }\n\n const m =\n /^(\\\\)?\\$(?:((?:\\w+\\:)?[a-z0-9_.][a-z0-9_.\\[\\]]*)|{([\\s\\S]+)})$/i.exec(\n path\n );\n\n if (!m) {\n return undefined;\n }\n\n const [_, escape, key, key2] = m;\n\n // 如果是转义如: `\\$abc` => `$abc`\n if (escape) {\n return _.substring(1);\n }\n\n let finalKey: string = key || key2;\n\n // 先只支持一层吧\n finalKey = finalKey.replace(\n /(\\\\|\\\\\\$)?\\$(?:([a-zA-Z0-9_.][a-zA-Z0-9_.\\[\\]]*)|{([^}{]+)})/g,\n (_, escape) => {\n return escape\n ? _.substring(1)\n : resolveVariableAndFilter(_, data, defaultFilter);\n }\n );\n\n // 默认 html 转义\n if (!~finalKey.indexOf('|')) {\n finalKey += defaultFilter;\n }\n\n let paths = finalKey.split(/\\s*\\|\\s*/g);\n let originalKey = finalKey;\n finalKey = paths.shift() as string;\n\n let ret = resolveVariable(finalKey, data);\n\n let prevConInputChanged = false; // 前一个类三元过滤器生效,则跳过后续类三元过滤器\n\n return ret == null &&\n !~originalKey.indexOf('default') &&\n !~originalKey.indexOf('now')\n ? fallbackValue(ret)\n : paths.reduce((input, filter) => {\n let params = filter\n .replace(\n /([^\\\\])\\\\([\\:\\\\])/g,\n (_, affix, content) =>\n `${affix}__${content === ':' ? 'colon' : 'slash'}__`\n )\n .split(':')\n .map(item =>\n item.replace(/__(slash|colon)__/g, (_, type) =>\n type === 'colon' ? ':' : '\\\\'\n )\n );\n let key = params.shift() as string;\n\n if (\n ~[\n 'isTrue',\n 'isFalse',\n 'isMatch',\n 'isEquals',\n 'notMatch',\n 'notEquals'\n ].indexOf(key)\n ) {\n if (prevConInputChanged) {\n return input;\n } else {\n const result = filters[key].call(data, input, ...params);\n prevConInputChanged = result !== input;\n return result;\n }\n } else {\n // 后面再遇到非类三元filter就重置了吧,不影响再后面的其他三元filter\n prevConInputChanged = false;\n }\n\n return (filters[key] || filters.raw).call(data, input, ...params);\n }, ret);\n};\n","import {Evaluator, EvaluatorOptions} from './evalutor';\nimport {parse, ParserOptions} from './parser';\nimport {lexer} from './lexer';\nexport {parse, lexer, Evaluator};\nexport * from './util';\n\nexport function evaluate(\n astOrString: string,\n data: any,\n options?: ParserOptions & EvaluatorOptions\n) {\n if (typeof astOrString === 'string') {\n astOrString = parse(astOrString, options);\n }\n\n return new Evaluator(options).evalute(astOrString, data);\n}\n","export interface LexerOptions {\n /**\n * 直接是运算表达式?还是从模板开始 ${} 里面才算运算表达式\n */\n evalMode?: boolean;\n\n /**\n * 是否允许 filter 语法,比如:\n *\n * ${abc | html}\n */\n allowFilter?: boolean;\n}\n\nexport const enum TokenEnum {\n BooleanLiteral = 1,\n RAW,\n Variable,\n OpenScript,\n CloseScript,\n EOF,\n Identifier,\n Literal,\n NumericLiteral,\n Punctuator,\n StringLiteral,\n RegularExpression,\n TemplateRaw,\n TemplateLeftBrace,\n TemplateRightBrace,\n OpenFilter,\n Char\n}\n\nexport type TokenTypeName =\n | 'Boolean'\n | 'Raw'\n | 'Variable'\n | 'OpenScript'\n | 'CloseScript'\n | 'EOF'\n | 'Identifier'\n | 'Literal'\n | 'Numeric'\n | 'Punctuator'\n | 'String'\n | 'RegularExpression'\n | 'TemplateRaw'\n | 'TemplateLeftBrace'\n | 'TemplateRightBrace'\n | 'OpenFilter'\n | 'Char';\n\nexport const TokenName: {\n [propName: string]: TokenTypeName;\n} = {};\nTokenName[TokenEnum.BooleanLiteral] = 'Boolean';\nTokenName[TokenEnum.RAW] = 'Raw';\nTokenName[TokenEnum.Variable] = 'Variable';\nTokenName[TokenEnum.OpenScript] = 'OpenScript';\nTokenName[TokenEnum.CloseScript] = 'CloseScript';\nTokenName[TokenEnum.EOF] = 'EOF';\nTokenName[TokenEnum.Identifier] = 'Identifier';\nTokenName[TokenEnum.Literal] = 'Literal';\nTokenName[TokenEnum.NumericLiteral] = 'Numeric';\nTokenName[TokenEnum.Punctuator] = 'Punctuator';\nTokenName[TokenEnum.StringLiteral] = 'String';\nTokenName[TokenEnum.RegularExpression] = 'RegularExpression';\nTokenName[TokenEnum.TemplateRaw] = 'TemplateRaw';\nTokenName[TokenEnum.TemplateLeftBrace] = 'TemplateLeftBrace';\nTokenName[TokenEnum.TemplateRightBrace] = 'TemplateRightBrace';\nTokenName[TokenEnum.OpenFilter] = 'OpenFilter';\nTokenName[TokenEnum.Char] = 'Char';\n\nexport interface Position {\n index: number;\n line: number;\n column: number;\n}\n\nexport interface Token {\n type: TokenTypeName;\n value: any;\n raw?: string;\n start: Position;\n end: Position;\n}\n\nconst mainStates = {\n START: 0,\n SCRIPT: 1,\n EXPRESSION: 2,\n BLOCK: 3,\n Template: 4,\n Filter: 5\n};\n\nconst rawStates = {\n START: 0,\n ESCAPE: 1\n};\n\nconst numberStates = {\n START: 0,\n MINUS: 1,\n ZERO: 2,\n DIGIT: 3,\n POINT: 4,\n DIGIT_FRACTION: 5,\n EXP: 6,\n EXP_DIGIT_OR_SIGN: 7\n};\n\nconst stringStates = {\n START: 0,\n START_QUOTE_OR_CHAR: 1,\n ESCAPE: 2\n};\n\nconst filterStates = {\n START: 0,\n Func: 1,\n SEP: 2,\n ESCAPE: 3\n};\n\nconst punctuatorList = [\n '===',\n '!==',\n '==',\n '!=',\n '<>',\n '<',\n '>',\n '<=',\n '>=',\n '||',\n '&&',\n '++',\n '--',\n '<<',\n '>>',\n '>>>',\n '+=',\n '*=',\n '/=',\n\n '=',\n '*',\n '/',\n '-',\n '+',\n '^',\n '!',\n '%',\n '&',\n '|',\n '(',\n ')',\n '[',\n ']',\n '{',\n '}',\n '?',\n ':',\n ';',\n ',',\n '.',\n '$'\n];\n\nconst escapes = {\n '\"': 0, // Quotation mask\n '\\\\': 1, // Reverse solidus\n '/': 2, // Solidus\n 'b': 3, // Backspace\n 'f': 4, // Form feed\n 'n': 5, // New line\n 'r': 6, // Carriage return\n 't': 7, // Horizontal tab\n 'u': 8 // 4 hexadecimal digits\n};\n\nfunction isDigit1to9(char: string) {\n return char >= '1' && char <= '9';\n}\n\nfunction isDigit(char: string) {\n return char >= '0' && char <= '9';\n}\n\nfunction isHex(char: string) {\n return (\n isDigit(char) ||\n (char >= 'a' && char <= 'f') ||\n (char >= 'A' && char <= 'F')\n );\n}\n\nfunction isExp(char: string) {\n return char === 'e' || char === 'E';\n}\n\nfunction escapeString(text: string, allowedLetter: Array<string> = []) {\n return text.replace(/\\\\(.)/g, function (_, text) {\n return text === 'b'\n ? '\\b'\n : text === 'f'\n ? '\\f'\n : text === 'n'\n ? '\\n'\n : text === 'r'\n ? '\\r'\n : text === 't'\n ? '\\t'\n : text === 'v'\n ? '\\v'\n : ~allowedLetter.indexOf(text)\n ? text\n : _;\n });\n}\n\nfunction formatNumber(value: string) {\n return Number(value);\n}\n\nexport function lexer(input: string, options?: LexerOptions) {\n let line = 1;\n let column = 1;\n let index = 0;\n let mainState = mainStates.START;\n const states: Array<any> = [mainState];\n let tokenCache: Array<Token> = [];\n const allowFilter = options?.allowFilter !== false;\n\n if (options?.evalMode) {\n pushState(mainStates.EXPRESSION);\n }\n\n function pushState(state: any) {\n states.push((mainState = state));\n }\n function popState() {\n states.pop();\n mainState = states[states.length - 1];\n }\n\n function position(value?: string) {\n if (value && typeof value === 'string') {\n const lines = value.split(/[\\r\\n]+/);\n return {\n index: index + value.length,\n line: line + lines.length - 1,\n column: column + lines[lines.length - 1].length\n };\n }\n\n return {index: index, line, column};\n }\n\n function eof(): Token | void | null {\n if (index >= input.length) {\n return {\n type: TokenName[TokenEnum.EOF],\n value: undefined,\n start: position(),\n end: position()\n };\n }\n }\n\n function raw(): Token | void | null {\n if (mainState !== mainStates.START) {\n return null;\n }\n\n let buffer = '';\n let state = rawStates.START;\n let i = index;\n\n while (i < input.length) {\n const ch = input[i];\n\n if (state === rawStates.ESCAPE) {\n if (escapes.hasOwnProperty(ch) || ch === '$') {\n buffer += ch;\n i++;\n state = rawStates.START;\n } else {\n const pos = position(buffer + ch);\n throw new SyntaxError(\n `Unexpected token ${ch} in ${pos.line}:${pos.column}`\n );\n }\n } else {\n if (ch === '\\\\') {\n buffer += ch;\n i++;\n state = rawStates.ESCAPE;\n continue;\n } else if (ch === '$') {\n const nextCh = input[i + 1];\n if (nextCh === '{') {\n break;\n } else if (nextCh === '$') {\n // $$ 用法兼容\n tokenCache.push({\n type: TokenName[TokenEnum.Variable],\n value: '&',\n raw: '$$',\n start: position(input.substring(index, i)),\n end: position(input.substring(index, i + 2))\n });\n break;\n } else {\n // 支持旧的 $varName 的取值方法\n let j = i + 2;\n while (\n /^[a-zA-Z0-9_.][a-zA-Z0-9_.\\[\\]]*$/.test(\n input.substring(i + 1, j)\n ) &&\n j <= input.length\n ) {\n j++;\n }\n\n if (j - i > 2) {\n tokenCache.push({\n type: TokenName[TokenEnum.Variable],\n value: input.substring(i + 1, j),\n raw: input.substring(i, j),\n start: position(input.substring(index, i)),\n end: position(input.substring(index, j))\n });\n break;\n }\n }\n }\n i++;\n buffer += ch;\n }\n }\n\n if (i > index) {\n return {\n type: TokenName[TokenEnum.RAW],\n value: escapeString(buffer, ['`', '$']),\n raw: buffer,\n start: position(),\n end: position(buffer)\n };\n }\n return tokenCache.length ? tokenCache.shift() : null;\n }\n\n function openScript() {\n const ch = input[index];\n if (ch === '$') {\n const nextCh = input[index + 1];\n if (nextCh === '{') {\n pushState(mainStates.SCRIPT);\n const value = input.substring(index, index + 2);\n return {\n type: TokenName[TokenEnum.OpenScript],\n value,\n start: position(),\n end: position(value)\n };\n }\n }\n return null;\n }\n\n function expression() {\n if (\n mainState !== mainStates.SCRIPT &&\n mainState !== mainStates.EXPRESSION &&\n mainState !== mainStates.BLOCK &&\n mainState !== mainStates.Filter\n ) {\n return null;\n }\n\n const token =\n literal() ||\n identifier() ||\n numberLiteral() ||\n stringLiteral() ||\n punctuator() ||\n char();\n\n if (token?.value === '{') {\n pushState(mainStates.BLOCK);\n } else if (token?.value === '}') {\n if (mainState === mainStates.Filter) {\n popState();\n }\n\n const prevState = mainState;\n popState();\n\n if (\n prevState === mainStates.SCRIPT ||\n prevState === mainStates.EXPRESSION\n ) {\n return {\n type: TokenName[\n prevState === mainStates.EXPRESSION\n ? TokenEnum.TemplateRightBrace\n : TokenEnum.CloseScript\n ],\n value: token!.value,\n start: position(),\n end: position(token!.value)\n };\n }\n }\n\n // filter 过滤器部分需要特殊处理\n if (\n mainState === mainStates.SCRIPT &&\n token?.value === '|' &&\n allowFilter\n ) {\n pushState(mainStates.Filter);\n return {\n type: TokenName[TokenEnum.OpenFilter],\n value: '|',\n start: position(),\n end: position('|')\n };\n } else if (mainState === mainStates.Filter && token?.value === '|') {\n return {\n type: TokenName[TokenEnum.OpenFilter],\n value: '|',\n start: position(),\n end: position('|')\n };\n }\n\n if (!token && input[index] === '`') {\n pushState(mainStates.Template);\n return {\n type: TokenName[TokenEnum.Punctuator],\n value: '`',\n start: position(),\n end: position('`')\n };\n }\n\n return token;\n }\n\n function char() {\n if (mainState !== mainStates.Filter) {\n return null;\n }\n\n let i = index;\n let ch = input[i];\n if (ch === '\\\\') {\n const nextCh = input[i + 1];\n\n if (\n nextCh === '$' ||\n ~punctuatorList.indexOf(nextCh) ||\n escapes.hasOwnProperty(nextCh)\n ) {\n i++;\n ch =\n nextCh === 'b'\n ? '\\b'\n : nextCh === 'f'\n ? '\\f'\n : nextCh === 'n'\n ? '\\n'\n : nextCh === 'r'\n ? '\\r'\n : nextCh === 't'\n ? '\\t'\n : nextCh === 'v'\n ? '\\v'\n : nextCh;\n } else {\n const pos = position(input.substring(index, index + 1));\n throw new SyntaxError(\n `Unexpected token ${ch} in ${pos.line}:${pos.column}`\n );\n }\n }\n const token = {\n type: TokenName[TokenEnum.Char],\n value: ch,\n start: position(),\n end: position(input.substring(index, i + 1))\n };\n return token;\n }\n\n function template(): Token | void | null {\n if (mainState !== mainStates.Template) {\n return null;\n }\n let state = stringStates.START;\n let i = index;\n while (i < input.length) {\n const ch = input[i];\n\n if (state === stringStates.ESCAPE) {\n if (escapes.hasOwnProperty(ch) || ch === '`' || ch === '$') {\n i++;\n state = stringStates.START_QUOTE_OR_CHAR;\n } else {\n const pos = position(input.substring(index, i + 1));\n throw new SyntaxError(\n `Unexpected token ${ch} in ${pos.line}:${pos.column}`\n );\n }\n } else if (ch === '\\\\') {\n i++;\n state = stringStates.ESCAPE;\n } else if (ch === '`') {\n popState();\n tokenCache.push({\n type: TokenName[TokenEnum.Punctuator],\n value: '`',\n start: position(input.substring(index, i)),\n end: position(input.substring(index, i + 1))\n });\n break;\n } else if (ch === '$') {\n const nextCh = input[i + 1];\n if (nextCh === '{') {\n pushState(mainStates.EXPRESSION);\n tokenCache.push({\n type: TokenName[TokenEnum.TemplateLeftBrace],\n value: '${',\n start: position(input.substring(index, i)),\n end: position(input.substring(index, i + 2))\n });\n break;\n }\n i++;\n } else {\n i++;\n }\n }\n if (i > index) {\n const value = input.substring(index, i);\n return {\n type: TokenName[TokenEnum.TemplateRaw],\n value: escapeString(value, ['`', '$']),\n raw: value,\n start: position(),\n end: position(value)\n };\n }\n return tokenCache.length ? tokenCache.shift() : null;\n }\n\n function skipWhiteSpace() {\n while (index < input.length) {\n const ch = input[index];\n if (ch === '\\r') {\n // CR (Unix)\n index++;\n line++;\n column = 1;\n if (input.charAt(index) === '\\n') {\n // CRLF (Windows)\n index++;\n }\n } else if (ch === '\\n') {\n // LF (MacOS)\n index++;\n line++;\n column = 1;\n } else if (ch === '\\t' || ch === ' ') {\n index++;\n column++;\n } else {\n break;\n }\n }\n }\n\n function punctuator() {\n const find = punctuatorList.find(\n punctuator =>\n input.substring(index, index + punctuator.length) === punctuator\n );\n if (find) {\n return {\n type: TokenName[TokenEnum.Punctuator],\n value: find,\n start: position(),\n end: position(find)\n };\n }\n return null;\n }\n\n function literal() {\n let keyword = input.substring(index, index + 4).toLowerCase();\n let value: any = keyword;\n let isLiteral = false;\n if (keyword === 'true' || keyword === 'null') {\n isLiteral = true;\n value = keyword === 'true' ? true : null;\n } else if (\n (keyword = input.substring(index, index + 5).toLowerCase()) === 'false'\n ) {\n isLiteral = true;\n value = false;\n } else if (\n (keyword = input.substring(index, index + 9).toLowerCase()) ===\n 'undefined'\n ) {\n isLiteral = true;\n value = undefined;\n }\n\n if (isLiteral) {\n return {\n type: TokenName[TokenEnum.Literal],\n value,\n raw: keyword,\n start: position(),\n end: position(keyword)\n };\n }\n return null;\n }\n\n function numberLiteral() {\n let i = index;\n\n let passedValueIndex = i;\n let state = numberStates.START;\n\n iterator: while (i < input.length) {\n const char = input.charAt(i);\n\n switch (state) {\n case numberStates.START: {\n if (char === '-') {\n state = numberStates.MINUS;\n } else if (char === '0') {\n passedValueIndex = i + 1;\n state = numberStates.ZERO;\n } else if (isDigit1to9(char)) {\n passedValueIndex = i + 1;\n state = numberStates.DIGIT;\n } else {\n return null;\n }\n break;\n }\n\n case numberStates.MINUS: {\n if (char === '0') {\n passedValueIndex = i + 1;\n state = numberStates.ZERO;\n } else if (isDigit1to9(char)) {\n passedValueIndex = i + 1;\n state = numberStates.DIGIT;\n } else {\n return null;\n }\n break;\n }\n\n case numberStates.ZERO: {\n if (char === '.') {\n state = numberStates.POINT;\n } else if (isExp(char)) {\n state = numberStates.EXP;\n } else {\n break iterator;\n }\n break;\n }\n\n case numberStates.DIGIT: {\n if (isDigit(char)) {\n passedValueIndex = i + 1;\n } else if (char === '.') {\n state = numberStates.POINT;\n } else if (isExp(char)) {\n state = numberStates.EXP;\n } else {\n break iterator;\n }\n break;\n }\n\n case numberStates.POINT: {\n if (isDigit(char)) {\n passedValueIndex = i + 1;\n state = numberStates.DIGIT_FRACTION;\n } else {\n break iterator;\n }\n break;\n }\n\n case numberStates.DIGIT_FRACTION: {\n if (isDigit(char)) {\n passedValueIndex = i + 1;\n } else if (isExp(char)) {\n state = numberStates.EXP;\n } else {\n break iterator;\n }\n break;\n }\n\n case numberStates.EXP: {\n if (char === '+' || char === '-') {\n state = numberStates.EXP_DIGIT_OR_SIGN;\n } else if (isDigit(char)) {\n passedValueIndex = i + 1;\n state = numberStates.EXP_DIGIT_OR_SIGN;\n } else {\n break iterator;\n }\n break;\n }\n\n case numberStates.EXP_DIGIT_OR_SIGN: {\n if (isDigit(char)) {\n passedValueIndex = i + 1;\n } else {\n break iterator;\n }\n break;\n }\n }\n\n i++;\n }\n\n if (passedValueIndex > 0) {\n const value = input.slice(index, passedValueIndex);\n return {\n type: TokenName[TokenEnum.NumericLiteral],\n value: formatNumber(value),\n raw: value,\n start: position(),\n end: position(value)\n };\n }\n\n return null;\n }\n\n function stringLiteral() {\n let startQuote = '\"';\n let state = stringStates.START;\n let i = index;\n while (i < input.length) {\n const ch = input[i];\n\n if (state === stringStates.START) {\n if (ch === '\"' || ch === \"'\") {\n startQuote = ch;\n i++;\n state = stringStates.START_QUOTE_OR_CHAR;\n } else {\n break;\n }\n } else if (state === stringStates.ESCAPE) {\n if (escapes.hasOwnProperty(ch) || ch === startQuote) {\n i++;\n state = stringStates.START_QUOTE_OR_CHAR;\n } else {\n const pos = position(input.substring(index, i + 1));\n throw new SyntaxError(\n `Unexpected token ${ch} in ${pos.line}:${pos.column}`\n );\n }\n } else if (ch === '\\\\') {\n i++;\n state = stringStates.ESCAPE;\n } else if (ch === startQuote) {\n i++;\n break;\n } else {\n i++;\n }\n }\n if (i > index) {\n const value = input.substring(index, i);\n return {\n type: TokenName[TokenEnum.StringLiteral],\n value: escapeString(value.substring(1, value.length - 1), [startQuote]),\n raw: value,\n start: position(),\n end: position(value)\n };\n }\n return null;\n }\n\n function identifier() {\n let i = index;\n let chunk = '';\n while (i < input.length) {\n const ch = input[i];\n if (\n /^[\\u4e00-\\u9fa5A-Za-z_$@][\\u4e00-\\u9fa5A-Za-z0-9_]*$/.test(chunk + ch)\n ) {\n chunk += ch;\n i++;\n } else {\n break;\n }\n }\n if (i > index) {\n const value = input.substring(index, i);\n return {\n type: TokenName[TokenEnum.Identifier],\n value: value,\n start: position(),\n end: position(value)\n };\n }\n return null;\n }\n\n function getNextToken(): Token | void | null {\n if (tokenCache.length) {\n return tokenCache.shift()!;\n }\n\n if (\n mainState === mainStates.SCRIPT ||\n mainState === mainStates.EXPRESSION ||\n mainState === mainStates.BLOCK\n ) {\n skipWhiteSpace();\n }\n\n return eof() || raw() || openScript() || expression() || template();\n }\n\n return {\n next: function () {\n const token = getNextToken();\n\n if (token) {\n index = token.end.index;\n line = token.end.line;\n column = token.end.column;\n return token;\n }\n\n const pos = position();\n throw new SyntaxError(\n `unexpected character \"${input[index]}\" at ${pos.line}:${pos.column}`\n );\n }\n };\n}\n","import {\n lexer as createLexer,\n Token,\n TokenEnum,\n TokenName,\n TokenTypeName\n} from './lexer';\n\nexport type NodeType = 'content' | 'raw' | 'conditional';\n\nexport interface ParserOptions {\n /**\n * 直接是运算表达式?还是从模板开始 ${} 里面才算运算表达式\n */\n evalMode?: boolean;\n\n /**\n * 是否允许 filter 语法,比如:\n *\n * ${abc | html}\n */\n allowFilter?: boolean;\n}\n\nconst argListStates = {\n START: 0,\n COMMA: 1\n};\n\nconst tempalteStates = {\n START: 0,\n SCRIPTING: 1\n};\n\nconst objectStates = {\n START: 0,\n KEY: 1,\n COLON: 2,\n VALUE: 3,\n COMMA: 4\n};\n\nexport function parse(input: string, options?: ParserOptions) {\n let token: Token;\n const lexer = createLexer(input, options);\n const tokens: Array<Token> = [];\n const tokenChunk: Array<Token> = [];\n\n function next() {\n token = tokenChunk.length ? tokenChunk.shift()! : lexer.next();\n\n if (!token) {\n throw new TypeError('next token is undefined');\n }\n tokens.push(token);\n }\n\n function back() {\n tokenChunk.unshift(tokens.pop()!);\n token = tokens[tokens.length - 1];\n }\n\n function matchPunctuator(operator: string | Array<string>) {\n return (\n token.type === TokenName[TokenEnum.Punctuator] &&\n (Array.isArray(operator)\n ? ~operator.indexOf(token.value!)\n : token.value === operator)\n );\n }\n\n function fatal() {\n throw TypeError(\n `Unexpected token <${token.type}>${token!.value} in ${\n token!.start.line\n }:${token!.start.column}`\n );\n }\n\n function assert(result: any) {\n if (!result) {\n fatal();\n }\n return result;\n }\n\n function expression() {\n return assignmentExpression();\n }\n\n function skipWhiteSpaceChar() {\n while (\n token.type === TokenName[TokenEnum.Char] &&\n /^\\s+$/m.test(token.value)\n ) {\n next();\n }\n }\n\n function collectFilterArg() {\n const arg: Array<any> = [];\n while (\n !matchPunctuator(':') &&\n token.type !== TokenName[TokenEnum.OpenFilter] &&\n token.type !== TokenName[TokenEnum.CloseScript]\n ) {\n const item =\n literal() ||\n template() ||\n arrayLiteral() ||\n rawScript() ||\n objectLiteral();\n\n if (item) {\n arg.push(item);\n } else {\n assert(\n ~[\n TokenName[TokenEnum.Identifier],\n TokenName[TokenEnum.Punctuator],\n TokenName[TokenEnum.Char]\n ].indexOf(token.type)\n );\n\n // 其他的都当字符处理\n if (arg.length && typeof arg[arg.length - 1] === 'string') {\n arg[arg.length - 1] += token.raw || token.value;\n } else {\n arg.push(token.raw || token.value);\n }\n next();\n }\n }\n if (arg.length && typeof arg[arg.length - 1] === 'string') {\n arg[arg.length - 1] = arg[arg.length - 1].replace(/\\s+$/, '');\n }\n return arg;\n }\n\n function complexExpression() {\n let ast = expression();\n\n while (token.type === TokenName[TokenEnum.OpenFilter]) {\n next();\n\n skipWhiteSpaceChar();\n const name = assert(identifier());\n const fnName = name.name;\n const args = [];\n\n skipWhiteSpaceChar();\n while (matchPunctuator(':')) {\n next();\n skipWhiteSpaceChar();\n\n let argContents: any = collectFilterArg();\n if (argContents.length === 1) {\n argContents = argContents[0];\n } else if (!argContents.length) {\n argContents = '';\n }\n\n args.push(\n Array.isArray(argContents)\n ? {\n type: 'mixed',\n body: argContents\n }\n : argContents\n );\n }\n ast = {\n type: 'filter',\n input: ast,\n fnName,\n args\n };\n }\n\n return ast;\n }\n\n function conditionalExpression(): any {\n const ast = logicalOrExpression();\n\n if (!ast) {\n return null;\n }\n\n if (matchPunctuator('?')) {\n next();\n let consequent = assignmentExpression();\n assert(consequent);\n assert(matchPunctuator(':'));\n\n next();\n let alternate = assignmentExpression();\n assert(alternate);\n\n return {\n type: 'conditional',\n test: ast,\n consequent: consequent,\n alternate: alternate\n };\n }\n\n return ast;\n }\n\n function binaryExpressionParser(\n type: string,\n operator: string,\n parseFunction: () => any,\n rightParseFunction = parseFunction,\n leftKey = 'left',\n rightKey = 'right'\n ) {\n let ast = parseFunction();\n if (!ast) {\n return null;\n }\n\n if (matchPunctuator(operator)) {\n while (matchPunctuator(operator)) {\n next();\n const right = assert(rightParseFunction());\n\n ast = {\n type: type,\n op: operator,\n [leftKey]: ast,\n [rightKey]: right\n };\n }\n }\n\n return ast;\n }\n\n function logicalOrExpression() {\n return binaryExpressionParser('or', '||', logicalAndExpression);\n }\n\n function logicalAndExpression() {\n return binaryExpressionParser('and', '&&', bitwiseOrExpression);\n }\n\n function bitwiseOrExpression() {\n return binaryExpressionParser('binary', '|', bitwiseXOrExpression);\n }\n\n function bitwiseXOrExpression() {\n return binaryExpressionParser('binary', '^', bitwiseAndExpression);\n }\n\n function bitwiseAndExpression() {\n return binaryExpressionParser('binary', '&', equalityExpression);\n }\n\n function equalityExpression() {\n return binaryExpressionParser('eq', '==', () =>\n binaryExpressionParser('ne', '!=', () =>\n binaryExpressionParser('streq', '===', () =>\n binaryExpressionParser('strneq', '!==', relationalExpression)\n )\n )\n );\n }\n\n function relationalExpression() {\n return binaryExpressionParser('lt', '<', () =>\n binaryExpressionParser('gt', '>', () =>\n binaryExpressionParser('le', '<=', () =>\n binaryExpressionParser('ge', '>=', shiftExpression)\n )\n )\n );\n }\n\n function shiftExpression() {\n return binaryExpressionParser('shift', '<<', () =>\n binaryExpressionParser('shift', '>>', () =>\n binaryExpressionParser('shift', '>>>', additiveExpression)\n )\n );\n }\n\n function additiveExpression() {\n return binaryExpressionParser('add', '+', () =>\n binaryExpressionParser('minus', '-', multiplicativeExpression)\n );\n }\n\n function multiplicativeExpression() {\n return binaryExpressionParser('multiply', '*', () =>\n binaryExpressionParser('divide', '/', () =>\n binaryExpressionParser('remainder', '%', powerExpression)\n )\n );\n }\n\n function powerExpression() {\n return binaryExpressionParser('power', '**', unaryExpression);\n }\n\n function unaryExpression() {\n const unaryOperators = ['+', '-', '~', '!'];\n const stack: Array<any> = [];\n while (matchPunctuator(unaryOperators)) {\n stack.push(token);\n next();\n }\n let ast: any = postfixExpression();\n assert(!stack.length || ast);\n while (stack.length) {\n const op = stack.pop();\n\n ast = {\n type: 'unary',\n op: op.value,\n value: ast\n };\n }\n return ast;\n }\n\n function postfixExpression() {\n let ast = leftHandSideExpression();\n if (!ast) {\n return null;\n }\n\n while (matchPunctuator('[') || matchPunctuator('.')) {\n const isDot = matchPunctuator('.');\n next();\n const right = assert(\n isDot\n ? identifier() /* 为了兼容久的语法,理论上来说只需要 identifier, 下面的 rawScript 是不应该有的 */ ||\n rawScript()\n : varibleKey()\n );\n\n if (!isDot) {\n if (matchPunctuator(']')) {\n next();\n } else {\n fatal();\n }\n }\n ast = {\n type: 'get',\n host: ast,\n key: right\n };\n }\n\n return ast;\n }\n\n function leftHandSideExpression() {\n return functionCall() || primaryExpression();\n }\n\n function varibleKey() {\n if (token.type === TokenName[TokenEnum.Identifier]) {\n const cToken = token;\n next();\n return cToken.value;\n }\n\n return stringLiteral() || template();\n }\n\n function stringLiteral() {\n if (token.type === TokenName[TokenEnum.StringLiteral]) {\n const cToken = token;\n next();\n return {\n type: 'string',\n value: cToken.value\n };\n }\n return null;\n }\n\n function template() {\n if (matchPunctuator('`')) {\n next();\n let state = tempalteStates.START;\n const ast: any = {\n type: 'template',\n body: []\n };\n while (true) {\n if (state === tempalteStates.SCRIPTING) {\n const exp = assert(expression());\n ast.body.push(exp);\n assert(token.type === TokenName[TokenEnum.TemplateRightBrace]);\n\n state = tempalteStates.START;\n next();\n } else {\n if (matchPunctuator('`')) {\n next();\n break;\n } else if (token.type === TokenName[TokenEnum.TemplateLeftBrace]) {\n next();\n state = tempalteStates.SCRIPTING;\n } else if (token.type === TokenName[TokenEnum.TemplateRaw]) {\n ast.body.push({\n type: 'template_raw',\n value: token.value\n });\n next();\n }\n }\n }\n\n return ast;\n }\n return null;\n }\n\n function identifier() {\n if (token.type === TokenName[TokenEnum.Identifier]) {\n const cToken = token;\n next();\n return {\n type: 'variable',\n name: cToken.value\n };\n }\n return null;\n }\n\n function primaryExpression() {\n return (\n identifier() ||\n literal() ||\n template() ||\n arrayLiteral() ||\n objectLiteral() ||\n (() => {\n const ast = expressionList();\n\n if (ast?.body.length === 1) {\n return ast.body[0];\n }\n\n return ast;\n })() ||\n rawScript()\n );\n }\n\n function literal() {\n if (\n token.type === TokenName[TokenEnum.Literal] ||\n token.type === TokenName[TokenEnum.NumericLiteral] ||\n token.type === TokenName[TokenEnum.StringLiteral]\n ) {\n const value = token.value;\n next();\n return {\n type: 'literal',\n value: value\n };\n }\n\n return null;\n }\n\n function functionCall() {\n if (token.type === TokenName[TokenEnum.Identifier]) {\n const id = token;\n next();\n if (matchPunctuator('(')) {\n const argList = expressionList();\n return {\n type: 'func_call',\n identifier: id.value,\n args: argList?.body\n };\n } else {\n back();\n }\n }\n return null;\n }\n\n function arrayLiteral() {\n if (matchPunctuator('[')) {\n const argList = expressionList('[', ']');\n return {\n type: 'array',\n members: argList?.body\n };\n }\n return null;\n }\n\n function expressionList(startOP = '(', endOp = ')') {\n if (matchPunctuator(startOP)) {\n next();\n const args: Array<any> = [];\n let state = argListStates.START;\n\n while (true) {\n if (state === argListStates.COMMA || !matchPunctuator(endOp)) {\n const arg = assert(expression());\n args.push(arg);\n state = argListStates.START;\n\n if (matchPunctuator(',')) {\n next();\n state = argListStates.COMMA;\n }\n } else if (matchPunctuator(endOp)) {\n next();\n break;\n }\n }\n return {\n type: 'expression-list',\n body: args\n };\n }\n return null;\n }\n\n function objectLiteral() {\n if (matchPunctuator('{')) {\n next();\n let ast: any = {\n type: 'object',\n members: []\n };\n let state = objectStates.START;\n let key: any, value: any;\n while (true) {\n if (state === objectStates.KEY) {\n assert(matchPunctuator(':'));\n next();\n state = objectStates.COLON;\n } else if (state === objectStates.COLON) {\n value = assert(expression());\n ast.members.push({\n key,\n value\n });\n state = objectStates.VALUE;\n } else if (state === objectStates.VALUE) {\n if (matchPunctuator(',')) {\n next();\n state = objectStates.COMMA;\n } else if (matchPunctuator('}')) {\n next();\n break;\n }\n } else {\n if (state != objectStates.COMMA && matchPunctuator('}')) {\n next();\n break;\n }\n\n key = assert(varibleKey());\n state = objectStates.KEY;\n }\n }\n\n return ast;\n }\n return null;\n }\n\n function assignmentExpression() {\n return conditionalExpression();\n }\n\n function contents() {\n const node: any = {\n type: 'document',\n body: []\n };\n while (token.type !== TokenName[TokenEnum.EOF]) {\n const ast = raw() || rawScript() || oldVariable();\n\n if (!ast) {\n break;\n }\n node.body.push(ast);\n }\n return node;\n }\n\n function raw() {\n if (token.type !== TokenName[TokenEnum.RAW]) {\n return null;\n }\n\n const cToken = token;\n next();\n return {\n type: 'raw',\n value: cToken.value\n };\n }\n\n function rawScript() {\n if (token.type !== TokenName[TokenEnum.OpenScript]) {\n return null;\n }\n\n next();\n const exp = complexExpression();\n if (!exp) {\n throw TypeError(\n `Unexpected token ${token.value} in ${token.start.line}:${token.start.column}`\n );\n }\n if (token.type !== TokenName[TokenEnum.CloseScript]) {\n throw TypeError(\n `expect ${TokenName[TokenEnum.CloseScript]} got ${token.type}`\n );\n }\n next();\n\n return {\n type: 'script',\n body: exp\n };\n }\n\n function oldVariable() {\n if (token.type !== TokenName[TokenEnum.Variable]) {\n return null;\n }\n const prevToken = token;\n next();\n return {\n type: 'script',\n body: {\n type: 'variable',\n name: prevToken.value\n }\n };\n }\n\n next();\n const ast = options?.evalMode ? expression() : contents();\n assert(token!?.type === TokenName[TokenEnum.EOF]);\n\n return ast;\n}\n","import isPlainObject from 'lodash/isPlainObject';\nimport {Evaluator} from './evalutor';\nimport {parse} from './parser';\n\n// 方便取值的时候能够把上层的取到,但是获取的时候不会全部把所有的数据获取到。\nexport function createObject(\n superProps?: {[propName: string]: any},\n props?: {[propName: string]: any},\n properties?: any\n): object {\n if (superProps && Object.isFrozen(superProps)) {\n superProps = cloneObject(superProps);\n }\n\n const obj = superProps\n ? Object.create(superProps, {\n ...properties,\n __super: {\n value: superProps,\n writable: false,\n enumerable: false\n }\n })\n : Object.create(Object.prototype, properties);\n\n props &&\n isObject(props) &&\n Object.keys(props).forEach(key => (obj[key] = props[key]));\n\n return obj;\n}\n\nexport function cloneObject(target: any, persistOwnProps: boolean = true) {\n const obj =\n target && target.__super\n ? Object.create(target.__super, {\n __super: {\n value: target.__super,\n writable: false,\n enumerable: false\n }\n })\n : Object.create(Object.prototype);\n persistOwnProps &&\n target &&\n Object.keys(target).forEach(key => (obj[key] = target[key]));\n return obj;\n}\n\nexport function isObject(obj: any) {\n const typename = typeof obj;\n return (\n obj &&\n typename !== 'string' &&\n typename !== 'number' &&\n typename !== 'boolean' &&\n typename !== 'function' &&\n !Array.isArray(obj)\n );\n}\n\nexport function string2regExp(value: string, caseSensitive = false) {\n if (typeof value !== 'string') {\n throw new TypeError('Expected a string');\n }\n\n return new RegExp(\n value.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d'),\n !caseSensitive ? 'i' : ''\n );\n}\n\nexport function getVariable(\n data: {[propName: string]: any},\n key: string | undefined,\n canAccessSuper: boolean = true\n): any {\n if (!data || !key) {\n return undefined;\n } else if (canAccessSuper ? key in data : data.hasOwnProperty(key)) {\n return data[key];\n }\n\n return keyToPath(key).reduce(\n (obj, key) =>\n obj &&\n typeof obj === 'object' &&\n (canAccessSuper ? key in obj : obj.hasOwnProperty(key))\n ? obj[key]\n : undefined,\n data\n );\n}\n\nexport function setVariable(\n data: {[propName: string]: any},\n key: string,\n value: any,\n convertKeyToPath?: boolean\n) {\n data = data || {};\n\n if (key in data) {\n data[key] = value;\n return;\n }\n\n const parts = convertKeyToPath !== false ? keyToPath(key) : [key];\n const last = parts.pop() as string;\n\n while (parts.length) {\n let key = parts.shift() as string;\n if (isPlainObject(data[key])) {\n data = data[key] = {\n ...data[key]\n };\n } else if (Array.isArray(data[key])) {\n data[key] = data[key].concat();\n data = data[key];\n } else if (data[key]) {\n // throw new Error(`目标路径不是纯对象,不能覆盖`);\n // 强行转成对象\n data[key] = {};\n data = data[key];\n } else {\n data[key] = {};\n data = data[key];\n }\n }\n\n data[last] = value;\n}\n\nexport function deleteVariable(data: {[propName: string]: any}, key: string) {\n if (!data) {\n return;\n } else if (data.hasOwnProperty(key)) {\n delete data[key];\n return;\n }\n\n const parts = keyToPath(key);\n const last = parts.pop() as string;\n\n while (parts.length) {\n let key = parts.shift() as string;\n if (isPlainObject(data[key])) {\n data = data[key] = {\n ...data[key]\n };\n } else if (data[key]) {\n throw new Error(`目标路径不是纯对象,不能修改`);\n } else {\n break;\n }\n }\n\n if (data && data.hasOwnProperty && data.hasOwnProperty(last)) {\n delete data[last];\n }\n}\n\n/**\n * 将例如像 a.b.c 或 a[1].b 的字符串转换为路径数组\n *\n * @param string 要转换的字符串\n */\nexport const keyToPath = (string: string) => {\n const result = [];\n\n if (string.charCodeAt(0) === '.'.charCodeAt(0)) {\n result.push('');\n }\n\n string.replace(\n new RegExp(\n '[^.[\\\\]]+|\\\\[(?:([^\"\\'][^[]*)|([\"\\'])((?:(?!\\\\2)[^\\\\\\\\]|\\\\\\\\.)*?)\\\\2)\\\\]|(?=(?:\\\\.|\\\\[\\\\])(?:\\\\.|\\\\[\\\\]|$))',\n 'g'\n ),\n (match, expression, quote, subString) => {\n let key = match;\n if (quote) {\n key = subString.replace(/\\\\(\\\\)?/g, '$1');\n } else if (expression) {\n key = expression.trim();\n }\n result.push(key);\n return '';\n }\n );\n\n return result;\n};\n\nexport const tokenize = (\n str: string,\n data: object,\n defaultFilter: string = '| html'\n) => {\n if (!str || typeof str !== 'string') {\n return str;\n }\n\n const ast = parse(str, {\n evalMode: false,\n allowFilter: true\n });\n\n return `${new Evaluator({\n defaultFilter\n }).evalute(ast, data)}`;\n};\n","module.exports = require(\"lodash/groupBy\");","module.exports = require(\"lodash/isPlainObject\");","module.exports = require(\"lodash/transform\");","module.exports = require(\"lodash/uniq\");","module.exports = require(\"lodash/uniqBy\");","module.exports = require(\"moment\");","module.exports = require(\"tslib\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(303);\n"],"names":["options","defaultFilter","functions","this","filters","getFilters","evalute","ast","data","type","replace","_","l","toUpperCase","fn","Error","call","document","body","length","content","map","item","join","filter","fnName","apply","input","concat","args","indexOf","constructor","e","raw","value","script","expressionList","reduce","prev","current","template","arg","templateRaw","get","host","key","unary","op","formatNumber","int","typeName","parseInt","parseFloat","Math","round","power","left","right","pow","multiply","divide","remainder","add","minus","shift","lt","gt","le","ge","eq","ne","streq","strneq","binary","and","or","number","variable","name","array","members","member","literal","string","object","memebers","forEach","conditional","test","consequent","alternate","funcCall","identifier","a","fnIF","condition","trueValue","falseValue","fnAND","condtions","every","c","fnOR","some","fnXOR","c1","c2","fnIFS","splice","v","fnABS","abs","fnMax","max","fnMin","min","fnSUM","sum","fnINT","n","floor","fnMOD","b","fnPI","PI","fnROUND","bResult","fnSQRT","sqrt","fnAVG","fnUPPERMONEY","fnRAND","random","normalizeText","Date","format","fnLEFT","text","len","substring","fnRIGHT","fnLEN","fnISEMPTY","String","trim","fnCONCATENATE","fnCHAR","code","fromCharCode","fnLOWER","toLowerCase","fnUPPER","fnSPLIT","sep","split","fnTRIM","fnSTARTSWITH","search","fnCONTAINS","fnREPLACE","result","idx","fnSEARCH","start","str","fnMID","from","fnDATE","year","month","day","hour","minute","second","undefined","fnTIMESTAMP","date","fnTODAY","fnNOW","fnSTARTOF","unit","startOf","toDate","fnENDOF","endOf","normalizeDate","formats","isValid","fnYEAR","getFullYear","fnMONTH","getMonth","fnDAY","getDate","fnHOUR","getHours","fnHMINUTE","getMinutes","fnSECOND","getSeconds","fnYEARS","endDate","startDate","diff","fnMINUTES","fnDAYS","fnHOURS","fnDATEMODIFY","num","fnSTRTODATE","fnISBEFORE","isBefore","fnISAFTER","isAfter","fnISSAMEORBEFORE","isSameOrBefore","fnISSAMEORAFTER","isSameOrAfter","fnCOUNT","Array","isArray","Evaluator","UNITS","prettyBytes","Number","isFinite","TypeError","neg","exponent","log","toPrecision","entityMap","formatDuration","steps","parts","push","toFixed","escapeHtml","s","timeUnitMap","week","weekday","millisecond","stripNumber","getStrOrVariable","RegExp","$2","resolveVariable","str2array","list","getConditionValue","isTrue","pickValues","names","arr","target","ret","setVariable","objectGet","path","keyToPath","isObject","relativeValueRe","filterDate","utc","m","mm","tokenize","exec","step","subtract","matches","duration","isDuration","html","json","tabSize","JSON","stringify","toJson","parse","toInt","toFloat","now","inputFormat","fromNow","dateModify","modifier","amount","percent","decimals","whole","multiplier","bytes","isNaN","truncate","end","url_encode","encodeURIComponent","url_decode","decodeURIComponent","default","defaultValue","strict","glue","delimiter","sortBy","method","order","sort","va","vb","localeCompare","makeSorter","objectToArray","label","k","unique","topAndOther","labelField","restLabel","index","Object","keys","obj","hasOwnProperty","first","nth","last","plus","times","division","count","field","pick","createObject","pick_if_exist","str2date","outputFormat","asArray","expOrDirective","arg1","directive","string2regExp","isAsterisk","base64Encode","btoa","match","p1","base64Decode","atob","charCodeAt","toString","slice","lowerCase","upperCase","isFalse","isMatch","matchArg","notMatch","isEquals","equalsValue","notEquals","ns","varname","window","sessionStorage","getItem","localStorage","parseJson","cookie","pop","getCookie","resolveVariableAndFilter","fallbackValue","escape","key2","finalKey","paths","originalKey","prevConInputChanged","params","affix","lexer","astOrString","TokenName","punctuatorList","escapes","isDigit1to9","char","isDigit","isExp","escapeString","allowedLetter","line","column","mainState","states","tokenCache","allowFilter","pushState","state","popState","position","lines","getNextToken","ch","charAt","skipWhiteSpace","eof","buffer","i","pos","SyntaxError","nextCh","j","openScript","find","keyword","isLiteral","token","chunk","passedValueIndex","iterator","numberLiteral","startQuote","stringLiteral","punctuator","prevState","expression","evalMode","next","tokens","tokenChunk","matchPunctuator","operator","fatal","assert","assignmentExpression","skipWhiteSpaceChar","collectFilterArg","arrayLiteral","rawScript","objectLiteral","binaryExpressionParser","parseFunction","rightParseFunction","leftKey","rightKey","logicalAndExpression","bitwiseOrExpression","bitwiseXOrExpression","bitwiseAndExpression","equalityExpression","relationalExpression","shiftExpression","additiveExpression","multiplicativeExpression","powerExpression","unaryExpression","unaryOperators","stack","id","argList","unshift","functionCall","isDot","varibleKey","postfixExpression","cToken","exp","startOP","endOp","conditionalExpression","argContents","complexExpression","oldVariable","prevToken","node","contents","cloneObject","persistOwnProps","__super","create","writable","enumerable","prototype","typename","superProps","props","properties","isFrozen","caseSensitive","canAccessSuper","convertKeyToPath","quote","subString","module","exports","require","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""}
@@ -0,0 +1,50 @@
1
+ export interface LexerOptions {
2
+ /**
3
+ * 直接是运算表达式?还是从模板开始 ${} 里面才算运算表达式
4
+ */
5
+ evalMode?: boolean;
6
+ /**
7
+ * 是否允许 filter 语法,比如:
8
+ *
9
+ * ${abc | html}
10
+ */
11
+ allowFilter?: boolean;
12
+ }
13
+ export declare const enum TokenEnum {
14
+ BooleanLiteral = 1,
15
+ RAW = 2,
16
+ Variable = 3,
17
+ OpenScript = 4,
18
+ CloseScript = 5,
19
+ EOF = 6,
20
+ Identifier = 7,
21
+ Literal = 8,
22
+ NumericLiteral = 9,
23
+ Punctuator = 10,
24
+ StringLiteral = 11,
25
+ RegularExpression = 12,
26
+ TemplateRaw = 13,
27
+ TemplateLeftBrace = 14,
28
+ TemplateRightBrace = 15,
29
+ OpenFilter = 16,
30
+ Char = 17
31
+ }
32
+ export declare type TokenTypeName = 'Boolean' | 'Raw' | 'Variable' | 'OpenScript' | 'CloseScript' | 'EOF' | 'Identifier' | 'Literal' | 'Numeric' | 'Punctuator' | 'String' | 'RegularExpression' | 'TemplateRaw' | 'TemplateLeftBrace' | 'TemplateRightBrace' | 'OpenFilter' | 'Char';
33
+ export declare const TokenName: {
34
+ [propName: string]: TokenTypeName;
35
+ };
36
+ export interface Position {
37
+ index: number;
38
+ line: number;
39
+ column: number;
40
+ }
41
+ export interface Token {
42
+ type: TokenTypeName;
43
+ value: any;
44
+ raw?: string;
45
+ start: Position;
46
+ end: Position;
47
+ }
48
+ export declare function lexer(input: string, options?: LexerOptions): {
49
+ next: () => Token;
50
+ };
@@ -0,0 +1,14 @@
1
+ export declare type NodeType = 'content' | 'raw' | 'conditional';
2
+ export interface ParserOptions {
3
+ /**
4
+ * 直接是运算表达式?还是从模板开始 ${} 里面才算运算表达式
5
+ */
6
+ evalMode?: boolean;
7
+ /**
8
+ * 是否允许 filter 语法,比如:
9
+ *
10
+ * ${abc | html}
11
+ */
12
+ allowFilter?: boolean;
13
+ }
14
+ export declare function parse(input: string, options?: ParserOptions): any;
package/dist/util.d.ts ADDED
@@ -0,0 +1,24 @@
1
+ export declare function createObject(superProps?: {
2
+ [propName: string]: any;
3
+ }, props?: {
4
+ [propName: string]: any;
5
+ }, properties?: any): object;
6
+ export declare function cloneObject(target: any, persistOwnProps?: boolean): any;
7
+ export declare function isObject(obj: any): any;
8
+ export declare function string2regExp(value: string, caseSensitive?: boolean): RegExp;
9
+ export declare function getVariable(data: {
10
+ [propName: string]: any;
11
+ }, key: string | undefined, canAccessSuper?: boolean): any;
12
+ export declare function setVariable(data: {
13
+ [propName: string]: any;
14
+ }, key: string, value: any, convertKeyToPath?: boolean): void;
15
+ export declare function deleteVariable(data: {
16
+ [propName: string]: any;
17
+ }, key: string): void;
18
+ /**
19
+ * 将例如像 a.b.c 或 a[1].b 的字符串转换为路径数组
20
+ *
21
+ * @param string 要转换的字符串
22
+ */
23
+ export declare const keyToPath: (string: string) => string[];
24
+ export declare const tokenize: (str: string, data: object, defaultFilter?: string) => string;
package/package.json ADDED
@@ -0,0 +1,113 @@
1
+ {
2
+ "name": "amis-formula",
3
+ "version": "1.0.0",
4
+ "description": "负责 amis 里面的表达式实现,内置公式,编辑器等",
5
+ "main": "dist/index.js",
6
+ "scripts": {
7
+ "build": "npm run clean-dist && webpack --config=configs/webpack/prod.js && npm run declaration",
8
+ "clean-dist": "rimraf dist/*",
9
+ "declaration": "tsc --allowJs --declaration --emitDeclarationOnly --declarationDir ./dist --rootDir ./src",
10
+ "test": "jest",
11
+ "coverage": "jest --coverage"
12
+ },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/aisuda/amis-tpl.git"
16
+ },
17
+ "keywords": [
18
+ "amis",
19
+ "tpl",
20
+ "parser",
21
+ "formula"
22
+ ],
23
+ "author": "fex",
24
+ "license": "MIT",
25
+ "bugs": {
26
+ "url": "https://github.com/aisuda/amis-tpl/issues"
27
+ },
28
+ "homepage": "https://github.com/aisuda/amis-tpl#readme",
29
+ "dependencies": {
30
+ "lodash": "^4.17.15",
31
+ "moment": "^2.29.1",
32
+ "tslib": "^2.3.1"
33
+ },
34
+ "devDependencies": {
35
+ "@types/lodash": "^4.14.175",
36
+ "@types/jest": "^27.0.2",
37
+ "jest": "^27.2.1",
38
+ "jest-canvas-mock": "^2.3.0",
39
+ "mini-css-extract-plugin": "^2.4.5",
40
+ "moment-timezone": "^0.5.33",
41
+ "rimraf": "^3.0.2",
42
+ "sass": "^1.36.0",
43
+ "sass-loader": "^12.1.0",
44
+ "style-loader": "^3.2.1",
45
+ "stylelint": "^13.0.0",
46
+ "ts-jest": "^27.0.5",
47
+ "ts-loader": "^9.2.3",
48
+ "typescript": "^4.3.5",
49
+ "webpack": "^5.46.0",
50
+ "webpack-cli": "^4.7.2",
51
+ "webpack-dev-server": "^3.11.2",
52
+ "webpack-merge": "^5.8.0",
53
+ "webpack-node-externals": "^3.0.0"
54
+ },
55
+ "jest": {
56
+ "testEnvironment": "jsdom",
57
+ "collectCoverageFrom": [
58
+ "src/**/*"
59
+ ],
60
+ "moduleFileExtensions": [
61
+ "ts",
62
+ "tsx",
63
+ "js"
64
+ ],
65
+ "transform": {
66
+ "\\.(ts|tsx)$": "ts-jest"
67
+ },
68
+ "setupFiles": [
69
+ "jest-canvas-mock"
70
+ ],
71
+ "testRegex": "/.*\\.test\\.(ts|tsx|js)$",
72
+ "moduleNameMapper": {
73
+ "\\.(css|less|sass|scss)$": "<rootDir>/__mocks__/styleMock.js",
74
+ "\\.(svg)$": "<rootDir>/__mocks__/svgMock.js"
75
+ },
76
+ "setupFilesAfterEnv": [
77
+ "<rootDir>/__tests__/jest.setup.js"
78
+ ],
79
+ "globals": {
80
+ "ts-jest": {
81
+ "diagnostics": false,
82
+ "tsconfig": {
83
+ "module": "commonjs",
84
+ "target": "es5",
85
+ "lib": [
86
+ "es6",
87
+ "dom",
88
+ "ES2015"
89
+ ],
90
+ "sourceMap": true,
91
+ "jsx": "react",
92
+ "moduleResolution": "node",
93
+ "rootDir": ".",
94
+ "importHelpers": true,
95
+ "esModuleInterop": true,
96
+ "allowSyntheticDefaultImports": true,
97
+ "sourceRoot": ".",
98
+ "noImplicitReturns": true,
99
+ "noImplicitThis": true,
100
+ "noImplicitAny": true,
101
+ "strictNullChecks": true,
102
+ "experimentalDecorators": true,
103
+ "emitDecoratorMetadata": false,
104
+ "typeRoots": [
105
+ "./node_modules/@types",
106
+ "./types"
107
+ ],
108
+ "skipLibCheck": true
109
+ }
110
+ }
111
+ }
112
+ }
113
+ }