diff --git a/README.md b/README.md
index 3e68aba..b0eb38d 100644
--- a/README.md
+++ b/README.md
@@ -16,9 +16,9 @@ $ npm install vue-fields
```
### CDN
-Available on [jsdelivr](https://cdn.jsdelivr.net/npm/vue-fields@1.0.6) or [unpkg](https://unpkg.com/vue-fields@1.0.6).
+Available on [jsdelivr](https://cdn.jsdelivr.net/npm/vue-fields@1.0.7) or [unpkg](https://unpkg.com/vue-fields@1.0.7).
```html
-
+
```
## Changelog
diff --git a/dist/vue-fields.common.js b/dist/vue-fields.common.js
index 69bf5cc..dc3fa32 100644
--- a/dist/vue-fields.common.js
+++ b/dist/vue-fields.common.js
@@ -1,5 +1,5 @@
/*!
- * vue-fields v1.0.6
+ * vue-fields v1.0.7
* https://github.com/pagekit/vue-fields
* Released under the MIT License.
*/
@@ -83,15 +83,25 @@ function set(obj, key, val) {
_set(obj, parts.shift(), val);
}
-function evaluate(self, expr, context) {
+var parsedFunc = {};
+var expressionRe = /((?:\d|true|false|null|undefined|(?:this\.|\$)[\S]+|\W)*)([\w][\w+.]*)?/g;
+var quotedStringRe = /([^"']+)((.)(?:[^\3\\]|\\.)*?\3|.)?/g;
- try {
- return (Function('c', ("with(c){return " + expr + "}"))).call(self, context);
- } catch (e) {
- warn(e);
- }
+function parse(expr) {
+ return parsedFunc[expr] = parsedFunc[expr] ||
+ Function('$values', '$context', ("with($context){return " + (expr.replace(quotedStringRe,
+ function (match, unquoted, quoted) {
+ if ( quoted === void 0 ) quoted = '';
+
+ return unquoted.replace(expressionRe,
+ function (match, prefix, expression) {
+ if ( prefix === void 0 ) prefix = '';
- return false;
+ return match ? ("" + prefix + (expression ? ("$get('" + expression + "')") : '')) : '';
+ }
+ ) + quoted;
+ }
+ )) + "}"));
}
function each(obj, iterator) {
@@ -319,26 +329,25 @@ var Fields = {render: function(){var _vm=this;var _h=_vm.$createElement;var _c=_
}
},
- evaluate: function evaluate$1(expr, values, config) {
+ evaluate: function evaluate(expression, values) {
if ( values === void 0 ) values = this.values;
- if ( config === void 0 ) config = this.config;
-
- if (isString(expr)) {
- var context = {$match: $match, $values: values};
+ try {
- each(config, function (ref, key) {
- var name = ref.name; if ( name === void 0 ) name = key;
-
- return set(context, name, get(values, name));
+ if (isString(expression)) {
+ expression = parse(expression);
}
- );
- return evaluate(this, expr, assign(context, values));
+ return expression.call(this, values, {
+ $match: $match, $get: function (key) { return get(values, key); }
+ });
+
+ } catch (e) {
+ warn(e);
}
- return expr.call(this, values, this);
+ return true;
},
prepare: function prepare(config, prefix) {
@@ -409,7 +418,7 @@ var Plugin = {
Vue.component('fields', Fields);
},
- version: '1.0.6'
+ version: '1.0.7'
};
if (typeof window !== 'undefined' && window.Vue) {
diff --git a/dist/vue-fields.esm.js b/dist/vue-fields.esm.js
index d21c252..83e94ae 100644
--- a/dist/vue-fields.esm.js
+++ b/dist/vue-fields.esm.js
@@ -1,5 +1,5 @@
/*!
- * vue-fields v1.0.6
+ * vue-fields v1.0.7
* https://github.com/pagekit/vue-fields
* Released under the MIT License.
*/
@@ -81,15 +81,25 @@ function set(obj, key, val) {
_set(obj, parts.shift(), val);
}
-function evaluate(self, expr, context) {
+var parsedFunc = {};
+var expressionRe = /((?:\d|true|false|null|undefined|(?:this\.|\$)[\S]+|\W)*)([\w][\w+.]*)?/g;
+var quotedStringRe = /([^"']+)((.)(?:[^\3\\]|\\.)*?\3|.)?/g;
- try {
- return (Function('c', ("with(c){return " + expr + "}"))).call(self, context);
- } catch (e) {
- warn(e);
- }
+function parse(expr) {
+ return parsedFunc[expr] = parsedFunc[expr] ||
+ Function('$values', '$context', ("with($context){return " + (expr.replace(quotedStringRe,
+ function (match, unquoted, quoted) {
+ if ( quoted === void 0 ) quoted = '';
+
+ return unquoted.replace(expressionRe,
+ function (match, prefix, expression) {
+ if ( prefix === void 0 ) prefix = '';
- return false;
+ return match ? ("" + prefix + (expression ? ("$get('" + expression + "')") : '')) : '';
+ }
+ ) + quoted;
+ }
+ )) + "}"));
}
function each(obj, iterator) {
@@ -317,26 +327,25 @@ var Fields = {render: function(){var _vm=this;var _h=_vm.$createElement;var _c=_
}
},
- evaluate: function evaluate$1(expr, values, config) {
+ evaluate: function evaluate(expression, values) {
if ( values === void 0 ) values = this.values;
- if ( config === void 0 ) config = this.config;
-
- if (isString(expr)) {
- var context = {$match: $match, $values: values};
+ try {
- each(config, function (ref, key) {
- var name = ref.name; if ( name === void 0 ) name = key;
-
- return set(context, name, get(values, name));
+ if (isString(expression)) {
+ expression = parse(expression);
}
- );
- return evaluate(this, expr, assign(context, values));
+ return expression.call(this, values, {
+ $match: $match, $get: function (key) { return get(values, key); }
+ });
+
+ } catch (e) {
+ warn(e);
}
- return expr.call(this, values, this);
+ return true;
},
prepare: function prepare(config, prefix) {
@@ -407,7 +416,7 @@ var Plugin = {
Vue.component('fields', Fields);
},
- version: '1.0.6'
+ version: '1.0.7'
};
if (typeof window !== 'undefined' && window.Vue) {
diff --git a/dist/vue-fields.js b/dist/vue-fields.js
index 4a7c0b2..ef8028d 100644
--- a/dist/vue-fields.js
+++ b/dist/vue-fields.js
@@ -1,5 +1,5 @@
/*!
- * vue-fields v1.0.6
+ * vue-fields v1.0.7
* https://github.com/pagekit/vue-fields
* Released under the MIT License.
*/
@@ -87,15 +87,25 @@
_set(obj, parts.shift(), val);
}
- function evaluate(self, expr, context) {
+ var parsedFunc = {};
+ var expressionRe = /((?:\d|true|false|null|undefined|(?:this\.|\$)[\S]+|\W)*)([\w][\w+.]*)?/g;
+ var quotedStringRe = /([^"']+)((.)(?:[^\3\\]|\\.)*?\3|.)?/g;
- try {
- return (Function('c', ("with(c){return " + expr + "}"))).call(self, context);
- } catch (e) {
- warn(e);
- }
+ function parse(expr) {
+ return parsedFunc[expr] = parsedFunc[expr] ||
+ Function('$values', '$context', ("with($context){return " + (expr.replace(quotedStringRe,
+ function (match, unquoted, quoted) {
+ if ( quoted === void 0 ) quoted = '';
+
+ return unquoted.replace(expressionRe,
+ function (match, prefix, expression) {
+ if ( prefix === void 0 ) prefix = '';
- return false;
+ return match ? ("" + prefix + (expression ? ("$get('" + expression + "')") : '')) : '';
+ }
+ ) + quoted;
+ }
+ )) + "}"));
}
function each(obj, iterator) {
@@ -323,26 +333,25 @@
}
},
- evaluate: function evaluate$1(expr, values, config) {
+ evaluate: function evaluate(expression, values) {
if ( values === void 0 ) values = this.values;
- if ( config === void 0 ) config = this.config;
-
- if (isString(expr)) {
- var context = {$match: $match, $values: values};
+ try {
- each(config, function (ref, key) {
- var name = ref.name; if ( name === void 0 ) name = key;
-
- return set(context, name, get(values, name));
+ if (isString(expression)) {
+ expression = parse(expression);
}
- );
- return evaluate(this, expr, assign(context, values));
+ return expression.call(this, values, {
+ $match: $match, $get: function (key) { return get(values, key); }
+ });
+
+ } catch (e) {
+ warn(e);
}
- return expr.call(this, values, this);
+ return true;
},
prepare: function prepare(config, prefix) {
@@ -413,7 +422,7 @@
Vue.component('fields', Fields);
},
- version: '1.0.6'
+ version: '1.0.7'
};
if (typeof window !== 'undefined' && window.Vue) {
diff --git a/dist/vue-fields.min.js b/dist/vue-fields.min.js
index 60cd860..165db66 100644
--- a/dist/vue-fields.min.js
+++ b/dist/vue-fields.min.js
@@ -1,7 +1,7 @@
/*!
- * vue-fields v1.0.6
+ * vue-fields v1.0.7
* https://github.com/pagekit/vue-fields
* Released under the MIT License.
*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.VueFields=t()}(this,function(){"use strict";var a,i={},u=Object.assign||function(n){var e=[],t=arguments.length-1;for(;0