vue-rails 2.2.1 → 2.2.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2fba1bfe175bd7dd8517658dc98514224b33db1c
4
- data.tar.gz: 6e641e28011c3b18b2912d359828552092bd5a22
3
+ metadata.gz: 4b68a092d2307324763c57de2cdd822abd5b78a4
4
+ data.tar.gz: 28e88d682259d381484b14ebef2676419726ccff
5
5
  SHA512:
6
- metadata.gz: 1fc5d373cbfb6f38836c18aa980e737b6f2c02839cde0420f23e934522cd4d4eac91b11ff31fab8faef5c9e81be19220f0d1744662f977c103d7454a3204d308
7
- data.tar.gz: f3ab20e493301b11fcfee75d70d7d0c9b470dc068d474e069b7bdb7bc1af555748a02a60e82c5e2c1e61f85fb17016720225bc469d9ad043349e8607d9496fde
6
+ metadata.gz: a56153ee8da3a34004054186b79a70eb473225fe22462aa3cf6a1ae221a5f111101539693c98f7846a22439bac61be1597b0b5542bf92c0c9030ad0fe3c22ee6
7
+ data.tar.gz: 72591f15195d02d6c6ddf76605ec2b91241ff38462d269ffb3bc2e9978d9cfb7bd7302c29b7ea04602893a77ec432d08f7bfaa47cd9b8e87f06b866e87dd5e0c
data/Readme.md CHANGED
@@ -11,7 +11,7 @@ Rails 3.1+ asset-pipeline gem to provide Vue.js
11
11
 
12
12
  ### Package Versions
13
13
 
14
- - vue v2.2.1
14
+ - vue v2.2.4
15
15
  - vue-router v2.2.1
16
16
  - vue-resource v1.2.1
17
17
  - vuex v2.2.1
@@ -35,6 +35,7 @@ And in your application.js manifest:
35
35
  //= require vue
36
36
  //= require vue-router (optional)
37
37
  //= require vue-resource (optional)
