vuejs 1.0.17 → 1.0.18.pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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;