vuejs-rails 2.1.6 → 2.1.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * Vue.js v2.1.6
3
- * (c) 2014-2016 Evan You
2
+ * Vue.js v2.1.10
3
+ * (c) 2014-2017 Evan You
4
4
  * Released under the MIT License.
5
5
  */
6
6
  (function (global, factory) {
@@ -27,8 +27,8 @@ function _toString (val) {
27
27
  * If the conversion fails, return original string.
28
28
  */
29
29
  function toNumber (val) {
30
- var n = parseFloat(val, 10);
31
- return (n || n === 0) ? n : val
30
+ var n = parseFloat(val);
31
+ return isNaN(n) ? val : n
32
32
  }
33
33
 
34
34
  /**
@@ -86,14 +86,14 @@ function isPrimitive (value) {
86
86
  */
87
87
  function cached (fn) {
88
88
  var cache = Object.create(null);
89
- return function cachedFn (str) {
89
+ return (function cachedFn (str) {
90
90
  var hit = cache[str];
91
91
  return hit || (cache[str] = fn(str))
92
- }
92
+ })
93
93
  }
94
94
 
95
95
  /**
96
- * Camelize a hyphen-delmited string.
96
+ * Camelize a hyphen-delimited string.
97
97
  */
98
98
  var camelizeRE = /-(\w)/g;
99
99
  var camelize = cached(function (str) {
@@ -219,13 +219,15 @@ function genStaticKeys (modules) {
219
219
  * if they are plain objects, do they have the same shape?
220
220
  */
221
221
  function looseEqual (a, b) {
222
- /* eslint-disable eqeqeq */
223
- return a == b || (
224
- isObject(a) && isObject(b)
225
- ? JSON.stringify(a) === JSON.stringify(b)
226
- : false
227
- )
228
- /* eslint-enable eqeqeq */
222
+ var isObjectA = isObject(a);
223
+ var isObjectB = isObject(b);
224
+ if (isObjectA && isObjectB) {
225
+ return JSON.stringify(a) === JSON.stringify(b)
226
+ } else if (!isObjectA && !isObjectB) {
227
+ return String(a) === String(b)
228
+ } else {
229
+ return false
230
+ }
229
231
  }
230
232
 
231
233
  function looseIndexOf (arr, val) {
@@ -261,7 +263,7 @@ var config = {
261
263
  /**
262
264
  * Ignore certain custom elements
263
265
  */
264
- ignoredElements: null,
266
+ ignoredElements: [],
265
267
 
266
268
  /**
267
269
  * Custom user key aliases for v-on
@@ -734,7 +736,7 @@ function copyAugment (target, src, keys) {
734
736
  * returns the new observer if successfully observed,
735
737
  * or the existing observer if the value already has one.
736
738
  */
737
- function observe (value) {
739
+ function observe (value, asRootData) {
738
740
  if (!isObject(value)) {
739
741
  return
740
742
  }
@@ -750,6 +752,9 @@ function observe (value) {
750
752
  ) {
751
753
  ob = new Observer(value);
752
754
  }
755
+ if (asRootData && ob) {
756
+ ob.vmCount++;
757
+ }
753
758
  return ob
754
759
  }
755
760
 
@@ -1216,10 +1221,10 @@ function validateProp (
1216
1221
  var absent = !hasOwn(propsData, key);
1217
1222
  var value = propsData[key];
1218
1223
  // handle boolean props
1219
- if (isBooleanType(prop.type)) {
1224
+ if (isType(Boolean, prop.type)) {
1220
1225
  if (absent && !hasOwn(prop, 'default')) {
1221
1226
  value = false;
1222
- } else if (value === '' || value === hyphenate(key)) {
1227
+ } else if (!isType(String, prop.type) && (value === '' || value === hyphenate(key))) {
1223
1228
  value = true;
1224
1229
  }
1225
1230
  }
@@ -1299,7 +1304,7 @@ function assertProp (
1299
1304
  }
1300
1305
  for (var i = 0; i < type.length && !valid; i++) {
1301
1306
  var assertedType = assertType(value, type[i]);
1302
- expectedTypes.push(assertedType.expectedType);
1307
+ expectedTypes.push(assertedType.expectedType || '');
1303
1308
  valid = assertedType.valid;
1304
1309
  }
1305
1310
  }
@@ -1360,12 +1365,12 @@ function getType (fn) {
1360
1365
  return match && match[1]
1361
1366
  }
1362
1367
 
1363
- function isBooleanType (fn) {
1368
+ function isType (type, fn) {
1364
1369
  if (!Array.isArray(fn)) {
1365
- return getType(fn) === 'Boolean'
1370
+ return getType(fn) === getType(type)
1366
1371
  }
1367
1372
  for (var i = 0, len = fn.length; i < len; i++) {
1368
- if (getType(fn[i]) === 'Boolean') {
1373
+ if (getType(fn[i]) === getType(type)) {
1369
1374
  return true
1370
1375
  }
1371
1376
  }
@@ -1376,50 +1381,50 @@ function isBooleanType (fn) {
1376
1381
 
1377
1382
 
1378
1383
  var util = Object.freeze({
1379
- defineReactive: defineReactive$$1,
1380
- _toString: _toString,
1381
- toNumber: toNumber,
1382
- makeMap: makeMap,
1383
- isBuiltInTag: isBuiltInTag,
1384
- remove: remove$1,
1385
- hasOwn: hasOwn,
1386
- isPrimitive: isPrimitive,
1387
- cached: cached,
1388
- camelize: camelize,
1389
- capitalize: capitalize,
1390
- hyphenate: hyphenate,
1391
- bind: bind$1,
1392
- toArray: toArray,
1393
- extend: extend,
1394
- isObject: isObject,
1395
- isPlainObject: isPlainObject,
1396
- toObject: toObject,
1397
- noop: noop,
1398
- no: no,
1399
- identity: identity,
1400
- genStaticKeys: genStaticKeys,
1401
- looseEqual: looseEqual,
1402
- looseIndexOf: looseIndexOf,
1403
- isReserved: isReserved,
1404
- def: def,
1405
- parsePath: parsePath,
1406
- hasProto: hasProto,
1407
- inBrowser: inBrowser,
1408
- UA: UA,
1409
- isIE: isIE,
1410
- isIE9: isIE9,
1411
- isEdge: isEdge,
1412
- isAndroid: isAndroid,
1413
- isIOS: isIOS,
1414
- isServerRendering: isServerRendering,
1415
- devtools: devtools,
1416
- nextTick: nextTick,
1417
- get _Set () { return _Set; },
1418
- mergeOptions: mergeOptions,
1419
- resolveAsset: resolveAsset,
1420
- get warn () { return warn; },
1421
- get formatComponentName () { return formatComponentName; },
1422
- validateProp: validateProp
1384
+ defineReactive: defineReactive$$1,
1385
+ _toString: _toString,
1386
+ toNumber: toNumber,
1387
+ makeMap: makeMap,
1388
+ isBuiltInTag: isBuiltInTag,
1389
+ remove: remove$1,
1390
+ hasOwn: hasOwn,
1391
+ isPrimitive: isPrimitive,
1392
+ cached: cached,
1393
+ camelize: camelize,
1394
+ capitalize: capitalize,
1395
+ hyphenate: hyphenate,
1396
+ bind: bind$1,
1397
+ toArray: toArray,
1398
+ extend: extend,
1399
+ isObject: isObject,
1400
+ isPlainObject: isPlainObject,
1401
+ toObject: toObject,
1402
+ noop: noop,
1403
+ no: no,
1404
+ identity: identity,
1405
+ genStaticKeys: genStaticKeys,
1406
+ looseEqual: looseEqual,
1407
+ looseIndexOf: looseIndexOf,
1408
+ isReserved: isReserved,
1409
+ def: def,
1410
+ parsePath: parsePath,
1411
+ hasProto: hasProto,
1412
+ inBrowser: inBrowser,
1413
+ UA: UA,
1414
+ isIE: isIE,
1415
+ isIE9: isIE9,
1416
+ isEdge: isEdge,
1417
+ isAndroid: isAndroid,
1418
+ isIOS: isIOS,
1419
+ isServerRendering: isServerRendering,
1420
+ devtools: devtools,
1421
+ nextTick: nextTick,
1422
+ get _Set () { return _Set; },
1423
+ mergeOptions: mergeOptions,
1424
+ resolveAsset: resolveAsset,
1425
+ get warn () { return warn; },
1426
+ get formatComponentName () { return formatComponentName; },
1427
+ validateProp: validateProp
1423
1428
  });
1424
1429
 
1425
1430
  /* not type checking this file because flow doesn't play well with Proxy */
@@ -1498,1764 +1503,1840 @@ var initProxy;
1498
1503
 
1499
1504
  /* */
1500
1505
 
1506
+ var VNode = function VNode (
1507
+ tag,
1508
+ data,
1509
+ children,
1510
+ text,
1511
+ elm,
1512
+ context,
1513
+ componentOptions
1514
+ ) {
1515
+ this.tag = tag;
1516
+ this.data = data;
1517
+ this.children = children;
1518
+ this.text = text;
1519
+ this.elm = elm;
1520
+ this.ns = undefined;
1521
+ this.context = context;
1522
+ this.functionalContext = undefined;
1523
+ this.key = data && data.key;
1524
+ this.componentOptions = componentOptions;
1525
+ this.componentInstance = undefined;
1526
+ this.parent = undefined;
1527
+ this.raw = false;
1528
+ this.isStatic = false;
1529
+ this.isRootInsert = true;
1530
+ this.isComment = false;
1531
+ this.isCloned = false;
1532
+ this.isOnce = false;
1533
+ };
1501
1534
 
1502
- var queue = [];
1503
- var has$1 = {};
1504
- var circular = {};
1505
- var waiting = false;
1506
- var flushing = false;
1507
- var index = 0;
1508
-
1509
- /**
1510
- * Reset the scheduler's state.
1511
- */
1512
- function resetSchedulerState () {
1513
- queue.length = 0;
1514
- has$1 = {};
1515
- {
1516
- circular = {};
1517
- }
1518
- waiting = flushing = false;
1519
- }
1535
+ var prototypeAccessors = { child: {} };
1520
1536
 
1521
- /**
1522
- * Flush both queues and run the watchers.
1523
- */
1524
- function flushSchedulerQueue () {
1525
- flushing = true;
1537
+ // DEPRECATED: alias for componentInstance for backwards compat.
1538
+ /* istanbul ignore next */
1539
+ prototypeAccessors.child.get = function () {
1540
+ return this.componentInstance
1541
+ };
1526
1542
 
1527
- // Sort queue before flush.
1528
- // This ensures that:
1529
- // 1. Components are updated from parent to child. (because parent is always
1530
- // created before the child)
1531
- // 2. A component's user watchers are run before its render watcher (because
1532
- // user watchers are created before the render watcher)
1533
- // 3. If a component is destroyed during a parent component's watcher run,
1534
- // its watchers can be skipped.
1535
- queue.sort(function (a, b) { return a.id - b.id; });
1543
+ Object.defineProperties( VNode.prototype, prototypeAccessors );
1536
1544
 
1537
- // do not cache length because more watchers might be pushed
1538
- // as we run existing watchers
1539
- for (index = 0; index < queue.length; index++) {
1540
- var watcher = queue[index];
1541
- var id = watcher.id;
1542
- has$1[id] = null;
1543
- watcher.run();
1544
- // in dev build, check and stop circular updates.
1545
- if ("development" !== 'production' && has$1[id] != null) {
1546
- circular[id] = (circular[id] || 0) + 1;
1547
- if (circular[id] > config._maxUpdateCount) {
1548
- warn(
1549
- 'You may have an infinite update loop ' + (
1550
- watcher.user
1551
- ? ("in watcher with expression \"" + (watcher.expression) + "\"")
1552
- : "in a component render function."
1553
- ),
1554
- watcher.vm
1555
- );
1556
- break
1557
- }
1558
- }
1559
- }
1545
+ var createEmptyVNode = function () {
1546
+ var node = new VNode();
1547
+ node.text = '';
1548
+ node.isComment = true;
1549
+ return node
1550
+ };
1560
1551
 
1561
- // devtool hook
1562
- /* istanbul ignore if */
1563
- if (devtools && config.devtools) {
1564
- devtools.emit('flush');
1565
- }
1552
+ function createTextVNode (val) {
1553
+ return new VNode(undefined, undefined, undefined, String(val))
1554
+ }
1566
1555
 
1567
- resetSchedulerState();
1556
+ // optimized shallow clone
1557
+ // used for static nodes and slot nodes because they may be reused across
1558
+ // multiple renders, cloning them avoids errors when DOM manipulations rely
1559
+ // on their elm reference.
1560
+ function cloneVNode (vnode) {
1561
+ var cloned = new VNode(
1562
+ vnode.tag,
1563
+ vnode.data,
1564
+ vnode.children,
1565
+ vnode.text,
1566
+ vnode.elm,
1567
+ vnode.context,
1568
+ vnode.componentOptions
1569
+ );
1570
+ cloned.ns = vnode.ns;
1571
+ cloned.isStatic = vnode.isStatic;
1572
+ cloned.key = vnode.key;
1573
+ cloned.isCloned = true;
1574
+ return cloned
1568
1575
  }
1569
1576
 
1570
- /**
1571
- * Push a watcher into the watcher queue.
1572
- * Jobs with duplicate IDs will be skipped unless it's
1573
- * pushed when the queue is being flushed.
1574
- */
1575
- function queueWatcher (watcher) {
1576
- var id = watcher.id;
1577
- if (has$1[id] == null) {
1578
- has$1[id] = true;
1579
- if (!flushing) {
1580
- queue.push(watcher);
1581
- } else {
1582
- // if already flushing, splice the watcher based on its id
1583
- // if already past its id, it will be run next immediately.
1584
- var i = queue.length - 1;
1585
- while (i >= 0 && queue[i].id > watcher.id) {
1586
- i--;
1587
- }
1588
- queue.splice(Math.max(i, index) + 1, 0, watcher);
1589
- }
1590
- // queue the flush
1591
- if (!waiting) {
1592
- waiting = true;
1593
- nextTick(flushSchedulerQueue);
1594
- }
1577
+ function cloneVNodes (vnodes) {
1578
+ var res = new Array(vnodes.length);
1579
+ for (var i = 0; i < vnodes.length; i++) {
1580
+ res[i] = cloneVNode(vnodes[i]);
1595
1581
  }
1582
+ return res
1596
1583
  }
1597
1584
 
1598
1585
  /* */
1599
1586
 
1600
- var uid$2 = 0;
1587
+ var hooks = { init: init, prepatch: prepatch, insert: insert, destroy: destroy$1 };
1588
+ var hooksToMerge = Object.keys(hooks);
1601
1589
 
1602
- /**
1603
- * A watcher parses an expression, collects dependencies,
1604
- * and fires callback when the expression value changes.
1605
- * This is used for both the $watch() api and directives.
1606
- */
1607
- var Watcher = function Watcher (
1608
- vm,
1609
- expOrFn,
1610
- cb,
1611
- options
1590
+ function createComponent (
1591
+ Ctor,
1592
+ data,
1593
+ context,
1594
+ children,
1595
+ tag
1612
1596
  ) {
1613
- if ( options === void 0 ) options = {};
1597
+ if (!Ctor) {
1598
+ return
1599
+ }
1614
1600
 
1615
- this.vm = vm;
1616
- vm._watchers.push(this);
1617
- // options
1618
- this.deep = !!options.deep;
1619
- this.user = !!options.user;
1620
- this.lazy = !!options.lazy;
1621
- this.sync = !!options.sync;
1622
- this.expression = expOrFn.toString();
1623
- this.cb = cb;
1624
- this.id = ++uid$2; // uid for batching
1625
- this.active = true;
1626
- this.dirty = this.lazy; // for lazy watchers
1627
- this.deps = [];
1628
- this.newDeps = [];
1629
- this.depIds = new _Set();
1630
- this.newDepIds = new _Set();
1631
- // parse expression for getter
1632
- if (typeof expOrFn === 'function') {
1633
- this.getter = expOrFn;
1634
- } else {
1635
- this.getter = parsePath(expOrFn);
1636
- if (!this.getter) {
1637
- this.getter = function () {};
1638
- "development" !== 'production' && warn(
1639
- "Failed watching path: \"" + expOrFn + "\" " +
1640
- 'Watcher only accepts simple dot-delimited paths. ' +
1641
- 'For full control, use a function instead.',
1642
- vm
1643
- );
1644
- }
1601
+ var baseCtor = context.$options._base;
1602
+ if (isObject(Ctor)) {
1603
+ Ctor = baseCtor.extend(Ctor);
1645
1604
  }
1646
- this.value = this.lazy
1647
- ? undefined
1648
- : this.get();
1649
- };
1650
1605
 
1651
- /**
1652
- * Evaluate the getter, and re-collect dependencies.
1653
- */
1654
- Watcher.prototype.get = function get () {
1655
- pushTarget(this);
1656
- var value = this.getter.call(this.vm, this.vm);
1657
- // "touch" every property so they are all tracked as
1658
- // dependencies for deep watching
1659
- if (this.deep) {
1660
- traverse(value);
1606
+ if (typeof Ctor !== 'function') {
1607
+ {
1608
+ warn(("Invalid Component definition: " + (String(Ctor))), context);
1609
+ }
1610
+ return
1661
1611
  }
1662
- popTarget();
1663
- this.cleanupDeps();
1664
- return value
1665
- };
1666
1612
 
1667
- /**
1668
- * Add a dependency to this directive.
1669
- */
1670
- Watcher.prototype.addDep = function addDep (dep) {
1671
- var id = dep.id;
1672
- if (!this.newDepIds.has(id)) {
1673
- this.newDepIds.add(id);
1674
- this.newDeps.push(dep);
1675
- if (!this.depIds.has(id)) {
1676
- dep.addSub(this);
1613
+ // async component
1614
+ if (!Ctor.cid) {
1615
+ if (Ctor.resolved) {
1616
+ Ctor = Ctor.resolved;
1617
+ } else {
1618
+ Ctor = resolveAsyncComponent(Ctor, baseCtor, function () {
1619
+ // it's ok to queue this on every render because
1620
+ // $forceUpdate is buffered by the scheduler.
1621
+ context.$forceUpdate();
1622
+ });
1623
+ if (!Ctor) {
1624
+ // return nothing if this is indeed an async component
1625
+ // wait for the callback to trigger parent update.
1626
+ return
1627
+ }
1677
1628
  }
1678
1629
  }
1679
- };
1680
1630
 
1681
- /**
1682
- * Clean up for dependency collection.
1683
- */
1684
- Watcher.prototype.cleanupDeps = function cleanupDeps () {
1685
- var this$1 = this;
1631
+ // resolve constructor options in case global mixins are applied after
1632
+ // component constructor creation
1633
+ resolveConstructorOptions(Ctor);
1686
1634
 
1687
- var i = this.deps.length;
1688
- while (i--) {
1689
- var dep = this$1.deps[i];
1690
- if (!this$1.newDepIds.has(dep.id)) {
1691
- dep.removeSub(this$1);
1692
- }
1693
- }
1694
- var tmp = this.depIds;
1695
- this.depIds = this.newDepIds;
1696
- this.newDepIds = tmp;
1697
- this.newDepIds.clear();
1698
- tmp = this.deps;
1699
- this.deps = this.newDeps;
1700
- this.newDeps = tmp;
1701
- this.newDeps.length = 0;
1702
- };
1635
+ data = data || {};
1703
1636
 
1704
- /**
1705
- * Subscriber interface.
1706
- * Will be called when a dependency changes.
1707
- */
1708
- Watcher.prototype.update = function update () {
1709
- /* istanbul ignore else */
1710
- if (this.lazy) {
1711
- this.dirty = true;
1712
- } else if (this.sync) {
1713
- this.run();
1714
- } else {
1715
- queueWatcher(this);
1716
- }
1717
- };
1637
+ // extract props
1638
+ var propsData = extractProps(data, Ctor);
1718
1639
 
1719
- /**
1720
- * Scheduler job interface.
1721
- * Will be called by the scheduler.
1722
- */
1723
- Watcher.prototype.run = function run () {
1724
- if (this.active) {
1725
- var value = this.get();
1726
- if (
1727
- value !== this.value ||
1728
- // Deep watchers and watchers on Object/Arrays should fire even
1729
- // when the value is the same, because the value may
1730
- // have mutated.
1731
- isObject(value) ||
1732
- this.deep
1733
- ) {
1734
- // set new value
1735
- var oldValue = this.value;
1736
- this.value = value;
1737
- if (this.user) {
1738
- try {
1739
- this.cb.call(this.vm, value, oldValue);
1740
- } catch (e) {
1741
- /* istanbul ignore else */
1742
- if (config.errorHandler) {
1743
- config.errorHandler.call(null, e, this.vm);
1744
- } else {
1745
- "development" !== 'production' && warn(
1746
- ("Error in watcher \"" + (this.expression) + "\""),
1747
- this.vm
1748
- );
1749
- throw e
1750
- }
1751
- }
1752
- } else {
1753
- this.cb.call(this.vm, value, oldValue);
1754
- }
1755
- }
1640
+ // functional component
1641
+ if (Ctor.options.functional) {
1642
+ return createFunctionalComponent(Ctor, propsData, data, context, children)
1756
1643
  }
1757
- };
1758
-
1759
- /**
1760
- * Evaluate the value of the watcher.
1761
- * This only gets called for lazy watchers.
1762
- */
1763
- Watcher.prototype.evaluate = function evaluate () {
1764
- this.value = this.get();
1765
- this.dirty = false;
1766
- };
1767
1644
 
1768
- /**
1769
- * Depend on all deps collected by this watcher.
1770
- */
1771
- Watcher.prototype.depend = function depend () {
1772
- var this$1 = this;
1645
+ // extract listeners, since these needs to be treated as
1646
+ // child component listeners instead of DOM listeners
1647
+ var listeners = data.on;
1648
+ // replace with listeners with .native modifier
1649
+ data.on = data.nativeOn;
1773
1650
 
1774
- var i = this.deps.length;
1775
- while (i--) {
1776
- this$1.deps[i].depend();
1651
+ if (Ctor.options.abstract) {
1652
+ // abstract components do not keep anything
1653
+ // other than props & listeners
1654
+ data = {};
1777
1655
  }
1778
- };
1779
1656
 
1780
- /**
1781
- * Remove self from all dependencies' subscriber list.
1782
- */
1783
- Watcher.prototype.teardown = function teardown () {
1784
- var this$1 = this;
1657
+ // merge component management hooks onto the placeholder node
1658
+ mergeHooks(data);
1785
1659
 
1786
- if (this.active) {
1787
- // remove self from vm's watcher list
1788
- // this is a somewhat expensive operation so we skip it
1789
- // if the vm is being destroyed or is performing a v-for
1790
- // re-render (the watcher list is then filtered by v-for).
1791
- if (!this.vm._isBeingDestroyed && !this.vm._vForRemoving) {
1792
- remove$1(this.vm._watchers, this);
1660
+ // return a placeholder vnode
1661
+ var name = Ctor.options.name || tag;
1662
+ var vnode = new VNode(
1663
+ ("vue-component-" + (Ctor.cid) + (name ? ("-" + name) : '')),
1664
+ data, undefined, undefined, undefined, context,
1665
+ { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children }
1666
+ );
1667
+ return vnode
1668
+ }
1669
+
1670
+ function createFunctionalComponent (
1671
+ Ctor,
1672
+ propsData,
1673
+ data,
1674
+ context,
1675
+ children
1676
+ ) {
1677
+ var props = {};
1678
+ var propOptions = Ctor.options.props;
1679
+ if (propOptions) {
1680
+ for (var key in propOptions) {
1681
+ props[key] = validateProp(key, propOptions, propsData);
1793
1682
  }
1794
- var i = this.deps.length;
1795
- while (i--) {
1796
- this$1.deps[i].removeSub(this$1);
1683
+ }
1684
+ // ensure the createElement function in functional components
1685
+ // gets a unique context - this is necessary for correct named slot check
1686
+ var _context = Object.create(context);
1687
+ var h = function (a, b, c, d) { return createElement(_context, a, b, c, d, true); };
1688
+ var vnode = Ctor.options.render.call(null, h, {
1689
+ props: props,
1690
+ data: data,
1691
+ parent: context,
1692
+ children: children,
1693
+ slots: function () { return resolveSlots(children, context); }
1694
+ });
1695
+ if (vnode instanceof VNode) {
1696
+ vnode.functionalContext = context;
1697
+ if (data.slot) {
1698
+ (vnode.data || (vnode.data = {})).slot = data.slot;
1797
1699
  }
1798
- this.active = false;
1799
1700
  }
1800
- };
1801
-
1802
- /**
1803
- * Recursively traverse an object to evoke all converted
1804
- * getters, so that every nested property inside the object
1805
- * is collected as a "deep" dependency.
1806
- */
1807
- var seenObjects = new _Set();
1808
- function traverse (val) {
1809
- seenObjects.clear();
1810
- _traverse(val, seenObjects);
1701
+ return vnode
1811
1702
  }
1812
1703
 
1813
- function _traverse (val, seen) {
1814
- var i, keys;
1815
- var isA = Array.isArray(val);
1816
- if ((!isA && !isObject(val)) || !Object.isExtensible(val)) {
1817
- return
1818
- }
1819
- if (val.__ob__) {
1820
- var depId = val.__ob__.dep.id;
1821
- if (seen.has(depId)) {
1822
- return
1823
- }
1824
- seen.add(depId);
1704
+ function createComponentInstanceForVnode (
1705
+ vnode, // we know it's MountedComponentVNode but flow doesn't
1706
+ parent, // activeInstance in lifecycle state
1707
+ parentElm,
1708
+ refElm
1709
+ ) {
1710
+ var vnodeComponentOptions = vnode.componentOptions;
1711
+ var options = {
1712
+ _isComponent: true,
1713
+ parent: parent,
1714
+ propsData: vnodeComponentOptions.propsData,
1715
+ _componentTag: vnodeComponentOptions.tag,
1716
+ _parentVnode: vnode,
1717
+ _parentListeners: vnodeComponentOptions.listeners,
1718
+ _renderChildren: vnodeComponentOptions.children,
1719
+ _parentElm: parentElm || null,
1720
+ _refElm: refElm || null
1721
+ };
1722
+ // check inline-template render functions
1723
+ var inlineTemplate = vnode.data.inlineTemplate;
1724
+ if (inlineTemplate) {
1725
+ options.render = inlineTemplate.render;
1726
+ options.staticRenderFns = inlineTemplate.staticRenderFns;
1825
1727
  }
1826
- if (isA) {
1827
- i = val.length;
1828
- while (i--) { _traverse(val[i], seen); }
1829
- } else {
1830
- keys = Object.keys(val);
1831
- i = keys.length;
1832
- while (i--) { _traverse(val[keys[i]], seen); }
1728
+ return new vnodeComponentOptions.Ctor(options)
1729
+ }
1730
+
1731
+ function init (
1732
+ vnode,
1733
+ hydrating,
1734
+ parentElm,
1735
+ refElm
1736
+ ) {
1737
+ if (!vnode.componentInstance || vnode.componentInstance._isDestroyed) {
1738
+ var child = vnode.componentInstance = createComponentInstanceForVnode(
1739
+ vnode,
1740
+ activeInstance,
1741
+ parentElm,
1742
+ refElm
1743
+ );
1744
+ child.$mount(hydrating ? vnode.elm : undefined, hydrating);
1745
+ } else if (vnode.data.keepAlive) {
1746
+ // kept-alive components, treat as a patch
1747
+ var mountedNode = vnode; // work around flow
1748
+ prepatch(mountedNode, mountedNode);
1833
1749
  }
1834
1750
  }
1835
1751
 
1836
- /* */
1752
+ function prepatch (
1753
+ oldVnode,
1754
+ vnode
1755
+ ) {
1756
+ var options = vnode.componentOptions;
1757
+ var child = vnode.componentInstance = oldVnode.componentInstance;
1758
+ child._updateFromParent(
1759
+ options.propsData, // updated props
1760
+ options.listeners, // updated listeners
1761
+ vnode, // new parent vnode
1762
+ options.children // new children
1763
+ );
1764
+ }
1837
1765
 
1838
- function initState (vm) {
1839
- vm._watchers = [];
1840
- initProps(vm);
1841
- initMethods(vm);
1842
- initData(vm);
1843
- initComputed(vm);
1844
- initWatch(vm);
1766
+ function insert (vnode) {
1767
+ if (!vnode.componentInstance._isMounted) {
1768
+ vnode.componentInstance._isMounted = true;
1769
+ callHook(vnode.componentInstance, 'mounted');
1770
+ }
1771
+ if (vnode.data.keepAlive) {
1772
+ vnode.componentInstance._inactive = false;
1773
+ callHook(vnode.componentInstance, 'activated');
1774
+ }
1845
1775
  }
1846
1776
 
1847
- var isReservedProp = { key: 1, ref: 1, slot: 1 };
1777
+ function destroy$1 (vnode) {
1778
+ if (!vnode.componentInstance._isDestroyed) {
1779
+ if (!vnode.data.keepAlive) {
1780
+ vnode.componentInstance.$destroy();
1781
+ } else {
1782
+ vnode.componentInstance._inactive = true;
1783
+ callHook(vnode.componentInstance, 'deactivated');
1784
+ }
1785
+ }
1786
+ }
1848
1787
 
1849
- function initProps (vm) {
1850
- var props = vm.$options.props;
1851
- if (props) {
1852
- var propsData = vm.$options.propsData || {};
1853
- var keys = vm.$options._propKeys = Object.keys(props);
1854
- var isRoot = !vm.$parent;
1855
- // root instance props should be converted
1856
- observerState.shouldConvert = isRoot;
1857
- var loop = function ( i ) {
1858
- var key = keys[i];
1859
- /* istanbul ignore else */
1860
- {
1861
- if (isReservedProp[key]) {
1862
- warn(
1863
- ("\"" + key + "\" is a reserved attribute and cannot be used as component prop."),
1864
- vm
1865
- );
1788
+ function resolveAsyncComponent (
1789
+ factory,
1790
+ baseCtor,
1791
+ cb
1792
+ ) {
1793
+ if (factory.requested) {
1794
+ // pool callbacks
1795
+ factory.pendingCallbacks.push(cb);
1796
+ } else {
1797
+ factory.requested = true;
1798
+ var cbs = factory.pendingCallbacks = [cb];
1799
+ var sync = true;
1800
+
1801
+ var resolve = function (res) {
1802
+ if (isObject(res)) {
1803
+ res = baseCtor.extend(res);
1804
+ }
1805
+ // cache resolved
1806
+ factory.resolved = res;
1807
+ // invoke callbacks only if this is not a synchronous resolve
1808
+ // (async resolves are shimmed as synchronous during SSR)
1809
+ if (!sync) {
1810
+ for (var i = 0, l = cbs.length; i < l; i++) {
1811
+ cbs[i](res);
1866
1812
  }
1867
- defineReactive$$1(vm, key, validateProp(key, props, propsData, vm), function () {
1868
- if (vm.$parent && !observerState.isSettingProps) {
1869
- warn(
1870
- "Avoid mutating a prop directly since the value will be " +
1871
- "overwritten whenever the parent component re-renders. " +
1872
- "Instead, use a data or computed property based on the prop's " +
1873
- "value. Prop being mutated: \"" + key + "\"",
1874
- vm
1875
- );
1876
- }
1877
- });
1878
1813
  }
1879
1814
  };
1880
1815
 
1881
- for (var i = 0; i < keys.length; i++) loop( i );
1882
- observerState.shouldConvert = true;
1883
- }
1884
- }
1885
-
1886
- function initData (vm) {
1887
- var data = vm.$options.data;
1888
- data = vm._data = typeof data === 'function'
1889
- ? data.call(vm)
1890
- : data || {};
1891
- if (!isPlainObject(data)) {
1892
- data = {};
1893
- "development" !== 'production' && warn(
1894
- 'data functions should return an object:\n' +
1895
- 'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',
1896
- vm
1897
- );
1898
- }
1899
- // proxy data on instance
1900
- var keys = Object.keys(data);
1901
- var props = vm.$options.props;
1902
- var i = keys.length;
1903
- while (i--) {
1904
- if (props && hasOwn(props, keys[i])) {
1816
+ var reject = function (reason) {
1905
1817
  "development" !== 'production' && warn(
1906
- "The data property \"" + (keys[i]) + "\" is already declared as a prop. " +
1907
- "Use prop default value instead.",
1908
- vm
1818
+ "Failed to resolve async component: " + (String(factory)) +
1819
+ (reason ? ("\nReason: " + reason) : '')
1909
1820
  );
1910
- } else {
1911
- proxy(vm, keys[i]);
1912
- }
1913
- }
1914
- // observe data
1915
- observe(data);
1916
- data.__ob__ && data.__ob__.vmCount++;
1917
- }
1821
+ };
1918
1822
 
1919
- var computedSharedDefinition = {
1920
- enumerable: true,
1921
- configurable: true,
1922
- get: noop,
1923
- set: noop
1924
- };
1823
+ var res = factory(resolve, reject);
1925
1824
 
1926
- function initComputed (vm) {
1927
- var computed = vm.$options.computed;
1928
- if (computed) {
1929
- for (var key in computed) {
1930
- var userDef = computed[key];
1931
- if (typeof userDef === 'function') {
1932
- computedSharedDefinition.get = makeComputedGetter(userDef, vm);
1933
- computedSharedDefinition.set = noop;
1934
- } else {
1935
- computedSharedDefinition.get = userDef.get
1936
- ? userDef.cache !== false
1937
- ? makeComputedGetter(userDef.get, vm)
1938
- : bind$1(userDef.get, vm)
1939
- : noop;
1940
- computedSharedDefinition.set = userDef.set
1941
- ? bind$1(userDef.set, vm)
1942
- : noop;
1943
- }
1944
- Object.defineProperty(vm, key, computedSharedDefinition);
1825
+ // handle promise
1826
+ if (res && typeof res.then === 'function' && !factory.resolved) {
1827
+ res.then(resolve, reject);
1945
1828
  }
1829
+
1830
+ sync = false;
1831
+ // return in case resolved synchronously
1832
+ return factory.resolved
1946
1833
  }
1947
1834
  }
1948
1835
 
1949
- function makeComputedGetter (getter, owner) {
1950
- var watcher = new Watcher(owner, getter, noop, {
1951
- lazy: true
1952
- });
1953
- return function computedGetter () {
1954
- if (watcher.dirty) {
1955
- watcher.evaluate();
1956
- }
1957
- if (Dep.target) {
1958
- watcher.depend();
1836
+ function extractProps (data, Ctor) {
1837
+ // we are only extracting raw values here.
1838
+ // validation and default values are handled in the child
1839
+ // component itself.
1840
+ var propOptions = Ctor.options.props;
1841
+ if (!propOptions) {
1842
+ return
1843
+ }
1844
+ var res = {};
1845
+ var attrs = data.attrs;
1846
+ var props = data.props;
1847
+ var domProps = data.domProps;
1848
+ if (attrs || props || domProps) {
1849
+ for (var key in propOptions) {
1850
+ var altKey = hyphenate(key);
1851
+ checkProp(res, props, key, altKey, true) ||
1852
+ checkProp(res, attrs, key, altKey) ||
1853
+ checkProp(res, domProps, key, altKey);
1959
1854
  }
1960
- return watcher.value
1961
1855
  }
1856
+ return res
1962
1857
  }
1963
1858
 
1964
- function initMethods (vm) {
1965
- var methods = vm.$options.methods;
1966
- if (methods) {
1967
- for (var key in methods) {
1968
- vm[key] = methods[key] == null ? noop : bind$1(methods[key], vm);
1969
- if ("development" !== 'production' && methods[key] == null) {
1970
- warn(
1971
- "method \"" + key + "\" has an undefined value in the component definition. " +
1972
- "Did you reference the function correctly?",
1973
- vm
1974
- );
1859
+ function checkProp (
1860
+ res,
1861
+ hash,
1862
+ key,
1863
+ altKey,
1864
+ preserve
1865
+ ) {
1866
+ if (hash) {
1867
+ if (hasOwn(hash, key)) {
1868
+ res[key] = hash[key];
1869
+ if (!preserve) {
1870
+ delete hash[key];
1871
+ }
1872
+ return true
1873
+ } else if (hasOwn(hash, altKey)) {
1874
+ res[key] = hash[altKey];
1875
+ if (!preserve) {
1876
+ delete hash[altKey];
1975
1877
  }
1878
+ return true
1976
1879
  }
1977
1880
  }
1881
+ return false
1978
1882
  }
1979
1883
 
1980
- function initWatch (vm) {
1981
- var watch = vm.$options.watch;
1982
- if (watch) {
1983
- for (var key in watch) {
1984
- var handler = watch[key];
1985
- if (Array.isArray(handler)) {
1986
- for (var i = 0; i < handler.length; i++) {
1987
- createWatcher(vm, key, handler[i]);
1988
- }
1989
- } else {
1990
- createWatcher(vm, key, handler);
1991
- }
1992
- }
1884
+ function mergeHooks (data) {
1885
+ if (!data.hook) {
1886
+ data.hook = {};
1887
+ }
1888
+ for (var i = 0; i < hooksToMerge.length; i++) {
1889
+ var key = hooksToMerge[i];
1890
+ var fromParent = data.hook[key];
1891
+ var ours = hooks[key];
1892
+ data.hook[key] = fromParent ? mergeHook$1(ours, fromParent) : ours;
1993
1893
  }
1994
1894
  }
1995
1895
 
1996
- function createWatcher (vm, key, handler) {
1997
- var options;
1998
- if (isPlainObject(handler)) {
1999
- options = handler;
2000
- handler = handler.handler;
1896
+ function mergeHook$1 (one, two) {
1897
+ return function (a, b, c, d) {
1898
+ one(a, b, c, d);
1899
+ two(a, b, c, d);
2001
1900
  }
2002
- if (typeof handler === 'string') {
2003
- handler = vm[handler];
1901
+ }
1902
+
1903
+ /* */
1904
+
1905
+ function mergeVNodeHook (def, hookKey, hook, key) {
1906
+ key = key + hookKey;
1907
+ var injectedHash = def.__injected || (def.__injected = {});
1908
+ if (!injectedHash[key]) {
1909
+ injectedHash[key] = true;
1910
+ var oldHook = def[hookKey];
1911
+ if (oldHook) {
1912
+ def[hookKey] = function () {
1913
+ oldHook.apply(this, arguments);
1914
+ hook.apply(this, arguments);
1915
+ };
1916
+ } else {
1917
+ def[hookKey] = hook;
1918
+ }
2004
1919
  }
2005
- vm.$watch(key, handler, options);
2006
1920
  }
2007
1921
 
2008
- function stateMixin (Vue) {
2009
- // flow somehow has problems with directly declared definition object
2010
- // when using Object.defineProperty, so we have to procedurally build up
2011
- // the object here.
2012
- var dataDef = {};
2013
- dataDef.get = function () {
2014
- return this._data
2015
- };
2016
- {
2017
- dataDef.set = function (newData) {
2018
- warn(
2019
- 'Avoid replacing instance root $data. ' +
2020
- 'Use nested data properties instead.',
2021
- this
2022
- );
2023
- };
1922
+ /* */
1923
+
1924
+ var normalizeEvent = cached(function (name) {
1925
+ var once = name.charAt(0) === '~'; // Prefixed last, checked first
1926
+ name = once ? name.slice(1) : name;
1927
+ var capture = name.charAt(0) === '!';
1928
+ name = capture ? name.slice(1) : name;
1929
+ return {
1930
+ name: name,
1931
+ once: once,
1932
+ capture: capture
2024
1933
  }
2025
- Object.defineProperty(Vue.prototype, '$data', dataDef);
1934
+ });
2026
1935
 
2027
- Vue.prototype.$set = set$1;
2028
- Vue.prototype.$delete = del;
1936
+ function createEventHandle (fn) {
1937
+ var handle = {
1938
+ fn: fn,
1939
+ invoker: function () {
1940
+ var arguments$1 = arguments;
2029
1941
 
2030
- Vue.prototype.$watch = function (
2031
- expOrFn,
2032
- cb,
2033
- options
2034
- ) {
2035
- var vm = this;
2036
- options = options || {};
2037
- options.user = true;
2038
- var watcher = new Watcher(vm, expOrFn, cb, options);
2039
- if (options.immediate) {
2040
- cb.call(vm, watcher.value);
2041
- }
2042
- return function unwatchFn () {
2043
- watcher.teardown();
1942
+ var fn = handle.fn;
1943
+ if (Array.isArray(fn)) {
1944
+ for (var i = 0; i < fn.length; i++) {
1945
+ fn[i].apply(null, arguments$1);
1946
+ }
1947
+ } else {
1948
+ fn.apply(null, arguments);
1949
+ }
2044
1950
  }
2045
1951
  };
1952
+ return handle
2046
1953
  }
2047
1954
 
2048
- function proxy (vm, key) {
2049
- if (!isReserved(key)) {
2050
- Object.defineProperty(vm, key, {
2051
- configurable: true,
2052
- enumerable: true,
2053
- get: function proxyGetter () {
2054
- return vm._data[key]
2055
- },
2056
- set: function proxySetter (val) {
2057
- vm._data[key] = val;
1955
+ function updateListeners (
1956
+ on,
1957
+ oldOn,
1958
+ add,
1959
+ remove$$1,
1960
+ vm
1961
+ ) {
1962
+ var name, cur, old, event;
1963
+ for (name in on) {
1964
+ cur = on[name];
1965
+ old = oldOn[name];
1966
+ event = normalizeEvent(name);
1967
+ if (!cur) {
1968
+ "development" !== 'production' && warn(
1969
+ "Invalid handler for event \"" + (event.name) + "\": got " + String(cur),
1970
+ vm
1971
+ );
1972
+ } else if (!old) {
1973
+ if (!cur.invoker) {
1974
+ cur = on[name] = createEventHandle(cur);
2058
1975
  }
2059
- });
1976
+ add(event.name, cur.invoker, event.once, event.capture);
1977
+ } else if (cur !== old) {
1978
+ old.fn = cur;
1979
+ on[name] = old;
1980
+ }
1981
+ }
1982
+ for (name in oldOn) {
1983
+ if (!on[name]) {
1984
+ event = normalizeEvent(name);
1985
+ remove$$1(event.name, oldOn[name].invoker, event.capture);
1986
+ }
2060
1987
  }
2061
1988
  }
2062
1989
 
2063
1990
  /* */
2064
1991
 
2065
- var VNode = function VNode (
2066
- tag,
2067
- data,
2068
- children,
2069
- text,
2070
- elm,
2071
- context,
2072
- componentOptions
2073
- ) {
2074
- this.tag = tag;
2075
- this.data = data;
2076
- this.children = children;
2077
- this.text = text;
2078
- this.elm = elm;
2079
- this.ns = undefined;
2080
- this.context = context;
2081
- this.functionalContext = undefined;
2082
- this.key = data && data.key;
2083
- this.componentOptions = componentOptions;
2084
- this.child = undefined;
2085
- this.parent = undefined;
2086
- this.raw = false;
2087
- this.isStatic = false;
2088
- this.isRootInsert = true;
2089
- this.isComment = false;
2090
- this.isCloned = false;
2091
- this.isOnce = false;
2092
- };
2093
-
2094
- var createEmptyVNode = function () {
2095
- var node = new VNode();
2096
- node.text = '';
2097
- node.isComment = true;
2098
- return node
2099
- };
2100
-
2101
- function createTextVNode (val) {
2102
- return new VNode(undefined, undefined, undefined, String(val))
1992
+ // The template compiler attempts to minimize the need for normalization by
1993
+ // statically analyzing the template at compile time.
1994
+ //
1995
+ // For plain HTML markup, normalization can be completely skipped because the
1996
+ // generated render function is guaranteed to return Array<VNode>. There are
1997
+ // two cases where extra normalization is needed:
1998
+
1999
+ // 1. When the children contains components - because a functional component
2000
+ // may return an Array instead of a single root. In this case, just a simple
2001
+ // nomralization is needed - if any child is an Array, we flatten the whole
2002
+ // thing with Array.prototype.concat. It is guaranteed to be only 1-level deep
2003
+ // because functional components already normalize their own children.
2004
+ function simpleNormalizeChildren (children) {
2005
+ for (var i = 0; i < children.length; i++) {
2006
+ if (Array.isArray(children[i])) {
2007
+ return Array.prototype.concat.apply([], children)
2008
+ }
2009
+ }
2010
+ return children
2103
2011
  }
2104
2012
 
2105
- // optimized shallow clone
2106
- // used for static nodes and slot nodes because they may be reused across
2107
- // multiple renders, cloning them avoids errors when DOM manipulations rely
2108
- // on their elm reference.
2109
- function cloneVNode (vnode) {
2110
- var cloned = new VNode(
2111
- vnode.tag,
2112
- vnode.data,
2113
- vnode.children,
2114
- vnode.text,
2115
- vnode.elm,
2116
- vnode.context,
2117
- vnode.componentOptions
2118
- );
2119
- cloned.ns = vnode.ns;
2120
- cloned.isStatic = vnode.isStatic;
2121
- cloned.key = vnode.key;
2122
- cloned.isCloned = true;
2123
- return cloned
2013
+ // 2. When the children contains constrcuts that always generated nested Arrays,
2014
+ // e.g. <template>, <slot>, v-for, or when the children is provided by user
2015
+ // with hand-written render functions / JSX. In such cases a full normalization
2016
+ // is needed to cater to all possible types of children values.
2017
+ function normalizeChildren (children) {
2018
+ return isPrimitive(children)
2019
+ ? [createTextVNode(children)]
2020
+ : Array.isArray(children)
2021
+ ? normalizeArrayChildren(children)
2022
+ : undefined
2124
2023
  }
2125
2024
 
2126
- function cloneVNodes (vnodes) {
2127
- var res = new Array(vnodes.length);
2128
- for (var i = 0; i < vnodes.length; i++) {
2129
- res[i] = cloneVNode(vnodes[i]);
2025
+ function normalizeArrayChildren (children, nestedIndex) {
2026
+ var res = [];
2027
+ var i, c, last;
2028
+ for (i = 0; i < children.length; i++) {
2029
+ c = children[i];
2030
+ if (c == null || typeof c === 'boolean') { continue }
2031
+ last = res[res.length - 1];
2032
+ // nested
2033
+ if (Array.isArray(c)) {
2034
+ res.push.apply(res, normalizeArrayChildren(c, ((nestedIndex || '') + "_" + i)));
2035
+ } else if (isPrimitive(c)) {
2036
+ if (last && last.text) {
2037
+ last.text += String(c);
2038
+ } else if (c !== '') {
2039
+ // convert primitive to vnode
2040
+ res.push(createTextVNode(c));
2041
+ }
2042
+ } else {
2043
+ if (c.text && last && last.text) {
2044
+ res[res.length - 1] = createTextVNode(last.text + c.text);
2045
+ } else {
2046
+ // default key for nested array children (likely generated by v-for)
2047
+ if (c.tag && c.key == null && nestedIndex != null) {
2048
+ c.key = "__vlist" + nestedIndex + "_" + i + "__";
2049
+ }
2050
+ res.push(c);
2051
+ }
2052
+ }
2130
2053
  }
2131
2054
  return res
2132
2055
  }
2133
2056
 
2134
2057
  /* */
2135
2058
 
2136
- var activeInstance = null;
2059
+ function getFirstComponentChild (children) {
2060
+ return children && children.filter(function (c) { return c && c.componentOptions; })[0]
2061
+ }
2137
2062
 
2138
- function initLifecycle (vm) {
2139
- var options = vm.$options;
2063
+ /* */
2140
2064
 
2141
- // locate first non-abstract parent
2142
- var parent = options.parent;
2143
- if (parent && !options.abstract) {
2144
- while (parent.$options.abstract && parent.$parent) {
2145
- parent = parent.$parent;
2065
+ var SIMPLE_NORMALIZE = 1;
2066
+ var ALWAYS_NORMALIZE = 2;
2067
+
2068
+ // wrapper function for providing a more flexible interface
2069
+ // without getting yelled at by flow
2070
+ function createElement (
2071
+ context,
2072
+ tag,
2073
+ data,
2074
+ children,
2075
+ normalizationType,
2076
+ alwaysNormalize
2077
+ ) {
2078
+ if (Array.isArray(data) || isPrimitive(data)) {
2079
+ normalizationType = children;
2080
+ children = data;
2081
+ data = undefined;
2082
+ }
2083
+ if (alwaysNormalize) { normalizationType = ALWAYS_NORMALIZE; }
2084
+ return _createElement(context, tag, data, children, normalizationType)
2085
+ }
2086
+
2087
+ function _createElement (
2088
+ context,
2089
+ tag,
2090
+ data,
2091
+ children,
2092
+ normalizationType
2093
+ ) {
2094
+ if (data && data.__ob__) {
2095
+ "development" !== 'production' && warn(
2096
+ "Avoid using observed data object as vnode data: " + (JSON.stringify(data)) + "\n" +
2097
+ 'Always create fresh vnode data objects in each render!',
2098
+ context
2099
+ );
2100
+ return createEmptyVNode()
2101
+ }
2102
+ if (!tag) {
2103
+ // in case of component :is set to falsy value
2104
+ return createEmptyVNode()
2105
+ }
2106
+ // support single function children as default scoped slot
2107
+ if (Array.isArray(children) &&
2108
+ typeof children[0] === 'function') {
2109
+ data = data || {};
2110
+ data.scopedSlots = { default: children[0] };
2111
+ children.length = 0;
2112
+ }
2113
+ if (normalizationType === ALWAYS_NORMALIZE) {
2114
+ children = normalizeChildren(children);
2115
+ } else if (normalizationType === SIMPLE_NORMALIZE) {
2116
+ children = simpleNormalizeChildren(children);
2117
+ }
2118
+ var vnode, ns;
2119
+ if (typeof tag === 'string') {
2120
+ var Ctor;
2121
+ ns = config.getTagNamespace(tag);
2122
+ if (config.isReservedTag(tag)) {
2123
+ // platform built-in elements
2124
+ vnode = new VNode(
2125
+ config.parsePlatformTagName(tag), data, children,
2126
+ undefined, undefined, context
2127
+ );
2128
+ } else if ((Ctor = resolveAsset(context.$options, 'components', tag))) {
2129
+ // component
2130
+ vnode = createComponent(Ctor, data, context, children, tag);
2131
+ } else {
2132
+ // unknown or unlisted namespaced elements
2133
+ // check at runtime because it may get assigned a namespace when its
2134
+ // parent normalizes children
2135
+ vnode = new VNode(
2136
+ tag, data, children,
2137
+ undefined, undefined, context
2138
+ );
2146
2139
  }
2147
- parent.$children.push(vm);
2140
+ } else {
2141
+ // direct component options / constructor
2142
+ vnode = createComponent(tag, data, context, children);
2143
+ }
2144
+ if (vnode) {
2145
+ if (ns) { applyNS(vnode, ns); }
2146
+ return vnode
2147
+ } else {
2148
+ return createEmptyVNode()
2148
2149
  }
2150
+ }
2149
2151
 
2150
- vm.$parent = parent;
2151
- vm.$root = parent ? parent.$root : vm;
2152
+ function applyNS (vnode, ns) {
2153
+ vnode.ns = ns;
2154
+ if (vnode.tag === 'foreignObject') {
2155
+ // use default namespace inside foreignObject
2156
+ return
2157
+ }
2158
+ if (vnode.children) {
2159
+ for (var i = 0, l = vnode.children.length; i < l; i++) {
2160
+ var child = vnode.children[i];
2161
+ if (child.tag && !child.ns) {
2162
+ applyNS(child, ns);
2163
+ }
2164
+ }
2165
+ }
2166
+ }
2152
2167
 
2153
- vm.$children = [];
2154
- vm.$refs = {};
2168
+ /* */
2155
2169
 
2156
- vm._watcher = null;
2157
- vm._inactive = false;
2158
- vm._isMounted = false;
2159
- vm._isDestroyed = false;
2160
- vm._isBeingDestroyed = false;
2170
+ function initRender (vm) {
2171
+ vm.$vnode = null; // the placeholder node in parent tree
2172
+ vm._vnode = null; // the root of the child tree
2173
+ vm._staticTrees = null;
2174
+ var parentVnode = vm.$options._parentVnode;
2175
+ var renderContext = parentVnode && parentVnode.context;
2176
+ vm.$slots = resolveSlots(vm.$options._renderChildren, renderContext);
2177
+ vm.$scopedSlots = {};
2178
+ // bind the createElement fn to this instance
2179
+ // so that we get proper render context inside it.
2180
+ // args order: tag, data, children, normalizationType, alwaysNormalize
2181
+ // internal version is used by render functions compiled from templates
2182
+ vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };
2183
+ // normalization is always applied for the public version, used in
2184
+ // user-written render functions.
2185
+ vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };
2161
2186
  }
2162
2187
 
2163
- function lifecycleMixin (Vue) {
2164
- Vue.prototype._mount = function (
2165
- el,
2166
- hydrating
2167
- ) {
2188
+ function renderMixin (Vue) {
2189
+ Vue.prototype.$nextTick = function (fn) {
2190
+ return nextTick(fn, this)
2191
+ };
2192
+
2193
+ Vue.prototype._render = function () {
2168
2194
  var vm = this;
2169
- vm.$el = el;
2170
- if (!vm.$options.render) {
2171
- vm.$options.render = createEmptyVNode;
2172
- {
2173
- /* istanbul ignore if */
2174
- if (vm.$options.template && vm.$options.template.charAt(0) !== '#') {
2175
- warn(
2176
- 'You are using the runtime-only build of Vue where the template ' +
2177
- 'option is not available. Either pre-compile the templates into ' +
2178
- 'render functions, or use the compiler-included build.',
2179
- vm
2180
- );
2181
- } else {
2182
- warn(
2183
- 'Failed to mount component: template or render function not defined.',
2184
- vm
2185
- );
2186
- }
2187
- }
2188
- }
2189
- callHook(vm, 'beforeMount');
2190
- vm._watcher = new Watcher(vm, function () {
2191
- vm._update(vm._render(), hydrating);
2192
- }, noop);
2193
- hydrating = false;
2194
- // manually mounted instance, call mounted on self
2195
- // mounted is called for render-created child components in its inserted hook
2196
- if (vm.$vnode == null) {
2197
- vm._isMounted = true;
2198
- callHook(vm, 'mounted');
2199
- }
2200
- return vm
2201
- };
2195
+ var ref = vm.$options;
2196
+ var render = ref.render;
2197
+ var staticRenderFns = ref.staticRenderFns;
2198
+ var _parentVnode = ref._parentVnode;
2202
2199
 
2203
- Vue.prototype._update = function (vnode, hydrating) {
2204
- var vm = this;
2205
2200
  if (vm._isMounted) {
2206
- callHook(vm, 'beforeUpdate');
2207
- }
2208
- var prevEl = vm.$el;
2209
- var prevVnode = vm._vnode;
2210
- var prevActiveInstance = activeInstance;
2211
- activeInstance = vm;
2212
- vm._vnode = vnode;
2213
- // Vue.prototype.__patch__ is injected in entry points
2214
- // based on the rendering backend used.
2215
- if (!prevVnode) {
2216
- // initial render
2217
- vm.$el = vm.__patch__(
2218
- vm.$el, vnode, hydrating, false /* removeOnly */,
2219
- vm.$options._parentElm,
2220
- vm.$options._refElm
2221
- );
2222
- } else {
2223
- // updates
2224
- vm.$el = vm.__patch__(prevVnode, vnode);
2225
- }
2226
- activeInstance = prevActiveInstance;
2227
- // update __vue__ reference
2228
- if (prevEl) {
2229
- prevEl.__vue__ = null;
2230
- }
2231
- if (vm.$el) {
2232
- vm.$el.__vue__ = vm;
2233
- }
2234
- // if parent is an HOC, update its $el as well
2235
- if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {
2236
- vm.$parent.$el = vm.$el;
2201
+ // clone slot nodes on re-renders
2202
+ for (var key in vm.$slots) {
2203
+ vm.$slots[key] = cloneVNodes(vm.$slots[key]);
2204
+ }
2237
2205
  }
2238
- if (vm._isMounted) {
2239
- callHook(vm, 'updated');
2206
+
2207
+ if (_parentVnode && _parentVnode.data.scopedSlots) {
2208
+ vm.$scopedSlots = _parentVnode.data.scopedSlots;
2240
2209
  }
2241
- };
2242
2210
 
2243
- Vue.prototype._updateFromParent = function (
2244
- propsData,
2245
- listeners,
2246
- parentVnode,
2247
- renderChildren
2248
- ) {
2249
- var vm = this;
2250
- var hasChildren = !!(vm.$options._renderChildren || renderChildren);
2251
- vm.$options._parentVnode = parentVnode;
2252
- vm.$vnode = parentVnode; // update vm's placeholder node without re-render
2253
- if (vm._vnode) { // update child tree's parent
2254
- vm._vnode.parent = parentVnode;
2211
+ if (staticRenderFns && !vm._staticTrees) {
2212
+ vm._staticTrees = [];
2255
2213
  }
2256
- vm.$options._renderChildren = renderChildren;
2257
- // update props
2258
- if (propsData && vm.$options.props) {
2259
- observerState.shouldConvert = false;
2260
- {
2261
- observerState.isSettingProps = true;
2262
- }
2263
- var propKeys = vm.$options._propKeys || [];
2264
- for (var i = 0; i < propKeys.length; i++) {
2265
- var key = propKeys[i];
2266
- vm[key] = validateProp(key, vm.$options.props, propsData, vm);
2267
- }
2268
- observerState.shouldConvert = true;
2269
- {
2270
- observerState.isSettingProps = false;
2214
+ // set parent vnode. this allows render functions to have access
2215
+ // to the data on the placeholder node.
2216
+ vm.$vnode = _parentVnode;
2217
+ // render self
2218
+ var vnode;
2219
+ try {
2220
+ vnode = render.call(vm._renderProxy, vm.$createElement);
2221
+ } catch (e) {
2222
+ /* istanbul ignore else */
2223
+ if (config.errorHandler) {
2224
+ config.errorHandler.call(null, e, vm);
2225
+ } else {
2226
+ {
2227
+ warn(("Error when rendering " + (formatComponentName(vm)) + ":"));
2228
+ }
2229
+ throw e
2271
2230
  }
2272
- vm.$options.propsData = propsData;
2273
- }
2274
- // update listeners
2275
- if (listeners) {
2276
- var oldListeners = vm.$options._parentListeners;
2277
- vm.$options._parentListeners = listeners;
2278
- vm._updateListeners(listeners, oldListeners);
2231
+ // return previous vnode to prevent render error causing blank component
2232
+ vnode = vm._vnode;
2279
2233
  }
2280
- // resolve slots + force update if has children
2281
- if (hasChildren) {
2282
- vm.$slots = resolveSlots(renderChildren, parentVnode.context);
2283
- vm.$forceUpdate();
2234
+ // return empty vnode in case the render function errored out
2235
+ if (!(vnode instanceof VNode)) {
2236
+ if ("development" !== 'production' && Array.isArray(vnode)) {
2237
+ warn(
2238
+ 'Multiple root nodes returned from render function. Render function ' +
2239
+ 'should return a single root node.',
2240
+ vm
2241
+ );
2242
+ }
2243
+ vnode = createEmptyVNode();
2284
2244
  }
2245
+ // set parent
2246
+ vnode.parent = _parentVnode;
2247
+ return vnode
2285
2248
  };
2286
2249
 
2287
- Vue.prototype.$forceUpdate = function () {
2288
- var vm = this;
2289
- if (vm._watcher) {
2290
- vm._watcher.update();
2250
+ // toString for mustaches
2251
+ Vue.prototype._s = _toString;
2252
+ // convert text to vnode
2253
+ Vue.prototype._v = createTextVNode;
2254
+ // number conversion
2255
+ Vue.prototype._n = toNumber;
2256
+ // empty vnode
2257
+ Vue.prototype._e = createEmptyVNode;
2258
+ // loose equal
2259
+ Vue.prototype._q = looseEqual;
2260
+ // loose indexOf
2261
+ Vue.prototype._i = looseIndexOf;
2262
+
2263
+ // render static tree by index
2264
+ Vue.prototype._m = function renderStatic (
2265
+ index,
2266
+ isInFor
2267
+ ) {
2268
+ var tree = this._staticTrees[index];
2269
+ // if has already-rendered static tree and not inside v-for,
2270
+ // we can reuse the same tree by doing a shallow clone.
2271
+ if (tree && !isInFor) {
2272
+ return Array.isArray(tree)
2273
+ ? cloneVNodes(tree)
2274
+ : cloneVNode(tree)
2291
2275
  }
2276
+ // otherwise, render a fresh tree.
2277
+ tree = this._staticTrees[index] = this.$options.staticRenderFns[index].call(this._renderProxy);
2278
+ markStatic(tree, ("__static__" + index), false);
2279
+ return tree
2292
2280
  };
2293
2281
 
2294
- Vue.prototype.$destroy = function () {
2295
- var vm = this;
2296
- if (vm._isBeingDestroyed) {
2297
- return
2298
- }
2299
- callHook(vm, 'beforeDestroy');
2300
- vm._isBeingDestroyed = true;
2301
- // remove self from parent
2302
- var parent = vm.$parent;
2303
- if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {
2304
- remove$1(parent.$children, vm);
2305
- }
2306
- // teardown watchers
2307
- if (vm._watcher) {
2308
- vm._watcher.teardown();
2309
- }
2310
- var i = vm._watchers.length;
2311
- while (i--) {
2312
- vm._watchers[i].teardown();
2313
- }
2314
- // remove reference from data ob
2315
- // frozen object may not have observer.
2316
- if (vm._data.__ob__) {
2317
- vm._data.__ob__.vmCount--;
2318
- }
2319
- // call the last hook...
2320
- vm._isDestroyed = true;
2321
- callHook(vm, 'destroyed');
2322
- // turn off all instance listeners.
2323
- vm.$off();
2324
- // remove __vue__ reference
2325
- if (vm.$el) {
2326
- vm.$el.__vue__ = null;
2327
- }
2328
- // invoke destroy hooks on current rendered tree
2329
- vm.__patch__(vm._vnode, null);
2282
+ // mark node as static (v-once)
2283
+ Vue.prototype._o = function markOnce (
2284
+ tree,
2285
+ index,
2286
+ key
2287
+ ) {
2288
+ markStatic(tree, ("__once__" + index + (key ? ("_" + key) : "")), true);
2289
+ return tree
2330
2290
  };
2331
- }
2332
2291
 
2333
- function callHook (vm, hook) {
2334
- var handlers = vm.$options[hook];
2335
- if (handlers) {
2336
- for (var i = 0, j = handlers.length; i < j; i++) {
2337
- handlers[i].call(vm);
2292
+ function markStatic (tree, key, isOnce) {
2293
+ if (Array.isArray(tree)) {
2294
+ for (var i = 0; i < tree.length; i++) {
2295
+ if (tree[i] && typeof tree[i] !== 'string') {
2296
+ markStaticNode(tree[i], (key + "_" + i), isOnce);
2297
+ }
2298
+ }
2299
+ } else {
2300
+ markStaticNode(tree, key, isOnce);
2338
2301
  }
2339
2302
  }
2340
- vm.$emit('hook:' + hook);
2341
- }
2342
-
2343
- /* */
2344
-
2345
- var hooks = { init: init, prepatch: prepatch, insert: insert, destroy: destroy$1 };
2346
- var hooksToMerge = Object.keys(hooks);
2347
-
2348
- function createComponent (
2349
- Ctor,
2350
- data,
2351
- context,
2352
- children,
2353
- tag
2354
- ) {
2355
- if (!Ctor) {
2356
- return
2357
- }
2358
2303
 
2359
- var baseCtor = context.$options._base;
2360
- if (isObject(Ctor)) {
2361
- Ctor = baseCtor.extend(Ctor);
2304
+ function markStaticNode (node, key, isOnce) {
2305
+ node.isStatic = true;
2306
+ node.key = key;
2307
+ node.isOnce = isOnce;
2362
2308
  }
2363
2309
 
2364
- if (typeof Ctor !== 'function') {
2365
- {
2366
- warn(("Invalid Component definition: " + (String(Ctor))), context);
2367
- }
2368
- return
2369
- }
2310
+ // filter resolution helper
2311
+ Vue.prototype._f = function resolveFilter (id) {
2312
+ return resolveAsset(this.$options, 'filters', id, true) || identity
2313
+ };
2370
2314
 
2371
- // async component
2372
- if (!Ctor.cid) {
2373
- if (Ctor.resolved) {
2374
- Ctor = Ctor.resolved;
2375
- } else {
2376
- Ctor = resolveAsyncComponent(Ctor, baseCtor, function () {
2377
- // it's ok to queue this on every render because
2378
- // $forceUpdate is buffered by the scheduler.
2379
- context.$forceUpdate();
2380
- });
2381
- if (!Ctor) {
2382
- // return nothing if this is indeed an async component
2383
- // wait for the callback to trigger parent update.
2384
- return
2315
+ // render v-for
2316
+ Vue.prototype._l = function renderList (
2317
+ val,
2318
+ render
2319
+ ) {
2320
+ var ret, i, l, keys, key;
2321
+ if (Array.isArray(val) || typeof val === 'string') {
2322
+ ret = new Array(val.length);
2323
+ for (i = 0, l = val.length; i < l; i++) {
2324
+ ret[i] = render(val[i], i);
2325
+ }
2326
+ } else if (typeof val === 'number') {
2327
+ ret = new Array(val);
2328
+ for (i = 0; i < val; i++) {
2329
+ ret[i] = render(i + 1, i);
2330
+ }
2331
+ } else if (isObject(val)) {
2332
+ keys = Object.keys(val);
2333
+ ret = new Array(keys.length);
2334
+ for (i = 0, l = keys.length; i < l; i++) {
2335
+ key = keys[i];
2336
+ ret[i] = render(val[key], key, i);
2385
2337
  }
2386
2338
  }
2387
- }
2388
-
2389
- // resolve constructor options in case global mixins are applied after
2390
- // component constructor creation
2391
- resolveConstructorOptions(Ctor);
2392
-
2393
- data = data || {};
2394
-
2395
- // extract props
2396
- var propsData = extractProps(data, Ctor);
2397
-
2398
- // functional component
2399
- if (Ctor.options.functional) {
2400
- return createFunctionalComponent(Ctor, propsData, data, context, children)
2401
- }
2402
-
2403
- // extract listeners, since these needs to be treated as
2404
- // child component listeners instead of DOM listeners
2405
- var listeners = data.on;
2406
- // replace with listeners with .native modifier
2407
- data.on = data.nativeOn;
2339
+ return ret
2340
+ };
2408
2341
 
2409
- if (Ctor.options.abstract) {
2410
- // abstract components do not keep anything
2411
- // other than props & listeners
2412
- data = {};
2413
- }
2342
+ // renderSlot
2343
+ Vue.prototype._t = function (
2344
+ name,
2345
+ fallback,
2346
+ props,
2347
+ bindObject
2348
+ ) {
2349
+ var scopedSlotFn = this.$scopedSlots[name];
2350
+ if (scopedSlotFn) { // scoped slot
2351
+ props = props || {};
2352
+ if (bindObject) {
2353
+ extend(props, bindObject);
2354
+ }
2355
+ return scopedSlotFn(props) || fallback
2356
+ } else {
2357
+ var slotNodes = this.$slots[name];
2358
+ // warn duplicate slot usage
2359
+ if (slotNodes && "development" !== 'production') {
2360
+ slotNodes._rendered && warn(
2361
+ "Duplicate presence of slot \"" + name + "\" found in the same render tree " +
2362
+ "- this will likely cause render errors.",
2363
+ this
2364
+ );
2365
+ slotNodes._rendered = true;
2366
+ }
2367
+ return slotNodes || fallback
2368
+ }
2369
+ };
2414
2370
 
2415
- // merge component management hooks onto the placeholder node
2416
- mergeHooks(data);
2371
+ // apply v-bind object
2372
+ Vue.prototype._b = function bindProps (
2373
+ data,
2374
+ tag,
2375
+ value,
2376
+ asProp
2377
+ ) {
2378
+ if (value) {
2379
+ if (!isObject(value)) {
2380
+ "development" !== 'production' && warn(
2381
+ 'v-bind without argument expects an Object or Array value',
2382
+ this
2383
+ );
2384
+ } else {
2385
+ if (Array.isArray(value)) {
2386
+ value = toObject(value);
2387
+ }
2388
+ for (var key in value) {
2389
+ if (key === 'class' || key === 'style') {
2390
+ data[key] = value[key];
2391
+ } else {
2392
+ var type = data.attrs && data.attrs.type;
2393
+ var hash = asProp || config.mustUseProp(tag, type, key)
2394
+ ? data.domProps || (data.domProps = {})
2395
+ : data.attrs || (data.attrs = {});
2396
+ hash[key] = value[key];
2397
+ }
2398
+ }
2399
+ }
2400
+ }
2401
+ return data
2402
+ };
2417
2403
 
2418
- // return a placeholder vnode
2419
- var name = Ctor.options.name || tag;
2420
- var vnode = new VNode(
2421
- ("vue-component-" + (Ctor.cid) + (name ? ("-" + name) : '')),
2422
- data, undefined, undefined, undefined, context,
2423
- { Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children }
2424
- );
2425
- return vnode
2404
+ // check v-on keyCodes
2405
+ Vue.prototype._k = function checkKeyCodes (
2406
+ eventKeyCode,
2407
+ key,
2408
+ builtInAlias
2409
+ ) {
2410
+ var keyCodes = config.keyCodes[key] || builtInAlias;
2411
+ if (Array.isArray(keyCodes)) {
2412
+ return keyCodes.indexOf(eventKeyCode) === -1
2413
+ } else {
2414
+ return keyCodes !== eventKeyCode
2415
+ }
2416
+ };
2426
2417
  }
2427
2418
 
2428
- function createFunctionalComponent (
2429
- Ctor,
2430
- propsData,
2431
- data,
2432
- context,
2433
- children
2419
+ function resolveSlots (
2420
+ children,
2421
+ context
2434
2422
  ) {
2435
- var props = {};
2436
- var propOptions = Ctor.options.props;
2437
- if (propOptions) {
2438
- for (var key in propOptions) {
2439
- props[key] = validateProp(key, propOptions, propsData);
2440
- }
2423
+ var slots = {};
2424
+ if (!children) {
2425
+ return slots
2441
2426
  }
2442
- // ensure the createElement function in functional components
2443
- // gets a unique context - this is necessary for correct named slot check
2444
- var _context = Object.create(context);
2445
- var h = function (a, b, c, d) { return createElement(_context, a, b, c, d, true); };
2446
- var vnode = Ctor.options.render.call(null, h, {
2447
- props: props,
2448
- data: data,
2449
- parent: context,
2450
- children: children,
2451
- slots: function () { return resolveSlots(children, context); }
2452
- });
2453
- if (vnode instanceof VNode) {
2454
- vnode.functionalContext = context;
2455
- if (data.slot) {
2456
- (vnode.data || (vnode.data = {})).slot = data.slot;
2427
+ var defaultSlot = [];
2428
+ var name, child;
2429
+ for (var i = 0, l = children.length; i < l; i++) {
2430
+ child = children[i];
2431
+ // named slots should only be respected if the vnode was rendered in the
2432
+ // same context.
2433
+ if ((child.context === context || child.functionalContext === context) &&
2434
+ child.data && (name = child.data.slot)) {
2435
+ var slot = (slots[name] || (slots[name] = []));
2436
+ if (child.tag === 'template') {
2437
+ slot.push.apply(slot, child.children);
2438
+ } else {
2439
+ slot.push(child);
2440
+ }
2441
+ } else {
2442
+ defaultSlot.push(child);
2457
2443
  }
2458
2444
  }
2459
- return vnode
2445
+ // ignore single whitespace
2446
+ if (defaultSlot.length && !(
2447
+ defaultSlot.length === 1 &&
2448
+ (defaultSlot[0].text === ' ' || defaultSlot[0].isComment)
2449
+ )) {
2450
+ slots.default = defaultSlot;
2451
+ }
2452
+ return slots
2460
2453
  }
2461
2454
 
2462
- function createComponentInstanceForVnode (
2463
- vnode, // we know it's MountedComponentVNode but flow doesn't
2464
- parent, // activeInstance in lifecycle state
2465
- parentElm,
2466
- refElm
2467
- ) {
2468
- var vnodeComponentOptions = vnode.componentOptions;
2469
- var options = {
2470
- _isComponent: true,
2471
- parent: parent,
2472
- propsData: vnodeComponentOptions.propsData,
2473
- _componentTag: vnodeComponentOptions.tag,
2474
- _parentVnode: vnode,
2475
- _parentListeners: vnodeComponentOptions.listeners,
2476
- _renderChildren: vnodeComponentOptions.children,
2477
- _parentElm: parentElm || null,
2478
- _refElm: refElm || null
2479
- };
2480
- // check inline-template render functions
2481
- var inlineTemplate = vnode.data.inlineTemplate;
2482
- if (inlineTemplate) {
2483
- options.render = inlineTemplate.render;
2484
- options.staticRenderFns = inlineTemplate.staticRenderFns;
2455
+ /* */
2456
+
2457
+ function initEvents (vm) {
2458
+ vm._events = Object.create(null);
2459
+ vm._hasHookEvent = false;
2460
+ // init parent attached events
2461
+ var listeners = vm.$options._parentListeners;
2462
+ if (listeners) {
2463
+ updateComponentListeners(vm, listeners);
2485
2464
  }
2486
- return new vnodeComponentOptions.Ctor(options)
2487
2465
  }
2488
2466
 
2489
- function init (
2490
- vnode,
2491
- hydrating,
2492
- parentElm,
2493
- refElm
2494
- ) {
2495
- if (!vnode.child || vnode.child._isDestroyed) {
2496
- var child = vnode.child = createComponentInstanceForVnode(
2497
- vnode,
2498
- activeInstance,
2499
- parentElm,
2500
- refElm
2501
- );
2502
- child.$mount(hydrating ? vnode.elm : undefined, hydrating);
2503
- } else if (vnode.data.keepAlive) {
2504
- // kept-alive components, treat as a patch
2505
- var mountedNode = vnode; // work around flow
2506
- prepatch(mountedNode, mountedNode);
2467
+ var target;
2468
+
2469
+ function add$1 (event, fn, once) {
2470
+ if (once) {
2471
+ target.$once(event, fn);
2472
+ } else {
2473
+ target.$on(event, fn);
2507
2474
  }
2508
2475
  }
2509
2476
 
2510
- function prepatch (
2511
- oldVnode,
2512
- vnode
2477
+ function remove$2 (event, fn) {
2478
+ target.$off(event, fn);
2479
+ }
2480
+
2481
+ function updateComponentListeners (
2482
+ vm,
2483
+ listeners,
2484
+ oldListeners
2513
2485
  ) {
2514
- var options = vnode.componentOptions;
2515
- var child = vnode.child = oldVnode.child;
2516
- child._updateFromParent(
2517
- options.propsData, // updated props
2518
- options.listeners, // updated listeners
2519
- vnode, // new parent vnode
2520
- options.children // new children
2521
- );
2486
+ target = vm;
2487
+ updateListeners(listeners, oldListeners || {}, add$1, remove$2, vm);
2522
2488
  }
2523
2489
 
2524
- function insert (vnode) {
2525
- if (!vnode.child._isMounted) {
2526
- vnode.child._isMounted = true;
2527
- callHook(vnode.child, 'mounted');
2528
- }
2529
- if (vnode.data.keepAlive) {
2530
- vnode.child._inactive = false;
2531
- callHook(vnode.child, 'activated');
2532
- }
2533
- }
2534
-
2535
- function destroy$1 (vnode) {
2536
- if (!vnode.child._isDestroyed) {
2537
- if (!vnode.data.keepAlive) {
2538
- vnode.child.$destroy();
2539
- } else {
2540
- vnode.child._inactive = true;
2541
- callHook(vnode.child, 'deactivated');
2490
+ function eventsMixin (Vue) {
2491
+ var hookRE = /^hook:/;
2492
+ Vue.prototype.$on = function (event, fn) {
2493
+ var vm = this;(vm._events[event] || (vm._events[event] = [])).push(fn);
2494
+ // optimize hook:event cost by using a boolean flag marked at registration
2495
+ // instead of a hash lookup
2496
+ if (hookRE.test(event)) {
2497
+ vm._hasHookEvent = true;
2542
2498
  }
2543
- }
2544
- }
2545
-
2546
- function resolveAsyncComponent (
2547
- factory,
2548
- baseCtor,
2549
- cb
2550
- ) {
2551
- if (factory.requested) {
2552
- // pool callbacks
2553
- factory.pendingCallbacks.push(cb);
2554
- } else {
2555
- factory.requested = true;
2556
- var cbs = factory.pendingCallbacks = [cb];
2557
- var sync = true;
2558
-
2559
- var resolve = function (res) {
2560
- if (isObject(res)) {
2561
- res = baseCtor.extend(res);
2562
- }
2563
- // cache resolved
2564
- factory.resolved = res;
2565
- // invoke callbacks only if this is not a synchronous resolve
2566
- // (async resolves are shimmed as synchronous during SSR)
2567
- if (!sync) {
2568
- for (var i = 0, l = cbs.length; i < l; i++) {
2569
- cbs[i](res);
2570
- }
2571
- }
2572
- };
2573
-
2574
- var reject = function (reason) {
2575
- "development" !== 'production' && warn(
2576
- "Failed to resolve async component: " + (String(factory)) +
2577
- (reason ? ("\nReason: " + reason) : '')
2578
- );
2579
- };
2580
-
2581
- var res = factory(resolve, reject);
2499
+ return vm
2500
+ };
2582
2501
 
2583
- // handle promise
2584
- if (res && typeof res.then === 'function' && !factory.resolved) {
2585
- res.then(resolve, reject);
2502
+ Vue.prototype.$once = function (event, fn) {
2503
+ var vm = this;
2504
+ function on () {
2505
+ vm.$off(event, on);
2506
+ fn.apply(vm, arguments);
2586
2507
  }
2508
+ on.fn = fn;
2509
+ vm.$on(event, on);
2510
+ return vm
2511
+ };
2587
2512
 
2588
- sync = false;
2589
- // return in case resolved synchronously
2590
- return factory.resolved
2591
- }
2592
- }
2593
-
2594
- function extractProps (data, Ctor) {
2595
- // we are only extracting raw values here.
2596
- // validation and default values are handled in the child
2597
- // component itself.
2598
- var propOptions = Ctor.options.props;
2599
- if (!propOptions) {
2600
- return
2601
- }
2602
- var res = {};
2603
- var attrs = data.attrs;
2604
- var props = data.props;
2605
- var domProps = data.domProps;
2606
- if (attrs || props || domProps) {
2607
- for (var key in propOptions) {
2608
- var altKey = hyphenate(key);
2609
- checkProp(res, props, key, altKey, true) ||
2610
- checkProp(res, attrs, key, altKey) ||
2611
- checkProp(res, domProps, key, altKey);
2513
+ Vue.prototype.$off = function (event, fn) {
2514
+ var vm = this;
2515
+ // all
2516
+ if (!arguments.length) {
2517
+ vm._events = Object.create(null);
2518
+ return vm
2612
2519
  }
2613
- }
2614
- return res
2615
- }
2616
-
2617
- function checkProp (
2618
- res,
2619
- hash,
2620
- key,
2621
- altKey,
2622
- preserve
2623
- ) {
2624
- if (hash) {
2625
- if (hasOwn(hash, key)) {
2626
- res[key] = hash[key];
2627
- if (!preserve) {
2628
- delete hash[key];
2629
- }
2630
- return true
2631
- } else if (hasOwn(hash, altKey)) {
2632
- res[key] = hash[altKey];
2633
- if (!preserve) {
2634
- delete hash[altKey];
2520
+ // specific event
2521
+ var cbs = vm._events[event];
2522
+ if (!cbs) {
2523
+ return vm
2524
+ }
2525
+ if (arguments.length === 1) {
2526
+ vm._events[event] = null;
2527
+ return vm
2528
+ }
2529
+ // specific handler
2530
+ var cb;
2531
+ var i = cbs.length;
2532
+ while (i--) {
2533
+ cb = cbs[i];
2534
+ if (cb === fn || cb.fn === fn) {
2535
+ cbs.splice(i, 1);
2536
+ break
2635
2537
  }
2636
- return true
2637
2538
  }
2638
- }
2639
- return false
2640
- }
2641
-
2642
- function mergeHooks (data) {
2643
- if (!data.hook) {
2644
- data.hook = {};
2645
- }
2646
- for (var i = 0; i < hooksToMerge.length; i++) {
2647
- var key = hooksToMerge[i];
2648
- var fromParent = data.hook[key];
2649
- var ours = hooks[key];
2650
- data.hook[key] = fromParent ? mergeHook$1(ours, fromParent) : ours;
2651
- }
2652
- }
2653
-
2654
- function mergeHook$1 (one, two) {
2655
- return function (a, b, c, d) {
2656
- one(a, b, c, d);
2657
- two(a, b, c, d);
2658
- }
2659
- }
2660
-
2661
- /* */
2539
+ return vm
2540
+ };
2662
2541
 
2663
- function mergeVNodeHook (def, hookKey, hook, key) {
2664
- key = key + hookKey;
2665
- var injectedHash = def.__injected || (def.__injected = {});
2666
- if (!injectedHash[key]) {
2667
- injectedHash[key] = true;
2668
- var oldHook = def[hookKey];
2669
- if (oldHook) {
2670
- def[hookKey] = function () {
2671
- oldHook.apply(this, arguments);
2672
- hook.apply(this, arguments);
2673
- };
2674
- } else {
2675
- def[hookKey] = hook;
2542
+ Vue.prototype.$emit = function (event) {
2543
+ var vm = this;
2544
+ var cbs = vm._events[event];
2545
+ if (cbs) {
2546
+ cbs = cbs.length > 1 ? toArray(cbs) : cbs;
2547
+ var args = toArray(arguments, 1);
2548
+ for (var i = 0, l = cbs.length; i < l; i++) {
2549
+ cbs[i].apply(vm, args);
2550
+ }
2676
2551
  }
2677
- }
2552
+ return vm
2553
+ };
2678
2554
  }
2679
2555
 
2680
2556
  /* */
2681
2557
 
2682
- function updateListeners (
2683
- on,
2684
- oldOn,
2685
- add,
2686
- remove$$1,
2687
- vm
2688
- ) {
2689
- var name, cur, old, fn, event, capture, once;
2690
- for (name in on) {
2691
- cur = on[name];
2692
- old = oldOn[name];
2693
- if (!cur) {
2694
- "development" !== 'production' && warn(
2695
- "Invalid handler for event \"" + name + "\": got " + String(cur),
2696
- vm
2697
- );
2698
- } else if (!old) {
2699
- once = name.charAt(0) === '~'; // Prefixed last, checked first
2700
- event = once ? name.slice(1) : name;
2701
- capture = event.charAt(0) === '!';
2702
- event = capture ? event.slice(1) : event;
2703
- if (Array.isArray(cur)) {
2704
- add(event, (cur.invoker = arrInvoker(cur)), once, capture);
2705
- } else {
2706
- if (!cur.invoker) {
2707
- fn = cur;
2708
- cur = on[name] = {};
2709
- cur.fn = fn;
2710
- cur.invoker = fnInvoker(cur);
2711
- }
2712
- add(event, cur.invoker, once, capture);
2713
- }
2714
- } else if (cur !== old) {
2715
- if (Array.isArray(old)) {
2716
- old.length = cur.length;
2717
- for (var i = 0; i < old.length; i++) { old[i] = cur[i]; }
2718
- on[name] = old;
2719
- } else {
2720
- old.fn = cur;
2721
- on[name] = old;
2722
- }
2723
- }
2724
- }
2725
- for (name in oldOn) {
2726
- if (!on[name]) {
2727
- once = name.charAt(0) === '~'; // Prefixed last, checked first
2728
- event = once ? name.slice(1) : name;
2729
- capture = event.charAt(0) === '!';
2730
- event = capture ? event.slice(1) : event;
2731
- remove$$1(event, oldOn[name].invoker, capture);
2732
- }
2733
- }
2734
- }
2558
+ var activeInstance = null;
2735
2559
 
2736
- function arrInvoker (arr) {
2737
- return function (ev) {
2738
- var arguments$1 = arguments;
2560
+ function initLifecycle (vm) {
2561
+ var options = vm.$options;
2739
2562
 
2740
- var single = arguments.length === 1;
2741
- for (var i = 0; i < arr.length; i++) {
2742
- single ? arr[i](ev) : arr[i].apply(null, arguments$1);
2563
+ // locate first non-abstract parent
2564
+ var parent = options.parent;
2565
+ if (parent && !options.abstract) {
2566
+ while (parent.$options.abstract && parent.$parent) {
2567
+ parent = parent.$parent;
2743
2568
  }
2569
+ parent.$children.push(vm);
2744
2570
  }
2745
- }
2746
2571
 
2747
- function fnInvoker (o) {
2748
- return function (ev) {
2749
- var single = arguments.length === 1;
2750
- single ? o.fn(ev) : o.fn.apply(null, arguments);
2751
- }
2752
- }
2572
+ vm.$parent = parent;
2573
+ vm.$root = parent ? parent.$root : vm;
2753
2574
 
2754
- /* */
2575
+ vm.$children = [];
2576
+ vm.$refs = {};
2755
2577
 
2756
- function normalizeChildren (children) {
2757
- return isPrimitive(children)
2758
- ? [createTextVNode(children)]
2759
- : Array.isArray(children)
2760
- ? normalizeArrayChildren(children)
2761
- : undefined
2578
+ vm._watcher = null;
2579
+ vm._inactive = false;
2580
+ vm._isMounted = false;
2581
+ vm._isDestroyed = false;
2582
+ vm._isBeingDestroyed = false;
2762
2583
  }
2763
2584
 
2764
- function normalizeArrayChildren (children, nestedIndex) {
2765
- var res = [];
2766
- var i, c, last;
2767
- for (i = 0; i < children.length; i++) {
2768
- c = children[i];
2769
- if (c == null || typeof c === 'boolean') { continue }
2770
- last = res[res.length - 1];
2771
- // nested
2772
- if (Array.isArray(c)) {
2773
- res.push.apply(res, normalizeArrayChildren(c, ((nestedIndex || '') + "_" + i)));
2774
- } else if (isPrimitive(c)) {
2775
- if (last && last.text) {
2776
- last.text += String(c);
2777
- } else if (c !== '') {
2778
- // convert primitive to vnode
2779
- res.push(createTextVNode(c));
2585
+ function lifecycleMixin (Vue) {
2586
+ Vue.prototype._mount = function (
2587
+ el,
2588
+ hydrating
2589
+ ) {
2590
+ var vm = this;
2591
+ vm.$el = el;
2592
+ if (!vm.$options.render) {
2593
+ vm.$options.render = createEmptyVNode;
2594
+ {
2595
+ /* istanbul ignore if */
2596
+ if (vm.$options.template && vm.$options.template.charAt(0) !== '#') {
2597
+ warn(
2598
+ 'You are using the runtime-only build of Vue where the template ' +
2599
+ 'option is not available. Either pre-compile the templates into ' +
2600
+ 'render functions, or use the compiler-included build.',
2601
+ vm
2602
+ );
2603
+ } else {
2604
+ warn(
2605
+ 'Failed to mount component: template or render function not defined.',
2606
+ vm
2607
+ );
2608
+ }
2780
2609
  }
2610
+ }
2611
+ callHook(vm, 'beforeMount');
2612
+ vm._watcher = new Watcher(vm, function updateComponent () {
2613
+ vm._update(vm._render(), hydrating);
2614
+ }, noop);
2615
+ hydrating = false;
2616
+ // manually mounted instance, call mounted on self
2617
+ // mounted is called for render-created child components in its inserted hook
2618
+ if (vm.$vnode == null) {
2619
+ vm._isMounted = true;
2620
+ callHook(vm, 'mounted');
2621
+ }
2622
+ return vm
2623
+ };
2624
+
2625
+ Vue.prototype._update = function (vnode, hydrating) {
2626
+ var vm = this;
2627
+ if (vm._isMounted) {
2628
+ callHook(vm, 'beforeUpdate');
2629
+ }
2630
+ var prevEl = vm.$el;
2631
+ var prevVnode = vm._vnode;
2632
+ var prevActiveInstance = activeInstance;
2633
+ activeInstance = vm;
2634
+ vm._vnode = vnode;
2635
+ // Vue.prototype.__patch__ is injected in entry points
2636
+ // based on the rendering backend used.
2637
+ if (!prevVnode) {
2638
+ // initial render
2639
+ vm.$el = vm.__patch__(
2640
+ vm.$el, vnode, hydrating, false /* removeOnly */,
2641
+ vm.$options._parentElm,
2642
+ vm.$options._refElm
2643
+ );
2781
2644
  } else {
2782
- if (c.text && last && last.text) {
2783
- res[res.length - 1] = createTextVNode(last.text + c.text);
2784
- } else {
2785
- // default key for nested array children (likely generated by v-for)
2786
- if (c.tag && c.key == null && nestedIndex != null) {
2787
- c.key = "__vlist" + nestedIndex + "_" + i + "__";
2788
- }
2789
- res.push(c);
2645
+ // updates
2646
+ vm.$el = vm.__patch__(prevVnode, vnode);
2647
+ }
2648
+ activeInstance = prevActiveInstance;
2649
+ // update __vue__ reference
2650
+ if (prevEl) {
2651
+ prevEl.__vue__ = null;
2652
+ }
2653
+ if (vm.$el) {
2654
+ vm.$el.__vue__ = vm;
2655
+ }
2656
+ // if parent is an HOC, update its $el as well
2657
+ if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {
2658
+ vm.$parent.$el = vm.$el;
2659
+ }
2660
+ // updated hook is called by the scheduler to ensure that children are
2661
+ // updated in a parent's updated hook.
2662
+ };
2663
+
2664
+ Vue.prototype._updateFromParent = function (
2665
+ propsData,
2666
+ listeners,
2667
+ parentVnode,
2668
+ renderChildren
2669
+ ) {
2670
+ var vm = this;
2671
+ var hasChildren = !!(vm.$options._renderChildren || renderChildren);
2672
+ vm.$options._parentVnode = parentVnode;
2673
+ vm.$vnode = parentVnode; // update vm's placeholder node without re-render
2674
+ if (vm._vnode) { // update child tree's parent
2675
+ vm._vnode.parent = parentVnode;
2676
+ }
2677
+ vm.$options._renderChildren = renderChildren;
2678
+ // update props
2679
+ if (propsData && vm.$options.props) {
2680
+ observerState.shouldConvert = false;
2681
+ {
2682
+ observerState.isSettingProps = true;
2790
2683
  }
2684
+ var propKeys = vm.$options._propKeys || [];
2685
+ for (var i = 0; i < propKeys.length; i++) {
2686
+ var key = propKeys[i];
2687
+ vm[key] = validateProp(key, vm.$options.props, propsData, vm);
2688
+ }
2689
+ observerState.shouldConvert = true;
2690
+ {
2691
+ observerState.isSettingProps = false;
2692
+ }
2693
+ vm.$options.propsData = propsData;
2694
+ }
2695
+ // update listeners
2696
+ if (listeners) {
2697
+ var oldListeners = vm.$options._parentListeners;
2698
+ vm.$options._parentListeners = listeners;
2699
+ updateComponentListeners(vm, listeners, oldListeners);
2700
+ }
2701
+ // resolve slots + force update if has children
2702
+ if (hasChildren) {
2703
+ vm.$slots = resolveSlots(renderChildren, parentVnode.context);
2704
+ vm.$forceUpdate();
2705
+ }
2706
+ };
2707
+
2708
+ Vue.prototype.$forceUpdate = function () {
2709
+ var vm = this;
2710
+ if (vm._watcher) {
2711
+ vm._watcher.update();
2712
+ }
2713
+ };
2714
+
2715
+ Vue.prototype.$destroy = function () {
2716
+ var vm = this;
2717
+ if (vm._isBeingDestroyed) {
2718
+ return
2719
+ }
2720
+ callHook(vm, 'beforeDestroy');
2721
+ vm._isBeingDestroyed = true;
2722
+ // remove self from parent
2723
+ var parent = vm.$parent;
2724
+ if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {
2725
+ remove$1(parent.$children, vm);
2726
+ }
2727
+ // teardown watchers
2728
+ if (vm._watcher) {
2729
+ vm._watcher.teardown();
2730
+ }
2731
+ var i = vm._watchers.length;
2732
+ while (i--) {
2733
+ vm._watchers[i].teardown();
2734
+ }
2735
+ // remove reference from data ob
2736
+ // frozen object may not have observer.
2737
+ if (vm._data.__ob__) {
2738
+ vm._data.__ob__.vmCount--;
2739
+ }
2740
+ // call the last hook...
2741
+ vm._isDestroyed = true;
2742
+ callHook(vm, 'destroyed');
2743
+ // turn off all instance listeners.
2744
+ vm.$off();
2745
+ // remove __vue__ reference
2746
+ if (vm.$el) {
2747
+ vm.$el.__vue__ = null;
2748
+ }
2749
+ // invoke destroy hooks on current rendered tree
2750
+ vm.__patch__(vm._vnode, null);
2751
+ };
2752
+ }
2753
+
2754
+ function callHook (vm, hook) {
2755
+ var handlers = vm.$options[hook];
2756
+ if (handlers) {
2757
+ for (var i = 0, j = handlers.length; i < j; i++) {
2758
+ handlers[i].call(vm);
2791
2759
  }
2792
2760
  }
2793
- return res
2761
+ if (vm._hasHookEvent) {
2762
+ vm.$emit('hook:' + hook);
2763
+ }
2794
2764
  }
2795
2765
 
2796
2766
  /* */
2797
2767
 
2798
- function getFirstComponentChild (children) {
2799
- return children && children.filter(function (c) { return c && c.componentOptions; })[0]
2800
- }
2801
2768
 
2802
- /* */
2769
+ var queue = [];
2770
+ var has$1 = {};
2771
+ var circular = {};
2772
+ var waiting = false;
2773
+ var flushing = false;
2774
+ var index = 0;
2803
2775
 
2804
- // wrapper function for providing a more flexible interface
2805
- // without getting yelled at by flow
2806
- function createElement (
2807
- context,
2808
- tag,
2809
- data,
2810
- children,
2811
- needNormalization,
2812
- alwaysNormalize
2813
- ) {
2814
- if (Array.isArray(data) || isPrimitive(data)) {
2815
- needNormalization = children;
2816
- children = data;
2817
- data = undefined;
2776
+ /**
2777
+ * Reset the scheduler's state.
2778
+ */
2779
+ function resetSchedulerState () {
2780
+ queue.length = 0;
2781
+ has$1 = {};
2782
+ {
2783
+ circular = {};
2818
2784
  }
2819
- if (alwaysNormalize) { needNormalization = true; }
2820
- return _createElement(context, tag, data, children, needNormalization)
2785
+ waiting = flushing = false;
2821
2786
  }
2822
2787
 
2823
- function _createElement (
2824
- context,
2825
- tag,
2826
- data,
2827
- children,
2828
- needNormalization
2829
- ) {
2830
- if (data && data.__ob__) {
2831
- "development" !== 'production' && warn(
2832
- "Avoid using observed data object as vnode data: " + (JSON.stringify(data)) + "\n" +
2833
- 'Always create fresh vnode data objects in each render!',
2834
- context
2835
- );
2836
- return createEmptyVNode()
2837
- }
2838
- if (!tag) {
2839
- // in case of component :is set to falsy value
2840
- return createEmptyVNode()
2788
+ /**
2789
+ * Flush both queues and run the watchers.
2790
+ */
2791
+ function flushSchedulerQueue () {
2792
+ flushing = true;
2793
+ var watcher, id, vm;
2794
+
2795
+ // Sort queue before flush.
2796
+ // This ensures that:
2797
+ // 1. Components are updated from parent to child. (because parent is always
2798
+ // created before the child)
2799
+ // 2. A component's user watchers are run before its render watcher (because
2800
+ // user watchers are created before the render watcher)
2801
+ // 3. If a component is destroyed during a parent component's watcher run,
2802
+ // its watchers can be skipped.
2803
+ queue.sort(function (a, b) { return a.id - b.id; });
2804
+
2805
+ // do not cache length because more watchers might be pushed
2806
+ // as we run existing watchers
2807
+ for (index = 0; index < queue.length; index++) {
2808
+ watcher = queue[index];
2809
+ id = watcher.id;
2810
+ has$1[id] = null;
2811
+ watcher.run();
2812
+ // in dev build, check and stop circular updates.
2813
+ if ("development" !== 'production' && has$1[id] != null) {
2814
+ circular[id] = (circular[id] || 0) + 1;
2815
+ if (circular[id] > config._maxUpdateCount) {
2816
+ warn(
2817
+ 'You may have an infinite update loop ' + (
2818
+ watcher.user
2819
+ ? ("in watcher with expression \"" + (watcher.expression) + "\"")
2820
+ : "in a component render function."
2821
+ ),
2822
+ watcher.vm
2823
+ );
2824
+ break
2825
+ }
2826
+ }
2841
2827
  }
2842
- // support single function children as default scoped slot
2843
- if (Array.isArray(children) &&
2844
- typeof children[0] === 'function') {
2845
- data = data || {};
2846
- data.scopedSlots = { default: children[0] };
2847
- children.length = 0;
2828
+
2829
+ // call updated hooks
2830
+ index = queue.length;
2831
+ while (index--) {
2832
+ watcher = queue[index];
2833
+ vm = watcher.vm;
2834
+ if (vm._watcher === watcher && vm._isMounted) {
2835
+ callHook(vm, 'updated');
2836
+ }
2848
2837
  }
2849
- if (needNormalization) {
2850
- children = normalizeChildren(children);
2838
+
2839
+ // devtool hook
2840
+ /* istanbul ignore if */
2841
+ if (devtools && config.devtools) {
2842
+ devtools.emit('flush');
2851
2843
  }
2852
- var vnode, ns;
2853
- if (typeof tag === 'string') {
2854
- var Ctor;
2855
- ns = config.getTagNamespace(tag);
2856
- if (config.isReservedTag(tag)) {
2857
- // platform built-in elements
2858
- vnode = new VNode(
2859
- config.parsePlatformTagName(tag), data, children,
2860
- undefined, undefined, context
2861
- );
2862
- } else if ((Ctor = resolveAsset(context.$options, 'components', tag))) {
2863
- // component
2864
- vnode = createComponent(Ctor, data, context, children, tag);
2844
+
2845
+ resetSchedulerState();
2846
+ }
2847
+
2848
+ /**
2849
+ * Push a watcher into the watcher queue.
2850
+ * Jobs with duplicate IDs will be skipped unless it's
2851
+ * pushed when the queue is being flushed.
2852
+ */
2853
+ function queueWatcher (watcher) {
2854
+ var id = watcher.id;
2855
+ if (has$1[id] == null) {
2856
+ has$1[id] = true;
2857
+ if (!flushing) {
2858
+ queue.push(watcher);
2865
2859
  } else {
2866
- // unknown or unlisted namespaced elements
2867
- // check at runtime because it may get assigned a namespace when its
2868
- // parent normalizes children
2869
- ns = tag === 'foreignObject' ? 'xhtml' : ns;
2870
- vnode = new VNode(
2871
- tag, data, children,
2872
- undefined, undefined, context
2860
+ // if already flushing, splice the watcher based on its id
2861
+ // if already past its id, it will be run next immediately.
2862
+ var i = queue.length - 1;
2863
+ while (i >= 0 && queue[i].id > watcher.id) {
2864
+ i--;
2865
+ }
2866
+ queue.splice(Math.max(i, index) + 1, 0, watcher);
2867
+ }
2868
+ // queue the flush
2869
+ if (!waiting) {
2870
+ waiting = true;
2871
+ nextTick(flushSchedulerQueue);
2872
+ }
2873
+ }
2874
+ }
2875
+
2876
+ /* */
2877
+
2878
+ var uid$2 = 0;
2879
+
2880
+ /**
2881
+ * A watcher parses an expression, collects dependencies,
2882
+ * and fires callback when the expression value changes.
2883
+ * This is used for both the $watch() api and directives.
2884
+ */
2885
+ var Watcher = function Watcher (
2886
+ vm,
2887
+ expOrFn,
2888
+ cb,
2889
+ options
2890
+ ) {
2891
+ this.vm = vm;
2892
+ vm._watchers.push(this);
2893
+ // options
2894
+ if (options) {
2895
+ this.deep = !!options.deep;
2896
+ this.user = !!options.user;
2897
+ this.lazy = !!options.lazy;
2898
+ this.sync = !!options.sync;
2899
+ } else {
2900
+ this.deep = this.user = this.lazy = this.sync = false;
2901
+ }
2902
+ this.cb = cb;
2903
+ this.id = ++uid$2; // uid for batching
2904
+ this.active = true;
2905
+ this.dirty = this.lazy; // for lazy watchers
2906
+ this.deps = [];
2907
+ this.newDeps = [];
2908
+ this.depIds = new _Set();
2909
+ this.newDepIds = new _Set();
2910
+ this.expression = expOrFn.toString();
2911
+ // parse expression for getter
2912
+ if (typeof expOrFn === 'function') {
2913
+ this.getter = expOrFn;
2914
+ } else {
2915
+ this.getter = parsePath(expOrFn);
2916
+ if (!this.getter) {
2917
+ this.getter = function () {};
2918
+ "development" !== 'production' && warn(
2919
+ "Failed watching path: \"" + expOrFn + "\" " +
2920
+ 'Watcher only accepts simple dot-delimited paths. ' +
2921
+ 'For full control, use a function instead.',
2922
+ vm
2873
2923
  );
2874
2924
  }
2875
- } else {
2876
- // direct component options / constructor
2877
- vnode = createComponent(tag, data, context, children);
2878
2925
  }
2879
- if (vnode) {
2880
- if (ns) { applyNS(vnode, ns); }
2881
- return vnode
2882
- } else {
2883
- return createEmptyVNode()
2926
+ this.value = this.lazy
2927
+ ? undefined
2928
+ : this.get();
2929
+ };
2930
+
2931
+ /**
2932
+ * Evaluate the getter, and re-collect dependencies.
2933
+ */
2934
+ Watcher.prototype.get = function get () {
2935
+ pushTarget(this);
2936
+ var value = this.getter.call(this.vm, this.vm);
2937
+ // "touch" every property so they are all tracked as
2938
+ // dependencies for deep watching
2939
+ if (this.deep) {
2940
+ traverse(value);
2884
2941
  }
2885
- }
2942
+ popTarget();
2943
+ this.cleanupDeps();
2944
+ return value
2945
+ };
2886
2946
 
2887
- function applyNS (vnode, ns) {
2888
- vnode.ns = ns;
2889
- if (vnode.children) {
2890
- for (var i = 0, l = vnode.children.length; i < l; i++) {
2891
- var child = vnode.children[i];
2892
- if (child.tag && !child.ns) {
2893
- applyNS(child, ns);
2894
- }
2947
+ /**
2948
+ * Add a dependency to this directive.
2949
+ */
2950
+ Watcher.prototype.addDep = function addDep (dep) {
2951
+ var id = dep.id;
2952
+ if (!this.newDepIds.has(id)) {
2953
+ this.newDepIds.add(id);
2954
+ this.newDeps.push(dep);
2955
+ if (!this.depIds.has(id)) {
2956
+ dep.addSub(this);
2895
2957
  }
2896
2958
  }
2897
- }
2959
+ };
2898
2960
 
2899
- /* */
2961
+ /**
2962
+ * Clean up for dependency collection.
2963
+ */
2964
+ Watcher.prototype.cleanupDeps = function cleanupDeps () {
2965
+ var this$1 = this;
2900
2966
 
2901
- function initRender (vm) {
2902
- vm.$vnode = null; // the placeholder node in parent tree
2903
- vm._vnode = null; // the root of the child tree
2904
- vm._staticTrees = null;
2905
- var parentVnode = vm.$options._parentVnode;
2906
- var renderContext = parentVnode && parentVnode.context;
2907
- vm.$slots = resolveSlots(vm.$options._renderChildren, renderContext);
2908
- vm.$scopedSlots = {};
2909
- // bind the createElement fn to this instance
2910
- // so that we get proper render context inside it.
2911
- // args order: tag, data, children, needNormalization, alwaysNormalize
2912
- // internal version is used by render functions compiled from templates
2913
- vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };
2914
- // normalization is always applied for the public version, used in
2915
- // user-written render functions.
2916
- vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };
2917
- if (vm.$options.el) {
2918
- vm.$mount(vm.$options.el);
2967
+ var i = this.deps.length;
2968
+ while (i--) {
2969
+ var dep = this$1.deps[i];
2970
+ if (!this$1.newDepIds.has(dep.id)) {
2971
+ dep.removeSub(this$1);
2972
+ }
2919
2973
  }
2920
- }
2921
-
2922
- function renderMixin (Vue) {
2923
- Vue.prototype.$nextTick = function (fn) {
2924
- return nextTick(fn, this)
2925
- };
2974
+ var tmp = this.depIds;
2975
+ this.depIds = this.newDepIds;
2976
+ this.newDepIds = tmp;
2977
+ this.newDepIds.clear();
2978
+ tmp = this.deps;
2979
+ this.deps = this.newDeps;
2980
+ this.newDeps = tmp;
2981
+ this.newDeps.length = 0;
2982
+ };
2926
2983
 
2927
- Vue.prototype._render = function () {
2928
- var vm = this;
2929
- var ref = vm.$options;
2930
- var render = ref.render;
2931
- var staticRenderFns = ref.staticRenderFns;
2932
- var _parentVnode = ref._parentVnode;
2984
+ /**
2985
+ * Subscriber interface.
2986
+ * Will be called when a dependency changes.
2987
+ */
2988
+ Watcher.prototype.update = function update () {
2989
+ /* istanbul ignore else */
2990
+ if (this.lazy) {
2991
+ this.dirty = true;
2992
+ } else if (this.sync) {
2993
+ this.run();
2994
+ } else {
2995
+ queueWatcher(this);
2996
+ }
2997
+ };
2933
2998
 
2934
- if (vm._isMounted) {
2935
- // clone slot nodes on re-renders
2936
- for (var key in vm.$slots) {
2937
- vm.$slots[key] = cloneVNodes(vm.$slots[key]);
2999
+ /**
3000
+ * Scheduler job interface.
3001
+ * Will be called by the scheduler.
3002
+ */
3003
+ Watcher.prototype.run = function run () {
3004
+ if (this.active) {
3005
+ var value = this.get();
3006
+ if (
3007
+ value !== this.value ||
3008
+ // Deep watchers and watchers on Object/Arrays should fire even
3009
+ // when the value is the same, because the value may
3010
+ // have mutated.
3011
+ isObject(value) ||
3012
+ this.deep
3013
+ ) {
3014
+ // set new value
3015
+ var oldValue = this.value;
3016
+ this.value = value;
3017
+ if (this.user) {
3018
+ try {
3019
+ this.cb.call(this.vm, value, oldValue);
3020
+ } catch (e) {
3021
+ /* istanbul ignore else */
3022
+ if (config.errorHandler) {
3023
+ config.errorHandler.call(null, e, this.vm);
3024
+ } else {
3025
+ "development" !== 'production' && warn(
3026
+ ("Error in watcher \"" + (this.expression) + "\""),
3027
+ this.vm
3028
+ );
3029
+ throw e
3030
+ }
3031
+ }
3032
+ } else {
3033
+ this.cb.call(this.vm, value, oldValue);
2938
3034
  }
2939
3035
  }
3036
+ }
3037
+ };
2940
3038
 
2941
- if (_parentVnode && _parentVnode.data.scopedSlots) {
2942
- vm.$scopedSlots = _parentVnode.data.scopedSlots;
2943
- }
3039
+ /**
3040
+ * Evaluate the value of the watcher.
3041
+ * This only gets called for lazy watchers.
3042
+ */
3043
+ Watcher.prototype.evaluate = function evaluate () {
3044
+ this.value = this.get();
3045
+ this.dirty = false;
3046
+ };
2944
3047
 
2945
- if (staticRenderFns && !vm._staticTrees) {
2946
- vm._staticTrees = [];
2947
- }
2948
- // set parent vnode. this allows render functions to have access
2949
- // to the data on the placeholder node.
2950
- vm.$vnode = _parentVnode;
2951
- // render self
2952
- var vnode;
2953
- try {
2954
- vnode = render.call(vm._renderProxy, vm.$createElement);
2955
- } catch (e) {
2956
- /* istanbul ignore else */
2957
- if (config.errorHandler) {
2958
- config.errorHandler.call(null, e, vm);
2959
- } else {
2960
- {
2961
- warn(("Error when rendering " + (formatComponentName(vm)) + ":"));
2962
- }
2963
- throw e
2964
- }
2965
- // return previous vnode to prevent render error causing blank component
2966
- vnode = vm._vnode;
2967
- }
2968
- // return empty vnode in case the render function errored out
2969
- if (!(vnode instanceof VNode)) {
2970
- if ("development" !== 'production' && Array.isArray(vnode)) {
2971
- warn(
2972
- 'Multiple root nodes returned from render function. Render function ' +
2973
- 'should return a single root node.',
2974
- vm
2975
- );
2976
- }
2977
- vnode = createEmptyVNode();
2978
- }
2979
- // set parent
2980
- vnode.parent = _parentVnode;
2981
- return vnode
2982
- };
3048
+ /**
3049
+ * Depend on all deps collected by this watcher.
3050
+ */
3051
+ Watcher.prototype.depend = function depend () {
3052
+ var this$1 = this;
2983
3053
 
2984
- // toString for mustaches
2985
- Vue.prototype._s = _toString;
2986
- // convert text to vnode
2987
- Vue.prototype._v = createTextVNode;
2988
- // number conversion
2989
- Vue.prototype._n = toNumber;
2990
- // empty vnode
2991
- Vue.prototype._e = createEmptyVNode;
2992
- // loose equal
2993
- Vue.prototype._q = looseEqual;
2994
- // loose indexOf
2995
- Vue.prototype._i = looseIndexOf;
3054
+ var i = this.deps.length;
3055
+ while (i--) {
3056
+ this$1.deps[i].depend();
3057
+ }
3058
+ };
2996
3059
 
2997
- // render static tree by index
2998
- Vue.prototype._m = function renderStatic (
2999
- index,
3000
- isInFor
3001
- ) {
3002
- var tree = this._staticTrees[index];
3003
- // if has already-rendered static tree and not inside v-for,
3004
- // we can reuse the same tree by doing a shallow clone.
3005
- if (tree && !isInFor) {
3006
- return Array.isArray(tree)
3007
- ? cloneVNodes(tree)
3008
- : cloneVNode(tree)
3060
+ /**
3061
+ * Remove self from all dependencies' subscriber list.
3062
+ */
3063
+ Watcher.prototype.teardown = function teardown () {
3064
+ var this$1 = this;
3065
+
3066
+ if (this.active) {
3067
+ // remove self from vm's watcher list
3068
+ // this is a somewhat expensive operation so we skip it
3069
+ // if the vm is being destroyed.
3070
+ if (!this.vm._isBeingDestroyed) {
3071
+ remove$1(this.vm._watchers, this);
3072
+ }
3073
+ var i = this.deps.length;
3074
+ while (i--) {
3075
+ this$1.deps[i].removeSub(this$1);
3009
3076
  }
3010
- // otherwise, render a fresh tree.
3011
- tree = this._staticTrees[index] = this.$options.staticRenderFns[index].call(this._renderProxy);
3012
- markStatic(tree, ("__static__" + index), false);
3013
- return tree
3014
- };
3077
+ this.active = false;
3078
+ }
3079
+ };
3015
3080
 
3016
- // mark node as static (v-once)
3017
- Vue.prototype._o = function markOnce (
3018
- tree,
3019
- index,
3020
- key
3021
- ) {
3022
- markStatic(tree, ("__once__" + index + (key ? ("_" + key) : "")), true);
3023
- return tree
3024
- };
3081
+ /**
3082
+ * Recursively traverse an object to evoke all converted
3083
+ * getters, so that every nested property inside the object
3084
+ * is collected as a "deep" dependency.
3085
+ */
3086
+ var seenObjects = new _Set();
3087
+ function traverse (val) {
3088
+ seenObjects.clear();
3089
+ _traverse(val, seenObjects);
3090
+ }
3025
3091
 
3026
- function markStatic (tree, key, isOnce) {
3027
- if (Array.isArray(tree)) {
3028
- for (var i = 0; i < tree.length; i++) {
3029
- if (tree[i] && typeof tree[i] !== 'string') {
3030
- markStaticNode(tree[i], (key + "_" + i), isOnce);
3031
- }
3032
- }
3033
- } else {
3034
- markStaticNode(tree, key, isOnce);
3092
+ function _traverse (val, seen) {
3093
+ var i, keys;
3094
+ var isA = Array.isArray(val);
3095
+ if ((!isA && !isObject(val)) || !Object.isExtensible(val)) {
3096
+ return
3097
+ }
3098
+ if (val.__ob__) {
3099
+ var depId = val.__ob__.dep.id;
3100
+ if (seen.has(depId)) {
3101
+ return
3035
3102
  }
3103
+ seen.add(depId);
3036
3104
  }
3105
+ if (isA) {
3106
+ i = val.length;
3107
+ while (i--) { _traverse(val[i], seen); }
3108
+ } else {
3109
+ keys = Object.keys(val);
3110
+ i = keys.length;
3111
+ while (i--) { _traverse(val[keys[i]], seen); }
3112
+ }
3113
+ }
3037
3114
 
3038
- function markStaticNode (node, key, isOnce) {
3039
- node.isStatic = true;
3040
- node.key = key;
3041
- node.isOnce = isOnce;
3115
+ /* */
3116
+
3117
+ function initState (vm) {
3118
+ vm._watchers = [];
3119
+ var opts = vm.$options;
3120
+ if (opts.props) { initProps(vm, opts.props); }
3121
+ if (opts.methods) { initMethods(vm, opts.methods); }
3122
+ if (opts.data) {
3123
+ initData(vm);
3124
+ } else {
3125
+ observe(vm._data = {}, true /* asRootData */);
3042
3126
  }
3127
+ if (opts.computed) { initComputed(vm, opts.computed); }
3128
+ if (opts.watch) { initWatch(vm, opts.watch); }
3129
+ }
3043
3130
 
3044
- // filter resolution helper
3045
- Vue.prototype._f = function resolveFilter (id) {
3046
- return resolveAsset(this.$options, 'filters', id, true) || identity
3047
- };
3131
+ var isReservedProp = { key: 1, ref: 1, slot: 1 };
3048
3132
 
3049
- // render v-for
3050
- Vue.prototype._l = function renderList (
3051
- val,
3052
- render
3053
- ) {
3054
- var ret, i, l, keys, key;
3055
- if (Array.isArray(val)) {
3056
- ret = new Array(val.length);
3057
- for (i = 0, l = val.length; i < l; i++) {
3058
- ret[i] = render(val[i], i);
3059
- }
3060
- } else if (typeof val === 'number') {
3061
- ret = new Array(val);
3062
- for (i = 0; i < val; i++) {
3063
- ret[i] = render(i + 1, i);
3064
- }
3065
- } else if (isObject(val)) {
3066
- keys = Object.keys(val);
3067
- ret = new Array(keys.length);
3068
- for (i = 0, l = keys.length; i < l; i++) {
3069
- key = keys[i];
3070
- ret[i] = render(val[key], key, i);
3133
+ function initProps (vm, props) {
3134
+ var propsData = vm.$options.propsData || {};
3135
+ var keys = vm.$options._propKeys = Object.keys(props);
3136
+ var isRoot = !vm.$parent;
3137
+ // root instance props should be converted
3138
+ observerState.shouldConvert = isRoot;
3139
+ var loop = function ( i ) {
3140
+ var key = keys[i];
3141
+ /* istanbul ignore else */
3142
+ {
3143
+ if (isReservedProp[key]) {
3144
+ warn(
3145
+ ("\"" + key + "\" is a reserved attribute and cannot be used as component prop."),
3146
+ vm
3147
+ );
3071
3148
  }
3149
+ defineReactive$$1(vm, key, validateProp(key, props, propsData, vm), function () {
3150
+ if (vm.$parent && !observerState.isSettingProps) {
3151
+ warn(
3152
+ "Avoid mutating a prop directly since the value will be " +
3153
+ "overwritten whenever the parent component re-renders. " +
3154
+ "Instead, use a data or computed property based on the prop's " +
3155
+ "value. Prop being mutated: \"" + key + "\"",
3156
+ vm
3157
+ );
3158
+ }
3159
+ });
3072
3160
  }
3073
- return ret
3074
3161
  };
3075
3162
 
3076
- // renderSlot
3077
- Vue.prototype._t = function (
3078
- name,
3079
- fallback,
3080
- props
3081
- ) {
3082
- var scopedSlotFn = this.$scopedSlots[name];
3083
- if (scopedSlotFn) { // scoped slot
3084
- return scopedSlotFn(props || {}) || fallback
3163
+ for (var i = 0; i < keys.length; i++) loop( i );
3164
+ observerState.shouldConvert = true;
3165
+ }
3166
+
3167
+ function initData (vm) {
3168
+ var data = vm.$options.data;
3169
+ data = vm._data = typeof data === 'function'
3170
+ ? data.call(vm)
3171
+ : data || {};
3172
+ if (!isPlainObject(data)) {
3173
+ data = {};
3174
+ "development" !== 'production' && warn(
3175
+ 'data functions should return an object:\n' +
3176
+ 'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',
3177
+ vm
3178
+ );
3179
+ }
3180
+ // proxy data on instance
3181
+ var keys = Object.keys(data);
3182
+ var props = vm.$options.props;
3183
+ var i = keys.length;
3184
+ while (i--) {
3185
+ if (props && hasOwn(props, keys[i])) {
3186
+ "development" !== 'production' && warn(
3187
+ "The data property \"" + (keys[i]) + "\" is already declared as a prop. " +
3188
+ "Use prop default value instead.",
3189
+ vm
3190
+ );
3085
3191
  } else {
3086
- var slotNodes = this.$slots[name];
3087
- // warn duplicate slot usage
3088
- if (slotNodes && "development" !== 'production') {
3089
- slotNodes._rendered && warn(
3090
- "Duplicate presence of slot \"" + name + "\" found in the same render tree " +
3091
- "- this will likely cause render errors.",
3092
- this
3093
- );
3094
- slotNodes._rendered = true;
3095
- }
3096
- return slotNodes || fallback
3192
+ proxy(vm, keys[i]);
3097
3193
  }
3098
- };
3194
+ }
3195
+ // observe data
3196
+ observe(data, true /* asRootData */);
3197
+ }
3099
3198
 
3100
- // apply v-bind object
3101
- Vue.prototype._b = function bindProps (
3102
- data,
3103
- tag,
3104
- value,
3105
- asProp
3106
- ) {
3107
- if (value) {
3108
- if (!isObject(value)) {
3109
- "development" !== 'production' && warn(
3110
- 'v-bind without argument expects an Object or Array value',
3111
- this
3112
- );
3113
- } else {
3114
- if (Array.isArray(value)) {
3115
- value = toObject(value);
3116
- }
3117
- for (var key in value) {
3118
- if (key === 'class' || key === 'style') {
3119
- data[key] = value[key];
3120
- } else {
3121
- var hash = asProp || config.mustUseProp(tag, key)
3122
- ? data.domProps || (data.domProps = {})
3123
- : data.attrs || (data.attrs = {});
3124
- hash[key] = value[key];
3125
- }
3126
- }
3127
- }
3128
- }
3129
- return data
3130
- };
3199
+ var computedSharedDefinition = {
3200
+ enumerable: true,
3201
+ configurable: true,
3202
+ get: noop,
3203
+ set: noop
3204
+ };
3131
3205
 
3132
- // check v-on keyCodes
3133
- Vue.prototype._k = function checkKeyCodes (
3134
- eventKeyCode,
3135
- key,
3136
- builtInAlias
3137
- ) {
3138
- var keyCodes = config.keyCodes[key] || builtInAlias;
3139
- if (Array.isArray(keyCodes)) {
3140
- return keyCodes.indexOf(eventKeyCode) === -1
3206
+ function initComputed (vm, computed) {
3207
+ for (var key in computed) {
3208
+ /* istanbul ignore if */
3209
+ if ("development" !== 'production' && key in vm) {
3210
+ warn(
3211
+ "existing instance property \"" + key + "\" will be " +
3212
+ "overwritten by a computed property with the same name.",
3213
+ vm
3214
+ );
3215
+ }
3216
+ var userDef = computed[key];
3217
+ if (typeof userDef === 'function') {
3218
+ computedSharedDefinition.get = makeComputedGetter(userDef, vm);
3219
+ computedSharedDefinition.set = noop;
3141
3220
  } else {
3142
- return keyCodes !== eventKeyCode
3221
+ computedSharedDefinition.get = userDef.get
3222
+ ? userDef.cache !== false
3223
+ ? makeComputedGetter(userDef.get, vm)
3224
+ : bind$1(userDef.get, vm)
3225
+ : noop;
3226
+ computedSharedDefinition.set = userDef.set
3227
+ ? bind$1(userDef.set, vm)
3228
+ : noop;
3143
3229
  }
3144
- };
3230
+ Object.defineProperty(vm, key, computedSharedDefinition);
3231
+ }
3145
3232
  }
3146
3233
 
3147
- function resolveSlots (
3148
- children,
3149
- context
3150
- ) {
3151
- var slots = {};
3152
- if (!children) {
3153
- return slots
3234
+ function makeComputedGetter (getter, owner) {
3235
+ var watcher = new Watcher(owner, getter, noop, {
3236
+ lazy: true
3237
+ });
3238
+ return function computedGetter () {
3239
+ if (watcher.dirty) {
3240
+ watcher.evaluate();
3241
+ }
3242
+ if (Dep.target) {
3243
+ watcher.depend();
3244
+ }
3245
+ return watcher.value
3154
3246
  }
3155
- var defaultSlot = [];
3156
- var name, child;
3157
- for (var i = 0, l = children.length; i < l; i++) {
3158
- child = children[i];
3159
- // named slots should only be respected if the vnode was rendered in the
3160
- // same context.
3161
- if ((child.context === context || child.functionalContext === context) &&
3162
- child.data && (name = child.data.slot)) {
3163
- var slot = (slots[name] || (slots[name] = []));
3164
- if (child.tag === 'template') {
3165
- slot.push.apply(slot, child.children);
3166
- } else {
3167
- slot.push(child);
3247
+ }
3248
+
3249
+ function initMethods (vm, methods) {
3250
+ for (var key in methods) {
3251
+ vm[key] = methods[key] == null ? noop : bind$1(methods[key], vm);
3252
+ if ("development" !== 'production' && methods[key] == null) {
3253
+ warn(
3254
+ "method \"" + key + "\" has an undefined value in the component definition. " +
3255
+ "Did you reference the function correctly?",
3256
+ vm
3257
+ );
3258
+ }
3259
+ }
3260
+ }
3261
+
3262
+ function initWatch (vm, watch) {
3263
+ for (var key in watch) {
3264
+ var handler = watch[key];
3265
+ if (Array.isArray(handler)) {
3266
+ for (var i = 0; i < handler.length; i++) {
3267
+ createWatcher(vm, key, handler[i]);
3168
3268
  }
3169
3269
  } else {
3170
- defaultSlot.push(child);
3270
+ createWatcher(vm, key, handler);
3171
3271
  }
3172
3272
  }
3173
- // ignore single whitespace
3174
- if (defaultSlot.length && !(
3175
- defaultSlot.length === 1 &&
3176
- (defaultSlot[0].text === ' ' || defaultSlot[0].isComment)
3177
- )) {
3178
- slots.default = defaultSlot;
3179
- }
3180
- return slots
3181
3273
  }
3182
3274
 
3183
- /* */
3184
-
3185
- function initEvents (vm) {
3186
- vm._events = Object.create(null);
3187
- // init parent attached events
3188
- var listeners = vm.$options._parentListeners;
3189
- var add = function (event, fn, once) {
3190
- once ? vm.$once(event, fn) : vm.$on(event, fn);
3191
- };
3192
- var remove$$1 = bind$1(vm.$off, vm);
3193
- vm._updateListeners = function (listeners, oldListeners) {
3194
- updateListeners(listeners, oldListeners || {}, add, remove$$1, vm);
3195
- };
3196
- if (listeners) {
3197
- vm._updateListeners(listeners);
3275
+ function createWatcher (vm, key, handler) {
3276
+ var options;
3277
+ if (isPlainObject(handler)) {
3278
+ options = handler;
3279
+ handler = handler.handler;
3280
+ }
3281
+ if (typeof handler === 'string') {
3282
+ handler = vm[handler];
3198
3283
  }
3284
+ vm.$watch(key, handler, options);
3199
3285
  }
3200
3286
 
3201
- function eventsMixin (Vue) {
3202
- Vue.prototype.$on = function (event, fn) {
3203
- var vm = this;(vm._events[event] || (vm._events[event] = [])).push(fn);
3204
- return vm
3287
+ function stateMixin (Vue) {
3288
+ // flow somehow has problems with directly declared definition object
3289
+ // when using Object.defineProperty, so we have to procedurally build up
3290
+ // the object here.
3291
+ var dataDef = {};
3292
+ dataDef.get = function () {
3293
+ return this._data
3205
3294
  };
3295
+ {
3296
+ dataDef.set = function (newData) {
3297
+ warn(
3298
+ 'Avoid replacing instance root $data. ' +
3299
+ 'Use nested data properties instead.',
3300
+ this
3301
+ );
3302
+ };
3303
+ }
3304
+ Object.defineProperty(Vue.prototype, '$data', dataDef);
3206
3305
 
3207
- Vue.prototype.$once = function (event, fn) {
3208
- var vm = this;
3209
- function on () {
3210
- vm.$off(event, on);
3211
- fn.apply(vm, arguments);
3212
- }
3213
- on.fn = fn;
3214
- vm.$on(event, on);
3215
- return vm
3216
- };
3306
+ Vue.prototype.$set = set$1;
3307
+ Vue.prototype.$delete = del;
3217
3308
 
3218
- Vue.prototype.$off = function (event, fn) {
3309
+ Vue.prototype.$watch = function (
3310
+ expOrFn,
3311
+ cb,
3312
+ options
3313
+ ) {
3219
3314
  var vm = this;
3220
- // all
3221
- if (!arguments.length) {
3222
- vm._events = Object.create(null);
3223
- return vm
3224
- }
3225
- // specific event
3226
- var cbs = vm._events[event];
3227
- if (!cbs) {
3228
- return vm
3229
- }
3230
- if (arguments.length === 1) {
3231
- vm._events[event] = null;
3232
- return vm
3315
+ options = options || {};
3316
+ options.user = true;
3317
+ var watcher = new Watcher(vm, expOrFn, cb, options);
3318
+ if (options.immediate) {
3319
+ cb.call(vm, watcher.value);
3233
3320
  }
3234
- // specific handler
3235
- var cb;
3236
- var i = cbs.length;
3237
- while (i--) {
3238
- cb = cbs[i];
3239
- if (cb === fn || cb.fn === fn) {
3240
- cbs.splice(i, 1);
3241
- break
3242
- }
3321
+ return function unwatchFn () {
3322
+ watcher.teardown();
3243
3323
  }
3244
- return vm
3245
3324
  };
3325
+ }
3246
3326
 
3247
- Vue.prototype.$emit = function (event) {
3248
- var vm = this;
3249
- var cbs = vm._events[event];
3250
- if (cbs) {
3251
- cbs = cbs.length > 1 ? toArray(cbs) : cbs;
3252
- var args = toArray(arguments, 1);
3253
- for (var i = 0, l = cbs.length; i < l; i++) {
3254
- cbs[i].apply(vm, args);
3327
+ function proxy (vm, key) {
3328
+ if (!isReserved(key)) {
3329
+ Object.defineProperty(vm, key, {
3330
+ configurable: true,
3331
+ enumerable: true,
3332
+ get: function proxyGetter () {
3333
+ return vm._data[key]
3334
+ },
3335
+ set: function proxySetter (val) {
3336
+ vm._data[key] = val;
3255
3337
  }
3256
- }
3257
- return vm
3258
- };
3338
+ });
3339
+ }
3259
3340
  }
3260
3341
 
3261
3342
  /* */
@@ -3290,10 +3371,13 @@ function initMixin (Vue) {
3290
3371
  vm._self = vm;
3291
3372
  initLifecycle(vm);
3292
3373
  initEvents(vm);
3374
+ initRender(vm);
3293
3375
  callHook(vm, 'beforeCreate');
3294
3376
  initState(vm);
3295
3377
  callHook(vm, 'created');
3296
- initRender(vm);
3378
+ if (vm.$options.el) {
3379
+ vm.$mount(vm.$options.el);
3380
+ }
3297
3381
  };
3298
3382
  }
3299
3383
 
@@ -3486,6 +3570,10 @@ function initAssetRegisters (Vue) {
3486
3570
 
3487
3571
  var patternTypes = [String, RegExp];
3488
3572
 
3573
+ function getComponentName (opts) {
3574
+ return opts && (opts.Ctor.options.name || opts.tag)
3575
+ }
3576
+
3489
3577
  function matches (pattern, name) {
3490
3578
  if (typeof pattern === 'string') {
3491
3579
  return pattern.split(',').indexOf(name) > -1
@@ -3494,22 +3582,64 @@ function matches (pattern, name) {
3494
3582
  }
3495
3583
  }
3496
3584
 
3585
+ function pruneCache (cache, filter) {
3586
+ for (var key in cache) {
3587
+ var cachedNode = cache[key];
3588
+ if (cachedNode) {
3589
+ var name = getComponentName(cachedNode.componentOptions);
3590
+ if (name && !filter(name)) {
3591
+ pruneCacheEntry(cachedNode);
3592
+ cache[key] = null;
3593
+ }
3594
+ }
3595
+ }
3596
+ }
3597
+
3598
+ function pruneCacheEntry (vnode) {
3599
+ if (vnode) {
3600
+ if (!vnode.componentInstance._inactive) {
3601
+ callHook(vnode.componentInstance, 'deactivated');
3602
+ }
3603
+ vnode.componentInstance.$destroy();
3604
+ }
3605
+ }
3606
+
3497
3607
  var KeepAlive = {
3498
3608
  name: 'keep-alive',
3499
3609
  abstract: true,
3610
+
3500
3611
  props: {
3501
3612
  include: patternTypes,
3502
3613
  exclude: patternTypes
3503
3614
  },
3615
+
3504
3616
  created: function created () {
3505
3617
  this.cache = Object.create(null);
3506
3618
  },
3619
+
3620
+ destroyed: function destroyed () {
3621
+ var this$1 = this;
3622
+
3623
+ for (var key in this.cache) {
3624
+ pruneCacheEntry(this$1.cache[key]);
3625
+ }
3626
+ },
3627
+
3628
+ watch: {
3629
+ include: function include (val) {
3630
+ pruneCache(this.cache, function (name) { return matches(val, name); });
3631
+ },
3632
+ exclude: function exclude (val) {
3633
+ pruneCache(this.cache, function (name) { return !matches(val, name); });
3634
+ }
3635
+ },
3636
+
3507
3637
  render: function render () {
3508
3638
  var vnode = getFirstComponentChild(this.$slots.default);
3509
- if (vnode && vnode.componentOptions) {
3510
- var opts = vnode.componentOptions;
3639
+ var componentOptions = vnode && vnode.componentOptions;
3640
+ if (componentOptions) {
3511
3641
  // check pattern
3512
- var name = opts.Ctor.options.name || opts.tag;
3642
+ var name = getComponentName(componentOptions);
3513
3643
  if (name && (
3514
3644
  (this.include && !matches(this.include, name)) ||
3515
3645
  (this.exclude && matches(this.exclude, name))
@@ -3519,25 +3649,16 @@ var KeepAlive = {
3519
3649
  var key = vnode.key == null
3520
3650
  // same constructor may get registered as different local components
3521
3651
  // so cid alone is not enough (#3269)
3522
- ? opts.Ctor.cid + (opts.tag ? ("::" + (opts.tag)) : '')
3652
+ ? componentOptions.Ctor.cid + (componentOptions.tag ? ("::" + (componentOptions.tag)) : '')
3523
3653
  : vnode.key;
3524
3654
  if (this.cache[key]) {
3525
- vnode.child = this.cache[key].child;
3655
+ vnode.componentInstance = this.cache[key].componentInstance;
3526
3656
  } else {
3527
3657
  this.cache[key] = vnode;
3528
3658
  }
3529
3659
  vnode.data.keepAlive = true;
3530
3660
  }
3531
3661
  return vnode
3532
- },
3533
- destroyed: function destroyed () {
3534
- var this$1 = this;
3535
-
3536
- for (var key in this.cache) {
3537
- var vnode = this$1.cache[key];
3538
- callHook(vnode.child, 'deactivated');
3539
- vnode.child.$destroy();
3540
- }
3541
3662
  }
3542
3663
  };
3543
3664
 
@@ -3587,15 +3708,15 @@ Object.defineProperty(Vue$3.prototype, '$isServer', {
3587
3708
  get: isServerRendering
3588
3709
  });
3589
3710
 
3590
- Vue$3.version = '2.1.6';
3711
+ Vue$3.version = '2.1.10';
3591
3712
 
3592
3713
  /* */
3593
3714
 
3594
3715
  // attributes that should be using props for binding
3595
3716
  var acceptValue = makeMap('input,textarea,option,select');
3596
- var mustUseProp = function (tag, attr) {
3717
+ var mustUseProp = function (tag, type, attr) {
3597
3718
  return (
3598
- (attr === 'value' && acceptValue(tag)) ||
3719
+ (attr === 'value' && acceptValue(tag)) && type !== 'button' ||
3599
3720
  (attr === 'selected' && tag === 'option') ||
3600
3721
  (attr === 'checked' && tag === 'input') ||
3601
3722
  (attr === 'muted' && tag === 'video')
@@ -3633,8 +3754,8 @@ function genClassForVnode (vnode) {
3633
3754
  var data = vnode.data;
3634
3755
  var parentNode = vnode;
3635
3756
  var childNode = vnode;
3636
- while (childNode.child) {
3637
- childNode = childNode.child._vnode;
3757
+ while (childNode.componentInstance) {
3758
+ childNode = childNode.componentInstance._vnode;
3638
3759
  if (childNode.data) {
3639
3760
  data = mergeClassData(childNode.data, data);
3640
3761
  }
@@ -3703,8 +3824,7 @@ function stringifyClass (value) {
3703
3824
 
3704
3825
  var namespaceMap = {
3705
3826
  svg: 'http://www.w3.org/2000/svg',
3706
- math: 'http://www.w3.org/1998/Math/MathML',
3707
- xhtml: 'http://www.w3.org/1999/xhtml'
3827
+ math: 'http://www.w3.org/1998/Math/MathML'
3708
3828
  };
3709
3829
 
3710
3830
  var isHTMLTag = makeMap(
@@ -3851,18 +3971,18 @@ function setAttribute (node, key, val) {
3851
3971
 
3852
3972
 
3853
3973
  var nodeOps = Object.freeze({
3854
- createElement: createElement$1,
3855
- createElementNS: createElementNS,
3856
- createTextNode: createTextNode,
3857
- createComment: createComment,
3858
- insertBefore: insertBefore,
3859
- removeChild: removeChild,
3860
- appendChild: appendChild,
3861
- parentNode: parentNode,
3862
- nextSibling: nextSibling,
3863
- tagName: tagName,
3864
- setTextContent: setTextContent,
3865
- setAttribute: setAttribute
3974
+ createElement: createElement$1,
3975
+ createElementNS: createElementNS,
3976
+ createTextNode: createTextNode,
3977
+ createComment: createComment,
3978
+ insertBefore: insertBefore,
3979
+ removeChild: removeChild,
3980
+ appendChild: appendChild,
3981
+ parentNode: parentNode,
3982
+ nextSibling: nextSibling,
3983
+ tagName: tagName,
3984
+ setTextContent: setTextContent,
3985
+ setAttribute: setAttribute
3866
3986
  });
3867
3987
 
3868
3988
  /* */
@@ -3887,7 +4007,7 @@ function registerRef (vnode, isRemoval) {
3887
4007
  if (!key) { return }
3888
4008
 
3889
4009
  var vm = vnode.context;
3890
- var ref = vnode.child || vnode.elm;
4010
+ var ref = vnode.componentInstance || vnode.elm;
3891
4011
  var refs = vm.$refs;
3892
4012
  if (isRemoval) {
3893
4013
  if (Array.isArray(refs[key])) {
@@ -3974,16 +4094,16 @@ function createPatchFunction (backend) {
3974
4094
  function createRmCb (childElm, listeners) {
3975
4095
  function remove$$1 () {
3976
4096
  if (--remove$$1.listeners === 0) {
3977
- removeElement(childElm);
4097
+ removeNode(childElm);
3978
4098
  }
3979
4099
  }
3980
4100
  remove$$1.listeners = listeners;
3981
4101
  return remove$$1
3982
4102
  }
3983
4103
 
3984
- function removeElement (el) {
4104
+ function removeNode (el) {
3985
4105
  var parent = nodeOps.parentNode(el);
3986
- // element may have already been removed due to v-html
4106
+ // element may have already been removed due to v-html / v-text
3987
4107
  if (parent) {
3988
4108
  nodeOps.removeChild(parent, el);
3989
4109
  }
@@ -4007,7 +4127,7 @@ function createPatchFunction (backend) {
4007
4127
  if (
4008
4128
  !inPre &&
4009
4129
  !vnode.ns &&
4010
- !(config.ignoredElements && config.ignoredElements.indexOf(tag) > -1) &&
4130
+ !(config.ignoredElements.length && config.ignoredElements.indexOf(tag) > -1) &&
4011
4131
  config.isUnknownElement(tag)
4012
4132
  ) {
4013
4133
  warn(
@@ -4047,7 +4167,7 @@ function createPatchFunction (backend) {
4047
4167
  function createComponent (vnode, insertedVnodeQueue, parentElm, refElm) {
4048
4168
  var i = vnode.data;
4049
4169
  if (isDef(i)) {
4050
- var isReactivated = isDef(vnode.child) && i.keepAlive;
4170
+ var isReactivated = isDef(vnode.componentInstance) && i.keepAlive;
4051
4171
  if (isDef(i = i.hook) && isDef(i = i.init)) {
4052
4172
  i(vnode, false /* hydrating */, parentElm, refElm);
4053
4173
  }
@@ -4055,7 +4175,7 @@ function createPatchFunction (backend) {
4055
4175
  // it should've created a child instance and mounted it. the child
4056
4176
  // component also has set the placeholder vnode's elm.
4057
4177
  // in that case we can just return the element and be done.
4058
- if (isDef(vnode.child)) {
4178
+ if (isDef(vnode.componentInstance)) {
4059
4179
  initComponent(vnode, insertedVnodeQueue);
4060
4180
  if (isReactivated) {
4061
4181
  reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm);
@@ -4065,6 +4185,23 @@ function createPatchFunction (backend) {
4065
4185
  }
4066
4186
  }
4067
4187
 
4188
+ function initComponent (vnode, insertedVnodeQueue) {
4189
+ if (vnode.data.pendingInsert) {
4190
+ insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert);
4191
+ }
4192
+ vnode.elm = vnode.componentInstance.$el;
4193
+ if (isPatchable(vnode)) {
4194
+ invokeCreateHooks(vnode, insertedVnodeQueue);
4195
+ setScope(vnode);
4196
+ } else {
4197
+ // empty component root.
4198
+ // skip all element-related modules except for ref (#3455)
4199
+ registerRef(vnode);
4200
+ // make sure to invoke the insert hook
4201
+ insertedVnodeQueue.push(vnode);
4202
+ }
4203
+ }
4204
+
4068
4205
  function reactivateComponent (vnode, insertedVnodeQueue, parentElm, refElm) {
4069
4206
  var i;
4070
4207
  // hack for #4339: a reactivated component with inner transition
@@ -4072,8 +4209,8 @@ function createPatchFunction (backend) {
4072
4209
  // again. It's not ideal to involve module-specific logic in here but
4073
4210
  // there doesn't seem to be a better way to do it.
4074
4211
  var innerNode = vnode;
4075
- while (innerNode.child) {
4076
- innerNode = innerNode.child._vnode;
4212
+ while (innerNode.componentInstance) {
4213
+ innerNode = innerNode.componentInstance._vnode;
4077
4214
  if (isDef(i = innerNode.data) && isDef(i = i.transition)) {
4078
4215
  for (i = 0; i < cbs.activate.length; ++i) {
4079
4216
  cbs.activate[i](emptyNode, innerNode);
@@ -4108,8 +4245,8 @@ function createPatchFunction (backend) {
4108
4245
  }
4109
4246
 
4110
4247
  function isPatchable (vnode) {
4111
- while (vnode.child) {
4112
- vnode = vnode.child._vnode;
4248
+ while (vnode.componentInstance) {
4249
+ vnode = vnode.componentInstance._vnode;
4113
4250
  }
4114
4251
  return isDef(vnode.tag)
4115
4252
  }
@@ -4125,23 +4262,6 @@ function createPatchFunction (backend) {
4125
4262
  }
4126
4263
  }
4127
4264
 
4128
- function initComponent (vnode, insertedVnodeQueue) {
4129
- if (vnode.data.pendingInsert) {
4130
- insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert);
4131
- }
4132
- vnode.elm = vnode.child.$el;
4133
- if (isPatchable(vnode)) {
4134
- invokeCreateHooks(vnode, insertedVnodeQueue);
4135
- setScope(vnode);
4136
- } else {
4137
- // empty component root.
4138
- // skip all element-related modules except for ref (#3455)
4139
- registerRef(vnode);
4140
- // make sure to invoke the insert hook
4141
- insertedVnodeQueue.push(vnode);
4142
- }
4143
- }
4144
-
4145
4265
  // set scope id attribute for scoped CSS.
4146
4266
  // this is implemented as a special case to avoid the overhead
4147
4267
  // of going through the normal attribute patching process.
@@ -4185,7 +4305,7 @@ function createPatchFunction (backend) {
4185
4305
  removeAndInvokeRemoveHook(ch);
4186
4306
  invokeDestroyHook(ch);
4187
4307
  } else { // Text node
4188
- nodeOps.removeChild(parentElm, ch.elm);
4308
+ removeNode(ch.elm);
4189
4309
  }
4190
4310
  }
4191
4311
  }
@@ -4203,7 +4323,7 @@ function createPatchFunction (backend) {
4203
4323
  rm.listeners += listeners;
4204
4324
  }
4205
4325
  // recursively invoke hooks on child component root node
4206
- if (isDef(i = vnode.child) && isDef(i = i._vnode) && isDef(i.data)) {
4326
+ if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) {
4207
4327
  removeAndInvokeRemoveHook(i, rm);
4208
4328
  }
4209
4329
  for (i = 0; i < cbs.remove.length; ++i) {
@@ -4215,7 +4335,7 @@ function createPatchFunction (backend) {
4215
4335
  rm();
4216
4336
  }
4217
4337
  } else {
4218
- removeElement(vnode.elm);
4338
+ removeNode(vnode.elm);
4219
4339
  }
4220
4340
  }
4221
4341
 
@@ -4307,7 +4427,7 @@ function createPatchFunction (backend) {
4307
4427
  vnode.key === oldVnode.key &&
4308
4428
  (vnode.isCloned || vnode.isOnce)) {
4309
4429
  vnode.elm = oldVnode.elm;
4310
- vnode.child = oldVnode.child;
4430
+ vnode.componentInstance = oldVnode.componentInstance;
4311
4431
  return
4312
4432
  }
4313
4433
  var i;
@@ -4372,7 +4492,7 @@ function createPatchFunction (backend) {
4372
4492
  var children = vnode.children;
4373
4493
  if (isDef(data)) {
4374
4494
  if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); }
4375
- if (isDef(i = vnode.child)) {
4495
+ if (isDef(i = vnode.componentInstance)) {
4376
4496
  // child component. it should have hydrated its own tree.
4377
4497
  initComponent(vnode, insertedVnodeQueue);
4378
4498
  return true
@@ -4415,6 +4535,8 @@ function createPatchFunction (backend) {
4415
4535
  }
4416
4536
  }
4417
4537
  }
4538
+ } else if (elm.data !== vnode.text) {
4539
+ elm.data = vnode.text;
4418
4540
  }
4419
4541
  return true
4420
4542
  }
@@ -4426,7 +4548,7 @@ function createPatchFunction (backend) {
4426
4548
  vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase())
4427
4549
  )
4428
4550
  } else {
4429
- return _toString(vnode.text) === node.data
4551
+ return node.nodeType === (vnode.isComment ? 8 : 3)
4430
4552
  }
4431
4553
  }
4432
4554
 
@@ -4436,7 +4558,6 @@ function createPatchFunction (backend) {
4436
4558
  return
4437
4559
  }
4438
4560
 
4439
- var elm, parent;
4440
4561
  var isInitialPatch = false;
4441
4562
  var insertedVnodeQueue = [];
4442
4563
 
@@ -4476,11 +4597,18 @@ function createPatchFunction (backend) {
4476
4597
  // create an empty node and replace it
4477
4598
  oldVnode = emptyNodeAt(oldVnode);
4478
4599
  }
4479
-
4480
4600
  // replacing existing element
4481
- elm = oldVnode.elm;
4482
- parent = nodeOps.parentNode(elm);
4483
- createElm(vnode, insertedVnodeQueue, parent, nodeOps.nextSibling(elm));
4601
+ var oldElm = oldVnode.elm;
4602
+ var parentElm$1 = nodeOps.parentNode(oldElm);
4603
+ createElm(
4604
+ vnode,
4605
+ insertedVnodeQueue,
4606
+ // extremely rare edge case: do not insert if old element is in a
4607
+ // leaving transition. Only happens when combining transition +
4608
+ // keep-alive + HOCs. (#4590)
4609
+ oldElm._leaveCb ? null : parentElm$1,
4610
+ nodeOps.nextSibling(oldElm)
4611
+ );
4484
4612
 
4485
4613
  if (vnode.parent) {
4486
4614
  // component root element replaced.
@@ -4497,8 +4625,8 @@ function createPatchFunction (backend) {
4497
4625
  }
4498
4626
  }
4499
4627
 
4500
- if (parent !== null) {
4501
- removeVnodes(parent, [oldVnode], 0, 0);
4628
+ if (parentElm$1 !== null) {
4629
+ removeVnodes(parentElm$1, [oldVnode], 0, 0);
4502
4630
  } else if (isDef(oldVnode.tag)) {
4503
4631
  invokeDestroyHook(oldVnode);
4504
4632
  }
@@ -4528,6 +4656,7 @@ function updateDirectives (oldVnode, vnode) {
4528
4656
 
4529
4657
  function _update (oldVnode, vnode) {
4530
4658
  var isCreate = oldVnode === emptyNode;
4659
+ var isDestroy = vnode === emptyNode;
4531
4660
  var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);
4532
4661
  var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);
4533
4662
 
@@ -4579,7 +4708,7 @@ function _update (oldVnode, vnode) {
4579
4708
  for (key in oldDirs) {
4580
4709
  if (!newDirs[key]) {
4581
4710
  // no longer present, unbind
4582
- callHook$1(oldDirs[key], 'unbind', oldVnode);
4711
+ callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);
4583
4712
  }
4584
4713
  }
4585
4714
  }
@@ -4611,10 +4740,10 @@ function getRawDirName (dir) {
4611
4740
  return dir.rawName || ((dir.name) + "." + (Object.keys(dir.modifiers || {}).join('.')))
4612
4741
  }
4613
4742
 
4614
- function callHook$1 (dir, hook, vnode, oldVnode) {
4743
+ function callHook$1 (dir, hook, vnode, oldVnode, isDestroy) {
4615
4744
  var fn = dir.def && dir.def[hook];
4616
4745
  if (fn) {
4617
- fn(vnode.elm, dir, vnode, oldVnode);
4746
+ fn(vnode.elm, dir, vnode, oldVnode, isDestroy);
4618
4747
  }
4619
4748
  }
4620
4749
 
@@ -4725,23 +4854,34 @@ var klass = {
4725
4854
 
4726
4855
  /* */
4727
4856
 
4728
- var target;
4857
+ var target$1;
4729
4858
 
4730
- function add$1 (event, handler, once, capture) {
4859
+ function add$2 (
4860
+ event,
4861
+ handler,
4862
+ once,
4863
+ capture
4864
+ ) {
4731
4865
  if (once) {
4732
4866
  var oldHandler = handler;
4867
+ var _target = target$1; // save current target element in closure
4733
4868
  handler = function (ev) {
4734
- remove$2(event, handler, capture);
4869
+ remove$3(event, handler, capture, _target);
4735
4870
  arguments.length === 1
4736
4871
  ? oldHandler(ev)
4737
4872
  : oldHandler.apply(null, arguments);
4738
4873
  };
4739
4874
  }
4740
- target.addEventListener(event, handler, capture);
4875
+ target$1.addEventListener(event, handler, capture);
4741
4876
  }
4742
4877
 
4743
- function remove$2 (event, handler, capture) {
4744
- target.removeEventListener(event, handler, capture);
4878
+ function remove$3 (
4879
+ event,
4880
+ handler,
4881
+ capture,
4882
+ _target
4883
+ ) {
4884
+ (_target || target$1).removeEventListener(event, handler, capture);
4745
4885
  }
4746
4886
 
4747
4887
  function updateDOMListeners (oldVnode, vnode) {
@@ -4750,8 +4890,8 @@ function updateDOMListeners (oldVnode, vnode) {
4750
4890
  }
4751
4891
  var on = vnode.data.on || {};
4752
4892
  var oldOn = oldVnode.data.on || {};
4753
- target = vnode.elm;
4754
- updateListeners(on, oldOn, add$1, remove$2, vnode.context);
4893
+ target$1 = vnode.elm;
4894
+ updateListeners(on, oldOn, add$2, remove$3, vnode.context);
4755
4895
  }
4756
4896
 
4757
4897
  var events = {
@@ -4788,16 +4928,14 @@ function updateDOMProps (oldVnode, vnode) {
4788
4928
  if (vnode.children) { vnode.children.length = 0; }
4789
4929
  if (cur === oldProps[key]) { continue }
4790
4930
  }
4931
+
4791
4932
  if (key === 'value') {
4792
4933
  // store value as _value as well since
4793
4934
  // non-string values will be stringified
4794
4935
  elm._value = cur;
4795
4936
  // avoid resetting cursor position when value is the same
4796
4937
  var strCur = cur == null ? '' : String(cur);
4797
- if (!elm.composing && (
4798
- (document.activeElement !== elm && elm.value !== strCur) ||
4799
- isValueChanged(vnode, strCur)
4800
- )) {
4938
+ if (shouldUpdateValue(elm, vnode, strCur)) {
4801
4939
  elm.value = strCur;
4802
4940
  }
4803
4941
  } else {
@@ -4806,7 +4944,27 @@ function updateDOMProps (oldVnode, vnode) {
4806
4944
  }
4807
4945
  }
4808
4946
 
4809
- function isValueChanged (vnode, newVal) {
4947
+ // check platforms/web/util/attrs.js acceptValue
4948
+
4949
+
4950
+ function shouldUpdateValue (
4951
+ elm,
4952
+ vnode,
4953
+ checkVal
4954
+ ) {
4955
+ return (!elm.composing && (
4956
+ vnode.tag === 'option' ||
4957
+ isDirty(elm, checkVal) ||
4958
+ isInputChanged(vnode, checkVal)
4959
+ ))
4960
+ }
4961
+
4962
+ function isDirty (elm, checkVal) {
4963
+ // return true when textbox (.number and .trim) loses focus and its value is not equal to the updated value
4964
+ return document.activeElement !== elm && elm.value !== checkVal
4965
+ }
4966
+
4967
+ function isInputChanged (vnode, newVal) {
4810
4968
  var value = vnode.elm.value;
4811
4969
  var modifiers = vnode.elm._vModifiers; // injected by v-model runtime
4812
4970
  if ((modifiers && modifiers.number) || vnode.elm.type === 'number') {
@@ -4869,8 +5027,8 @@ function getStyle (vnode, checkChild) {
4869
5027
 
4870
5028
  if (checkChild) {
4871
5029
  var childNode = vnode;
4872
- while (childNode.child) {
4873
- childNode = childNode.child._vnode;
5030
+ while (childNode.componentInstance) {
5031
+ childNode = childNode.componentInstance._vnode;
4874
5032
  if (childNode.data && (styleData = normalizeStyleData(childNode.data))) {
4875
5033
  extend(res, styleData);
4876
5034
  }
@@ -5044,7 +5202,11 @@ if (hasTransition) {
5044
5202
  }
5045
5203
  }
5046
5204
 
5047
- var raf = (inBrowser && window.requestAnimationFrame) || setTimeout;
5205
+ // binding to window is necessary to make hot reload work in IE in strict mode
5206
+ var raf = inBrowser && window.requestAnimationFrame
5207
+ ? window.requestAnimationFrame.bind(window)
5208
+ : setTimeout;
5209
+
5048
5210
  function nextFrame (fn) {
5049
5211
  raf(function () {
5050
5212
  raf(fn);
@@ -5184,8 +5346,10 @@ function enter (vnode, toggleDisplay) {
5184
5346
  var css = data.css;
5185
5347
  var type = data.type;
5186
5348
  var enterClass = data.enterClass;
5349
+ var enterToClass = data.enterToClass;
5187
5350
  var enterActiveClass = data.enterActiveClass;
5188
5351
  var appearClass = data.appearClass;
5352
+ var appearToClass = data.appearToClass;
5189
5353
  var appearActiveClass = data.appearActiveClass;
5190
5354
  var beforeEnter = data.beforeEnter;
5191
5355
  var enter = data.enter;
@@ -5215,6 +5379,7 @@ function enter (vnode, toggleDisplay) {
5215
5379
 
5216
5380
  var startClass = isAppear ? appearClass : enterClass;
5217
5381
  var activeClass = isAppear ? appearActiveClass : enterActiveClass;
5382
+ var toClass = isAppear ? appearToClass : enterToClass;
5218
5383
  var beforeEnterHook = isAppear ? (beforeAppear || beforeEnter) : beforeEnter;
5219
5384
  var enterHook = isAppear ? (typeof appear === 'function' ? appear : enter) : enter;
5220
5385
  var afterEnterHook = isAppear ? (afterAppear || afterEnter) : afterEnter;
@@ -5229,6 +5394,7 @@ function enter (vnode, toggleDisplay) {
5229
5394
 
5230
5395
  var cb = el._enterCb = once(function () {
5231
5396
  if (expectsCSS) {
5397
+ removeTransitionClass(el, toClass);
5232
5398
  removeTransitionClass(el, activeClass);
5233
5399
  }
5234
5400
  if (cb.cancelled) {
@@ -5248,7 +5414,6 @@ function enter (vnode, toggleDisplay) {
5248
5414
  var parent = el.parentNode;
5249
5415
  var pendingNode = parent && parent._pending && parent._pending[vnode.key];
5250
5416
  if (pendingNode &&
5251
- pendingNode.context === vnode.context &&
5252
5417
  pendingNode.tag === vnode.tag &&
5253
5418
  pendingNode.elm._leaveCb) {
5254
5419
  pendingNode.elm._leaveCb();
@@ -5263,6 +5428,7 @@ function enter (vnode, toggleDisplay) {
5263
5428
  addTransitionClass(el, startClass);
5264
5429
  addTransitionClass(el, activeClass);
5265
5430
  nextFrame(function () {
5431
+ addTransitionClass(el, toClass);
5266
5432
  removeTransitionClass(el, startClass);
5267
5433
  if (!cb.cancelled && !userWantsControl) {
5268
5434
  whenTransitionEnds(el, type, cb);
@@ -5302,6 +5468,7 @@ function leave (vnode, rm) {
5302
5468
  var css = data.css;
5303
5469
  var type = data.type;
5304
5470
  var leaveClass = data.leaveClass;
5471
+ var leaveToClass = data.leaveToClass;
5305
5472
  var leaveActiveClass = data.leaveActiveClass;
5306
5473
  var beforeLeave = data.beforeLeave;
5307
5474
  var leave = data.leave;
@@ -5321,6 +5488,7 @@ function leave (vnode, rm) {
5321
5488
  el.parentNode._pending[vnode.key] = null;
5322
5489
  }
5323
5490
  if (expectsCSS) {
5491
+ removeTransitionClass(el, leaveToClass);
5324
5492
  removeTransitionClass(el, leaveActiveClass);
5325
5493
  }
5326
5494
  if (cb.cancelled) {
@@ -5355,6 +5523,7 @@ function leave (vnode, rm) {
5355
5523
  addTransitionClass(el, leaveClass);
5356
5524
  addTransitionClass(el, leaveActiveClass);
5357
5525
  nextFrame(function () {
5526
+ addTransitionClass(el, leaveToClass);
5358
5527
  removeTransitionClass(el, leaveClass);
5359
5528
  if (!cb.cancelled && !userWantsControl) {
5360
5529
  whenTransitionEnds(el, type, cb);
@@ -5390,6 +5559,9 @@ var autoCssTransition = cached(function (name) {
5390
5559
  enterClass: (name + "-enter"),
5391
5560
  leaveClass: (name + "-leave"),
5392
5561
  appearClass: (name + "-enter"),
5562
+ enterToClass: (name + "-enter-to"),
5563
+ leaveToClass: (name + "-leave-to"),
5564
+ appearToClass: (name + "-enter-to"),
5393
5565
  enterActiveClass: (name + "-enter-active"),
5394
5566
  leaveActiveClass: (name + "-leave-active"),
5395
5567
  appearActiveClass: (name + "-enter-active")
@@ -5579,8 +5751,8 @@ function trigger (el, type) {
5579
5751
 
5580
5752
  // recursively search for possible transition defined inside the component root
5581
5753
  function locateNode (vnode) {
5582
- return vnode.child && (!vnode.data || !vnode.data.transition)
5583
- ? locateNode(vnode.child._vnode)
5754
+ return vnode.componentInstance && (!vnode.data || !vnode.data.transition)
5755
+ ? locateNode(vnode.componentInstance._vnode)
5584
5756
  : vnode
5585
5757
  }
5586
5758
 
@@ -5601,6 +5773,7 @@ var show = {
5601
5773
  el.style.display = value ? originalDisplay : 'none';
5602
5774
  }
5603
5775
  },
5776
+
5604
5777
  update: function update (el, ref, vnode) {
5605
5778
  var value = ref.value;
5606
5779
  var oldValue = ref.oldValue;
@@ -5623,6 +5796,18 @@ var show = {
5623
5796
  } else {
5624
5797
  el.style.display = value ? el.__vOriginalDisplay : 'none';
5625
5798
  }
5799
+ },
5800
+
5801
+ unbind: function unbind (
5802
+ el,
5803
+ binding,
5804
+ vnode,
5805
+ oldVnode,
5806
+ isDestroy
5807
+ ) {
5808
+ if (!isDestroy) {
5809
+ el.style.display = el.__vOriginalDisplay;
5810
+ }
5626
5811
  }
5627
5812
  };
5628
5813
 
@@ -5644,10 +5829,13 @@ var transitionProps = {
5644
5829
  type: String,
5645
5830
  enterClass: String,
5646
5831
  leaveClass: String,
5832
+ enterToClass: String,
5833
+ leaveToClass: String,
5647
5834
  enterActiveClass: String,
5648
5835
  leaveActiveClass: String,
5649
5836
  appearClass: String,
5650
- appearActiveClass: String
5837
+ appearActiveClass: String,
5838
+ appearToClass: String
5651
5839
  };
5652
5840
 
5653
5841
  // in case the child is also an abstract component, e.g. <keep-alive>
@@ -5691,10 +5879,15 @@ function hasParentTransition (vnode) {
5691
5879
  }
5692
5880
  }
5693
5881
 
5882
+ function isSameChild (child, oldChild) {
5883
+ return oldChild.key === child.key && oldChild.tag === child.tag
5884
+ }
5885
+
5694
5886
  var Transition = {
5695
5887
  name: 'transition',
5696
5888
  props: transitionProps,
5697
5889
  abstract: true,
5890
+
5698
5891
  render: function render (h) {
5699
5892
  var this$1 = this;
5700
5893
 
@@ -5750,9 +5943,15 @@ var Transition = {
5750
5943
  return placeholder(h, rawChild)
5751
5944
  }
5752
5945
 
5753
- var key = child.key = child.key == null || child.isStatic
5754
- ? ("__v" + (child.tag + this._uid) + "__")
5755
- : child.key;
5946
+ // ensure a key that is unique to the vnode type and to this transition
5947
+ // component instance. This key will be used to remove pending leaving nodes
5948
+ // during entering.
5949
+ var id = "__transition-" + (this._uid) + "-";
5950
+ var key = child.key = child.key == null
5951
+ ? id + child.tag
5952
+ : isPrimitive(child.key)
5953
+ ? (String(child.key).indexOf(id) === 0 ? child.key : id + child.key)
5954
+ : child.key;
5756
5955
  var data = (child.data || (child.data = {})).transition = extractTransitionData(this);
5757
5956
  var oldRawChild = this._vnode;
5758
5957
  var oldChild = getRealChild(oldRawChild);
@@ -5763,11 +5962,10 @@ var Transition = {
5763
5962
  child.data.show = true;
5764
5963
  }
5765
5964
 
5766
- if (oldChild && oldChild.data && oldChild.key !== key) {
5965
+ if (oldChild && oldChild.data && !isSameChild(child, oldChild)) {
5767
5966
  // replace old child transition data with fresh one
5768
5967
  // important for dynamic transitions!
5769
- var oldData = oldChild.data.transition = extend({}, data);
5770
-
5968
+ var oldData = oldChild && (oldChild.data.transition = extend({}, data));
5771
5969
  // handle transition mode
5772
5970
  if (mode === 'out-in') {
5773
5971
  // return placeholder node and queue update when leave finishes
@@ -5978,6 +6176,15 @@ Vue$3.prototype.$mount = function (
5978
6176
  return this._mount(el, hydrating)
5979
6177
  };
5980
6178
 
6179
+ if ("development" !== 'production' &&
6180
+ inBrowser && typeof console !== 'undefined') {
6181
+ console[console.info ? 'info' : 'log'](
6182
+ "You are running Vue in development mode.\n" +
6183
+ "Make sure to turn on production mode when deploying for production.\n" +
6184
+ "See more tips at https://vuejs.org/guide/deployment.html"
6185
+ );
6186
+ }
6187
+
5981
6188
  // devtools global hook
5982
6189
  /* istanbul ignore next */
5983
6190
  setTimeout(function () {
@@ -5988,8 +6195,8 @@ setTimeout(function () {
5988
6195
  "development" !== 'production' &&
5989
6196
  inBrowser && !isEdge && /Chrome\/\d+/.test(window.navigator.userAgent)
5990
6197
  ) {
5991
- console.log(
5992
- 'Download the Vue Devtools for a better development experience:\n' +
6198
+ console[console.info ? 'info' : 'log'](
6199
+ 'Download the Vue Devtools extension for a better development experience:\n' +
5993
6200
  'https://github.com/vuejs/vue-devtools'
5994
6201
  );
5995
6202
  }
@@ -6091,22 +6298,6 @@ var IS_REGEX_CAPTURING_BROKEN = false;
6091
6298
 
6092
6299
  // Special Elements (can contain anything)
6093
6300
  var isScriptOrStyle = makeMap('script,style', true);
6094
- var hasLang = function (attr) { return attr.name === 'lang' && attr.value !== 'html'; };
6095
- var isSpecialTag = function (tag, isSFC, stack) {
6096
- if (isScriptOrStyle(tag)) {
6097
- return true
6098
- }
6099
- if (isSFC && stack.length === 1) {
6100
- // top-level template that has no pre-processor
6101
- if (tag === 'template' && !stack[0].attrs.some(hasLang)) {
6102
- return false
6103
- } else {
6104
- return true
6105
- }
6106
- }
6107
- return false
6108
- };
6109
-
6110
6301
  var reCache = {};
6111
6302
 
6112
6303
  var ltRE = /&lt;/g;
@@ -6135,7 +6326,7 @@ function parseHTML (html, options) {
6135
6326
  while (html) {
6136
6327
  last = html;
6137
6328
  // Make sure we're not in a script or style element
6138
- if (!lastTag || !isSpecialTag(lastTag, options.sfc, stack)) {
6329
+ if (!lastTag || !isScriptOrStyle(lastTag)) {
6139
6330
  var textEnd = html.indexOf('<');
6140
6331
  if (textEnd === 0) {
6141
6332
  // Comment:
@@ -6170,7 +6361,7 @@ function parseHTML (html, options) {
6170
6361
  if (endTagMatch) {
6171
6362
  var curIndex = index;
6172
6363
  advance(endTagMatch[0].length);
6173
- parseEndTag(endTagMatch[0], endTagMatch[1], curIndex, index);
6364
+ parseEndTag(endTagMatch[1], curIndex, index);
6174
6365
  continue
6175
6366
  }
6176
6367
 
@@ -6227,7 +6418,7 @@ function parseHTML (html, options) {
6227
6418
  });
6228
6419
  index += html.length - rest.length;
6229
6420
  html = rest;
6230
- parseEndTag('</' + stackedTag + '>', stackedTag, index - endTagLength, index);
6421
+ parseEndTag(stackedTag, index - endTagLength, index);
6231
6422
  }
6232
6423
 
6233
6424
  if (html === last && options.chars) {
@@ -6273,10 +6464,10 @@ function parseHTML (html, options) {
6273
6464
 
6274
6465
  if (expectHTML) {
6275
6466
  if (lastTag === 'p' && isNonPhrasingTag(tagName)) {
6276
- parseEndTag('', lastTag);
6467
+ parseEndTag(lastTag);
6277
6468
  }
6278
6469
  if (canBeLeftOpenTag(tagName) && lastTag === tagName) {
6279
- parseEndTag('', tagName);
6470
+ parseEndTag(tagName);
6280
6471
  }
6281
6472
  }
6282
6473
 
@@ -6303,7 +6494,7 @@ function parseHTML (html, options) {
6303
6494
  }
6304
6495
 
6305
6496
  if (!unary) {
6306
- stack.push({ tag: tagName, attrs: attrs });
6497
+ stack.push({ tag: tagName, lowerCasedTag: tagName.toLowerCase(), attrs: attrs });
6307
6498
  lastTag = tagName;
6308
6499
  unarySlash = '';
6309
6500
  }
@@ -6313,16 +6504,19 @@ function parseHTML (html, options) {
6313
6504
  }
6314
6505
  }
6315
6506
 
6316
- function parseEndTag (tag, tagName, start, end) {
6317
- var pos;
6507
+ function parseEndTag (tagName, start, end) {
6508
+ var pos, lowerCasedTagName;
6318
6509
  if (start == null) { start = index; }
6319
6510
  if (end == null) { end = index; }
6320
6511
 
6512
+ if (tagName) {
6513
+ lowerCasedTagName = tagName.toLowerCase();
6514
+ }
6515
+
6321
6516
  // Find the closest opened tag of the same type
6322
6517
  if (tagName) {
6323
- var needle = tagName.toLowerCase();
6324
6518
  for (pos = stack.length - 1; pos >= 0; pos--) {
6325
- if (stack[pos].tag.toLowerCase() === needle) {
6519
+ if (stack[pos].lowerCasedTag === lowerCasedTagName) {
6326
6520
  break
6327
6521
  }
6328
6522
  }
@@ -6342,11 +6536,11 @@ function parseHTML (html, options) {
6342
6536
  // Remove the open elements from the stack
6343
6537
  stack.length = pos;
6344
6538
  lastTag = pos && stack[pos - 1].tag;
6345
- } else if (tagName.toLowerCase() === 'br') {
6539
+ } else if (lowerCasedTagName === 'br') {
6346
6540
  if (options.start) {
6347
6541
  options.start(tagName, [], true, start, end);
6348
6542
  }
6349
- } else if (tagName.toLowerCase() === 'p') {
6543
+ } else if (lowerCasedTagName === 'p') {
6350
6544
  if (options.start) {
6351
6545
  options.start(tagName, [], false, start, end);
6352
6546
  }
@@ -6456,7 +6650,7 @@ function wrapFilter (exp, filter) {
6456
6650
  /* */
6457
6651
 
6458
6652
  var defaultTagRE = /\{\{((?:.|\n)+?)\}\}/g;
6459
- var regexEscapeRE = /[-.*+?^${}()|[\]/\\]/g;
6653
+ var regexEscapeRE = /[-.*+?^${}()|[\]\/\\]/g;
6460
6654
 
6461
6655
  var buildRegex = cached(function (delimiters) {
6462
6656
  var open = delimiters[0].replace(regexEscapeRE, '\\$&');
@@ -6758,7 +6952,7 @@ function parse (
6758
6952
  "development" !== 'production' && warn$1(
6759
6953
  'Templates should only be responsible for mapping the state to the ' +
6760
6954
  'UI. Avoid placing tags with side-effects in your templates, such as ' +
6761
- "<" + tag + ">."
6955
+ "<" + tag + ">" + ', as they will not be parsed.'
6762
6956
  );
6763
6957
  }
6764
6958
 
@@ -6895,19 +7089,20 @@ function parse (
6895
7089
  currentParent.attrsMap.placeholder === text) {
6896
7090
  return
6897
7091
  }
7092
+ var children = currentParent.children;
6898
7093
  text = inPre || text.trim()
6899
7094
  ? decodeHTMLCached(text)
6900
7095
  // only preserve whitespace if its not right after a starting tag
6901
- : preserveWhitespace && currentParent.children.length ? ' ' : '';
7096
+ : preserveWhitespace && children.length ? ' ' : '';
6902
7097
  if (text) {
6903
7098
  var expression;
6904
7099
  if (!inVPre && text !== ' ' && (expression = parseText(text, delimiters))) {
6905
- currentParent.children.push({
7100
+ children.push({
6906
7101
  type: 2,
6907
7102
  expression: expression,
6908
7103
  text: text
6909
7104
  });
6910
- } else {
7105
+ } else if (text !== ' ' || children[children.length - 1].text !== ' ') {
6911
7106
  currentParent.children.push({
6912
7107
  type: 3,
6913
7108
  text: text
@@ -7018,6 +7213,23 @@ function processIfConditions (el, parent) {
7018
7213
  }
7019
7214
  }
7020
7215
 
7216
+ function findPrevElement (children) {
7217
+ var i = children.length;
7218
+ while (i--) {
7219
+ if (children[i].type === 1) {
7220
+ return children[i]
7221
+ } else {
7222
+ if ("development" !== 'production' && children[i].text !== ' ') {
7223
+ warn$1(
7224
+ "text \"" + (children[i].text.trim()) + "\" between v-if and v-else(-if) " +
7225
+ "will be ignored."
7226
+ );
7227
+ }
7228
+ children.pop();
7229
+ }
7230
+ }
7231
+ }
7232
+
7021
7233
  function addIfCondition (el, condition) {
7022
7234
  if (!el.ifConditions) {
7023
7235
  el.ifConditions = [];
@@ -7091,7 +7303,7 @@ function processAttrs (el) {
7091
7303
  name = camelize(name);
7092
7304
  }
7093
7305
  }
7094
- if (isProp || platformMustUseProp(el.tag, name)) {
7306
+ if (isProp || platformMustUseProp(el.tag, el.attrsMap.type, name)) {
7095
7307
  addProp(el, name, value);
7096
7308
  } else {
7097
7309
  addAttr(el, name, value);
@@ -7160,13 +7372,6 @@ function makeAttrsMap (attrs) {
7160
7372
  return map
7161
7373
  }
7162
7374
 
7163
- function findPrevElement (children) {
7164
- var i = children.length;
7165
- while (i--) {
7166
- if (children[i].tag) { return children[i] }
7167
- }
7168
- }
7169
-
7170
7375
  function isForbiddenTag (el) {
7171
7376
  return (
7172
7377
  el.tag === 'style' ||
@@ -7420,6 +7625,8 @@ function bind$2 (el, dir) {
7420
7625
  };
7421
7626
  }
7422
7627
 
7628
+ /* */
7629
+
7423
7630
  var baseDirectives = {
7424
7631
  bind: bind$2,
7425
7632
  cloak: noop
@@ -7432,6 +7639,7 @@ var warn$2;
7432
7639
  var transforms$1;
7433
7640
  var dataGenFns;
7434
7641
  var platformDirectives$1;
7642
+ var isPlatformReservedTag$1;
7435
7643
  var staticRenderFns;
7436
7644
  var onceCount;
7437
7645
  var currentOptions;
@@ -7450,6 +7658,7 @@ function generate (
7450
7658
  transforms$1 = pluckModuleFunction(options.modules, 'transformCode');
7451
7659
  dataGenFns = pluckModuleFunction(options.modules, 'genData');
7452
7660
  platformDirectives$1 = options.directives || {};
7661
+ isPlatformReservedTag$1 = options.isReservedTag || no;
7453
7662
  var code = ast ? genElement(ast) : '_c("div")';
7454
7663
  staticRenderFns = prevStaticRenderFns;
7455
7664
  onceCount = prevOnceCount;
@@ -7689,25 +7898,43 @@ function genChildren (el, checkSkip) {
7689
7898
  el$1.tag !== 'slot') {
7690
7899
  return genElement(el$1)
7691
7900
  }
7901
+ var normalizationType = getNormalizationType(children);
7692
7902
  return ("[" + (children.map(genNode).join(',')) + "]" + (checkSkip
7693
- ? canSkipNormalization(children) ? '' : ',true'
7903
+ ? normalizationType ? ("," + normalizationType) : ''
7694
7904
  : ''))
7695
7905
  }
7696
7906
  }
7697
7907
 
7698
- function canSkipNormalization (children) {
7908
+ // determine the normalization needed for the children array.
7909
+ // 0: no normalization needed
7910
+ // 1: simple normalization needed (possible 1-level deep nested array)
7911
+ // 2: full normalization needed
7912
+ function getNormalizationType (children) {
7913
+ var res = 0;
7699
7914
  for (var i = 0; i < children.length; i++) {
7700
7915
  var el = children[i];
7916
+ if (el.type !== 1) {
7917
+ continue
7918
+ }
7701
7919
  if (needsNormalization(el) ||
7702
- (el.if && el.ifConditions.some(function (c) { return needsNormalization(c.block); }))) {
7703
- return false
7920
+ (el.ifConditions && el.ifConditions.some(function (c) { return needsNormalization(c.block); }))) {
7921
+ res = 2;
7922
+ break
7923
+ }
7924
+ if (maybeComponent(el) ||
7925
+ (el.ifConditions && el.ifConditions.some(function (c) { return maybeComponent(c.block); }))) {
7926
+ res = 1;
7704
7927
  }
7705
7928
  }
7706
- return true
7929
+ return res
7707
7930
  }
7708
7931
 
7709
7932
  function needsNormalization (el) {
7710
- return el.for || el.tag === 'template' || el.tag === 'slot'
7933
+ return el.for !== undefined || el.tag === 'template' || el.tag === 'slot'
7934
+ }
7935
+
7936
+ function maybeComponent (el) {
7937
+ return !isPlatformReservedTag$1(el.tag)
7711
7938
  }
7712
7939
 
7713
7940
  function genNode (node) {
@@ -7727,7 +7954,19 @@ function genText (text) {
7727
7954
  function genSlot (el) {
7728
7955
  var slotName = el.slotName || '"default"';
7729
7956
  var children = genChildren(el);
7730
- return ("_t(" + slotName + (children ? ("," + children) : '') + (el.attrs ? ((children ? '' : ',null') + ",{" + (el.attrs.map(function (a) { return ((camelize(a.name)) + ":" + (a.value)); }).join(',')) + "}") : '') + ")")
7957
+ var res = "_t(" + slotName + (children ? ("," + children) : '');
7958
+ var attrs = el.attrs && ("{" + (el.attrs.map(function (a) { return ((camelize(a.name)) + ":" + (a.value)); }).join(',')) + "}");
7959
+ var bind$$1 = el.attrsMap['v-bind'];
7960
+ if ((attrs || bind$$1) && !children) {
7961
+ res += ",null";
7962
+ }
7963
+ if (attrs) {
7964
+ res += "," + attrs;
7965
+ }
7966
+ if (bind$$1) {
7967
+ res += (attrs ? '' : ',null') + "," + bind$$1;
7968
+ }
7969
+ return res + ')'
7731
7970
  }
7732
7971
 
7733
7972
  // componentName is el.component, take it as argument to shun flow's pessimistic refinement
@@ -7992,10 +8231,13 @@ function genCheckboxModel (
7992
8231
  var falseValueBinding = getBindingAttr(el, 'false-value') || 'false';
7993
8232
  addProp(el, 'checked',
7994
8233
  "Array.isArray(" + value + ")" +
7995
- "?_i(" + value + "," + valueBinding + ")>-1" +
7996
- ":_q(" + value + "," + trueValueBinding + ")"
8234
+ "?_i(" + value + "," + valueBinding + ")>-1" + (
8235
+ trueValueBinding === 'true'
8236
+ ? (":(" + value + ")")
8237
+ : (":_q(" + value + "," + trueValueBinding + ")")
8238
+ )
7997
8239
  );
7998
- addHandler(el, 'change',
8240
+ addHandler(el, 'click',
7999
8241
  "var $$a=" + value + "," +
8000
8242
  '$$el=$event.target,' +
8001
8243
  "$$c=$$el.checked?(" + trueValueBinding + "):(" + falseValueBinding + ");" +
@@ -8026,7 +8268,7 @@ function genRadioModel (
8026
8268
  var valueBinding = getBindingAttr(el, 'value') || 'null';
8027
8269
  valueBinding = number ? ("_n(" + valueBinding + ")") : valueBinding;
8028
8270
  addProp(el, 'checked', ("_q(" + value + "," + valueBinding + ")"));
8029
- addHandler(el, 'change', genAssignmentCode(value, valueBinding), null, true);
8271
+ addHandler(el, 'click', genAssignmentCode(value, valueBinding), null, true);
8030
8272
  }
8031
8273
 
8032
8274
  function genDefaultModel (