Skip to content
This repository was archived by the owner on Dec 1, 2023. It is now read-only.

Commit c0f986d

Browse files
author
Steffan
committed
update expression parsing
1 parent df4d2f3 commit c0f986d

File tree

3 files changed

+23
-23
lines changed

3 files changed

+23
-23
lines changed

src/fields.vue

+13-6
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import FieldSelect from './components/Select.vue';
1919
import FieldRange from './components/Range.vue';
2020
import FieldNumber from './components/Number.vue';
21-
import {assign, each, evaluate, get, isArray, isString, isUndefined, set, warn} from './util';
21+
import {assign, each, get, parse, isArray, isString, isUndefined, set, warn} from './util';
2222
2323
export default {
2424
@@ -74,16 +74,23 @@
7474
}
7575
},
7676
77-
evaluate(expr, values = this.values) {
77+
evaluate(expression, values = this.values) {
7878
79-
if (isString(expr)) {
79+
try {
8080
81-
const context = {$match, $values: values, $get: key => get(values, key)};
81+
if (isString(expression)) {
82+
expression = parse(expression);
83+
}
84+
85+
return expression.call(this, values, {
86+
$match, $get: key => get(values, key)
87+
});
8288
83-
return evaluate(this, expr, context);
89+
} catch (e) {
90+
warn(e);
8491
}
8592
86-
return expr.call(this, values, this);
93+
return true;
8794
},
8895
8996
prepare(config = this.config, prefix = this.prefix) {

src/util.js

+9-16
Original file line numberDiff line numberDiff line change
@@ -68,24 +68,17 @@ export function set(obj, key, val) {
6868
_set(obj, parts.shift(), val);
6969
}
7070

71-
const quotedStringRe = /([^"']+)((.)(?:[^\3\\]|\\.)*?\3|.)?/g;
71+
const parsedFunc = {};
7272
const expressionRe = /((?:\d|true|false|null|undefined|(?:this\.|\$)[\S]+|\W)*)([\w][\w+.]*)?/g;
73-
const expressions = {};
74-
export function evaluate(self, expr, context) {
75-
76-
expressions[expr] = expressions[expr] || expr.replace(quotedStringRe, (match, unquoted, quoted = '') =>
77-
unquoted.replace(expressionRe, (match, prefix = '', expr) =>
78-
match ? `${prefix}${expr ? `$get('${expr}')` : ''}` : ''
79-
) + quoted
80-
);
81-
82-
try {
83-
return (Function('c', `with(c){return ${expressions[expr]}}`)).call(self, context);
84-
} catch (e) {
85-
warn(e);
86-
}
73+
const quotedStringRe = /([^"']+)((.)(?:[^\3\\]|\\.)*?\3|.)?/g;
8774

88-
return false;
75+
export function parse(expr) {
76+
return parsedFunc[expr] = parsedFunc[expr] ||
77+
Function('$values', '$context', `with($context){return ${expr.replace(quotedStringRe,
78+
(match, unquoted, quoted = '') => unquoted.replace(expressionRe,
79+
(match, prefix = '', expression) => match ? `${prefix}${expression ? `$get('${expression}')` : ''}` : ''
80+
) + quoted
81+
)}}`);
8982
}
9083

9184
export function each(obj, iterator) {

stories/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ import FieldsStory from './components/FieldsStory.vue';
22
import {storiesOf} from '@storybook/vue';
33

44
storiesOf('Fields', module)
5-
.add('Default', () => ({extends: FieldsStory}));
5+
.add('Default', () => FieldsStory);

0 commit comments

Comments
 (0)