vuejs 1.0.17 → 1.0.18.pre

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vue.js v1.0.17
2
+ * Vue.js v1.0.18
3
3
  * (c) 2016 Evan You
4
4
  * Released under the MIT License.
5
5
  */
@@ -289,7 +289,7 @@
289
289
  var isArray = Array.isArray;
290
290
 
291
291
  /**
292
- * Define a non-enumerable property
292
+ * Define a property.
293
293
  *
294
294
  * @param {Object} obj
295
295
  * @param {String} key
@@ -909,6 +909,13 @@ var text = Object.freeze({
909
909
 
910
910
  warnExpressionErrors: true,
911
911
 
912
+ /**
913
+ * Whether to allow devtools inspection.
914
+ * Disabled by default in production builds.
915
+ */
916
+
917
+ devtools: 'development' !== 'production',
918
+
912
919
  /**
913
920
  * Internal flag to indicate the delimiters have been
914
921
  * changed.
@@ -1493,830 +1500,863 @@ var transition = Object.freeze({
1493
1500
  }
1494
1501
  }
1495
1502
 
1496
- var commonTagRE = /^(div|p|span|img|a|b|i|br|ul|ol|li|h1|h2|h3|h4|h5|h6|code|pre|table|th|td|tr|form|label|input|select|option|nav|article|section|header|footer)$/;
1497
- var reservedTagRE = /^(slot|partial|component)$/;
1498
-
1499
- var isUnknownElement = undefined;
1500
- if ('development' !== 'production') {
1501
- isUnknownElement = function (el, tag) {
1502
- if (tag.indexOf('-') > -1) {
1503
- // http://stackoverflow.com/a/28210364/1070244
1504
- return el.constructor === window.HTMLUnknownElement || el.constructor === window.HTMLElement;
1505
- } else {
1506
- return (/HTMLUnknownElement/.test(el.toString()) &&
1507
- // Chrome returns unknown for several HTML5 elements.
1508
- // https://code.google.com/p/chromium/issues/detail?id=540526
1509
- !/^(data|time|rtc|rb)$/.test(tag)
1510
- );
1511
- }
1512
- };
1513
- }
1503
+ var uid$1 = 0;
1514
1504
 
1515
1505
  /**
1516
- * Check if an element is a component, if yes return its
1517
- * component id.
1506
+ * A dep is an observable that can have multiple
1507
+ * directives subscribing to it.
1518
1508
  *
1519
- * @param {Element} el
1520
- * @param {Object} options
1521
- * @return {Object|undefined}
1509
+ * @constructor
1522
1510
  */