38
+ //= require vuex (optional)
38
39
  ```
39
40
 
40
41
  If your `application.js` requires TurboLinks (a default setting for new Rails apps), you should strongly consider disabling it, as it will cause pages to load without reloading the Javascript.
@@ -1,5 +1,5 @@
1
1
  module Vue
2
2
  module Rails
3
- VERSION = '2.2.1'
3
+ VERSION = '2.2.4'
4
4
  end
5
5
  end
@@ -1,12 +1,12 @@
1
1
  /*!
2
- * Vue.js v2.2.1
2
+ * Vue.js v2.2.4
3
3
  * (c) 2014-2017 Evan You
4
4
  * Released under the MIT License.
5
5
  */
6
6
  (function (global, factory) {
7
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
8
- typeof define === 'function' && define.amd ? define(factory) :
9
- (global.Vue = factory());
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
8
+ typeof define === 'function' && define.amd ? define(factory) :
9
+ (global.Vue = factory());
10
10
  }(this, (function () { 'use strict';
11
11
 
12
12
  /* */
@@ -222,7 +222,12 @@ function looseEqual (a, b) {
222
222
  var isObjectA = isObject(a);
223
223
  var isObjectB = isObject(b);
224
224
  if (isObjectA && isObjectB) {
225
- return JSON.stringify(a) === JSON.stringify(b)
225
+ try {
226
+ return JSON.stringify(a) === JSON.stringify(b)
227
+ } catch (e) {
228
+ // possible circular reference
229
+ return a === b
230
+ }
226
231
  } else if (!isObjectA && !isObjectB) {
227
232
  return String(a) === String(b)
228
233
  } else {
@@ -276,7 +281,7 @@ var config = {
276
281
  /**
277
282
  * Whether to record perf
278
283
  */
279
- performance: "development" !== 'production',
284
+ performance: false,
280
285
 
281
286
  /**
282
287
  * Error handler for watcher errors
@@ -352,6 +357,48 @@ var config = {
352
357
  _maxUpdateCount: 100
353
358
  };
354
359
 
360
+ /* */
361
+
362
+ var emptyObject = Object.freeze({});
363
+
364
+ /**
365
+ * Check if a string starts with $ or _
366
+ */
367
+ function isReserved (str) {
368
+ var c = (str + '').charCodeAt(0);
369
+ return c === 0x24 || c === 0x5F
370
+ }
371
+
372
+ /**
373
+ * Define a property.
374
+ */
375
+ function def (obj, key, val, enumerable) {
376
+ Object.defineProperty(obj, key, {
377
+ value: val,
378
+ enumerable: !!enumerable,
379
+ writable: true,
380
+ configurable: true
381
+ });
382
+ }
383
+
384
+ /**
385
+ * Parse simple path.
386
+ */
387
+ var bailRE = /[^\w.$]/;
388
+ function parsePath (path) {
389
+ if (bailRE.test(path)) {
390
+ return
391
+ }
392
+ var segments = path.split('.');
393
+ return function (obj) {
394
+ for (var i = 0; i < segments.length; i++) {
395
+ if (!obj) { return }
396
+ obj = obj[segments[i]];
397
+ }
398
+ return obj
399
+ }
400
+ }
401
+
355
402
  /* */
356
403
  /* globals MutationObserver */
357
404
 
@@ -501,58 +548,6 @@ if (typeof Set !== 'undefined' && isNative(Set)) {
501
548
  }());
502
549
  }
503
550
 
504
- var perf;
505
-
506
- {
507
- perf = inBrowser && window.performance;
508
- if (perf && (!perf.mark || !perf.measure)) {
509
- perf = undefined;
510
- }
511
- }
512
-
513
- /* */
514
-
515
- var emptyObject = Object.freeze({});
516
-
517
- /**
518
- * Check if a string starts with $ or _
519
- */
520
- function isReserved (str) {
521
- var c = (str + '').charCodeAt(0);
522
- return c === 0x24 || c === 0x5F
523
- }
524
-
525
- /**
526
- * Define a property.
527
- */
528
- function def (obj, key, val, enumerable) {
529
- Object.defineProperty(obj, key, {
530
- value: val,
531
- enumerable: !!enumerable,
532
- writable: true,
533
- configurable: true
534
- });
535
- }
536
-
537
- /**
538
- * Parse simple path.
539
- */
540
- var bailRE = /[^\w.$]/;
541
- function parsePath (path) {
542
- if (bailRE.test(path)) {
543
- return
544
- } else {
545
- var segments = path.split('.');
546
- return function (obj) {
547
- for (var i = 0; i < segments.length; i++) {
548
- if (!obj) { return }
549
- obj = obj[segments[i]];
550
- }
551
- return obj
552
- }
553
- }
554
- }
555
-
556
551
  var warn = noop;
557
552
  var tip = noop;
558
553
  var formatComponentName;
@@ -584,9 +579,11 @@ var formatComponentName;
584
579
  if (vm.$root === vm) {
585
580
  return '<Root>'
586
581
  }
587
- var name = vm._isVue
588
- ? vm.$options.name || vm.$options._componentTag
589
- : vm.name;
582
+ var name = typeof vm === 'function' && vm.options
583
+ ? vm.options.name
584
+ : vm._isVue
585
+ ? vm.$options.name || vm.$options._componentTag
586
+ : vm.name;
590
587
 
591
588
  var file = vm._isVue && vm.$options.__file;
592
589
  if (!name && file) {
@@ -637,7 +634,7 @@ Dep.prototype.depend = function depend () {
637
634
  };
638
635
 
639
636
  Dep.prototype.notify = function notify () {
640
- // stablize the subscriber list first
637
+ // stabilize the subscriber list first
641
638
  var subs = this.subs.slice();
642
639
  for (var i = 0, l = subs.length; i < l; i++) {
643
640
  subs[i].update();
@@ -880,27 +877,27 @@ function defineReactive$$1 (
880
877
  * triggers change notification if the property doesn't
881
878
  * already exist.
882
879
  */
883
- function set (obj, key, val) {
884
- if (Array.isArray(obj)) {
885
- obj.length = Math.max(obj.length, key);
886
- obj.splice(key, 1, val);
880
+ function set (target, key, val) {
881
+ if (Array.isArray(target)) {
882
+ target.length = Math.max(target.length, key);
883
+ target.splice(key, 1, val);
887
884
  return val
888
885
  }
889
- if (hasOwn(obj, key)) {
890
- obj[key] = val;
891
- return
886
+ if (hasOwn(target, key)) {
887
+ target[key] = val;
888
+ return val
892
889
  }
893
- var ob = obj.__ob__;
894
- if (obj._isVue || (ob && ob.vmCount)) {
890
+ var ob = target.__ob__;
891
+ if (target._isVue || (ob && ob.vmCount)) {
895
892
  "development" !== 'production' && warn(
896
893
  'Avoid adding reactive properties to a Vue instance or its root $data ' +
897
894
  'at runtime - declare it upfront in the data option.'
898
895
  );
899
- return
896
+ return val
900
897
  }
901
898
  if (!ob) {
902
- obj[key] = val;
903
- return
899
+ target[key] = val;
900
+ return val
904
901
  }
905
902
  defineReactive$$1(ob.value, key, val);
906
903
  ob.dep.notify();
@@ -910,23 +907,23 @@ function set (obj, key, val) {
910
907
  /**
911
908
  * Delete a property and trigger change if necessary.
912
909
  */
913
- function del (obj, key) {
914
- if (Array.isArray(obj)) {
915
- obj.splice(key, 1);
910
+ function del (target, key) {
911
+ if (Array.isArray(target)) {
912
+ target.splice(key, 1);
916
913
  return
917
914
  }
918
- var ob = obj.__ob__;
919
- if (obj._isVue || (ob && ob.vmCount)) {
915
+ var ob = target.__ob__;
916
+ if (target._isVue || (ob && ob.vmCount)) {
920
917
  "development" !== 'production' && warn(
921
918
  'Avoid deleting properties on a Vue instance or its root $data ' +
922
919
  '- just set it to null.'
923
920
  );
924
921
  return
925
922
  }
926
- if (!hasOwn(obj, key)) {
923
+ if (!hasOwn(target, key)) {
927
924
  return
928
925
  }
929
- delete obj[key];
926
+ delete target[key];
930
927
  if (!ob) {
931
928
  return
932
929
  }
@@ -1442,12 +1439,12 @@ function isType (type, fn) {
1442
1439
  return false
1443
1440
  }
1444
1441
 
1445
- function handleError (err, vm, type) {
1442
+ function handleError (err, vm, info) {
1446
1443
  if (config.errorHandler) {
1447
- config.errorHandler.call(null, err, vm, type);
1444
+ config.errorHandler.call(null, err, vm, info);
1448
1445
  } else {
1449
1446
  {
1450
- warn(("Error in " + type + ":"), vm);
1447
+ warn(("Error in " + info + ":"), vm);
1451
1448
  }
1452
1449
  /* istanbul ignore else */
1453
1450
  if (inBrowser && typeof console !== 'undefined') {
@@ -1532,6 +1529,29 @@ var initProxy;
1532
1529
  };
1533
1530
  }
1534
1531
 
1532
+ var mark;
1533
+ var measure;
1534
+
1535
+ {
1536
+ var perf = inBrowser && window.performance;
1537
+ /* istanbul ignore if */
1538
+ if (
1539
+ perf &&
1540
+ perf.mark &&
1541
+ perf.measure &&
1542
+ perf.clearMarks &&
1543
+ perf.clearMeasures
1544
+ ) {
1545
+ mark = function (tag) { return perf.mark(tag); };
1546
+ measure = function (name, startTag, endTag) {
1547
+ perf.measure(name, startTag, endTag);
1548
+ perf.clearMarks(startTag);
1549
+ perf.clearMarks(endTag);
1550
+ perf.clearMeasures(name);
1551
+ };
1552
+ }
1553
+ }
1554
+
1535
1555
  /* */
1536
1556
 
1537
1557
  var VNode = function VNode (
@@ -1606,8 +1626,9 @@ function cloneVNode (vnode) {
1606
1626
  }
1607
1627
 
1608
1628
  function cloneVNodes (vnodes) {
1609
- var res = new Array(vnodes.length);
1610
- for (var i = 0; i < vnodes.length; i++) {
1629
+ var len = vnodes.length;
1630
+ var res = new Array(len);
1631
+ for (var i = 0; i < len; i++) {
1611
1632
  res[i] = cloneVNode(vnodes[i]);
1612
1633
  }
1613
1634
  return res
@@ -1735,7 +1756,7 @@ function simpleNormalizeChildren (children) {
1735
1756
  return children
1736
1757
  }
1737
1758
 
1738
- // 2. When the children contains constrcuts that always generated nested Arrays,
1759
+ // 2. When the children contains constructs that always generated nested Arrays,
1739
1760
  // e.g. <template>, <slot>, v-for, or when the children is provided by user
1740
1761
  // with hand-written render functions / JSX. In such cases a full normalization
1741
1762
  // is needed to cater to all possible types of children values.
@@ -1853,12 +1874,21 @@ function eventsMixin (Vue) {
1853
1874
  };
1854
1875
 
1855
1876
  Vue.prototype.$off = function (event, fn) {
1877
+ var this$1 = this;
1878
+
1856
1879
  var vm = this;
1857
1880
  // all
1858
1881
  if (!arguments.length) {
1859
1882
  vm._events = Object.create(null);
1860
1883
  return vm
1861
1884
  }
1885
+ // array of events
1886
+ if (Array.isArray(event)) {
1887
+ for (var i$1 = 0, l = event.length; i$1 < l; i$1++) {
1888
+ this$1.$off(event[i$1], fn);
1889
+ }
1890
+ return vm
1891
+ }
1862
1892
  // specific event
1863
1893
  var cbs = vm._events[event];
1864
1894
  if (!cbs) {
@@ -1926,16 +1956,17 @@ function resolveSlots (
1926
1956
  defaultSlot.push(child);
1927
1957
  }
1928
1958
  }
1929
- // ignore single whitespace
1930
- if (defaultSlot.length && !(
1931
- defaultSlot.length === 1 &&
1932
- (defaultSlot[0].text === ' ' || defaultSlot[0].isComment)
1933
- )) {
1959
+ // ignore whitespace
1960
+ if (!defaultSlot.every(isWhitespace)) {
1934
1961
  slots.default = defaultSlot;
1935
1962
  }
1936
1963
  return slots
1937
1964
  }
1938
1965
 
1966
+ function isWhitespace (node) {
1967
+ return node.isComment || node.text === ' '
1968
+ }
1969
+
1939
1970
  function resolveScopedSlots (
1940
1971
  fns
1941
1972
  ) {
@@ -2072,10 +2103,11 @@ function mountComponent (
2072
2103
  vm.$options.render = createEmptyVNode;
2073
2104
  {
2074
2105
  /* istanbul ignore if */
2075
- if (vm.$options.template && vm.$options.template.charAt(0) !== '#') {
2106
+ if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') ||
2107
+ vm.$options.el || el) {
2076
2108
  warn(
2077
2109
  'You are using the runtime-only build of Vue where the template ' +
2078
- 'option is not available. Either pre-compile the templates into ' +
2110
+ 'compiler is not available. Either pre-compile the templates into ' +
2079
2111
  'render functions, or use the compiler-included build.',
2080
2112
  vm
2081
2113
  );
@@ -2091,19 +2123,22 @@ function mountComponent (
2091
2123
 
2092
2124
  var updateComponent;
2093
2125
  /* istanbul ignore if */
2094
- if ("development" !== 'production' && config.performance && perf) {
2126
+ if ("development" !== 'production' && config.performance && mark) {
2095
2127
  updateComponent = function () {
2096
2128
  var name = vm._name;
2097
- var startTag = "start " + name;
2098
- var endTag = "end " + name;
2099
- perf.mark(startTag);
2129
+ var id = vm._uid;
2130
+ var startTag = "vue-perf-start:" + id;
2131
+ var endTag = "vue-perf-end:" + id;
2132
+
2133
+ mark(startTag);
2100
2134
  var vnode = vm._render();
2101
- perf.mark(endTag);
2102
- perf.measure((name + " render"), startTag, endTag);
2103
- perf.mark(startTag);
2135
+ mark(endTag);
2136
+ measure((name + " render"), startTag, endTag);
2137
+
2138
+ mark(startTag);
2104
2139
  vm._update(vnode, hydrating);
2105
- perf.mark(endTag);
2106
- perf.measure((name + " patch"), startTag, endTag);
2140
+ mark(endTag);
2141
+ measure((name + " patch"), startTag, endTag);
2107
2142
  };
2108
2143
  } else {
2109
2144
  updateComponent = function () {
@@ -2841,8 +2876,63 @@ function stateMixin (Vue) {
2841
2876
 
2842
2877
  /* */
2843
2878
 
2844
- var hooks = { init: init, prepatch: prepatch, insert: insert, destroy: destroy };
2845
- var hooksToMerge = Object.keys(hooks);
2879
+ // hooks to be invoked on component VNodes during patch
2880
+ var componentVNodeHooks = {
2881
+ init: function init (
2882
+ vnode,
2883
+ hydrating,
2884
+ parentElm,
2885
+ refElm
2886
+ ) {
2887
+ if (!vnode.componentInstance || vnode.componentInstance._isDestroyed) {
2888
+ var child = vnode.componentInstance = createComponentInstanceForVnode(
2889
+ vnode,
2890
+ activeInstance,
2891
+ parentElm,
2892
+ refElm
2893
+ );
2894
+ child.$mount(hydrating ? vnode.elm : undefined, hydrating);
2895
+ } else if (vnode.data.keepAlive) {
2896
+ // kept-alive components, treat as a patch
2897
+ var mountedNode = vnode; // work around flow
2898
+ componentVNodeHooks.prepatch(mountedNode, mountedNode);
2899
+ }
2900
+ },
2901
+
2902
+ prepatch: function prepatch (oldVnode, vnode) {
2903
+ var options = vnode.componentOptions;
2904
+ var child = vnode.componentInstance = oldVnode.componentInstance;
2905
+ updateChildComponent(
2906
+ child,
2907
+ options.propsData, // updated props
2908
+ options.listeners, // updated listeners
2909
+ vnode, // new parent vnode
2910
+ options.children // new children
2911
+ );
2912
+ },
2913
+
2914
+ insert: function insert (vnode) {
2915
+ if (!vnode.componentInstance._isMounted) {
2916
+ vnode.componentInstance._isMounted = true;
2917
+ callHook(vnode.componentInstance, 'mounted');
2918
+ }
2919
+ if (vnode.data.keepAlive) {
2920
+ activateChildComponent(vnode.componentInstance, true /* direct */);
2921
+ }
2922
+ },
2923
+
2924
+ destroy: function destroy (vnode) {
2925
+ if (!vnode.componentInstance._isDestroyed) {
2926
+ if (!vnode.data.keepAlive) {
2927
+ vnode.componentInstance.$destroy();
2928
+ } else {
2929
+ deactivateChildComponent(vnode.componentInstance, true /* direct */);
2930
+ }
2931
+ }
2932
+ }
2933
+ };
2934
+
2935
+ var hooksToMerge = Object.keys(componentVNodeHooks);
2846
2936
 
2847
2937
  function createComponent (
2848
2938
  Ctor,
@@ -2990,62 +3080,6 @@ function createComponentInstanceForVnode (
2990
3080
  return new vnodeComponentOptions.Ctor(options)
2991
3081
  }
2992
3082
 
2993
- function init (
2994
- vnode,
2995
- hydrating,
2996
- parentElm,
2997
- refElm
2998
- ) {
2999
- if (!vnode.componentInstance || vnode.componentInstance._isDestroyed) {
3000
- var child = vnode.componentInstance = createComponentInstanceForVnode(
3001
- vnode,
3002
- activeInstance,
3003
- parentElm,
3004
- refElm
3005
- );
3006
- child.$mount(hydrating ? vnode.elm : undefined, hydrating);
3007
- } else if (vnode.data.keepAlive) {
3008
- // kept-alive components, treat as a patch
3009
- var mountedNode = vnode; // work around flow
3010
- prepatch(mountedNode, mountedNode);
3011
- }
3012
- }
3013
-
3014
- function prepatch (
3015
- oldVnode,
3016
- vnode
3017
- ) {
3018
- var options = vnode.componentOptions;
3019
- var child = vnode.componentInstance = oldVnode.componentInstance;
3020
- updateChildComponent(
3021
- child,
3022
- options.propsData, // updated props
3023
- options.listeners, // updated listeners
3024
- vnode, // new parent vnode
3025
- options.children // new children
3026
- );
3027
- }
3028
-
3029
- function insert (vnode) {
3030
- if (!vnode.componentInstance._isMounted) {
3031
- vnode.componentInstance._isMounted = true;
3032
- callHook(vnode.componentInstance, 'mounted');
3033
- }
3034
- if (vnode.data.keepAlive) {
3035
- activateChildComponent(vnode.componentInstance, true /* direct */);
3036
- }
3037
- }
3038
-
3039
- function destroy (vnode) {
3040
- if (!vnode.componentInstance._isDestroyed) {
3041
- if (!vnode.data.keepAlive) {
3042
- vnode.componentInstance.$destroy();
3043
- } else {
3044
- deactivateChildComponent(vnode.componentInstance, true /* direct */);
3045
- }
3046
- }
3047
- }
3048
-
3049
3083
  function resolveAsyncComponent (
3050
3084
  factory,
3051
3085
  baseCtor,
@@ -3109,6 +3143,21 @@ function extractProps (data, Ctor) {
3109
3143
  if (attrs || props || domProps) {
3110
3144
  for (var key in propOptions) {
3111
3145
  var altKey = hyphenate(key);
3146
+ {
3147
+ var keyInLowerCase = key.toLowerCase();
3148
+ if (
3149
+ key !== keyInLowerCase &&
3150
+ attrs && attrs.hasOwnProperty(keyInLowerCase)
3151
+ ) {
3152
+ warn(
3153
+ "Prop \"" + keyInLowerCase + "\" is not declared in component " +
3154
+ (formatComponentName(Ctor)) + ". Note that HTML attributes are " +
3155
+ "case-insensitive and camelCased props need to use their kebab-case " +
3156
+ "equivalents when using in-DOM templates. You should probably use " +
3157
+ "\"" + altKey + "\" instead of \"" + key + "\"."
3158
+ );
3159
+ }
3160
+ }
3112
3161
  checkProp(res, props, key, altKey, true) ||
3113
3162
  checkProp(res, attrs, key, altKey) ||
3114
3163
  checkProp(res, domProps, key, altKey);
@@ -3149,7 +3198,7 @@ function mergeHooks (data) {
3149
3198
  for (var i = 0; i < hooksToMerge.length; i++) {
3150
3199
  var key = hooksToMerge[i];
3151
3200
  var fromParent = data.hook[key];
3152
- var ours = hooks[key];
3201
+ var ours = componentVNodeHooks[key];
3153
3202
  data.hook[key] = fromParent ? mergeHook$1(ours, fromParent) : ours;
3154
3203
  }
3155
3204
  }
@@ -3391,14 +3440,17 @@ function bindObjectProps (
3391
3440
  if (Array.isArray(value)) {
3392
3441
  value = toObject(value);
3393
3442
  }
3443
+ var hash;
3394
3444
  for (var key in value) {
3395
3445
  if (key === 'class' || key === 'style') {
3396
- data[key] = value[key];
3446
+ hash = data;
3397
3447
  } else {
3398
3448
  var type = data.attrs && data.attrs.type;
3399
- var hash = asProp || config.mustUseProp(tag, type, key)
3449
+ hash = asProp || config.mustUseProp(tag, type, key)
3400
3450
  ? data.domProps || (data.domProps = {})
3401
3451
  : data.attrs || (data.attrs = {});
3452
+ }
3453
+ if (!(key in hash)) {
3402
3454
  hash[key] = value[key];
3403
3455
  }
3404
3456
  }
@@ -3565,14 +3617,17 @@ function renderMixin (Vue) {
3565
3617
 
3566
3618
  /* */
3567
3619
 
3568
- function initInjections (vm) {
3620
+ function initProvide (vm) {
3569
3621
  var provide = vm.$options.provide;
3570
- var inject = vm.$options.inject;
3571
3622
  if (provide) {
3572
3623
  vm._provided = typeof provide === 'function'
3573
3624
  ? provide.call(vm)
3574
3625
  : provide;
3575
3626
  }
3627
+ }
3628
+
3629
+ function initInjections (vm) {
3630
+ var inject = vm.$options.inject;
3576
3631
  if (inject) {
3577
3632
  // inject is :any because flow is not smart enough to figure out cached
3578
3633
  // isArray here
@@ -3588,7 +3643,7 @@ function initInjections (vm) {
3588
3643
  var provideKey = isArray ? key : inject[key];
3589
3644
  var source = vm;
3590
3645
  while (source) {
3591
- if (source._provided && source._provided[provideKey]) {
3646
+ if (source._provided && provideKey in source._provided) {
3592
3647
  vm[key] = source._provided[provideKey];
3593
3648
  break
3594
3649
  }
@@ -3605,8 +3660,8 @@ var uid = 0;
3605
3660
  function initMixin (Vue) {
3606
3661
  Vue.prototype._init = function (options) {
3607
3662
  /* istanbul ignore if */
3608
- if ("development" !== 'production' && config.performance && perf) {
3609
- perf.mark('init');
3663
+ if ("development" !== 'production' && config.performance && mark) {
3664
+ mark('vue-perf-init');
3610
3665
  }
3611
3666
 
3612
3667
  var vm = this;
@@ -3637,15 +3692,16 @@ function initMixin (Vue) {
3637
3692
  initEvents(vm);
3638
3693
  initRender(vm);
3639
3694
  callHook(vm, 'beforeCreate');
3695
+ initInjections(vm); // resolve injections before data/props
3640
3696
  initState(vm);
3641
- initInjections(vm);
3697
+ initProvide(vm); // resolve provide after data/props
3642
3698
  callHook(vm, 'created');
3643
3699
 
3644
3700
  /* istanbul ignore if */
3645
- if ("development" !== 'production' && config.performance && perf) {
3701
+ if ("development" !== 'production' && config.performance && mark) {
3646
3702
  vm._name = formatComponentName(vm, false);
3647
- perf.mark('init end');
3648
- perf.measure(((vm._name) + " init"), 'init', 'init end');
3703
+ mark('vue-perf-init-end');
3704
+ measure(((vm._name) + " init"), 'vue-perf-init', 'vue-perf-init-end');
3649
3705
  }
3650
3706
 
3651
3707
  if (vm.$options.el) {
@@ -4057,7 +4113,7 @@ Object.defineProperty(Vue$3.prototype, '$isServer', {
4057
4113
  get: isServerRendering
4058
4114
  });
4059
4115
 
4060
- Vue$3.version = '2.2.1';
4116
+ Vue$3.version = '2.2.4';
4061
4117
 
4062
4118
  /* */
4063
4119
 
@@ -4322,18 +4378,18 @@ function setAttribute (node, key, val) {
4322
4378
 
4323
4379
 
4324
4380
  var nodeOps = Object.freeze({
4325
- createElement: createElement$1,
4326
- createElementNS: createElementNS,
4327
- createTextNode: createTextNode,
4328
- createComment: createComment,
4329
- insertBefore: insertBefore,
4330
- removeChild: removeChild,
4331
- appendChild: appendChild,
4332
- parentNode: parentNode,
4333
- nextSibling: nextSibling,
4334
- tagName: tagName,
4335
- setTextContent: setTextContent,
4336
- setAttribute: setAttribute
4381
+ createElement: createElement$1,
4382
+ createElementNS: createElementNS,
4383
+ createTextNode: createTextNode,
4384
+ createComment: createComment,
4385
+ insertBefore: insertBefore,
4386
+ removeChild: removeChild,
4387
+ appendChild: appendChild,
4388
+ parentNode: parentNode,
4389
+ nextSibling: nextSibling,
4390
+ tagName: tagName,
4391
+ setTextContent: setTextContent,
4392
+ setAttribute: setAttribute
4337
4393
  });
4338
4394
 
4339
4395
  /* */
@@ -4395,7 +4451,7 @@ function registerRef (vnode, isRemoval) {
4395
4451
 
4396
4452
  var emptyNode = new VNode('', {}, []);
4397
4453
 
4398
- var hooks$1 = ['create', 'activate', 'update', 'remove', 'destroy'];
4454
+ var hooks = ['create', 'activate', 'update', 'remove', 'destroy'];
4399
4455
 
4400
4456
  function isUndef (s) {
4401
4457
  return s == null
@@ -4431,10 +4487,10 @@ function createPatchFunction (backend) {
4431
4487
  var modules = backend.modules;
4432
4488
  var nodeOps = backend.nodeOps;
4433
4489
 
4434
- for (i = 0; i < hooks$1.length; ++i) {
4435
- cbs[hooks$1[i]] = [];
4490
+ for (i = 0; i < hooks.length; ++i) {
4491
+ cbs[hooks[i]] = [];
4436
4492
  for (j = 0; j < modules.length; ++j) {
4437
- if (modules[j][hooks$1[i]] !== undefined) { cbs[hooks$1[i]].push(modules[j][hooks$1[i]]); }
4493
+ if (modules[j][hooks[i]] !== undefined) { cbs[hooks[i]].push(modules[j][hooks[i]]); }
4438
4494
  }
4439
4495
  }
4440
4496
 
@@ -5436,6 +5492,7 @@ function genComponentModel (
5436
5492
 
5437
5493
  el.model = {
5438
5494
  value: ("(" + value + ")"),
5495
+ expression: ("\"" + value + "\""),
5439
5496
  callback: ("function (" + baseValueExpression + ") {" + assignment + "}")
5440
5497
  };
5441
5498
  }
@@ -5615,14 +5672,6 @@ function genCheckboxModel (
5615
5672
  value,
5616
5673
  modifiers
5617
5674
  ) {
5618
- if ("development" !== 'production' &&
5619
- el.attrsMap.checked != null) {
5620
- warn$1(
5621
- "<" + (el.tag) + " v-model=\"" + value + "\" checked>:\n" +
5622
- "inline checked attributes will be ignored when using v-model. " +
5623
- 'Declare initial values in the component\'s data option instead.'
5624
- );
5625
- }
5626
5675
  var number = modifiers && modifiers.number;
5627
5676
  var valueBinding = getBindingAttr(el, 'value') || 'null';
5628
5677
  var trueValueBinding = getBindingAttr(el, 'true-value') || 'true';
@@ -5654,14 +5703,6 @@ function genRadioModel (
5654
5703
  value,
5655
5704
  modifiers
5656
5705
  ) {
5657
- if ("development" !== 'production' &&
5658
- el.attrsMap.checked != null) {
5659
- warn$1(
5660
- "<" + (el.tag) + " v-model=\"" + value + "\" checked>:\n" +
5661
- "inline checked attributes will be ignored when using v-model. " +
5662
- 'Declare initial values in the component\'s data option instead.'
5663
- );
5664
- }
5665
5706
  var number = modifiers && modifiers.number;
5666
5707
  var valueBinding = getBindingAttr(el, 'value') || 'null';
5667
5708
  valueBinding = number ? ("_n(" + valueBinding + ")") : valueBinding;
@@ -5674,10 +5715,6 @@ function genSelect (
5674
5715
  value,
5675
5716
  modifiers
5676
5717
  ) {
5677
- {
5678
- el.children.some(checkOptionWarning);
5679
- }
5680
-
5681
5718
  var number = modifiers && modifiers.number;
5682
5719
  var selectedVal = "Array.prototype.filter" +
5683
5720
  ".call($event.target.options,function(o){return o.selected})" +
@@ -5690,20 +5727,6 @@ function genSelect (
5690
5727
  addHandler(el, 'change', code, null, true);
5691
5728
  }
5692
5729
 
5693
- function checkOptionWarning (option) {
5694
- if (option.type === 1 &&
5695
- option.tag === 'option' &&
5696
- option.attrsMap.selected != null) {
5697
- warn$1(
5698
- "<select v-model=\"" + (option.parent.attrsMap['v-model']) + "\">:\n" +
5699
- 'inline selected attributes on <option> will be ignored when using v-model. ' +
5700
- 'Declare initial values in the component\'s data option instead.'
5701
- );
5702
- return true
5703
- }
5704
- return false
5705
- }
5706
-
5707
5730
  function genDefaultModel (
5708
5731
  el,
5709
5732
  value,
@@ -6201,9 +6224,9 @@ var transformRE = /\b(transform|all)(,|$)/;
6201
6224
 
6202
6225
  function getTransitionInfo (el, expectedType) {
6203
6226
  var styles = window.getComputedStyle(el);
6204
- var transitioneDelays = styles[transitionProp + 'Delay'].split(', ');
6227
+ var transitionDelays = styles[transitionProp + 'Delay'].split(', ');
6205
6228
  var transitionDurations = styles[transitionProp + 'Duration'].split(', ');
6206
- var transitionTimeout = getTimeout(transitioneDelays, transitionDurations);
6229
+ var transitionTimeout = getTimeout(transitionDelays, transitionDurations);
6207
6230
  var animationDelays = styles[animationProp + 'Delay'].split(', ');
6208
6231
  var animationDurations = styles[animationProp + 'Duration'].split(', ');
6209
6232
  var animationTimeout = getTimeout(animationDelays, animationDurations);
@@ -6353,7 +6376,7 @@ function enter (vnode, toggleDisplay) {
6353
6376
  }
6354
6377
 
6355
6378
  var expectsCSS = css !== false && !isIE9;
6356
- var userWantsControl = getHookAgumentsLength(enterHook);
6379
+ var userWantsControl = getHookArgumentsLength(enterHook);
6357
6380
 
6358
6381
  var cb = el._enterCb = once(function () {
6359
6382
  if (expectsCSS) {
@@ -6445,7 +6468,7 @@ function leave (vnode, rm) {
6445
6468
  var duration = data.duration;
6446
6469
 
6447
6470
  var expectsCSS = css !== false && !isIE9;
6448
- var userWantsControl = getHookAgumentsLength(leave);
6471
+ var userWantsControl = getHookArgumentsLength(leave);
6449
6472
 
6450
6473
  var explicitLeaveDuration = toNumber(
6451
6474
  isObject(duration)
@@ -6542,12 +6565,12 @@ function isValidDuration (val) {
6542
6565
  * - a wrapped component method (check ._length)
6543
6566
  * - a plain function (.length)
6544
6567
  */
6545
- function getHookAgumentsLength (fn) {
6568
+ function getHookArgumentsLength (fn) {
6546
6569
  if (!fn) { return false }
6547
6570
  var invokerFns = fn.fns;
6548
6571
  if (invokerFns) {
6549
6572
  // invoker
6550
- return getHookAgumentsLength(
6573
+ return getHookArgumentsLength(
6551
6574
  Array.isArray(invokerFns)
6552
6575
  ? invokerFns[0]
6553
6576
  : invokerFns
@@ -6967,7 +6990,7 @@ var Transition = {
6967
6990
  // we force transition-group to update its children into two passes:
6968
6991
  // in the first pass, we remove all nodes that need to be removed,
6969
6992
  // triggering their leaving transition; in the second pass, we insert/move
6970
- // into the final disired state. This way in the second pass removed
6993
+ // into the final desired state. This way in the second pass removed
6971
6994
  // nodes will remain where they should be.
6972
6995
 
6973
6996
  var props = extend({
@@ -7194,15 +7217,13 @@ var shouldDecodeNewlines = inBrowser ? shouldDecode('\n', '&#10;') : false;
7194
7217
 
7195
7218
  var isUnaryTag = makeMap(
7196
7219
  'area,base,br,col,embed,frame,hr,img,input,isindex,keygen,' +
7197
- 'link,meta,param,source,track,wbr',
7198
- true
7220
+ 'link,meta,param,source,track,wbr'
7199
7221
  );
7200
7222
 
7201
7223
  // Elements that you can, intentionally, leave open
7202
7224
  // (and which close themselves)
7203
7225
  var canBeLeftOpenTag = makeMap(
7204
- 'colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source',
7205
- true
7226
+ 'colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source'
7206
7227
  );
7207
7228
 
7208
7229
  // HTML5 tags https://html.spec.whatwg.org/multipage/indices.html#elements-3
@@ -7212,8 +7233,7 @@ var isNonPhrasingTag = makeMap(
7212
7233
  'details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,' +
7213
7234
  'h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,' +
7214
7235
  'optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,' +
7215
- 'title,tr,track',
7216
- true
7236
+ 'title,tr,track'
7217
7237
  );
7218
7238
 
7219
7239
  /* */
@@ -7271,7 +7291,7 @@ var IS_REGEX_CAPTURING_BROKEN = false;
7271
7291
  });
7272
7292
 
7273
7293
  // Special Elements (can contain anything)
7274
- var isScriptOrStyle = makeMap('script,style', true);
7294
+ var isPlainTextElement = makeMap('script,style,textarea', true);
7275
7295
  var reCache = {};
7276
7296
 
7277
7297
  var decodingMap = {
@@ -7297,8 +7317,8 @@ function parseHTML (html, options) {
7297
7317
  var last, lastTag;
7298
7318
  while (html) {
7299
7319
  last = html;
7300
- // Make sure we're not in a script or style element
7301
- if (!lastTag || !isScriptOrStyle(lastTag)) {
7320
+ // Make sure we're not in a plaintext content element like script/style
7321
+ if (!lastTag || !isPlainTextElement(lastTag)) {
7302
7322
  var textEnd = html.indexOf('<');
7303
7323
  if (textEnd === 0) {
7304
7324
  // Comment:
@@ -7378,7 +7398,7 @@ function parseHTML (html, options) {
7378
7398
  var endTagLength = 0;
7379
7399
  var rest = html.replace(reStackedTag, function (all, text, endTag) {
7380
7400
  endTagLength = endTag.length;
7381
- if (stackedTag !== 'script' && stackedTag !== 'style' && stackedTag !== 'noscript') {
7401
+ if (!isPlainTextElement(stackedTag) && stackedTag !== 'noscript') {
7382
7402
  text = text
7383
7403
  .replace(/<!--([\s\S]*?)-->/g, '$1')
7384
7404
  .replace(/<!\[CDATA\[([\s\S]*?)]]>/g, '$1');
@@ -7573,25 +7593,26 @@ function parseText (
7573
7593
 
7574
7594
  /* */
7575
7595
 
7596
+ var onRE = /^@|^v-on:/;
7576
7597
  var dirRE = /^v-|^@|^:/;
7577
7598
  var forAliasRE = /(.*?)\s+(?:in|of)\s+(.*)/;
7578
7599
  var forIteratorRE = /\((\{[^}]*\}|[^,]*),([^,]*)(?:,([^,]*))?\)/;
7579
- var bindRE = /^:|^v-bind:/;
7580
- var onRE = /^@|^v-on:/;
7600
+
7581
7601
  var argRE = /:(.*)$/;
7602
+ var bindRE = /^:|^v-bind:/;
7582
7603
  var modifierRE = /\.[^.]+/g;
7583
7604
 
7584
7605
  var decodeHTMLCached = cached(decode);
7585
7606
 
7586
7607
  // configurable state
7587
7608
  var warn$2;
7588
- var platformGetTagNamespace;
7589
- var platformMustUseProp;
7590
- var platformIsPreTag;
7591
- var preTransforms;
7609
+ var delimiters;
7592
7610
  var transforms;
7611
+ var preTransforms;
7593
7612
  var postTransforms;
7594
- var delimiters;
7613
+ var platformIsPreTag;
7614
+ var platformMustUseProp;
7615
+ var platformGetTagNamespace;
7595
7616
 
7596
7617
  /**
7597
7618
  * Convert HTML string to AST.
@@ -7617,6 +7638,13 @@ function parse (
7617
7638
  var inPre = false;
7618
7639
  var warned = false;
7619
7640
 
7641
+ function warnOnce (msg) {
7642
+ if (!warned) {
7643
+ warned = true;
7644
+ warn$2(msg);
7645
+ }
7646
+ }
7647
+
7620
7648
  function endPre (element) {
7621
7649
  // check pre state
7622
7650
  if (element.pre) {
@@ -7700,17 +7728,15 @@ function parse (
7700
7728
  }
7701
7729
 
7702
7730
  function checkRootConstraints (el) {
7703
- if ("development" !== 'production' && !warned) {
7731
+ {
7704
7732
  if (el.tag === 'slot' || el.tag === 'template') {
7705
- warned = true;
7706
- warn$2(
7733
+ warnOnce(
7707
7734
  "Cannot use <" + (el.tag) + "> as component root element because it may " +
7708
7735
  'contain multiple nodes.'
7709
7736
  );
7710
7737
  }
7711
7738
  if (el.attrsMap.hasOwnProperty('v-for')) {
7712
- warned = true;
7713
- warn$2(
7739
+ warnOnce(
7714
7740
  'Cannot use v-for on stateful component root element because ' +
7715
7741
  'it renders multiple elements.'
7716
7742
  );
@@ -7730,9 +7756,8 @@ function parse (
7730
7756
  exp: element.elseif,
7731
7757
  block: element
7732
7758
  });
7733
- } else if ("development" !== 'production' && !warned) {
7734
- warned = true;
7735
- warn$2(
7759
+ } else {
7760
+ warnOnce(
7736
7761
  "Component template should contain exactly one root element. " +
7737
7762
  "If you are using v-if on multiple elements, " +
7738
7763
  "use v-else-if to chain them instead."
@@ -7777,11 +7802,16 @@ function parse (
7777
7802
 
7778
7803
  chars: function chars (text) {
7779
7804
  if (!currentParent) {
7780
- if ("development" !== 'production' && !warned && text === template) {
7781
- warned = true;
7782
- warn$2(
7783
- 'Component template requires a root element, rather than just text.'
7784
- );
7805
+ {
7806
+ if (text === template) {
7807
+ warnOnce(
7808
+ 'Component template requires a root element, rather than just text.'
7809
+ );
7810
+ } else if ((text = text.trim())) {
7811
+ warnOnce(
7812
+ ("text \"" + text + "\" outside root element will be ignored.")
7813
+ );
7814
+ }
7785
7815
  }
7786
7816
  return
7787
7817
  }
@@ -7980,7 +8010,7 @@ function processComponent (el) {
7980
8010
 
7981
8011
  function processAttrs (el) {
7982
8012
  var list = el.attrsList;
7983
- var i, l, name, rawName, value, arg, modifiers, isProp;
8013
+ var i, l, name, rawName, value, modifiers, isProp;
7984
8014
  for (i = 0, l = list.length; i < l; i++) {
7985
8015
  name = rawName = list[i].name;
7986
8016
  value = list[i].value;
@@ -8018,7 +8048,8 @@ function processAttrs (el) {
8018
8048
  name = name.replace(dirRE, '');
8019
8049
  // parse arg
8020
8050
  var argMatch = name.match(argRE);
8021
- if (argMatch && (arg = argMatch[1])) {
8051
+ var arg = argMatch && argMatch[1];
8052
+ if (arg) {
8022
8053
  name = name.slice(0, -(arg.length + 1));
8023
8054
  }
8024
8055
  addDirective(el, name, rawName, value, arg, modifiers);
@@ -8270,9 +8301,9 @@ var modifierCode = {
8270
8301
  shift: genGuard("!$event.shiftKey"),
8271
8302
  alt: genGuard("!$event.altKey"),
8272
8303
  meta: genGuard("!$event.metaKey"),
8273
- left: genGuard("$event.button !== 0"),
8274
- middle: genGuard("$event.button !== 1"),
8275
- right: genGuard("$event.button !== 2")
8304
+ left: genGuard("'button' in $event && $event.button !== 0"),
8305
+ middle: genGuard("'button' in $event && $event.button !== 1"),
8306
+ right: genGuard("'button' in $event && $event.button !== 2")
8276
8307
  };
8277
8308
 
8278
8309
  function genHandlers (events, native) {
@@ -8289,34 +8320,52 @@ function genHandler (
8289
8320
  ) {
8290
8321
  if (!handler) {
8291
8322
  return 'function(){}'
8292
- } else if (Array.isArray(handler)) {
8323
+ }
8324
+
8325
+ if (Array.isArray(handler)) {
8293
8326
  return ("[" + (handler.map(function (handler) { return genHandler(name, handler); }).join(',')) + "]")
8294
- } else if (!handler.modifiers) {
8295
- return fnExpRE.test(handler.value) || simplePathRE.test(handler.value)
8327
+ }
8328
+
8329
+ var isMethodPath = simplePathRE.test(handler.value);
8330
+ var isFunctionExpression = fnExpRE.test(handler.value);
8331
+
8332
+ if (!handler.modifiers) {
8333
+ return isMethodPath || isFunctionExpression
8296
8334
  ? handler.value
8297
- : ("function($event){" + (handler.value) + "}")
8335
+ : ("function($event){" + (handler.value) + "}") // inline statement
8298
8336
  } else {
8299
8337
  var code = '';
8338
+ var genModifierCode = '';
8300
8339
  var keys = [];
8301
8340
  for (var key in handler.modifiers) {
8302
8341
  if (modifierCode[key]) {
8303
- code += modifierCode[key];
8342
+ genModifierCode += modifierCode[key];
8343
+ // left/right
8344
+ if (keyCodes[key]) {
8345
+ keys.push(key);
8346
+ }
8304
8347
  } else {
8305
8348
  keys.push(key);
8306
8349
  }
8307
8350
  }
8308
8351
  if (keys.length) {
8309
- code = genKeyFilter(keys) + code;
8352
+ code += genKeyFilter(keys);
8353
+ }
8354
+ // Make sure modifiers like prevent and stop get executed after key filtering
8355
+ if (genModifierCode) {
8356
+ code += genModifierCode;
8310
8357
  }
8311
- var handlerCode = simplePathRE.test(handler.value)
8358
+ var handlerCode = isMethodPath
8312
8359
  ? handler.value + '($event)'
8313
- : handler.value;
8360
+ : isFunctionExpression
8361
+ ? ("(" + (handler.value) + ")($event)")
8362
+ : handler.value;
8314
8363
  return ("function($event){" + code + handlerCode + "}")
8315
8364
  }
8316
8365
  }
8317
8366
 
8318
8367
  function genKeyFilter (keys) {
8319
- return ("if(" + (keys.map(genFilterCode).join('&&')) + ")return null;")
8368
+ return ("if(!('button' in $event)&&" + (keys.map(genFilterCode).join('&&')) + ")return null;")
8320
8369
  }
8321
8370
 
8322
8371
  function genFilterCode (key) {
@@ -8549,7 +8598,7 @@ function genData (el) {
8549
8598
  }
8550
8599
  // component v-model
8551
8600
  if (el.model) {
8552
- data += "model:{value:" + (el.model.value) + ",callback:" + (el.model.callback) + "},";
8601
+ data += "model:{value:" + (el.model.value) + ",callback:" + (el.model.callback) + ",expression:" + (el.model.expression) + "},";
8553
8602
  }
8554
8603
  // inline-template
8555
8604
  if (el.inlineTemplate) {
@@ -8626,10 +8675,8 @@ function genChildren (el, checkSkip) {
8626
8675
  el$1.tag !== 'slot') {
8627
8676
  return genElement(el$1)
8628
8677
  }
8629
- var normalizationType = getNormalizationType(children);
8630
- return ("[" + (children.map(genNode).join(',')) + "]" + (checkSkip
8631
- ? normalizationType ? ("," + normalizationType) : ''
8632
- : ''))
8678
+ var normalizationType = checkSkip ? getNormalizationType(children) : 0;
8679
+ return ("[" + (children.map(genNode).join(',')) + "]" + (normalizationType ? ("," + normalizationType) : ''))
8633
8680
  }
8634
8681
  }
8635
8682
 
@@ -8721,14 +8768,22 @@ function transformSpecialNewlines (text) {
8721
8768
 
8722
8769
  /* */
8723
8770
 
8724
- // operators like typeof, instanceof and in are allowed
8771
+ // these keywords should not appear inside expressions, but operators like
8772
+ // typeof, instanceof and in are allowed
8725
8773
  var prohibitedKeywordRE = new RegExp('\\b' + (
8726
8774
  'do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,' +
8727
8775
  'super,throw,while,yield,delete,export,import,return,switch,default,' +
8728
8776
  'extends,finally,continue,debugger,function,arguments'
8729
8777
  ).split(',').join('\\b|\\b') + '\\b');
8778
+
8779
+ // these unary operators should not be used as property/method names
8780
+ var unaryOperatorsRE = new RegExp('\\b' + (
8781
+ 'delete,typeof,void'
8782
+ ).split(',').join('\\s*\\([^\\)]*\\)|\\b') + '\\s*\\([^\\)]*\\)');
8783
+
8730
8784
  // check valid identifier for v-for
8731
8785
  var identRE = /[A-Za-z_$][\w$]*/;
8786
+
8732
8787
  // strip strings in expressions
8733
8788
  var stripStringRE = /'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"|`(?:[^`\\]|\\.)*\$\{|\}(?:[^`\\]|\\.)*`|`(?:[^`\\]|\\.)*`/g;
8734
8789
 
@@ -8749,6 +8804,8 @@ function checkNode (node, errors) {
8749
8804
  if (value) {
8750
8805
  if (name === 'v-for') {
8751
8806
  checkFor(node, ("v-for=\"" + value + "\""), errors);
8807
+ } else if (onRE.test(name)) {
8808
+ checkEvent(value, (name + "=\"" + value + "\""), errors);
8752
8809
  } else {
8753
8810
  checkExpression(value, (name + "=\"" + value + "\""), errors);
8754
8811
  }
@@ -8765,6 +8822,17 @@ function checkNode (node, errors) {
8765
8822
  }
8766
8823
  }
8767
8824
 
8825
+ function checkEvent (exp, text, errors) {
8826
+ var keywordMatch = exp.replace(stripStringRE, '').match(unaryOperatorsRE);
8827
+ if (keywordMatch) {
8828
+ errors.push(
8829
+ "avoid using JavaScript unary operator as property name: " +
8830
+ "\"" + (keywordMatch[0]) + "\" in expression " + (text.trim())
8831
+ );
8832
+ }
8833
+ checkExpression(exp, text, errors);
8834
+ }
8835
+
8768
8836
  function checkFor (node, text, errors) {
8769
8837
  checkExpression(node.for || '', text, errors);
8770
8838
  checkIdentifier(node.alias, 'v-for alias', text, errors);
@@ -9131,8 +9199,8 @@ Vue$3.prototype.$mount = function (
9131
9199
  }
9132
9200
  if (template) {
9133
9201
  /* istanbul ignore if */
9134
- if ("development" !== 'production' && config.performance && perf) {
9135
- perf.mark('compile');
9202
+ if ("development" !== 'production' && config.performance && mark) {
9203
+ mark('compile');
9136
9204
  }
9137
9205
 
9138
9206
  var ref = compileToFunctions(template, {
@@ -9145,9 +9213,9 @@ Vue$3.prototype.$mount = function (
9145
9213
  options.staticRenderFns = staticRenderFns;
9146
9214
 
9147
9215
  /* istanbul ignore if */
9148
- if ("development" !== 'production' && config.performance && perf) {
9149
- perf.mark('compile end');
9150
- perf.measure(((this._name) + " compile"), 'compile', 'compile end');
9216
+ if ("development" !== 'production' && config.performance && mark) {
9217
+ mark('compile end');
9218
+ measure(((this._name) + " compile"), 'compile', 'compile end');
9151
9219
  }
9152
9220
  }
9153
9221
  }
@@ -9172,4 +9240,4 @@ Vue$3.compile = compileToFunctions;
9172
9240
 
9173
9241
  return Vue$3;
9174
9242
 
9175
- })));
9243
+ })));
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vue-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.1
4
+ version: 2.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marshall Shen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-14 00:00:00.000000000 Z
11
+ date: 2017-03-15 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A simple asset-pipeline wrapper for vue.js by Evan You
14
14
  email: