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 +20 -0
- package/LICENSE +21 -0
- package/README.md +5 -0
- package/dist/evalutor.d.ts +233 -0
- package/dist/filter.d.ts +19 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/dist/lexer.d.ts +50 -0
- package/dist/parser.d.ts +14 -0
- package/dist/util.d.ts +24 -0
- package/package.json +113 -0
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,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
|
+
}
|
package/dist/filter.d.ts
ADDED
|
@@ -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;
|
package/dist/index.d.ts
ADDED
|
@@ -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={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};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 '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/'\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":""}
|
package/dist/lexer.d.ts
ADDED
|
@@ -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
|
+
};
|
package/dist/parser.d.ts
ADDED
|
@@ -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
|
+
}
|