1523
-
1524
- function checkComponentAttr(el, options) {
1525
- var tag = el.tagName.toLowerCase();
1526
- var hasAttrs = el.hasAttributes();
1527
- if (!commonTagRE.test(tag) && !reservedTagRE.test(tag)) {
1528
- if (resolveAsset(options, 'components', tag)) {
1529
- return { id: tag };
1530
- } else {
1531
- var is = hasAttrs && getIsBinding(el);
1532
- if (is) {
1533
- return is;
1534
- } else if ('development' !== 'production') {
1535
- var expectedTag = options._componentNameMap && options._componentNameMap[tag];
1536
- if (expectedTag) {
1537
- warn('Unknown custom element: <' + tag + '> - ' + 'did you mean <' + expectedTag + '>? ' + 'HTML is case-insensitive, remember to use kebab-case in templates.');
1538
- } else if (isUnknownElement(el, tag)) {
1539
- warn('Unknown custom element: <' + tag + '> - did you ' + 'register the component correctly? For recursive components, ' + 'make sure to provide the "name" option.');
1540
- }
1541
- }
1542
- }
1543
- } else if (hasAttrs) {
1544
- return getIsBinding(el);
1545
- }
1511
+ function Dep() {
1512
+ this.id = uid$1++;
1513
+ this.subs = [];
1546
1514
  }
1547
1515
 
1516
+ // the current target watcher being evaluated.
1517
+ // this is globally unique because there could be only one
1518
+ // watcher being evaluated at any time.
1519
+ Dep.target = null;
1520
+
1548
1521
  /**
1549
- * Get "is" binding from an element.
1522
+ * Add a directive subscriber.
1550
1523
  *
1551
- * @param {Element} el
1552
- * @return {Object|undefined}
1524
+ * @param {Directive} sub
1553
1525
  */
1554
1526
 
1555
- function getIsBinding(el) {
1556
- // dynamic syntax
1557
- var exp = getAttr(el, 'is');
1558
- if (exp != null) {
1559
- return { id: exp };
1560
- } else {
1561
- exp = getBindAttr(el, 'is');
1562
- if (exp != null) {
1563
- return { id: exp, dynamic: true };
1564
- }
1565
- }
1566
- }
1527
+ Dep.prototype.addSub = function (sub) {
1528
+ this.subs.push(sub);
1529
+ };
1567
1530
 
1568
1531
  /**
1569
- * Set a prop's initial value on a vm and its data object.
1532
+ * Remove a directive subscriber.
1570
1533
  *
1571
- * @param {Vue} vm
1572
- * @param {Object} prop
1573
- * @param {*} value
1534
+ * @param {Directive} sub
1574
1535
  */
1575
1536
 
1576
- function initProp(vm, prop, value) {
1577
- var key = prop.path;
1578
- value = coerceProp(prop, value);
1579
- vm[key] = vm._data[key] = assertProp(prop, value) ? value : undefined;
1580
- }
1537
+ Dep.prototype.removeSub = function (sub) {
1538
+ this.subs.$remove(sub);
1539
+ };
1581
1540
 
1582
1541
  /**
1583
- * Assert whether a prop is valid.
1584
- *
1585
- * @param {Object} prop
1586
- * @param {*} value
1542
+ * Add self as a dependency to the target watcher.
1587
1543
  */
1588
1544
 
1589
- function assertProp(prop, value) {
1590
- if (!prop.options.required && ( // non-required
1591
- prop.raw === null || // abscent
1592
- value == null) // null or undefined
1593
- ) {
1594
- return true;
1595
- }
1596
- var options = prop.options;
1597
- var type = options.type;
1598
- var valid = true;
1599
- var expectedType;
1600
- if (type) {
1601
- if (type === String) {
1602
- expectedType = 'string';
1603
- valid = typeof value === expectedType;
1604
- } else if (type === Number) {
1605
- expectedType = 'number';
1606
- valid = typeof value === 'number';
1607
- } else if (type === Boolean) {
1608
- expectedType = 'boolean';
1609
- valid = typeof value === 'boolean';
1610
- } else if (type === Function) {
1611
- expectedType = 'function';
1612
- valid = typeof value === 'function';
1613
- } else if (type === Object) {
1614
- expectedType = 'object';
1615
- valid = isPlainObject(value);
1616
- } else if (type === Array) {
1617
- expectedType = 'array';
1618
- valid = isArray(value);
1619
- } else {
1620
- valid = value instanceof type;
1621
- }
1622
- }
1623
- if (!valid) {
1624
- 'development' !== 'production' && warn('Invalid prop: type check failed for ' + prop.path + '="' + prop.raw + '".' + ' Expected ' + formatType(expectedType) + ', got ' + formatValue(value) + '.');
1625
- return false;
1626
- }
1627
- var validator = options.validator;
1628
- if (validator) {
1629
- if (!validator(value)) {
1630
- 'development' !== 'production' && warn('Invalid prop: custom validator check failed for ' + prop.path + '="' + prop.raw + '"');
1631
- return false;
1632
- }
1633
- }
1634
- return true;
1635
- }
1545
+ Dep.prototype.depend = function () {
1546
+ Dep.target.addDep(this);
1547
+ };
1636
1548
 
1637
1549
  /**
1638
- * Force parsing value with coerce option.
1639
- *
1640
- * @param {*} value
1641
- * @param {Object} options
1642
- * @return {*}
1550
+ * Notify all subscribers of a new value.
1643
1551
  */
1644
1552
 
1645
- function coerceProp(prop, value) {
1646
- var coerce = prop.options.coerce;
1647
- if (!coerce) {
1648
- return value;
1553
+ Dep.prototype.notify = function () {
1554
+ // stablize the subscriber list first
1555
+ var subs = toArray(this.subs);
1556
+ for (var i = 0, l = subs.length; i < l; i++) {
1557
+ subs[i].update();
1649
1558
  }
1650
- // coerce is a function
1651
- return coerce(value);
1652
- }
1653
-
1654
- function formatType(val) {
1655
- return val ? val.charAt(0).toUpperCase() + val.slice(1) : 'custom type';
1656
- }
1559
+ };
1657
1560
 
1658
- function formatValue(val) {
1659
- return Object.prototype.toString.call(val).slice(8, -1);
1660
- }
1561
+ var arrayProto = Array.prototype;
1562
+ var arrayMethods = Object.create(arrayProto)
1661
1563
 
1662
1564
  /**
1663
- * Option overwriting strategies are functions that handle
1664
- * how to merge a parent option value and a child option
1665
- * value into the final value.
1666
- *
1667
- * All strategy functions follow the same signature:
1668
- *
1669
- * @param {*} parentVal
1670
- * @param {*} childVal
1671
- * @param {Vue} [vm]
1565
+ * Intercept mutating methods and emit events
1672
1566
  */
1673
1567
 
1674
- var strats = config.optionMergeStrategies = Object.create(null);
1568
+ ;['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].forEach(function (method) {
1569
+ // cache original method
1570
+ var original = arrayProto[method];
1571
+ def(arrayMethods, method, function mutator() {
1572
+ // avoid leaking arguments:
1573
+ // http://jsperf.com/closure-with-arguments
1574
+ var i = arguments.length;
1575
+ var args = new Array(i);
1576
+ while (i--) {
1577
+ args[i] = arguments[i];
1578
+ }
1579
+ var result = original.apply(this, args);
1580
+ var ob = this.__ob__;
1581
+ var inserted;
1582
+ switch (method) {
1583
+ case 'push':
1584
+ inserted = args;
1585
+ break;
1586
+ case 'unshift':
1587
+ inserted = args;
1588
+ break;
1589
+ case 'splice':
1590
+ inserted = args.slice(2);
1591
+ break;
1592
+ }
1593
+ if (inserted) ob.observeArray(inserted);
1594
+ // notify change
1595
+ ob.dep.notify();
1596
+ return result;
1597
+ });
1598
+ });
1675
1599
 
1676
1600
  /**
1677
- * Helper that recursively merges two data objects together.
1601
+ * Swap the element at the given index with a new value
1602
+ * and emits corresponding event.
1603
+ *
1604
+ * @param {Number} index
1605
+ * @param {*} val
1606
+ * @return {*} - replaced element
1678
1607
  */
1679
1608
 
1680
- function mergeData(to, from) {
1681
- var key, toVal, fromVal;
1682
- for (key in from) {
1683
- toVal = to[key];
1684
- fromVal = from[key];
1685
- if (!hasOwn(to, key)) {
1686
- set(to, key, fromVal);
1687
- } else if (isObject(toVal) && isObject(fromVal)) {
1688
- mergeData(toVal, fromVal);
1689
- }
1609
+ def(arrayProto, '$set', function $set(index, val) {
1610
+ if (index >= this.length) {
1611
+ this.length = Number(index) + 1;
1690
1612
  }
1691
- return to;
1692
- }
1613
+ return this.splice(index, 1, val)[0];
1614
+ });
1693
1615
 
1694
1616
  /**
1695
- * Data
1617
+ * Convenience method to remove the element at given index.
1618
+ *
1619
+ * @param {Number} index
1620
+ * @param {*} val
1696
1621
  */
1697
1622
 
1698
- strats.data = function (parentVal, childVal, vm) {
1699
- if (!vm) {
1700
- // in a Vue.extend merge, both should be functions
1701
- if (!childVal) {
1702
- return parentVal;
1703
- }
1704
- if (typeof childVal !== 'function') {
1705
- 'development' !== 'production' && warn('The "data" option should be a function ' + 'that returns a per-instance value in component ' + 'definitions.');
1706
- return parentVal;
1707
- }
1708
- if (!parentVal) {
1709
- return childVal;
1710
- }
1711
- // when parentVal & childVal are both present,
1712
- // we need to return a function that returns the
1713
- // merged result of both functions... no need to
1714
- // check if parentVal is a function here because
1715
- // it has to be a function to pass previous merges.
1716
- return function mergedDataFn() {
1717
- return mergeData(childVal.call(this), parentVal.call(this));
1718
- };
1719
- } else if (parentVal || childVal) {
1720
- return function mergedInstanceDataFn() {
1721
- // instance merge
1722
- var instanceData = typeof childVal === 'function' ? childVal.call(vm) : childVal;
1723
- var defaultData = typeof parentVal === 'function' ? parentVal.call(vm) : undefined;
1724
- if (instanceData) {
1725
- return mergeData(instanceData, defaultData);
1726
- } else {
1727
- return defaultData;
1728
- }
1729
- };
1623
+ def(arrayProto, '$remove', function $remove(item) {
1624
+ /* istanbul ignore if */
1625
+ if (!this.length) return;
1626
+ var index = indexOf(this, item);
1627
+ if (index > -1) {
1628
+ return this.splice(index, 1);
1730
1629
  }
1731
- };
1630
+ });
1631
+
1632
+ var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
1732
1633
 
1733
1634
  /**
1734
- * El
1635
+ * Observer class that are attached to each observed
1636
+ * object. Once attached, the observer converts target
1637
+ * object's property keys into getter/setters that
1638
+ * collect dependencies and dispatches updates.
1639
+ *
1640
+ * @param {Array|Object} value
1641
+ * @constructor
1735
1642
  */
1736
1643
 
1737
- strats.el = function (parentVal, childVal, vm) {
1738
- if (!vm && childVal && typeof childVal !== 'function') {
1739
- 'development' !== 'production' && warn('The "el" option should be a function ' + 'that returns a per-instance value in component ' + 'definitions.');
1740
- return;
1644
+ function Observer(value) {
1645
+ this.value = value;
1646
+ this.dep = new Dep();
1647
+ def(value, '__ob__', this);
1648
+ if (isArray(value)) {
1649
+ var augment = hasProto ? protoAugment : copyAugment;
1650
+ augment(value, arrayMethods, arrayKeys);
1651
+ this.observeArray(value);
1652
+ } else {
1653
+ this.walk(value);
1741
1654
  }
1742
- var ret = childVal || parentVal;
1743
- // invoke the element factory if this is instance merge
1744
- return vm && typeof ret === 'function' ? ret.call(vm) : ret;
1745
- };
1655
+ }
1656
+
1657
+ // Instance methods
1746
1658
 
1747
1659
  /**
1748
- * Hooks and param attributes are merged as arrays.
1660
+ * Walk through each property and convert them into
1661
+ * getter/setters. This method should only be called when
1662
+ * value type is Object.
1663
+ *
1664
+ * @param {Object} obj
1749
1665
  */
1750
1666
 
1751
- strats.init = strats.created = strats.ready = strats.attached = strats.detached = strats.beforeCompile = strats.compiled = strats.beforeDestroy = strats.destroyed = strats.activate = function (parentVal, childVal) {
1752
- return childVal ? parentVal ? parentVal.concat(childVal) : isArray(childVal) ? childVal : [childVal] : parentVal;
1667
+ Observer.prototype.walk = function (obj) {
1668
+ var keys = Object.keys(obj);
1669
+ for (var i = 0, l = keys.length; i < l; i++) {
1670
+ this.convert(keys[i], obj[keys[i]]);
1671
+ }
1753
1672
  };
1754
1673
 
1755
1674
  /**
1756
- * 0.11 deprecation warning
1675
+ * Observe a list of Array items.
1676
+ *
1677
+ * @param {Array} items
1757
1678
  */
1758
1679
 
1759
- strats.paramAttributes = function () {
1760
- /* istanbul ignore next */
1761
- 'development' !== 'production' && warn('"paramAttributes" option has been deprecated in 0.12. ' + 'Use "props" instead.');
1680
+ Observer.prototype.observeArray = function (items) {
1681
+ for (var i = 0, l = items.length; i < l; i++) {
1682
+ observe(items[i]);
1683
+ }
1762
1684
  };
1763
1685
 
1764
1686
  /**
1765
- * Assets
1687
+ * Convert a property into getter/setter so we can emit
1688
+ * the events when the property is accessed/changed.
1766
1689
  *
1767
- * When a vm is present (instance creation), we need to do
1768
- * a three-way merge between constructor options, instance
1769
- * options and parent options.
1690
+ * @param {String} key
1691
+ * @param {*} val
1770
1692
  */
1771
1693
 
1772
- function mergeAssets(parentVal, childVal) {
1773
- var res = Object.create(parentVal);
1774
- return childVal ? extend(res, guardArrayAssets(childVal)) : res;
1775
- }
1776
-
1777
- config._assetTypes.forEach(function (type) {
1778
- strats[type + 's'] = mergeAssets;
1779
- });
1694
+ Observer.prototype.convert = function (key, val) {
1695
+ defineReactive(this.value, key, val);
1696
+ };
1780
1697
 
1781
1698
  /**
1782
- * Events & Watchers.
1699
+ * Add an owner vm, so that when $set/$delete mutations
1700
+ * happen we can notify owner vms to proxy the keys and
1701
+ * digest the watchers. This is only called when the object
1702
+ * is observed as an instance's root $data.
1783
1703
  *
1784
- * Events & watchers hashes should not overwrite one
1785
- * another, so we merge them as arrays.
1704
+ * @param {Vue} vm
1786
1705
  */
1787
1706
 
1788
- strats.watch = strats.events = function (parentVal, childVal) {
1789
- if (!childVal) return parentVal;
1790
- if (!parentVal) return childVal;
1791
- var ret = {};
1792
- extend(ret, parentVal);
1793
- for (var key in childVal) {
1794
- var parent = ret[key];
1795
- var child = childVal[key];
1796
- if (parent && !isArray(parent)) {
1797
- parent = [parent];
1798
- }
1799
- ret[key] = parent ? parent.concat(child) : [child];
1800
- }
1801
- return ret;
1707
+ Observer.prototype.addVm = function (vm) {
1708
+ (this.vms || (this.vms = [])).push(vm);
1802
1709
  };
1803
1710
 
1804
1711
  /**
1805
- * Other object hashes.
1712
+ * Remove an owner vm. This is called when the object is
1713
+ * swapped out as an instance's $data object.
1714
+ *
1715
+ * @param {Vue} vm
1806
1716
  */
1807
1717
 
1808
- strats.props = strats.methods = strats.computed = function (parentVal, childVal) {
1809
- if (!childVal) return parentVal;
1810
- if (!parentVal) return childVal;
1811
- var ret = Object.create(null);
1812
- extend(ret, parentVal);
1813
- extend(ret, childVal);
1814
- return ret;
1718
+ Observer.prototype.removeVm = function (vm) {
1719
+ this.vms.$remove(vm);
1815
1720
  };
1816
1721
 
1722
+ // helpers
1723
+
1817
1724
  /**
1818
- * Default strategy.
1725
+ * Augment an target Object or Array by intercepting
1726
+ * the prototype chain using __proto__
1727
+ *
1728
+ * @param {Object|Array} target
1729
+ * @param {Object} proto
1819
1730
  */
1820
1731
 
1821
- var defaultStrat = function defaultStrat(parentVal, childVal) {
1822
- return childVal === undefined ? parentVal : childVal;
1823
- };
1732
+ function protoAugment(target, src) {
1733
+ /* eslint-disable no-proto */
1734
+ target.__proto__ = src;
1735
+ /* eslint-enable no-proto */
1736
+ }
1824
1737
 
1825
1738
  /**
1826
- * Make sure component options get converted to actual
1827
- * constructors.
1739
+ * Augment an target Object or Array by defining
1740
+ * hidden properties.
1828
1741
  *
1829
- * @param {Object} options
1742
+ * @param {Object|Array} target
1743
+ * @param {Object} proto
1830
1744
  */
1831
1745
 
1832
- function guardComponents(options) {
1833
- if (options.components) {
1834
- var components = options.components = guardArrayAssets(options.components);
1835
- var ids = Object.keys(components);
1836
- var def;
1837
- if ('development' !== 'production') {
1838
- var map = options._componentNameMap = {};
1839
- }
1840
- for (var i = 0, l = ids.length; i < l; i++) {
1841
- var key = ids[i];
1842
- if (commonTagRE.test(key) || reservedTagRE.test(key)) {
1843
- 'development' !== 'production' && warn('Do not use built-in or reserved HTML elements as component ' + 'id: ' + key);
1844
- continue;
1845
- }
1846
- // record a all lowercase <-> kebab-case mapping for
1847
- // possible custom element case error warning
1848
- if ('development' !== 'production') {
1849
- map[key.replace(/-/g, '').toLowerCase()] = hyphenate(key);
1850
- }
1851
- def = components[key];
1852
- if (isPlainObject(def)) {
1853
- components[key] = Vue.extend(def);
1854
- }
1855
- }
1746
+ function copyAugment(target, src, keys) {
1747
+ for (var i = 0, l = keys.length; i < l; i++) {
1748
+ var key = keys[i];
1749
+ def(target, key, src[key]);
1856
1750
  }
1857
1751
  }
1858
1752
 
1859
1753
  /**
1860
- * Ensure all props option syntax are normalized into the
1861
- * Object-based format.
1754
+ * Attempt to create an observer instance for a value,
1755
+ * returns the new observer if successfully observed,
1756
+ * or the existing observer if the value already has one.
1862
1757
  *
1863
- * @param {Object} options
1758
+ * @param {*} value
1759
+ * @param {Vue} [vm]
1760
+ * @return {Observer|undefined}
1761
+ * @static
1864
1762
  */
1865
1763
 
1866
- function guardProps(options) {
1867
- var props = options.props;
1868
- var i, val;
1869
- if (isArray(props)) {
1870
- options.props = {};
1871
- i = props.length;
1872
- while (i--) {
1873
- val = props[i];
1874
- if (typeof val === 'string') {
1875
- options.props[val] = null;
1876
- } else if (val.name) {
1877
- options.props[val.name] = val;
1878
- }
1879
- }
1880
- } else if (isPlainObject(props)) {
1881
- var keys = Object.keys(props);
1882
- i = keys.length;
1883
- while (i--) {
1884
- val = props[keys[i]];
1885
- if (typeof val === 'function') {
1886
- props[keys[i]] = { type: val };
1887
- }
1888
- }
1764
+ function observe(value, vm) {
1765
+ if (!value || typeof value !== 'object') {
1766
+ return;
1767
+ }
1768
+ var ob;
1769
+ if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
1770
+ ob = value.__ob__;
1771
+ } else if ((isArray(value) || isPlainObject(value)) && Object.isExtensible(value) && !value._isVue) {
1772
+ ob = new Observer(value);
1889
1773
  }
1774
+ if (ob && vm) {
1775
+ ob.addVm(vm);
1776
+ }
1777
+ return ob;
1890
1778
  }
1891
1779
 
1892
1780
  /**
1893
- * Guard an Array-format assets option and converted it
1894
- * into the key-value Object format.
1781
+ * Define a reactive property on an Object.
1895
1782
  *
1896
- * @param {Object|Array} assets
1897
- * @return {Object}
1783
+ * @param {Object} obj
1784
+ * @param {String} key
1785
+ * @param {*} val
1786
+ * @param {Boolean} doNotObserve
1898
1787
  */
1899
1788
 
1900
- function guardArrayAssets(assets) {
1901
- if (isArray(assets)) {
1902
- var res = {};
1903
- var i = assets.length;
1904
- var asset;
1905
- while (i--) {
1906
- asset = assets[i];
1907
- var id = typeof asset === 'function' ? asset.options && asset.options.name || asset.id : asset.name || asset.id;
1908
- if (!id) {
1909
- 'development' !== 'production' && warn('Array-syntax assets must provide a "name" or "id" field.');
1789
+ function defineReactive(obj, key, val, doNotObserve) {
1790
+ var dep = new Dep();
1791
+
1792
+ var property = Object.getOwnPropertyDescriptor(obj, key);
1793
+ if (property && property.configurable === false) {
1794
+ return;
1795
+ }
1796
+
1797
+ // cater for pre-defined getter/setters
1798
+ var getter = property && property.get;
1799
+ var setter = property && property.set;
1800
+
1801
+ // if doNotObserve is true, only use the child value observer
1802
+ // if it already exists, and do not attempt to create it.
1803
+ // this allows freezing a large object from the root and
1804
+ // avoid unnecessary observation inside v-for fragments.
1805
+ var childOb = doNotObserve ? isObject(val) && val.__ob__ : observe(val);
1806
+ Object.defineProperty(obj, key, {
1807
+ enumerable: true,
1808
+ configurable: true,
1809
+ get: function reactiveGetter() {
1810
+ var value = getter ? getter.call(obj) : val;
1811
+ if (Dep.target) {
1812
+ dep.depend();
1813
+ if (childOb) {
1814
+ childOb.dep.depend();
1815
+ }
1816
+ if (isArray(value)) {
1817
+ for (var e, i = 0, l = value.length; i < l; i++) {
1818
+ e = value[i];
1819
+ e && e.__ob__ && e.__ob__.dep.depend();
1820
+ }
1821
+ }
1822
+ }
1823
+ return value;
1824
+ },
1825
+ set: function reactiveSetter(newVal) {
1826
+ var value = getter ? getter.call(obj) : val;
1827
+ if (newVal === value) {
1828
+ return;
1829
+ }
1830
+ if (setter) {
1831
+ setter.call(obj, newVal);
1910
1832
  } else {
1911
- res[id] = asset;
1833
+ val = newVal;
1912
1834
  }
1835
+ childOb = doNotObserve ? isObject(newVal) && newVal.__ob__ : observe(newVal);
1836
+ dep.notify();
1913
1837
  }
1914
- return res;
1915
- }
1916
- return assets;
1838
+ });
1839
+ }
1840
+
1841
+ var commonTagRE = /^(div|p|span|img|a|b|i|br|ul|ol|li|h1|h2|h3|h4|h5|h6|code|pre|table|th|td|tr|form|label|input|select|option|nav|article|section|header|footer)$/i;
1842
+ var reservedTagRE = /^(slot|partial|component)$/i;
1843
+
1844
+ var isUnknownElement = undefined;
1845
+ if ('development' !== 'production') {
1846
+ isUnknownElement = function (el, tag) {
1847
+ if (tag.indexOf('-') > -1) {
1848
+ // http://stackoverflow.com/a/28210364/1070244
1849
+ return el.constructor === window.HTMLUnknownElement || el.constructor === window.HTMLElement;
1850
+ } else {
1851
+ return (/HTMLUnknownElement/.test(el.toString()) &&
1852
+ // Chrome returns unknown for several HTML5 elements.
1853
+ // https://code.google.com/p/chromium/issues/detail?id=540526
1854
+ !/^(data|time|rtc|rb)$/.test(tag)
1855
+ );
1856
+ }
1857
+ };
1917
1858
  }
1918
1859
 
1919
1860
  /**
1920
- * Merge two option objects into a new one.
1921
- * Core utility used in both instantiation and inheritance.
1861
+ * Check if an element is a component, if yes return its
1862
+ * component id.
1922
1863
  *
1923
- * @param {Object} parent
1924
- * @param {Object} child
1925
- * @param {Vue} [vm] - if vm is present, indicates this is
1926
- * an instantiation merge.
1864
+ * @param {Element} el
1865
+ * @param {Object} options
1866
+ * @return {Object|undefined}
1927
1867
  */
1928
1868
 
1929
- function mergeOptions(parent, child, vm) {
1930
- guardComponents(child);
1931
- guardProps(child);
1932
- var options = {};
1933
- var key;
1934
- if (child.mixins) {
1935
- for (var i = 0, l = child.mixins.length; i < l; i++) {
1936
- parent = mergeOptions(parent, child.mixins[i], vm);
1937
- }
1938
- }
1939
- for (key in parent) {
1940
- mergeField(key);
1941
- }
1942
- for (key in child) {
1943
- if (!hasOwn(parent, key)) {
1944
- mergeField(key);
1869
+ function checkComponentAttr(el, options) {
1870
+ var tag = el.tagName.toLowerCase();
1871
+ var hasAttrs = el.hasAttributes();
1872
+ if (!commonTagRE.test(tag) && !reservedTagRE.test(tag)) {
1873
+ if (resolveAsset(options, 'components', tag)) {
1874
+ return { id: tag };
1875
+ } else {
1876
+ var is = hasAttrs && getIsBinding(el);
1877
+ if (is) {
1878
+ return is;
1879
+ } else if ('development' !== 'production') {
1880
+ var expectedTag = options._componentNameMap && options._componentNameMap[tag];
1881
+ if (expectedTag) {
1882
+ warn('Unknown custom element: <' + tag + '> - ' + 'did you mean <' + expectedTag + '>? ' + 'HTML is case-insensitive, remember to use kebab-case in templates.');
1883
+ } else if (isUnknownElement(el, tag)) {
1884
+ warn('Unknown custom element: <' + tag + '> - did you ' + 'register the component correctly? For recursive components, ' + 'make sure to provide the "name" option.');
1885
+ }
1886
+ }
1945
1887
  }
1888
+ } else if (hasAttrs) {
1889
+ return getIsBinding(el);
1946
1890
  }
1947
- function mergeField(key) {
1948
- var strat = strats[key] || defaultStrat;
1949
- options[key] = strat(parent[key], child[key], vm, key);
1950
- }
1951
- return options;
1952
1891
  }
1953
1892
 
1954
1893
  /**
1955
- * Resolve an asset.
1956
- * This function is used because child instances need access
1957
- * to assets defined in its ancestor chain.
1894
+ * Get "is" binding from an element.
1958
1895
  *
1959
- * @param {Object} options
1960
- * @param {String} type
1961
- * @param {String} id
1962
- * @return {Object|Function}
1896
+ * @param {Element} el
1897
+ * @return {Object|undefined}
1963
1898
  */
1964
1899
 
1965
- function resolveAsset(options, type, id) {
1966
- /* istanbul ignore if */
1967
- if (typeof id !== 'string') {
1968
- return;
1900
+ function getIsBinding(el) {
1901
+ // dynamic syntax
1902
+ var exp = getAttr(el, 'is');
1903
+ if (exp != null) {
1904
+ return { id: exp };
1905
+ } else {
1906
+ exp = getBindAttr(el, 'is');
1907
+ if (exp != null) {
1908
+ return { id: exp, dynamic: true };
1909
+ }
1969
1910
  }
1970
- var assets = options[type];
1971
- var camelizedId;
1972
- return assets[id] ||
1973
- // camelCase ID
1974
- assets[camelizedId = camelize(id)] ||
1975
- // Pascal Case ID
1976
- assets[camelizedId.charAt(0).toUpperCase() + camelizedId.slice(1)];
1977
1911
  }
1978
1912
 
1979
1913
  /**
1980
- * Assert asset exists
1914
+ * Set a prop's initial value on a vm and its data object.
1915
+ *
1916
+ * @param {Vue} vm
1917
+ * @param {Object} prop
1918
+ * @param {*} value
1981
1919
  */
1982
1920
 
1983
- function assertAsset(val, type, id) {
1984
- if (!val) {
1985
- 'development' !== 'production' && warn('Failed to resolve ' + type + ': ' + id);
1921
+ function initProp(vm, prop, value) {
1922
+ var key = prop.path;
1923
+ value = coerceProp(prop, value);
1924
+ if (value === undefined) {
1925
+ value = getPropDefaultValue(vm, prop.options);
1926
+ }
1927
+ if (assertProp(prop, value)) {
1928
+ defineReactive(vm, key, value, true /* doNotObserve */);
1986
1929
  }
1987
1930
  }
1988
1931
 
1989
- var uid$1 = 0;
1990
-
1991
1932
  /**
1992
- * A dep is an observable that can have multiple
1993
- * directives subscribing to it.
1933
+ * Get the default value of a prop.
1994
1934
  *
1995
- * @constructor
1935
+ * @param {Vue} vm
1936
+ * @param {Object} options
1937
+ * @return {*}
1996
1938
  */
1997
- function Dep() {
1998
- this.id = uid$1++;
1999
- this.subs = [];
2000
- }
2001
1939
 
2002
- // the current target watcher being evaluated.
2003
- // this is globally unique because there could be only one
2004
- // watcher being evaluated at any time.
2005
- Dep.target = null;
1940
+ function getPropDefaultValue(vm, options) {
1941
+ // no default, return undefined
1942
+ if (!hasOwn(options, 'default')) {
1943
+ // absent boolean value defaults to false
1944
+ return options.type === Boolean ? false : undefined;
1945
+ }
1946
+ var def = options['default'];
1947
+ // warn against non-factory defaults for Object & Array
1948
+ if (isObject(def)) {
1949
+ 'development' !== 'production' && warn('Object/Array as default prop values will be shared ' + 'across multiple instances. Use a factory function ' + 'to return the default value instead.');
1950
+ }
1951
+ // call factory function for non-Function types
1952
+ return typeof def === 'function' && options.type !== Function ? def.call(vm) : def;
1953
+ }
2006
1954
 
2007
1955
  /**
2008
- * Add a directive subscriber.
1956
+ * Assert whether a prop is valid.
2009
1957
  *
2010
- * @param {Directive} sub
1958
+ * @param {Object} prop
1959
+ * @param {*} value
2011
1960
  */
2012
1961
 
2013
- Dep.prototype.addSub = function (sub) {
2014
- this.subs.push(sub);
2015
- };
1962
+ function assertProp(prop, value) {
1963
+ if (!prop.options.required && ( // non-required
1964
+ prop.raw === null || // abscent
1965
+ value == null) // null or undefined
1966
+ ) {
1967
+ return true;
1968
+ }
1969
+ var options = prop.options;
1970
+ var type = options.type;
1971
+ var valid = true;
1972
+ var expectedType;
1973
+ if (type) {
1974
+ if (type === String) {
1975
+ expectedType = 'string';
1976
+ valid = typeof value === expectedType;
1977
+ } else if (type === Number) {
1978
+ expectedType = 'number';
1979
+ valid = typeof value === 'number';
1980
+ } else if (type === Boolean) {
1981
+ expectedType = 'boolean';
1982
+ valid = typeof value === 'boolean';
1983
+ } else if (type === Function) {
1984
+ expectedType = 'function';
1985
+ valid = typeof value === 'function';
1986
+ } else if (type === Object) {
1987
+ expectedType = 'object';
1988
+ valid = isPlainObject(value);
1989
+ } else if (type === Array) {
1990
+ expectedType = 'array';
1991
+ valid = isArray(value);
1992
+ } else {
1993
+ valid = value instanceof type;
1994
+ }
1995
+ }
1996
+ if (!valid) {
1997
+ 'development' !== 'production' && warn('Invalid prop: type check failed for ' + prop.path + '="' + prop.raw + '".' + ' Expected ' + formatType(expectedType) + ', got ' + formatValue(value) + '.');
1998
+ return false;
1999
+ }
2000
+ var validator = options.validator;
2001
+ if (validator) {
2002
+ if (!validator(value)) {
2003
+ 'development' !== 'production' && warn('Invalid prop: custom validator check failed for ' + prop.path + '="' + prop.raw + '"');
2004
+ return false;
2005
+ }
2006
+ }
2007
+ return true;
2008
+ }
2016
2009
 
2017
2010
  /**
2018
- * Remove a directive subscriber.
2011
+ * Force parsing value with coerce option.
2019
2012
  *
2020
- * @param {Directive} sub
2013
+ * @param {*} value
2014
+ * @param {Object} options
2015
+ * @return {*}
2021
2016
  */
2022
2017
 
2023
- Dep.prototype.removeSub = function (sub) {
2024
- this.subs.$remove(sub);
2025
- };
2018
+ function coerceProp(prop, value) {
2019
+ var coerce = prop.options.coerce;
2020
+ if (!coerce) {
2021
+ return value;
2022
+ }
2023
+ // coerce is a function
2024
+ return coerce(value);
2025
+ }
2026
+
2027
+ function formatType(val) {
2028
+ return val ? val.charAt(0).toUpperCase() + val.slice(1) : 'custom type';
2029
+ }
2030
+
2031
+ function formatValue(val) {
2032
+ return Object.prototype.toString.call(val).slice(8, -1);
2033
+ }
2026
2034
 
2027
2035
  /**
2028
- * Add self as a dependency to the target watcher.
2036
+ * Option overwriting strategies are functions that handle
2037
+ * how to merge a parent option value and a child option
2038
+ * value into the final value.
2039
+ *
2040
+ * All strategy functions follow the same signature:
2041
+ *
2042
+ * @param {*} parentVal
2043
+ * @param {*} childVal
2044
+ * @param {Vue} [vm]
2029
2045
  */
2030
2046
 
2031
- Dep.prototype.depend = function () {
2032
- Dep.target.addDep(this);
2033
- };
2047
+ var strats = config.optionMergeStrategies = Object.create(null);
2034
2048
 
2035
2049
  /**
2036
- * Notify all subscribers of a new value.
2050
+ * Helper that recursively merges two data objects together.
2037
2051
  */
2038
2052
 
2039
- Dep.prototype.notify = function () {
2040
- // stablize the subscriber list first
2041
- var subs = toArray(this.subs);
2042
- for (var i = 0, l = subs.length; i < l; i++) {
2043
- subs[i].update();
2053
+ function mergeData(to, from) {
2054
+ var key, toVal, fromVal;
2055
+ for (key in from) {
2056
+ toVal = to[key];
2057
+ fromVal = from[key];
2058
+ if (!hasOwn(to, key)) {
2059
+ set(to, key, fromVal);
2060
+ } else if (isObject(toVal) && isObject(fromVal)) {
2061
+ mergeData(toVal, fromVal);
2062
+ }
2044
2063
  }
2045
- };
2046
-
2047
- var arrayProto = Array.prototype;
2048
- var arrayMethods = Object.create(arrayProto)
2064
+ return to;
2065
+ }
2049
2066
 
2050
2067
  /**
2051
- * Intercept mutating methods and emit events
2068
+ * Data
2052
2069
  */
2053
2070
 
2054
- ;['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].forEach(function (method) {
2055
- // cache original method
2056
- var original = arrayProto[method];
2057
- def(arrayMethods, method, function mutator() {
2058
- // avoid leaking arguments:
2059
- // http://jsperf.com/closure-with-arguments
2060
- var i = arguments.length;
2061
- var args = new Array(i);
2062
- while (i--) {
2063
- args[i] = arguments[i];
2071
+ strats.data = function (parentVal, childVal, vm) {
2072
+ if (!vm) {
2073
+ // in a Vue.extend merge, both should be functions
2074
+ if (!childVal) {
2075
+ return parentVal;
2064
2076
  }
2065
- var result = original.apply(this, args);
2066
- var ob = this.__ob__;
2067
- var inserted;
2068
- switch (method) {
2069
- case 'push':
2070
- inserted = args;
2071
- break;
2072
- case 'unshift':
2073
- inserted = args;
2074
- break;
2075
- case 'splice':
2076
- inserted = args.slice(2);
2077
- break;
2077
+ if (typeof childVal !== 'function') {
2078
+ 'development' !== 'production' && warn('The "data" option should be a function ' + 'that returns a per-instance value in component ' + 'definitions.');
2079
+ return parentVal;
2078
2080
  }
2079
- if (inserted) ob.observeArray(inserted);
2080
- // notify change
2081
- ob.dep.notify();
2082
- return result;
2083
- });
2084
- });
2081
+ if (!parentVal) {
2082
+ return childVal;
2083
+ }
2084
+ // when parentVal & childVal are both present,
2085
+ // we need to return a function that returns the
2086
+ // merged result of both functions... no need to
2087
+ // check if parentVal is a function here because
2088
+ // it has to be a function to pass previous merges.
2089
+ return function mergedDataFn() {
2090
+ return mergeData(childVal.call(this), parentVal.call(this));
2091
+ };
2092
+ } else if (parentVal || childVal) {
2093
+ return function mergedInstanceDataFn() {
2094
+ // instance merge
2095
+ var instanceData = typeof childVal === 'function' ? childVal.call(vm) : childVal;
2096
+ var defaultData = typeof parentVal === 'function' ? parentVal.call(vm) : undefined;
2097
+ if (instanceData) {
2098
+ return mergeData(instanceData, defaultData);
2099
+ } else {
2100
+ return defaultData;
2101
+ }
2102
+ };
2103
+ }
2104
+ };
2085
2105
 
2086
2106
  /**
2087
- * Swap the element at the given index with a new value
2088
- * and emits corresponding event.
2089
- *
2090
- * @param {Number} index
2091
- * @param {*} val
2092
- * @return {*} - replaced element
2107
+ * El
2093
2108
  */
2094
2109
 
2095
- def(arrayProto, '$set', function $set(index, val) {
2096
- if (index >= this.length) {
2097
- this.length = Number(index) + 1;
2110
+ strats.el = function (parentVal, childVal, vm) {
2111
+ if (!vm && childVal && typeof childVal !== 'function') {
2112
+ 'development' !== 'production' && warn('The "el" option should be a function ' + 'that returns a per-instance value in component ' + 'definitions.');
2113
+ return;
2098
2114
  }
2099
- return this.splice(index, 1, val)[0];
2100
- });
2115
+ var ret = childVal || parentVal;
2116
+ // invoke the element factory if this is instance merge
2117
+ return vm && typeof ret === 'function' ? ret.call(vm) : ret;
2118
+ };
2101
2119
 
2102
2120
  /**
2103
- * Convenience method to remove the element at given index.
2104
- *
2105
- * @param {Number} index
2106
- * @param {*} val
2121
+ * Hooks and param attributes are merged as arrays.
2107
2122
  */
2108
2123
 
2109
- def(arrayProto, '$remove', function $remove(item) {
2110
- /* istanbul ignore if */
2111
- if (!this.length) return;
2112
- var index = indexOf(this, item);
2113
- if (index > -1) {
2114
- return this.splice(index, 1);
2115
- }
2116
- });
2117
-
2118
- var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
2124
+ strats.init = strats.created = strats.ready = strats.attached = strats.detached = strats.beforeCompile = strats.compiled = strats.beforeDestroy = strats.destroyed = strats.activate = function (parentVal, childVal) {
2125
+ return childVal ? parentVal ? parentVal.concat(childVal) : isArray(childVal) ? childVal : [childVal] : parentVal;
2126
+ };
2119
2127
 
2120
2128
  /**
2121
- * Observer class that are attached to each observed
2122
- * object. Once attached, the observer converts target
2123
- * object's property keys into getter/setters that
2124
- * collect dependencies and dispatches updates.
2125
- *
2126
- * @param {Array|Object} value
2127
- * @constructor
2129
+ * 0.11 deprecation warning
2128
2130
  */
2129
2131
 
2130
- function Observer(value) {
2131
- this.value = value;
2132
- this.dep = new Dep();
2133
- def(value, '__ob__', this);
2134
- if (isArray(value)) {
2135
- var augment = hasProto ? protoAugment : copyAugment;
2136
- augment(value, arrayMethods, arrayKeys);
2137
- this.observeArray(value);
2138
- } else {
2139
- this.walk(value);
2140
- }
2141
- }
2142
-
2143
- // Instance methods
2132
+ strats.paramAttributes = function () {
2133
+ /* istanbul ignore next */
2134
+ 'development' !== 'production' && warn('"paramAttributes" option has been deprecated in 0.12. ' + 'Use "props" instead.');
2135
+ };
2144
2136
 
2145
2137
  /**
2146
- * Walk through each property and convert them into
2147
- * getter/setters. This method should only be called when
2148
- * value type is Object.
2138
+ * Assets
2149
2139
  *
2150
- * @param {Object} obj
2140
+ * When a vm is present (instance creation), we need to do
2141
+ * a three-way merge between constructor options, instance
2142
+ * options and parent options.
2151
2143
  */
2152
2144
 
2153
- Observer.prototype.walk = function (obj) {
2154
- var keys = Object.keys(obj);
2155
- for (var i = 0, l = keys.length; i < l; i++) {
2156
- this.convert(keys[i], obj[keys[i]]);
2157
- }
2158
- };
2145
+ function mergeAssets(parentVal, childVal) {
2146
+ var res = Object.create(parentVal);
2147
+ return childVal ? extend(res, guardArrayAssets(childVal)) : res;
2148
+ }
2149
+
2150
+ config._assetTypes.forEach(function (type) {
2151
+ strats[type + 's'] = mergeAssets;
2152
+ });
2159
2153
 
2160
2154
  /**
2161
- * Observe a list of Array items.
2155
+ * Events & Watchers.
2162
2156
  *
2163
- * @param {Array} items
2157
+ * Events & watchers hashes should not overwrite one
2158
+ * another, so we merge them as arrays.
2164
2159
  */
2165
2160
 
2166
- Observer.prototype.observeArray = function (items) {
2167
- for (var i = 0, l = items.length; i < l; i++) {
2168
- observe(items[i]);
2161
+ strats.watch = strats.events = function (parentVal, childVal) {
2162
+ if (!childVal) return parentVal;
2163
+ if (!parentVal) return childVal;
2164
+ var ret = {};
2165
+ extend(ret, parentVal);
2166
+ for (var key in childVal) {
2167
+ var parent = ret[key];
2168
+ var child = childVal[key];
2169
+ if (parent && !isArray(parent)) {
2170
+ parent = [parent];
2171
+ }
2172
+ ret[key] = parent ? parent.concat(child) : [child];
2169
2173
  }
2174
+ return ret;
2170
2175
  };
2171
2176
 
2172
2177
  /**
2173
- * Convert a property into getter/setter so we can emit
2174
- * the events when the property is accessed/changed.
2175
- *
2176
- * @param {String} key
2177
- * @param {*} val
2178
+ * Other object hashes.
2178
2179
  */
2179
2180
 
2180
- Observer.prototype.convert = function (key, val) {
2181
- defineReactive(this.value, key, val);
2181
+ strats.props = strats.methods = strats.computed = function (parentVal, childVal) {
2182
+ if (!childVal) return parentVal;
2183
+ if (!parentVal) return childVal;
2184
+ var ret = Object.create(null);
2185
+ extend(ret, parentVal);
2186
+ extend(ret, childVal);
2187
+ return ret;
2182
2188
  };
2183
2189
 
2184
2190
  /**
2185
- * Add an owner vm, so that when $set/$delete mutations
2186
- * happen we can notify owner vms to proxy the keys and
2187
- * digest the watchers. This is only called when the object
2188
- * is observed as an instance's root $data.
2189
- *
2190
- * @param {Vue} vm
2191
+ * Default strategy.
2191
2192
  */
2192
2193
 
2193
- Observer.prototype.addVm = function (vm) {
2194
- (this.vms || (this.vms = [])).push(vm);
2194
+ var defaultStrat = function defaultStrat(parentVal, childVal) {
2195
+ return childVal === undefined ? parentVal : childVal;
2195
2196
  };
2196
2197
 
2197
2198
  /**
2198
- * Remove an owner vm. This is called when the object is
2199
- * swapped out as an instance's $data object.
2199
+ * Make sure component options get converted to actual
2200
+ * constructors.
2200
2201
  *
2201
- * @param {Vue} vm
2202
+ * @param {Object} options
2202
2203
  */
2203
2204
 
2204
- Observer.prototype.removeVm = function (vm) {
2205
- this.vms.$remove(vm);
2206
- };
2207
-
2208
- // helpers
2205
+ function guardComponents(options) {
2206
+ if (options.components) {
2207
+ var components = options.components = guardArrayAssets(options.components);
2208
+ var ids = Object.keys(components);
2209
+ var def;
2210
+ if ('development' !== 'production') {
2211
+ var map = options._componentNameMap = {};
2212
+ }
2213
+ for (var i = 0, l = ids.length; i < l; i++) {
2214
+ var key = ids[i];
2215
+ if (commonTagRE.test(key) || reservedTagRE.test(key)) {
2216
+ 'development' !== 'production' && warn('Do not use built-in or reserved HTML elements as component ' + 'id: ' + key);
2217
+ continue;
2218
+ }
2219
+ // record a all lowercase <-> kebab-case mapping for
2220
+ // possible custom element case error warning
2221
+ if ('development' !== 'production') {
2222
+ map[key.replace(/-/g, '').toLowerCase()] = hyphenate(key);
2223
+ }
2224
+ def = components[key];
2225
+ if (isPlainObject(def)) {
2226
+ components[key] = Vue.extend(def);
2227
+ }
2228
+ }
2229
+ }
2230
+ }
2209
2231
 
2210
2232
  /**
2211
- * Augment an target Object or Array by intercepting
2212
- * the prototype chain using __proto__
2233
+ * Ensure all props option syntax are normalized into the
2234
+ * Object-based format.
2213
2235
  *
2214
- * @param {Object|Array} target
2215
- * @param {Object} proto
2236
+ * @param {Object} options
2216
2237
  */
2217
2238
 
2218
- function protoAugment(target, src) {
2219
- /* eslint-disable no-proto */
2220
- target.__proto__ = src;
2221
- /* eslint-enable no-proto */
2239
+ function guardProps(options) {
2240
+ var props = options.props;
2241
+ var i, val;
2242
+ if (isArray(props)) {
2243
+ options.props = {};
2244
+ i = props.length;
2245
+ while (i--) {
2246
+ val = props[i];
2247
+ if (typeof val === 'string') {
2248
+ options.props[val] = null;
2249
+ } else if (val.name) {
2250
+ options.props[val.name] = val;
2251
+ }
2252
+ }
2253
+ } else if (isPlainObject(props)) {
2254
+ var keys = Object.keys(props);
2255
+ i = keys.length;
2256
+ while (i--) {
2257
+ val = props[keys[i]];
2258
+ if (typeof val === 'function') {
2259
+ props[keys[i]] = { type: val };
2260
+ }
2261
+ }
2262
+ }
2222
2263
  }
2223
2264
 
2224
2265
  /**
2225
- * Augment an target Object or Array by defining
2226
- * hidden properties.
2266
+ * Guard an Array-format assets option and converted it
2267
+ * into the key-value Object format.
2227
2268
  *
2228
- * @param {Object|Array} target
2229
- * @param {Object} proto
2269
+ * @param {Object|Array} assets
2270
+ * @return {Object}
2230
2271
  */
2231
2272
 
2232
- function copyAugment(target, src, keys) {
2233
- for (var i = 0, l = keys.length; i < l; i++) {
2234
- var key = keys[i];
2235
- def(target, key, src[key]);
2273
+ function guardArrayAssets(assets) {
2274
+ if (isArray(assets)) {
2275
+ var res = {};
2276
+ var i = assets.length;
2277
+ var asset;
2278
+ while (i--) {
2279
+ asset = assets[i];
2280
+ var id = typeof asset === 'function' ? asset.options && asset.options.name || asset.id : asset.name || asset.id;
2281
+ if (!id) {
2282
+ 'development' !== 'production' && warn('Array-syntax assets must provide a "name" or "id" field.');
2283
+ } else {
2284
+ res[id] = asset;
2285
+ }
2286
+ }
2287
+ return res;
2236
2288
  }
2289
+ return assets;
2237
2290
  }
2238
2291
 
2239
2292
  /**
2240
- * Attempt to create an observer instance for a value,
2241
- * returns the new observer if successfully observed,
2242
- * or the existing observer if the value already has one.
2293
+ * Merge two option objects into a new one.
2294
+ * Core utility used in both instantiation and inheritance.
2243
2295
  *
2244
- * @param {*} value
2245
- * @param {Vue} [vm]
2246
- * @return {Observer|undefined}
2247
- * @static
2296
+ * @param {Object} parent
2297
+ * @param {Object} child
2298
+ * @param {Vue} [vm] - if vm is present, indicates this is
2299
+ * an instantiation merge.
2248
2300
  */
2249
2301
 
2250
- function observe(value, vm) {
2251
- if (!value || typeof value !== 'object') {
2252
- return;
2302
+ function mergeOptions(parent, child, vm) {
2303
+ guardComponents(child);
2304
+ guardProps(child);
2305
+ var options = {};
2306
+ var key;
2307
+ if (child.mixins) {
2308
+ for (var i = 0, l = child.mixins.length; i < l; i++) {
2309
+ parent = mergeOptions(parent, child.mixins[i], vm);
2310
+ }
2253
2311
  }
2254
- var ob;
2255
- if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
2256
- ob = value.__ob__;
2257
- } else if ((isArray(value) || isPlainObject(value)) && Object.isExtensible(value) && !value._isVue) {
2258
- ob = new Observer(value);
2312
+ for (key in parent) {
2313
+ mergeField(key);
2259
2314
  }
2260
- if (ob && vm) {
2261
- ob.addVm(vm);
2315
+ for (key in child) {
2316
+ if (!hasOwn(parent, key)) {
2317
+ mergeField(key);
2318
+ }
2262
2319
  }
2263
- return ob;
2320
+ function mergeField(key) {
2321
+ var strat = strats[key] || defaultStrat;
2322
+ options[key] = strat(parent[key], child[key], vm, key);
2323
+ }
2324
+ return options;
2264
2325
  }
2265
2326
 
2266
2327
  /**
2267
- * Define a reactive property on an Object.
2328
+ * Resolve an asset.
2329
+ * This function is used because child instances need access
2330
+ * to assets defined in its ancestor chain.
2268
2331
  *
2269
- * @param {Object} obj
2270
- * @param {String} key
2271
- * @param {*} val
2332
+ * @param {Object} options
2333
+ * @param {String} type
2334
+ * @param {String} id
2335
+ * @return {Object|Function}
2272
2336
  */
2273
2337
 
2274
- function defineReactive(obj, key, val) {
2275
- var dep = new Dep();
2276
-
2277
- var property = Object.getOwnPropertyDescriptor(obj, key);
2278
- if (property && property.configurable === false) {
2338
+ function resolveAsset(options, type, id) {
2339
+ /* istanbul ignore if */
2340
+ if (typeof id !== 'string') {
2279
2341
  return;
2280
2342
  }
2343
+ var assets = options[type];
2344
+ var camelizedId;
2345
+ return assets[id] ||
2346
+ // camelCase ID
2347
+ assets[camelizedId = camelize(id)] ||
2348
+ // Pascal Case ID
2349
+ assets[camelizedId.charAt(0).toUpperCase() + camelizedId.slice(1)];
2350
+ }
2281
2351
 
2282
- // cater for pre-defined getter/setters
2283
- var getter = property && property.get;
2284
- var setter = property && property.set;
2352
+ /**
2353
+ * Assert asset exists
2354
+ */
2285
2355
 
2286
- var childOb = observe(val);
2287
- Object.defineProperty(obj, key, {
2288
- enumerable: true,
2289
- configurable: true,
2290
- get: function reactiveGetter() {
2291
- var value = getter ? getter.call(obj) : val;
2292
- if (Dep.target) {
2293
- dep.depend();
2294
- if (childOb) {
2295
- childOb.dep.depend();
2296
- }
2297
- if (isArray(value)) {
2298
- for (var e, i = 0, l = value.length; i < l; i++) {
2299
- e = value[i];
2300
- e && e.__ob__ && e.__ob__.dep.depend();
2301
- }
2302
- }
2303
- }
2304
- return value;
2305
- },
2306
- set: function reactiveSetter(newVal) {
2307
- var value = getter ? getter.call(obj) : val;
2308
- if (newVal === value) {
2309
- return;
2310
- }
2311
- if (setter) {
2312
- setter.call(obj, newVal);
2313
- } else {
2314
- val = newVal;
2315
- }
2316
- childOb = observe(newVal);
2317
- dep.notify();
2318
- }
2319
- });
2356
+ function assertAsset(val, type, id) {
2357
+ if (!val) {
2358
+ 'development' !== 'production' && warn('Failed to resolve ' + type + ': ' + id);
2359
+ }
2320
2360
  }
2321
2361
 
2322
2362
 
@@ -2465,13 +2505,6 @@ var transition = Object.freeze({
2465
2505
  this.$parent.$children.push(this);
2466
2506
  }
2467
2507
 
2468
- // save raw constructor data before merge
2469
- // so that we know which properties are provided at
2470
- // instantiation.
2471
- if ('development' !== 'production') {
2472
- this._runtimeData = options.data;
2473
- }
2474
-
2475
2508
  // merge options.
2476
2509
  options = this.$options = mergeOptions(this.constructor.options, options, this);
2477
2510
 
@@ -2482,6 +2515,11 @@ var transition = Object.freeze({
2482
2515
  // it will be filled up in _initScope().
2483
2516
  this._data = {};
2484
2517
 
2518
+ // save raw constructor data before merge
2519
+ // so that we know which properties are provided at
2520
+ // instantiation.
2521
+ this._runtimeData = options.data;
2522
+
2485
2523
  // call init hook
2486
2524
  this._callHook('init');
2487
2525
 
@@ -2839,7 +2877,7 @@ var path = Object.freeze({
2839
2877
  var allowedKeywordsRE = new RegExp('^(' + allowedKeywords.replace(/,/g, '\\b|') + '\\b)');
2840
2878
 
2841
2879
  // keywords that don't make sense inside expressions
2842
- var improperKeywords = 'break,case,class,catch,const,continue,debugger,default,' + 'delete,do,else,export,extends,finally,for,function,if,' + 'import,in,instanceof,let,return,super,switch,throw,try,' + 'var,while,with,yield,enum,await,implements,package,' + 'proctected,static,interface,private,public';
2880
+ var improperKeywords = 'break,case,class,catch,const,continue,debugger,default,' + 'delete,do,else,export,extends,finally,for,function,if,' + 'import,in,instanceof,let,return,super,switch,throw,try,' + 'var,while,with,yield,enum,await,implements,package,' + 'protected,static,interface,private,public';
2843
2881
  var improperKeywordsRE = new RegExp('^(' + improperKeywords.replace(/,/g, '\\b|') + '\\b)');
2844
2882
 
2845
2883
  var wsRE = /\s/g;
@@ -3030,6 +3068,8 @@ var expression = Object.freeze({
3030
3068
  // before user watchers so that when user watchers are
3031
3069
  // triggered, the DOM would have already been in updated
3032
3070
  // state.
3071
+
3072
+ var queueIndex;
3033
3073
  var queue = [];
3034
3074
  var userQueue = [];
3035
3075
  var has = {};
@@ -3059,7 +3099,7 @@ var expression = Object.freeze({
3059
3099
  runBatcherQueue(userQueue);
3060
3100
  // dev tool hook
3061
3101
  /* istanbul ignore if */
3062
- if (devtools) {
3102
+ if (devtools && config.devtools) {
3063
3103
  devtools.emit('flush');
3064
3104
  }
3065
3105
  resetBatcherState();
@@ -3074,8 +3114,8 @@ var expression = Object.freeze({
3074
3114
  function runBatcherQueue(queue) {
3075
3115
  // do not cache length because more watchers might be pushed
3076
3116
  // as we run existing watchers
3077
- for (var i = 0; i < queue.length; i++) {
3078
- var watcher = queue[i];
3117
+ for (queueIndex = 0; queueIndex < queue.length; queueIndex++) {
3118
+ var watcher = queue[queueIndex];
3079
3119
  var id = watcher.id;
3080
3120
  has[id] = null;
3081
3121
  watcher.run();
@@ -3104,20 +3144,20 @@ var expression = Object.freeze({
3104
3144
  function pushWatcher(watcher) {
3105
3145
  var id = watcher.id;
3106
3146
  if (has[id] == null) {
3107
- // if an internal watcher is pushed, but the internal
3108
- // queue is already depleted, we run it immediately.
3109
3147
  if (internalQueueDepleted && !watcher.user) {
3110
- watcher.run();
3111
- return;
3112
- }
3113
- // push watcher into appropriate queue
3114
- var q = watcher.user ? userQueue : queue;
3115
- has[id] = q.length;
3116
- q.push(watcher);
3117
- // queue the flush
3118
- if (!waiting) {
3119
- waiting = true;
3120
- nextTick(flushBatcherQueue);
3148
+ // an internal watcher triggered by a user watcher...
3149
+ // let's run it immediately after current user watcher is done.
3150
+ userQueue.splice(queueIndex + 1, 0, watcher);
3151
+ } else {
3152
+ // push watcher into appropriate queue
3153
+ var q = watcher.user ? userQueue : queue;
3154
+ has[id] = q.length;
3155
+ q.push(watcher);
3156
+ // queue the flush
3157
+ if (!waiting) {
3158
+ waiting = true;
3159
+ nextTick(flushBatcherQueue);
3160
+ }
3121
3161
  }
3122
3162
  }
3123
3163
  }
@@ -3151,13 +3191,15 @@ var expression = Object.freeze({
3151
3191
  var isFn = typeof expOrFn === 'function';
3152
3192
  this.vm = vm;
3153
3193
  vm._watchers.push(this);
3154
- this.expression = isFn ? expOrFn.toString() : expOrFn;
3194
+ this.expression = expOrFn;
3155
3195
  this.cb = cb;
3156
3196
  this.id = ++uid$2; // uid for batching
3157
3197
  this.active = true;
3158
3198
  this.dirty = this.lazy; // for lazy watchers
3159
- this.deps = Object.create(null);
3160
- this.newDeps = null;
3199
+ this.deps = [];
3200
+ this.newDeps = [];
3201
+ this.depIds = Object.create(null);
3202
+ this.newDepIds = null;
3161
3203
  this.prevError = null; // for async error stacks
3162
3204
  // parse expression for getter/setter
3163
3205
  if (isFn) {
@@ -3174,23 +3216,6 @@ var expression = Object.freeze({
3174
3216
  this.queued = this.shallow = false;
3175
3217
  }
3176
3218
 
3177
- /**
3178
- * Add a dependency to this directive.
3179
- *
3180
- * @param {Dep} dep
3181
- */
3182
-
3183
- Watcher.prototype.addDep = function (dep) {
3184
- var id = dep.id;
3185
- if (!this.newDeps[id]) {
3186
- this.newDeps[id] = dep;
3187
- if (!this.deps[id]) {
3188
- this.deps[id] = dep;
3189
- dep.addSub(this);
3190
- }
3191
- }
3192
- };
3193
-
3194
3219
  /**
3195
3220
  * Evaluate the getter, and re-collect dependencies.
3196
3221
  */
@@ -3266,7 +3291,25 @@ var expression = Object.freeze({
3266
3291
 
3267
3292
  Watcher.prototype.beforeGet = function () {
3268
3293
  Dep.target = this;
3269
- this.newDeps = Object.create(null);
3294
+ this.newDepIds = Object.create(null);
3295
+ this.newDeps.length = 0;
3296
+ };
3297
+
3298
+ /**
3299
+ * Add a dependency to this directive.
3300
+ *
3301
+ * @param {Dep} dep
3302
+ */
3303
+
3304
+ Watcher.prototype.addDep = function (dep) {
3305
+ var id = dep.id;
3306
+ if (!this.newDepIds[id]) {
3307
+ this.newDepIds[id] = true;
3308
+ this.newDeps.push(dep);
3309
+ if (!this.depIds[id]) {
3310
+ dep.addSub(this);
3311
+ }
3312
+ }
3270
3313
  };
3271
3314
 
3272
3315
  /**
@@ -3275,15 +3318,17 @@ var expression = Object.freeze({
3275
3318
 
3276
3319
  Watcher.prototype.afterGet = function () {
3277
3320
  Dep.target = null;
3278
- var ids = Object.keys(this.deps);
3279
- var i = ids.length;
3321
+ var i = this.deps.length;
3280
3322
  while (i--) {
3281
- var id = ids[i];
3282
- if (!this.newDeps[id]) {
3283
- this.deps[id].removeSub(this);
3323
+ var dep = this.deps[i];
3324
+ if (!this.newDepIds[dep.id]) {
3325
+ dep.removeSub(this);
3284
3326
  }
3285
3327
  }
3328
+ this.depIds = this.newDepIds;
3329
+ var tmp = this.deps;
3286
3330
  this.deps = this.newDeps;
3331
+ this.newDeps = tmp;
3287
3332
  };
3288
3333
 
3289
3334
  /**
@@ -3371,10 +3416,9 @@ var expression = Object.freeze({
3371
3416
  */
3372
3417
 
3373
3418
  Watcher.prototype.depend = function () {
3374
- var depIds = Object.keys(this.deps);
3375
- var i = depIds.length;
3419
+ var i = this.deps.length;
3376
3420
  while (i--) {
3377
- this.deps[depIds[i]].depend();
3421
+ this.deps[i].depend();
3378
3422
  }
3379
3423
  };
3380
3424
 
@@ -3391,10 +3435,9 @@ var expression = Object.freeze({
3391
3435
  if (!this.vm._isBeingDestroyed && !this.vm._vForRemoving) {
3392
3436
  this.vm._watchers.$remove(this);
3393
3437
  }
3394
- var depIds = Object.keys(this.deps);
3395
- var i = depIds.length;
3438
+ var i = this.deps.length;
3396
3439
  while (i--) {
3397
- this.deps[depIds[i]].removeSub(this);
3440
+ this.deps[i].removeSub(this);
3398
3441
  }
3399
3442
  this.active = false;
3400
3443
  this.vm = this.cb = this.value = null;
@@ -3462,7 +3505,7 @@ var expression = Object.freeze({
3462
3505
  return isTemplate(node) && isFragment(node.content);
3463
3506
  }
3464
3507
 
3465
- var tagRE$1 = /<([\w:]+)/;
3508
+ var tagRE$1 = /<([\w:-]+)/;
3466
3509
  var entityRE = /&#?\w+?;/;
3467
3510
 
3468
3511
  /**
@@ -3584,6 +3627,7 @@ var expression = Object.freeze({
3584
3627
  */
3585
3628
 
3586
3629
  function cloneNode(node) {
3630
+ /* istanbul ignore if */
3587
3631
  if (!node.querySelectorAll) {
3588
3632
  return node.cloneNode();
3589
3633
  }
@@ -3893,7 +3937,7 @@ var template = Object.freeze({
3893
3937
  */
3894
3938
 
3895
3939
  function attach(child) {
3896
- if (!child._isAttached) {
3940
+ if (!child._isAttached && inDoc(child.$el)) {
3897
3941
  child._callHook('attached');
3898
3942
  }
3899
3943
  }
@@ -3905,7 +3949,7 @@ var template = Object.freeze({
3905
3949
  */
3906
3950
 
3907
3951
  function detach(child) {
3908
- if (child._isAttached) {
3952
+ if (child._isAttached && !inDoc(child.$el)) {
3909
3953
  child._callHook('detached');
3910
3954
  }
3911
3955
  }
@@ -4174,7 +4218,7 @@ var template = Object.freeze({
4174
4218
  // for two-way binding on alias
4175
4219
  scope.$forContext = this;
4176
4220
  // define scope properties
4177
- defineReactive(scope, alias, value);
4221
+ defineReactive(scope, alias, value, true /* do not observe */);
4178
4222
  defineReactive(scope, '$index', index);
4179
4223
  if (key) {
4180
4224
  defineReactive(scope, '$key', key);
@@ -4558,12 +4602,11 @@ var template = Object.freeze({
4558
4602
  var next = el.nextElementSibling;
4559
4603
  if (next && getAttr(next, 'v-else') !== null) {
4560
4604
  remove(next);
4561
- this.elseFactory = new FragmentFactory(next._context || this.vm, next);
4605
+ this.elseEl = next;
4562
4606
  }
4563
4607
  // check main block
4564
4608
  this.anchor = createAnchor('v-if');
4565
4609
  replace(el, this.anchor);
4566
- this.factory = new FragmentFactory(this.vm, el);
4567
4610
  } else {
4568
4611
  'development' !== 'production' && warn('v-if="' + this.expression + '" cannot be ' + 'used on an instance root element.');
4569
4612
  this.invalid = true;
@@ -4586,6 +4629,10 @@ var template = Object.freeze({
4586
4629
  this.elseFrag.remove();
4587
4630
  this.elseFrag = null;
4588
4631
  }
4632
+ // lazy init factory
4633
+ if (!this.factory) {
4634
+ this.factory = new FragmentFactory(this.vm, this.el);
4635
+ }
4589
4636
  this.frag = this.factory.create(this._host, this._scope, this._frag);
4590
4637
  this.frag.before(this.anchor);
4591
4638
  },
@@ -4595,7 +4642,10 @@ var template = Object.freeze({
4595
4642
  this.frag.remove();
4596
4643
  this.frag = null;
4597
4644
  }
4598
- if (this.elseFactory && !this.elseFrag) {
4645
+ if (this.elseEl && !this.elseFrag) {
4646
+ if (!this.elseFactory) {
4647
+ this.elseFactory = new FragmentFactory(this.elseEl._context || this.vm, this.elseEl);
4648
+ }
4599
4649
  this.elseFrag = this.elseFactory.create(this._host, this._scope, this._frag);
4600
4650
  this.elseFrag.before(this.anchor);
4601
4651
  }
@@ -4684,6 +4734,10 @@ var template = Object.freeze({
4684
4734
  });
4685
4735
  this.on('blur', function () {
4686
4736
  self.focused = false;
4737
+ // do not sync value after fragment removal (#2017)
4738
+ if (!self._frag || self._frag.inserted) {
4739
+ self.rawListener();
4740
+ }
4687
4741
  });
4688
4742
  }
4689
4743
 
@@ -5131,7 +5185,7 @@ var template = Object.freeze({
5131
5185
  }
5132
5186
  // key filter
5133
5187
  var keys = Object.keys(this.modifiers).filter(function (key) {
5134
- return key !== 'stop' && key !== 'prevent';
5188
+ return key !== 'stop' && key !== 'prevent' && key !== 'self';
5135
5189
  });
5136
5190
  if (keys.length) {
5137
5191
  handler = keyFilter(handler, keys);
@@ -5757,6 +5811,7 @@ var template = Object.freeze({
5757
5811
  if (!child || this.keepAlive) {
5758
5812
  if (child) {
5759
5813
  // remove ref
5814
+ child._inactive = true;
5760
5815
  child._updateRef(true);
5761
5816
  }
5762
5817
  return;
@@ -5809,10 +5864,8 @@ var template = Object.freeze({
5809
5864
  var self = this;
5810
5865
  var current = this.childVM;
5811
5866
  // for devtool inspection
5812
- if ('development' !== 'production') {
5813
- if (current) current._inactive = true;
5814
- target._inactive = false;
5815
- }
5867
+ if (current) current._inactive = true;
5868
+ target._inactive = false;
5816
5869
  this.childVM = target;
5817
5870
  switch (self.params.transitionMode) {
5818
5871
  case 'in-out':
@@ -6461,7 +6514,7 @@ var template = Object.freeze({
6461
6514
  vm._props[path] = prop;
6462
6515
  if (raw === null) {
6463
6516
  // initialize absent prop
6464
- initProp(vm, prop, getDefault(vm, options));
6517
+ initProp(vm, prop, undefined);
6465
6518
  } else if (prop.dynamic) {
6466
6519
  // dynamic prop
6467
6520
  if (prop.mode === propBindingModes.ONE_TIME) {
@@ -6496,29 +6549,6 @@ var template = Object.freeze({
6496
6549
  };
6497
6550
  }
6498
6551
 
6499
- /**
6500
- * Get the default value of a prop.
6501
- *
6502
- * @param {Vue} vm
6503
- * @param {Object} options
6504
- * @return {*}
6505
- */
6506
-
6507
- function getDefault(vm, options) {
6508
- // no default, return undefined
6509
- if (!hasOwn(options, 'default')) {
6510
- // absent boolean value defaults to false
6511
- return options.type === Boolean ? false : undefined;
6512
- }
6513
- var def = options['default'];
6514
- // warn against non-factory defaults for Object & Array
6515
- if (isObject(def)) {
6516
- 'development' !== 'production' && warn('Object/Array as default prop values will be shared ' + 'across multiple instances. Use a factory function ' + 'to return the default value instead.');
6517
- }
6518
- // call factory function for non-Function types
6519
- return typeof def === 'function' && options.type !== Function ? def.call(vm) : def;
6520
- }
6521
-
6522
6552
  // special binding prefixes
6523
6553
  var bindRE = /^v-bind:|^:/;
6524
6554
  var onRE = /^v-on:|^@/;
@@ -7403,7 +7433,7 @@ var template = Object.freeze({
7403
7433
  if (!to.hasAttribute(name) && !specialCharRE.test(name)) {
7404
7434
  to.setAttribute(name, value);
7405
7435
  } else if (name === 'class' && !parseText(value)) {
7406
- value.split(/\s+/).forEach(function (cls) {
7436
+ value.trim().split(/\s+/).forEach(function (cls) {
7407
7437
  addClass(to, cls);
7408
7438
  });
7409
7439
  }
@@ -7421,39 +7451,25 @@ var template = Object.freeze({
7421
7451
  * @param {Vue} vm
7422
7452
  */
7423
7453
 
7424
- function scanSlots(template, content, vm) {
7454
+ function resolveSlots(vm, content) {
7425
7455
  if (!content) {
7426
7456
  return;
7427
7457
  }
7428
- var contents = vm._slotContents = {};
7429
- var slots = template.querySelectorAll('slot');
7430
- if (slots.length) {
7431
- var hasDefault, slot, name;
7432
- for (var i = 0, l = slots.length; i < l; i++) {
7433
- slot = slots[i];
7434
- /* eslint-disable no-cond-assign */
7435
- if (name = slot.getAttribute('name')) {
7436
- select(slot, name);
7437
- } else if ('development' !== 'production' && (name = getBindAttr(slot, 'name'))) {
7438
- warn('<slot :name="' + name + '">: slot names cannot be dynamic.');
7439
- } else {
7440
- // default slot
7441
- hasDefault = true;
7442
- }
7443
- /* eslint-enable no-cond-assign */
7444
- }
7445
- if (hasDefault) {
7446
- contents['default'] = extractFragment(content.childNodes, content);
7458
+ var contents = vm._slotContents = Object.create(null);
7459
+ var el, name;
7460
+ for (var i = 0, l = content.children.length; i < l; i++) {
7461
+ el = content.children[i];
7462
+ /* eslint-disable no-cond-assign */
7463
+ if (name = el.getAttribute('slot')) {
7464
+ (contents[name] || (contents[name] = [])).push(el);
7447
7465
  }
7466
+ /* eslint-enable no-cond-assign */
7448
7467
  }
7449
-
7450
- function select(slot, name) {
7451
- // named slot
7452
- var selector = '[slot="' + name + '"]';
7453
- var nodes = content.querySelectorAll(selector);
7454
- if (nodes.length) {
7455
- contents[name] = extractFragment(nodes, content);
7456
- }
7468
+ for (name in contents) {
7469
+ contents[name] = extractFragment(contents[name], content);
7470
+ }
7471
+ if (content.hasChildNodes()) {
7472
+ contents['default'] = extractFragment(content.childNodes, content);
7457
7473
  }
7458
7474
  }
7459
7475
 
@@ -7461,7 +7477,6 @@ var template = Object.freeze({
7461
7477
  * Extract qualified content nodes from a node list.
7462
7478
  *
7463
7479
  * @param {NodeList} nodes
7464
- * @param {Element} parent
7465
7480
  * @return {DocumentFragment}
7466
7481
  */
7467
7482
 
@@ -7470,13 +7485,11 @@ var template = Object.freeze({
7470
7485
  nodes = toArray(nodes);
7471
7486
  for (var i = 0, l = nodes.length; i < l; i++) {
7472
7487
  var node = nodes[i];
7473
- if (node.parentNode === parent) {
7474
- if (isTemplate(node) && !node.hasAttribute('v-if') && !node.hasAttribute('v-for')) {
7475
- parent.removeChild(node);
7476
- node = parseTemplate(node);
7477
- }
7478
- frag.appendChild(node);
7488
+ if (isTemplate(node) && !node.hasAttribute('v-if') && !node.hasAttribute('v-for')) {
7489
+ parent.removeChild(node);
7490
+ node = parseTemplate(node);
7479
7491
  }
7492
+ frag.appendChild(node);
7480
7493
  }
7481
7494
  return frag;
7482
7495
  }
@@ -7489,7 +7502,7 @@ var template = Object.freeze({
7489
7502
  compileRoot: compileRoot,
7490
7503
  terminalDirectives: terminalDirectives,
7491
7504
  transclude: transclude,
7492
- scanSlots: scanSlots
7505
+ resolveSlots: resolveSlots
7493
7506
  });
7494
7507
 
7495
7508
  function stateMixin (Vue) {
@@ -7549,33 +7562,25 @@ var template = Object.freeze({
7549
7562
  */
7550
7563
 
7551
7564
  Vue.prototype._initData = function () {
7552
- var propsData = this._data;
7553
- var optionsDataFn = this.$options.data;
7554
- var optionsData = optionsDataFn && optionsDataFn();
7555
- var runtimeData;
7556
- if ('development' !== 'production') {
7557
- runtimeData = (typeof this._runtimeData === 'function' ? this._runtimeData() : this._runtimeData) || {};
7558
- this._runtimeData = null;
7559
- }
7560
- if (optionsData) {
7561
- this._data = optionsData;
7562
- for (var prop in propsData) {
7563
- if ('development' !== 'production' && hasOwn(optionsData, prop) && !hasOwn(runtimeData, prop)) {
7564
- warn('Data field "' + prop + '" is already defined ' + 'as a prop. Use prop default value instead.');
7565
- }
7566
- if (this._props[prop].raw !== null || !hasOwn(optionsData, prop)) {
7567
- set(optionsData, prop, propsData[prop]);
7568
- }
7569
- }
7570
- }
7571
- var data = this._data;
7565
+ var dataFn = this.$options.data;
7566
+ var data = this._data = dataFn ? dataFn() : {};
7567
+ var props = this._props;
7568
+ var runtimeData = this._runtimeData ? typeof this._runtimeData === 'function' ? this._runtimeData() : this._runtimeData : null;
7572
7569
  // proxy data on instance
7573
7570
  var keys = Object.keys(data);
7574
7571
  var i, key;
7575
7572
  i = keys.length;
7576
7573
  while (i--) {
7577
7574
  key = keys[i];
7578
- this._proxy(key);
7575
+ // there are two scenarios where we can proxy a data key:
7576
+ // 1. it's not already defined as a prop
7577
+ // 2. it's provided via a instantiation option AND there are no
7578
+ // template prop present
7579
+ if (!props || !hasOwn(props, key) || runtimeData && hasOwn(runtimeData, key) && props[key].raw === null) {
7580
+ this._proxy(key);
7581
+ } else if ('development' !== 'production') {
7582
+ warn('Data field "' + key + '" is already defined ' + 'as a prop. Use prop default value instead.');
7583
+ }
7579
7584
  }
7580
7585
  // observe data
7581
7586
  observe(data, this);
@@ -8253,9 +8258,8 @@ var template = Object.freeze({
8253
8258
  var contextOptions = this._context && this._context.$options;
8254
8259
  var rootLinker = compileRoot(el, options, contextOptions);
8255
8260
 
8256
- // scan for slot distribution before compiling the content
8257
- // so that it's decoupeld from slot/directive compilation order
8258
- scanSlots(el, options._content, this);
8261
+ // resolve slot distribution
8262
+ resolveSlots(this, options._content);
8259
8263
 
8260
8264
  // compile and link the rest
8261
8265
  var contentLinkFn;
@@ -8687,9 +8691,15 @@ var template = Object.freeze({
8687
8691
  }
8688
8692
  // include computed fields
8689
8693
  if (!path) {
8690
- for (var key in this.$options.computed) {
8694
+ var key;
8695
+ for (key in this.$options.computed) {
8691
8696
  data[key] = clean(this[key]);
8692
8697
  }
8698
+ if (this._props) {
8699
+ for (key in this._props) {
8700
+ data[key] = clean(this[key]);
8701
+ }
8702
+ }
8693
8703
  }
8694
8704
  console.log(data);
8695
8705
  };
@@ -9675,14 +9685,16 @@ var template = Object.freeze({
9675
9685
 
9676
9686
  installGlobalAPI(Vue);
9677
9687
 
9678
- Vue.version = '1.0.17';
9688
+ Vue.version = '1.0.18';
9679
9689
 
9680
9690
  // devtools global hook
9681
9691
  /* istanbul ignore next */
9682
- if (devtools) {
9683
- devtools.emit('init', Vue);
9684
- } else if ('development' !== 'production' && inBrowser && /Chrome\/\d+/.test(window.navigator.userAgent)) {
9685
- console.log('Download the Vue Devtools for a better development experience:\n' + 'https://github.com/vuejs/vue-devtools');
9692
+ if (config.devtools) {
9693
+ if (devtools) {
9694
+ devtools.emit('init', Vue);
9695
+ } else if ('development' !== 'production' && inBrowser && /Chrome\/\d+/.test(window.navigator.userAgent)) {
9696
+ console.log('Download the Vue Devtools for a better development experience:\n' + 'https://github.com/vuejs/vue-devtools');
9697
+ }
9686
9698
  }
9687
9699
 
9688
9700
  return Vue;