vuejs 1.0.18 → 1.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +4 -4
- data/lib/vuejs/post_message.rb +8 -0
- data/lib/vuejs/version.rb +1 -1
- data/vendor/assets/javascripts/vue.js +1033 -915
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 102d3087a91ffb15dba385f2312742a48b90556b
|
4
|
+
data.tar.gz: 5129db28c66a55caf135ef4e6fd2c164f8fffc07
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9959cd6a8cb7366c1df8e60f6c78ae8f3e8f70f3e6d069af47063067533d8e1885570a633e8715af7c71529cc93e4b267c729f2dee1631a436def1997df1e413
|
7
|
+
data.tar.gz: c6a887d1c5f7bf9ca79b91ca928a36a44c22c2245d3e486616753b54dcb3b8588c2e94ecd3d402d5fc4564005e88bfb37680470f18aa3d607a390bd4bdf97417
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# Vuejs
|
2
2
|
|
3
|
-
Vuejs ships with the latest [Vue.js + router + resource](http://vuejs.org/) and integrate with Rails' asset pipeline.
|
3
|
+
Vuejs ships with the latest [Vue.js + router + resource](http://vuejs.org/) and integrate with Rails' asset pipeline. Vue.js is created by Evan You.
|
4
4
|
|
5
|
-
The current version is Vue.js (v0.7.11) + vue-router (v1.0.
|
5
|
+
The current version is Vue.js (v0.7.11) + vue-router (v1.0.20) + vue-resource (0.7.0)
|
6
6
|
|
7
7
|
> Reactive Components for Modern Web Interfaces
|
8
8
|
|
@@ -29,8 +29,8 @@ Or install it yourself as:
|
|
29
29
|
//= require jquery_ujs
|
30
30
|
//= require turbolinks
|
31
31
|
//= require vue
|
32
|
-
//= require vue-router
|
33
|
-
//= require vue-resource
|
32
|
+
//= require vue-router
|
33
|
+
//= require vue-resource
|
34
34
|
//= require_tree .
|
35
35
|
```
|
36
36
|
|
data/lib/vuejs/post_message.rb
CHANGED
data/lib/vuejs/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* Vue.js v1.0.
|
2
|
+
* Vue.js v1.0.20
|
3
3
|
* (c) 2016 Evan You
|
4
4
|
* Released under the MIT License.
|
5
5
|
*/
|
@@ -648,7 +648,7 @@
|
|
648
648
|
* ]
|
649
649
|
* }
|
650
650
|
*
|
651
|
-
* @param {String}
|
651
|
+
* @param {String} s
|
652
652
|
* @return {Object}
|
653
653
|
*/
|
654
654
|
|
@@ -1253,6 +1253,22 @@ var transition = Object.freeze({
|
|
1253
1253
|
el.removeEventListener(event, cb);
|
1254
1254
|
}
|
1255
1255
|
|
1256
|
+
/**
|
1257
|
+
* For IE9 compat: when both class and :class are present
|
1258
|
+
* getAttribute('class') returns wrong value...
|
1259
|
+
*
|
1260
|
+
* @param {Element} el
|
1261
|
+
* @return {String}
|
1262
|
+
*/
|
1263
|
+
|
1264
|
+
function getClass(el) {
|
1265
|
+
var classname = el.className;
|
1266
|
+
if (typeof classname === 'object') {
|
1267
|
+
classname = classname.baseVal || '';
|
1268
|
+
}
|
1269
|
+
return classname;
|
1270
|
+
}
|
1271
|
+
|
1256
1272
|
/**
|
1257
1273
|
* In IE9, setAttribute('class') will result in empty class
|
1258
1274
|
* if the element also has the :class attribute; However in
|
@@ -1283,7 +1299,7 @@ var transition = Object.freeze({
|
|
1283
1299
|
if (el.classList) {
|
1284
1300
|
el.classList.add(cls);
|
1285
1301
|
} else {
|
1286
|
-
var cur = ' ' + (el
|
1302
|
+
var cur = ' ' + getClass(el) + ' ';
|
1287
1303
|
if (cur.indexOf(' ' + cls + ' ') < 0) {
|
1288
1304
|
setClass(el, (cur + cls).trim());
|
1289
1305
|
}
|
@@ -1301,7 +1317,7 @@ var transition = Object.freeze({
|
|
1301
1317
|
if (el.classList) {
|
1302
1318
|
el.classList.remove(cls);
|
1303
1319
|
} else {
|
1304
|
-
var cur = ' ' + (el
|
1320
|
+
var cur = ' ' + getClass(el) + ' ';
|
1305
1321
|
var tar = ' ' + cls + ' ';
|
1306
1322
|
while (cur.indexOf(tar) >= 0) {
|
1307
1323
|
cur = cur.replace(tar, ' ');
|
@@ -1500,863 +1516,754 @@ var transition = Object.freeze({
|
|
1500
1516
|
}
|
1501
1517
|
}
|
1502
1518
|
|
1503
|
-
var
|
1519
|
+
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;
|
1520
|
+
var reservedTagRE = /^(slot|partial|component)$/i;
|
1521
|
+
|
1522
|
+
var isUnknownElement = undefined;
|
1523
|
+
if ('development' !== 'production') {
|
1524
|
+
isUnknownElement = function (el, tag) {
|
1525
|
+
if (tag.indexOf('-') > -1) {
|
1526
|
+
// http://stackoverflow.com/a/28210364/1070244
|
1527
|
+
return el.constructor === window.HTMLUnknownElement || el.constructor === window.HTMLElement;
|
1528
|
+
} else {
|
1529
|
+
return (/HTMLUnknownElement/.test(el.toString()) &&
|
1530
|
+
// Chrome returns unknown for several HTML5 elements.
|
1531
|
+
// https://code.google.com/p/chromium/issues/detail?id=540526
|
1532
|
+
!/^(data|time|rtc|rb)$/.test(tag)
|
1533
|
+
);
|
1534
|
+
}
|
1535
|
+
};
|
1536
|
+
}
|
1504
1537
|
|
1505
1538
|
/**
|
1506
|
-
*
|
1507
|
-
*
|
1539
|
+
* Check if an element is a component, if yes return its
|
1540
|
+
* component id.
|
1508
1541
|
*
|
1509
|
-
* @
|
1542
|
+
* @param {Element} el
|
1543
|
+
* @param {Object} options
|
1544
|
+
* @return {Object|undefined}
|
1510
1545
|
*/
|
1511
|
-
function Dep() {
|
1512
|
-
this.id = uid$1++;
|
1513
|
-
this.subs = [];
|
1514
|
-
}
|
1515
1546
|
|
1516
|
-
|
1517
|
-
|
1518
|
-
|
1519
|
-
|
1547
|
+
function checkComponentAttr(el, options) {
|
1548
|
+
var tag = el.tagName.toLowerCase();
|
1549
|
+
var hasAttrs = el.hasAttributes();
|
1550
|
+
if (!commonTagRE.test(tag) && !reservedTagRE.test(tag)) {
|
1551
|
+
if (resolveAsset(options, 'components', tag)) {
|
1552
|
+
return { id: tag };
|
1553
|
+
} else {
|
1554
|
+
var is = hasAttrs && getIsBinding(el);
|
1555
|
+
if (is) {
|
1556
|
+
return is;
|
1557
|
+
} else if ('development' !== 'production') {
|
1558
|
+
var expectedTag = options._componentNameMap && options._componentNameMap[tag];
|
1559
|
+
if (expectedTag) {
|
1560
|
+
warn('Unknown custom element: <' + tag + '> - ' + 'did you mean <' + expectedTag + '>? ' + 'HTML is case-insensitive, remember to use kebab-case in templates.');
|
1561
|
+
} else if (isUnknownElement(el, tag)) {
|
1562
|
+
warn('Unknown custom element: <' + tag + '> - did you ' + 'register the component correctly? For recursive components, ' + 'make sure to provide the "name" option.');
|
1563
|
+
}
|
1564
|
+
}
|
1565
|
+
}
|
1566
|
+
} else if (hasAttrs) {
|
1567
|
+
return getIsBinding(el);
|
1568
|
+
}
|
1569
|
+
}
|
1520
1570
|
|
1521
1571
|
/**
|
1522
|
-
*
|
1572
|
+
* Get "is" binding from an element.
|
1523
1573
|
*
|
1524
|
-
* @param {
|
1574
|
+
* @param {Element} el
|
1575
|
+
* @return {Object|undefined}
|
1525
1576
|
*/
|
1526
1577
|
|
1527
|
-
|
1528
|
-
|
1529
|
-
|
1578
|
+
function getIsBinding(el) {
|
1579
|
+
// dynamic syntax
|
1580
|
+
var exp = getAttr(el, 'is');
|
1581
|
+
if (exp != null) {
|
1582
|
+
return { id: exp };
|
1583
|
+
} else {
|
1584
|
+
exp = getBindAttr(el, 'is');
|
1585
|
+
if (exp != null) {
|
1586
|
+
return { id: exp, dynamic: true };
|
1587
|
+
}
|
1588
|
+
}
|
1589
|
+
}
|
1530
1590
|
|
1531
1591
|
/**
|
1532
|
-
*
|
1592
|
+
* Option overwriting strategies are functions that handle
|
1593
|
+
* how to merge a parent option value and a child option
|
1594
|
+
* value into the final value.
|
1533
1595
|
*
|
1534
|
-
*
|
1596
|
+
* All strategy functions follow the same signature:
|
1597
|
+
*
|
1598
|
+
* @param {*} parentVal
|
1599
|
+
* @param {*} childVal
|
1600
|
+
* @param {Vue} [vm]
|
1535
1601
|
*/
|
1536
1602
|
|
1537
|
-
|
1538
|
-
this.subs.$remove(sub);
|
1539
|
-
};
|
1603
|
+
var strats = config.optionMergeStrategies = Object.create(null);
|
1540
1604
|
|
1541
1605
|
/**
|
1542
|
-
*
|
1606
|
+
* Helper that recursively merges two data objects together.
|
1543
1607
|
*/
|
1544
1608
|
|
1545
|
-
|
1546
|
-
|
1547
|
-
|
1609
|
+
function mergeData(to, from) {
|
1610
|
+
var key, toVal, fromVal;
|
1611
|
+
for (key in from) {
|
1612
|
+
toVal = to[key];
|
1613
|
+
fromVal = from[key];
|
1614
|
+
if (!hasOwn(to, key)) {
|
1615
|
+
set(to, key, fromVal);
|
1616
|
+
} else if (isObject(toVal) && isObject(fromVal)) {
|
1617
|
+
mergeData(toVal, fromVal);
|
1618
|
+
}
|
1619
|
+
}
|
1620
|
+
return to;
|
1621
|
+
}
|
1548
1622
|
|
1549
1623
|
/**
|
1550
|
-
*
|
1624
|
+
* Data
|
1551
1625
|
*/
|
1552
1626
|
|
1553
|
-
|
1554
|
-
|
1555
|
-
|
1556
|
-
|
1557
|
-
|
1627
|
+
strats.data = function (parentVal, childVal, vm) {
|
1628
|
+
if (!vm) {
|
1629
|
+
// in a Vue.extend merge, both should be functions
|
1630
|
+
if (!childVal) {
|
1631
|
+
return parentVal;
|
1632
|
+
}
|
1633
|
+
if (typeof childVal !== 'function') {
|
1634
|
+
'development' !== 'production' && warn('The "data" option should be a function ' + 'that returns a per-instance value in component ' + 'definitions.');
|
1635
|
+
return parentVal;
|
1636
|
+
}
|
1637
|
+
if (!parentVal) {
|
1638
|
+
return childVal;
|
1639
|
+
}
|
1640
|
+
// when parentVal & childVal are both present,
|
1641
|
+
// we need to return a function that returns the
|
1642
|
+
// merged result of both functions... no need to
|
1643
|
+
// check if parentVal is a function here because
|
1644
|
+
// it has to be a function to pass previous merges.
|
1645
|
+
return function mergedDataFn() {
|
1646
|
+
return mergeData(childVal.call(this), parentVal.call(this));
|
1647
|
+
};
|
1648
|
+
} else if (parentVal || childVal) {
|
1649
|
+
return function mergedInstanceDataFn() {
|
1650
|
+
// instance merge
|
1651
|
+
var instanceData = typeof childVal === 'function' ? childVal.call(vm) : childVal;
|
1652
|
+
var defaultData = typeof parentVal === 'function' ? parentVal.call(vm) : undefined;
|
1653
|
+
if (instanceData) {
|
1654
|
+
return mergeData(instanceData, defaultData);
|
1655
|
+
} else {
|
1656
|
+
return defaultData;
|
1657
|
+
}
|
1658
|
+
};
|
1558
1659
|
}
|
1559
1660
|
};
|
1560
1661
|
|
1561
|
-
|
1562
|
-
|
1662
|
+
/**
|
1663
|
+
* El
|
1664
|
+
*/
|
1665
|
+
|
1666
|
+
strats.el = function (parentVal, childVal, vm) {
|
1667
|
+
if (!vm && childVal && typeof childVal !== 'function') {
|
1668
|
+
'development' !== 'production' && warn('The "el" option should be a function ' + 'that returns a per-instance value in component ' + 'definitions.');
|
1669
|
+
return;
|
1670
|
+
}
|
1671
|
+
var ret = childVal || parentVal;
|
1672
|
+
// invoke the element factory if this is instance merge
|
1673
|
+
return vm && typeof ret === 'function' ? ret.call(vm) : ret;
|
1674
|
+
};
|
1563
1675
|
|
1564
1676
|
/**
|
1565
|
-
*
|
1677
|
+
* Hooks and param attributes are merged as arrays.
|
1566
1678
|
*/
|
1567
1679
|
|
1568
|
-
|
1569
|
-
|
1570
|
-
|
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
|
-
});
|
1680
|
+
strats.init = strats.created = strats.ready = strats.attached = strats.detached = strats.beforeCompile = strats.compiled = strats.beforeDestroy = strats.destroyed = strats.activate = function (parentVal, childVal) {
|
1681
|
+
return childVal ? parentVal ? parentVal.concat(childVal) : isArray(childVal) ? childVal : [childVal] : parentVal;
|
1682
|
+
};
|
1599
1683
|
|
1600
1684
|
/**
|
1601
|
-
*
|
1602
|
-
* and emits corresponding event.
|
1603
|
-
*
|
1604
|
-
* @param {Number} index
|
1605
|
-
* @param {*} val
|
1606
|
-
* @return {*} - replaced element
|
1685
|
+
* 0.11 deprecation warning
|
1607
1686
|
*/
|
1608
1687
|
|
1609
|
-
|
1610
|
-
|
1611
|
-
|
1612
|
-
|
1613
|
-
return this.splice(index, 1, val)[0];
|
1614
|
-
});
|
1688
|
+
strats.paramAttributes = function () {
|
1689
|
+
/* istanbul ignore next */
|
1690
|
+
'development' !== 'production' && warn('"paramAttributes" option has been deprecated in 0.12. ' + 'Use "props" instead.');
|
1691
|
+
};
|
1615
1692
|
|
1616
1693
|
/**
|
1617
|
-
*
|
1694
|
+
* Assets
|
1618
1695
|
*
|
1619
|
-
*
|
1620
|
-
*
|
1696
|
+
* When a vm is present (instance creation), we need to do
|
1697
|
+
* a three-way merge between constructor options, instance
|
1698
|
+
* options and parent options.
|
1621
1699
|
*/
|
1622
1700
|
|
1623
|
-
|
1624
|
-
|
1625
|
-
|
1626
|
-
|
1627
|
-
if (index > -1) {
|
1628
|
-
return this.splice(index, 1);
|
1629
|
-
}
|
1630
|
-
});
|
1701
|
+
function mergeAssets(parentVal, childVal) {
|
1702
|
+
var res = Object.create(parentVal);
|
1703
|
+
return childVal ? extend(res, guardArrayAssets(childVal)) : res;
|
1704
|
+
}
|
1631
1705
|
|
1632
|
-
|
1706
|
+
config._assetTypes.forEach(function (type) {
|
1707
|
+
strats[type + 's'] = mergeAssets;
|
1708
|
+
});
|
1633
1709
|
|
1634
1710
|
/**
|
1635
|
-
*
|
1636
|
-
* object. Once attached, the observer converts target
|
1637
|
-
* object's property keys into getter/setters that
|
1638
|
-
* collect dependencies and dispatches updates.
|
1711
|
+
* Events & Watchers.
|
1639
1712
|
*
|
1640
|
-
*
|
1641
|
-
*
|
1642
|
-
*/
|
1643
|
-
|
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);
|
1654
|
-
}
|
1655
|
-
}
|
1656
|
-
|
1657
|
-
// Instance methods
|
1658
|
-
|
1659
|
-
/**
|
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
|
1665
|
-
*/
|
1666
|
-
|
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
|
-
}
|
1672
|
-
};
|
1673
|
-
|
1674
|
-
/**
|
1675
|
-
* Observe a list of Array items.
|
1676
|
-
*
|
1677
|
-
* @param {Array} items
|
1713
|
+
* Events & watchers hashes should not overwrite one
|
1714
|
+
* another, so we merge them as arrays.
|
1678
1715
|
*/
|
1679
1716
|
|
1680
|
-
|
1681
|
-
|
1682
|
-
|
1717
|
+
strats.watch = strats.events = function (parentVal, childVal) {
|
1718
|
+
if (!childVal) return parentVal;
|
1719
|
+
if (!parentVal) return childVal;
|
1720
|
+
var ret = {};
|
1721
|
+
extend(ret, parentVal);
|
1722
|
+
for (var key in childVal) {
|
1723
|
+
var parent = ret[key];
|
1724
|
+
var child = childVal[key];
|
1725
|
+
if (parent && !isArray(parent)) {
|
1726
|
+
parent = [parent];
|
1727
|
+
}
|
1728
|
+
ret[key] = parent ? parent.concat(child) : [child];
|
1683
1729
|
}
|
1730
|
+
return ret;
|
1684
1731
|
};
|
1685
1732
|
|
1686
1733
|
/**
|
1687
|
-
*
|
1688
|
-
* the events when the property is accessed/changed.
|
1689
|
-
*
|
1690
|
-
* @param {String} key
|
1691
|
-
* @param {*} val
|
1692
|
-
*/
|
1693
|
-
|
1694
|
-
Observer.prototype.convert = function (key, val) {
|
1695
|
-
defineReactive(this.value, key, val);
|
1696
|
-
};
|
1697
|
-
|
1698
|
-
/**
|
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.
|
1703
|
-
*
|
1704
|
-
* @param {Vue} vm
|
1734
|
+
* Other object hashes.
|
1705
1735
|
*/
|
1706
1736
|
|
1707
|
-
|
1708
|
-
|
1737
|
+
strats.props = strats.methods = strats.computed = function (parentVal, childVal) {
|
1738
|
+
if (!childVal) return parentVal;
|
1739
|
+
if (!parentVal) return childVal;
|
1740
|
+
var ret = Object.create(null);
|
1741
|
+
extend(ret, parentVal);
|
1742
|
+
extend(ret, childVal);
|
1743
|
+
return ret;
|
1709
1744
|
};
|
1710
1745
|
|
1711
1746
|
/**
|
1712
|
-
*
|
1713
|
-
* swapped out as an instance's $data object.
|
1714
|
-
*
|
1715
|
-
* @param {Vue} vm
|
1747
|
+
* Default strategy.
|
1716
1748
|
*/
|
1717
1749
|
|
1718
|
-
|
1719
|
-
|
1750
|
+
var defaultStrat = function defaultStrat(parentVal, childVal) {
|
1751
|
+
return childVal === undefined ? parentVal : childVal;
|
1720
1752
|
};
|
1721
1753
|
|
1722
|
-
// helpers
|
1723
|
-
|
1724
|
-
/**
|
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
|
1730
|
-
*/
|
1731
|
-
|
1732
|
-
function protoAugment(target, src) {
|
1733
|
-
/* eslint-disable no-proto */
|
1734
|
-
target.__proto__ = src;
|
1735
|
-
/* eslint-enable no-proto */
|
1736
|
-
}
|
1737
|
-
|
1738
1754
|
/**
|
1739
|
-
*
|
1740
|
-
*
|
1741
|
-
*
|
1742
|
-
* @param {Object|Array} target
|
1743
|
-
* @param {Object} proto
|
1744
|
-
*/
|
1745
|
-
|
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]);
|
1750
|
-
}
|
1751
|
-
}
|
1752
|
-
|
1753
|
-
/**
|
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.
|
1757
|
-
*
|
1758
|
-
* @param {*} value
|
1759
|
-
* @param {Vue} [vm]
|
1760
|
-
* @return {Observer|undefined}
|
1761
|
-
* @static
|
1762
|
-
*/
|
1763
|
-
|
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);
|
1773
|
-
}
|
1774
|
-
if (ob && vm) {
|
1775
|
-
ob.addVm(vm);
|
1776
|
-
}
|
1777
|
-
return ob;
|
1778
|
-
}
|
1779
|
-
|
1780
|
-
/**
|
1781
|
-
* Define a reactive property on an Object.
|
1755
|
+
* Make sure component options get converted to actual
|
1756
|
+
* constructors.
|
1782
1757
|
*
|
1783
|
-
* @param {Object}
|
1784
|
-
* @param {String} key
|
1785
|
-
* @param {*} val
|
1786
|
-
* @param {Boolean} doNotObserve
|
1758
|
+
* @param {Object} options
|
1787
1759
|
*/
|
1788
1760
|
|
1789
|
-
function
|
1790
|
-
|
1791
|
-
|
1792
|
-
|
1793
|
-
|
1794
|
-
|
1795
|
-
|
1796
|
-
|
1797
|
-
|
1798
|
-
|
1799
|
-
|
1800
|
-
|
1801
|
-
|
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
|
-
}
|
1761
|
+
function guardComponents(options) {
|
1762
|
+
if (options.components) {
|
1763
|
+
var components = options.components = guardArrayAssets(options.components);
|
1764
|
+
var ids = Object.keys(components);
|
1765
|
+
var def;
|
1766
|
+
if ('development' !== 'production') {
|
1767
|
+
var map = options._componentNameMap = {};
|
1768
|
+
}
|
1769
|
+
for (var i = 0, l = ids.length; i < l; i++) {
|
1770
|
+
var key = ids[i];
|
1771
|
+
if (commonTagRE.test(key) || reservedTagRE.test(key)) {
|
1772
|
+
'development' !== 'production' && warn('Do not use built-in or reserved HTML elements as component ' + 'id: ' + key);
|
1773
|
+
continue;
|
1822
1774
|
}
|
1823
|
-
|
1824
|
-
|
1825
|
-
|
1826
|
-
|
1827
|
-
if (newVal === value) {
|
1828
|
-
return;
|
1775
|
+
// record a all lowercase <-> kebab-case mapping for
|
1776
|
+
// possible custom element case error warning
|
1777
|
+
if ('development' !== 'production') {
|
1778
|
+
map[key.replace(/-/g, '').toLowerCase()] = hyphenate(key);
|
1829
1779
|
}
|
1830
|
-
|
1831
|
-
|
1832
|
-
|
1833
|
-
val = newVal;
|
1780
|
+
def = components[key];
|
1781
|
+
if (isPlainObject(def)) {
|
1782
|
+
components[key] = Vue.extend(def);
|
1834
1783
|
}
|
1835
|
-
childOb = doNotObserve ? isObject(newVal) && newVal.__ob__ : observe(newVal);
|
1836
|
-
dep.notify();
|
1837
|
-
}
|
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
1784
|
}
|
1857
|
-
}
|
1785
|
+
}
|
1858
1786
|
}
|
1859
1787
|
|
1860
1788
|
/**
|
1861
|
-
*
|
1862
|
-
*
|
1789
|
+
* Ensure all props option syntax are normalized into the
|
1790
|
+
* Object-based format.
|
1863
1791
|
*
|
1864
|
-
* @param {Element} el
|
1865
1792
|
* @param {Object} options
|
1866
|
-
* @return {Object|undefined}
|
1867
1793
|
*/
|
1868
1794
|
|
1869
|
-
function
|
1870
|
-
var
|
1871
|
-
var
|
1872
|
-
if (
|
1873
|
-
|
1874
|
-
|
1875
|
-
|
1876
|
-
|
1877
|
-
if (
|
1878
|
-
|
1879
|
-
} else if (
|
1880
|
-
|
1881
|
-
|
1882
|
-
|
1883
|
-
|
1884
|
-
|
1885
|
-
|
1795
|
+
function guardProps(options) {
|
1796
|
+
var props = options.props;
|
1797
|
+
var i, val;
|
1798
|
+
if (isArray(props)) {
|
1799
|
+
options.props = {};
|
1800
|
+
i = props.length;
|
1801
|
+
while (i--) {
|
1802
|
+
val = props[i];
|
1803
|
+
if (typeof val === 'string') {
|
1804
|
+
options.props[val] = null;
|
1805
|
+
} else if (val.name) {
|
1806
|
+
options.props[val.name] = val;
|
1807
|
+
}
|
1808
|
+
}
|
1809
|
+
} else if (isPlainObject(props)) {
|
1810
|
+
var keys = Object.keys(props);
|
1811
|
+
i = keys.length;
|
1812
|
+
while (i--) {
|
1813
|
+
val = props[keys[i]];
|
1814
|
+
if (typeof val === 'function') {
|
1815
|
+
props[keys[i]] = { type: val };
|
1886
1816
|
}
|
1887
1817
|
}
|
1888
|
-
} else if (hasAttrs) {
|
1889
|
-
return getIsBinding(el);
|
1890
1818
|
}
|
1891
1819
|
}
|
1892
1820
|
|
1893
1821
|
/**
|
1894
|
-
*
|
1822
|
+
* Guard an Array-format assets option and converted it
|
1823
|
+
* into the key-value Object format.
|
1895
1824
|
*
|
1896
|
-
* @param {
|
1897
|
-
* @return {Object
|
1825
|
+
* @param {Object|Array} assets
|
1826
|
+
* @return {Object}
|
1898
1827
|
*/
|
1899
1828
|
|
1900
|
-
function
|
1901
|
-
|
1902
|
-
|
1903
|
-
|
1904
|
-
|
1905
|
-
|
1906
|
-
|
1907
|
-
|
1908
|
-
|
1829
|
+
function guardArrayAssets(assets) {
|
1830
|
+
if (isArray(assets)) {
|
1831
|
+
var res = {};
|
1832
|
+
var i = assets.length;
|
1833
|
+
var asset;
|
1834
|
+
while (i--) {
|
1835
|
+
asset = assets[i];
|
1836
|
+
var id = typeof asset === 'function' ? asset.options && asset.options.name || asset.id : asset.name || asset.id;
|
1837
|
+
if (!id) {
|
1838
|
+
'development' !== 'production' && warn('Array-syntax assets must provide a "name" or "id" field.');
|
1839
|
+
} else {
|
1840
|
+
res[id] = asset;
|
1841
|
+
}
|
1909
1842
|
}
|
1843
|
+
return res;
|
1910
1844
|
}
|
1845
|
+
return assets;
|
1911
1846
|
}
|
1912
1847
|
|
1913
1848
|
/**
|
1914
|
-
*
|
1849
|
+
* Merge two option objects into a new one.
|
1850
|
+
* Core utility used in both instantiation and inheritance.
|
1915
1851
|
*
|
1916
|
-
* @param {
|
1917
|
-
* @param {Object}
|
1918
|
-
* @param {
|
1852
|
+
* @param {Object} parent
|
1853
|
+
* @param {Object} child
|
1854
|
+
* @param {Vue} [vm] - if vm is present, indicates this is
|
1855
|
+
* an instantiation merge.
|
1919
1856
|
*/
|
1920
1857
|
|
1921
|
-
function
|
1922
|
-
|
1923
|
-
|
1924
|
-
|
1925
|
-
|
1858
|
+
function mergeOptions(parent, child, vm) {
|
1859
|
+
guardComponents(child);
|
1860
|
+
guardProps(child);
|
1861
|
+
var options = {};
|
1862
|
+
var key;
|
1863
|
+
if (child.mixins) {
|
1864
|
+
for (var i = 0, l = child.mixins.length; i < l; i++) {
|
1865
|
+
parent = mergeOptions(parent, child.mixins[i], vm);
|
1866
|
+
}
|
1926
1867
|
}
|
1927
|
-
|
1928
|
-
|
1868
|
+
for (key in parent) {
|
1869
|
+
mergeField(key);
|
1929
1870
|
}
|
1930
|
-
|
1931
|
-
|
1932
|
-
|
1933
|
-
|
1934
|
-
*
|
1935
|
-
* @param {Vue} vm
|
1936
|
-
* @param {Object} options
|
1937
|
-
* @return {*}
|
1938
|
-
*/
|
1939
|
-
|
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;
|
1871
|
+
for (key in child) {
|
1872
|
+
if (!hasOwn(parent, key)) {
|
1873
|
+
mergeField(key);
|
1874
|
+
}
|
1945
1875
|
}
|
1946
|
-
|
1947
|
-
|
1948
|
-
|
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.');
|
1876
|
+
function mergeField(key) {
|
1877
|
+
var strat = strats[key] || defaultStrat;
|
1878
|
+
options[key] = strat(parent[key], child[key], vm, key);
|
1950
1879
|
}
|
1951
|
-
|
1952
|
-
return typeof def === 'function' && options.type !== Function ? def.call(vm) : def;
|
1880
|
+
return options;
|
1953
1881
|
}
|
1954
1882
|
|
1955
1883
|
/**
|
1956
|
-
*
|
1884
|
+
* Resolve an asset.
|
1885
|
+
* This function is used because child instances need access
|
1886
|
+
* to assets defined in its ancestor chain.
|
1957
1887
|
*
|
1958
|
-
* @param {Object}
|
1959
|
-
* @param {
|
1888
|
+
* @param {Object} options
|
1889
|
+
* @param {String} type
|
1890
|
+
* @param {String} id
|
1891
|
+
* @return {Object|Function}
|
1960
1892
|
*/
|
1961
1893
|
|
1962
|
-
function
|
1963
|
-
|
1964
|
-
|
1965
|
-
|
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
|
-
}
|
1894
|
+
function resolveAsset(options, type, id) {
|
1895
|
+
/* istanbul ignore if */
|
1896
|
+
if (typeof id !== 'string') {
|
1897
|
+
return;
|
2006
1898
|
}
|
2007
|
-
|
1899
|
+
var assets = options[type];
|
1900
|
+
var camelizedId;
|
1901
|
+
return assets[id] ||
|
1902
|
+
// camelCase ID
|
1903
|
+
assets[camelizedId = camelize(id)] ||
|
1904
|
+
// Pascal Case ID
|
1905
|
+
assets[camelizedId.charAt(0).toUpperCase() + camelizedId.slice(1)];
|
2008
1906
|
}
|
2009
1907
|
|
2010
1908
|
/**
|
2011
|
-
*
|
2012
|
-
*
|
2013
|
-
* @param {*} value
|
2014
|
-
* @param {Object} options
|
2015
|
-
* @return {*}
|
1909
|
+
* Assert asset exists
|
2016
1910
|
*/
|
2017
1911
|
|
2018
|
-
function
|
2019
|
-
|
2020
|
-
|
2021
|
-
return value;
|
1912
|
+
function assertAsset(val, type, id) {
|
1913
|
+
if (!val) {
|
1914
|
+
'development' !== 'production' && warn('Failed to resolve ' + type + ': ' + id);
|
2022
1915
|
}
|
2023
|
-
// coerce is a function
|
2024
|
-
return coerce(value);
|
2025
1916
|
}
|
2026
1917
|
|
2027
|
-
|
2028
|
-
return val ? val.charAt(0).toUpperCase() + val.slice(1) : 'custom type';
|
2029
|
-
}
|
1918
|
+
var uid$1 = 0;
|
2030
1919
|
|
2031
|
-
|
2032
|
-
|
1920
|
+
/**
|
1921
|
+
* A dep is an observable that can have multiple
|
1922
|
+
* directives subscribing to it.
|
1923
|
+
*
|
1924
|
+
* @constructor
|
1925
|
+
*/
|
1926
|
+
function Dep() {
|
1927
|
+
this.id = uid$1++;
|
1928
|
+
this.subs = [];
|
2033
1929
|
}
|
2034
1930
|
|
1931
|
+
// the current target watcher being evaluated.
|
1932
|
+
// this is globally unique because there could be only one
|
1933
|
+
// watcher being evaluated at any time.
|
1934
|
+
Dep.target = null;
|
1935
|
+
|
2035
1936
|
/**
|
2036
|
-
*
|
2037
|
-
* how to merge a parent option value and a child option
|
2038
|
-
* value into the final value.
|
1937
|
+
* Add a directive subscriber.
|
2039
1938
|
*
|
2040
|
-
*
|
1939
|
+
* @param {Directive} sub
|
1940
|
+
*/
|
1941
|
+
|
1942
|
+
Dep.prototype.addSub = function (sub) {
|
1943
|
+
this.subs.push(sub);
|
1944
|
+
};
|
1945
|
+
|
1946
|
+
/**
|
1947
|
+
* Remove a directive subscriber.
|
2041
1948
|
*
|
2042
|
-
* @param {
|
2043
|
-
* @param {*} childVal
|
2044
|
-
* @param {Vue} [vm]
|
1949
|
+
* @param {Directive} sub
|
2045
1950
|
*/
|
2046
1951
|
|
2047
|
-
|
1952
|
+
Dep.prototype.removeSub = function (sub) {
|
1953
|
+
this.subs.$remove(sub);
|
1954
|
+
};
|
2048
1955
|
|
2049
1956
|
/**
|
2050
|
-
*
|
1957
|
+
* Add self as a dependency to the target watcher.
|
2051
1958
|
*/
|
2052
1959
|
|
2053
|
-
function
|
2054
|
-
|
2055
|
-
|
2056
|
-
|
2057
|
-
|
2058
|
-
|
2059
|
-
|
2060
|
-
|
2061
|
-
|
2062
|
-
|
1960
|
+
Dep.prototype.depend = function () {
|
1961
|
+
Dep.target.addDep(this);
|
1962
|
+
};
|
1963
|
+
|
1964
|
+
/**
|
1965
|
+
* Notify all subscribers of a new value.
|
1966
|
+
*/
|
1967
|
+
|
1968
|
+
Dep.prototype.notify = function () {
|
1969
|
+
// stablize the subscriber list first
|
1970
|
+
var subs = toArray(this.subs);
|
1971
|
+
for (var i = 0, l = subs.length; i < l; i++) {
|
1972
|
+
subs[i].update();
|
2063
1973
|
}
|
2064
|
-
|
2065
|
-
|
1974
|
+
};
|
1975
|
+
|
1976
|
+
var arrayProto = Array.prototype;
|
1977
|
+
var arrayMethods = Object.create(arrayProto)
|
2066
1978
|
|
2067
1979
|
/**
|
2068
|
-
*
|
1980
|
+
* Intercept mutating methods and emit events
|
2069
1981
|
*/
|
2070
1982
|
|
2071
|
-
|
2072
|
-
|
2073
|
-
|
2074
|
-
|
2075
|
-
|
2076
|
-
|
2077
|
-
|
2078
|
-
|
2079
|
-
|
1983
|
+
;['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'].forEach(function (method) {
|
1984
|
+
// cache original method
|
1985
|
+
var original = arrayProto[method];
|
1986
|
+
def(arrayMethods, method, function mutator() {
|
1987
|
+
// avoid leaking arguments:
|
1988
|
+
// http://jsperf.com/closure-with-arguments
|
1989
|
+
var i = arguments.length;
|
1990
|
+
var args = new Array(i);
|
1991
|
+
while (i--) {
|
1992
|
+
args[i] = arguments[i];
|
2080
1993
|
}
|
2081
|
-
|
2082
|
-
|
1994
|
+
var result = original.apply(this, args);
|
1995
|
+
var ob = this.__ob__;
|
1996
|
+
var inserted;
|
1997
|
+
switch (method) {
|
1998
|
+
case 'push':
|
1999
|
+
inserted = args;
|
2000
|
+
break;
|
2001
|
+
case 'unshift':
|
2002
|
+
inserted = args;
|
2003
|
+
break;
|
2004
|
+
case 'splice':
|
2005
|
+
inserted = args.slice(2);
|
2006
|
+
break;
|
2083
2007
|
}
|
2084
|
-
|
2085
|
-
//
|
2086
|
-
|
2087
|
-
|
2088
|
-
|
2089
|
-
|
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
|
-
};
|
2008
|
+
if (inserted) ob.observeArray(inserted);
|
2009
|
+
// notify change
|
2010
|
+
ob.dep.notify();
|
2011
|
+
return result;
|
2012
|
+
});
|
2013
|
+
});
|
2105
2014
|
|
2106
2015
|
/**
|
2107
|
-
*
|
2016
|
+
* Swap the element at the given index with a new value
|
2017
|
+
* and emits corresponding event.
|
2018
|
+
*
|
2019
|
+
* @param {Number} index
|
2020
|
+
* @param {*} val
|
2021
|
+
* @return {*} - replaced element
|
2108
2022
|
*/
|
2109
2023
|
|
2110
|
-
|
2111
|
-
if (
|
2112
|
-
|
2113
|
-
return;
|
2024
|
+
def(arrayProto, '$set', function $set(index, val) {
|
2025
|
+
if (index >= this.length) {
|
2026
|
+
this.length = Number(index) + 1;
|
2114
2027
|
}
|
2115
|
-
|
2116
|
-
|
2117
|
-
return vm && typeof ret === 'function' ? ret.call(vm) : ret;
|
2118
|
-
};
|
2028
|
+
return this.splice(index, 1, val)[0];
|
2029
|
+
});
|
2119
2030
|
|
2120
2031
|
/**
|
2121
|
-
*
|
2032
|
+
* Convenience method to remove the element at given index.
|
2033
|
+
*
|
2034
|
+
* @param {Number} index
|
2035
|
+
* @param {*} val
|
2122
2036
|
*/
|
2123
2037
|
|
2124
|
-
|
2125
|
-
|
2126
|
-
|
2038
|
+
def(arrayProto, '$remove', function $remove(item) {
|
2039
|
+
/* istanbul ignore if */
|
2040
|
+
if (!this.length) return;
|
2041
|
+
var index = indexOf(this, item);
|
2042
|
+
if (index > -1) {
|
2043
|
+
return this.splice(index, 1);
|
2044
|
+
}
|
2045
|
+
});
|
2046
|
+
|
2047
|
+
var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
|
2127
2048
|
|
2128
2049
|
/**
|
2129
|
-
*
|
2050
|
+
* By default, when a reactive property is set, the new value is
|
2051
|
+
* also converted to become reactive. However in certain cases, e.g.
|
2052
|
+
* v-for scope alias and props, we don't want to force conversion
|
2053
|
+
* because the value may be a nested value under a frozen data structure.
|
2054
|
+
*
|
2055
|
+
* So whenever we want to set a reactive property without forcing
|
2056
|
+
* conversion on the new value, we wrap that call inside this function.
|
2130
2057
|
*/
|
2131
2058
|
|
2132
|
-
|
2133
|
-
|
2134
|
-
|
2135
|
-
|
2059
|
+
var shouldConvert = true;
|
2060
|
+
|
2061
|
+
function withoutConversion(fn) {
|
2062
|
+
shouldConvert = false;
|
2063
|
+
fn();
|
2064
|
+
shouldConvert = true;
|
2065
|
+
}
|
2136
2066
|
|
2137
2067
|
/**
|
2138
|
-
*
|
2068
|
+
* Observer class that are attached to each observed
|
2069
|
+
* object. Once attached, the observer converts target
|
2070
|
+
* object's property keys into getter/setters that
|
2071
|
+
* collect dependencies and dispatches updates.
|
2139
2072
|
*
|
2140
|
-
*
|
2141
|
-
*
|
2142
|
-
* options and parent options.
|
2073
|
+
* @param {Array|Object} value
|
2074
|
+
* @constructor
|
2143
2075
|
*/
|
2144
2076
|
|
2145
|
-
function
|
2146
|
-
|
2147
|
-
|
2077
|
+
function Observer(value) {
|
2078
|
+
this.value = value;
|
2079
|
+
this.dep = new Dep();
|
2080
|
+
def(value, '__ob__', this);
|
2081
|
+
if (isArray(value)) {
|
2082
|
+
var augment = hasProto ? protoAugment : copyAugment;
|
2083
|
+
augment(value, arrayMethods, arrayKeys);
|
2084
|
+
this.observeArray(value);
|
2085
|
+
} else {
|
2086
|
+
this.walk(value);
|
2087
|
+
}
|
2148
2088
|
}
|
2149
2089
|
|
2150
|
-
|
2151
|
-
strats[type + 's'] = mergeAssets;
|
2152
|
-
});
|
2090
|
+
// Instance methods
|
2153
2091
|
|
2154
2092
|
/**
|
2155
|
-
*
|
2093
|
+
* Walk through each property and convert them into
|
2094
|
+
* getter/setters. This method should only be called when
|
2095
|
+
* value type is Object.
|
2156
2096
|
*
|
2157
|
-
*
|
2158
|
-
* another, so we merge them as arrays.
|
2097
|
+
* @param {Object} obj
|
2159
2098
|
*/
|
2160
2099
|
|
2161
|
-
|
2162
|
-
|
2163
|
-
|
2164
|
-
|
2165
|
-
|
2166
|
-
|
2167
|
-
|
2168
|
-
|
2169
|
-
|
2170
|
-
|
2171
|
-
|
2172
|
-
|
2100
|
+
Observer.prototype.walk = function (obj) {
|
2101
|
+
var keys = Object.keys(obj);
|
2102
|
+
for (var i = 0, l = keys.length; i < l; i++) {
|
2103
|
+
this.convert(keys[i], obj[keys[i]]);
|
2104
|
+
}
|
2105
|
+
};
|
2106
|
+
|
2107
|
+
/**
|
2108
|
+
* Observe a list of Array items.
|
2109
|
+
*
|
2110
|
+
* @param {Array} items
|
2111
|
+
*/
|
2112
|
+
|
2113
|
+
Observer.prototype.observeArray = function (items) {
|
2114
|
+
for (var i = 0, l = items.length; i < l; i++) {
|
2115
|
+
observe(items[i]);
|
2173
2116
|
}
|
2174
|
-
return ret;
|
2175
2117
|
};
|
2176
2118
|
|
2177
2119
|
/**
|
2178
|
-
*
|
2120
|
+
* Convert a property into getter/setter so we can emit
|
2121
|
+
* the events when the property is accessed/changed.
|
2122
|
+
*
|
2123
|
+
* @param {String} key
|
2124
|
+
* @param {*} val
|
2179
2125
|
*/
|
2180
2126
|
|
2181
|
-
|
2182
|
-
|
2183
|
-
if (!parentVal) return childVal;
|
2184
|
-
var ret = Object.create(null);
|
2185
|
-
extend(ret, parentVal);
|
2186
|
-
extend(ret, childVal);
|
2187
|
-
return ret;
|
2127
|
+
Observer.prototype.convert = function (key, val) {
|
2128
|
+
defineReactive(this.value, key, val);
|
2188
2129
|
};
|
2189
2130
|
|
2190
2131
|
/**
|
2191
|
-
*
|
2132
|
+
* Add an owner vm, so that when $set/$delete mutations
|
2133
|
+
* happen we can notify owner vms to proxy the keys and
|
2134
|
+
* digest the watchers. This is only called when the object
|
2135
|
+
* is observed as an instance's root $data.
|
2136
|
+
*
|
2137
|
+
* @param {Vue} vm
|
2192
2138
|
*/
|
2193
2139
|
|
2194
|
-
|
2195
|
-
|
2140
|
+
Observer.prototype.addVm = function (vm) {
|
2141
|
+
(this.vms || (this.vms = [])).push(vm);
|
2196
2142
|
};
|
2197
2143
|
|
2198
2144
|
/**
|
2199
|
-
*
|
2200
|
-
*
|
2145
|
+
* Remove an owner vm. This is called when the object is
|
2146
|
+
* swapped out as an instance's $data object.
|
2201
2147
|
*
|
2202
|
-
* @param {
|
2148
|
+
* @param {Vue} vm
|
2203
2149
|
*/
|
2204
2150
|
|
2205
|
-
function
|
2206
|
-
|
2207
|
-
|
2208
|
-
|
2209
|
-
|
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
|
-
}
|
2151
|
+
Observer.prototype.removeVm = function (vm) {
|
2152
|
+
this.vms.$remove(vm);
|
2153
|
+
};
|
2154
|
+
|
2155
|
+
// helpers
|
2231
2156
|
|
2232
2157
|
/**
|
2233
|
-
*
|
2234
|
-
*
|
2158
|
+
* Augment an target Object or Array by intercepting
|
2159
|
+
* the prototype chain using __proto__
|
2235
2160
|
*
|
2236
|
-
* @param {Object}
|
2161
|
+
* @param {Object|Array} target
|
2162
|
+
* @param {Object} src
|
2237
2163
|
*/
|
2238
2164
|
|
2239
|
-
function
|
2240
|
-
|
2241
|
-
|
2242
|
-
|
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
|
-
}
|
2165
|
+
function protoAugment(target, src) {
|
2166
|
+
/* eslint-disable no-proto */
|
2167
|
+
target.__proto__ = src;
|
2168
|
+
/* eslint-enable no-proto */
|
2263
2169
|
}
|
2264
2170
|
|
2265
2171
|
/**
|
2266
|
-
*
|
2267
|
-
*
|
2172
|
+
* Augment an target Object or Array by defining
|
2173
|
+
* hidden properties.
|
2268
2174
|
*
|
2269
|
-
* @param {Object|Array}
|
2270
|
-
* @
|
2175
|
+
* @param {Object|Array} target
|
2176
|
+
* @param {Object} proto
|
2271
2177
|
*/
|
2272
2178
|
|
2273
|
-
function
|
2274
|
-
|
2275
|
-
var
|
2276
|
-
|
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;
|
2179
|
+
function copyAugment(target, src, keys) {
|
2180
|
+
for (var i = 0, l = keys.length; i < l; i++) {
|
2181
|
+
var key = keys[i];
|
2182
|
+
def(target, key, src[key]);
|
2288
2183
|
}
|
2289
|
-
return assets;
|
2290
2184
|
}
|
2291
2185
|
|
2292
2186
|
/**
|
2293
|
-
*
|
2294
|
-
*
|
2187
|
+
* Attempt to create an observer instance for a value,
|
2188
|
+
* returns the new observer if successfully observed,
|
2189
|
+
* or the existing observer if the value already has one.
|
2295
2190
|
*
|
2296
|
-
* @param {
|
2297
|
-
* @param {
|
2298
|
-
* @
|
2299
|
-
*
|
2191
|
+
* @param {*} value
|
2192
|
+
* @param {Vue} [vm]
|
2193
|
+
* @return {Observer|undefined}
|
2194
|
+
* @static
|
2300
2195
|
*/
|
2301
2196
|
|
2302
|
-
function
|
2303
|
-
|
2304
|
-
|
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
|
-
}
|
2311
|
-
}
|
2312
|
-
for (key in parent) {
|
2313
|
-
mergeField(key);
|
2197
|
+
function observe(value, vm) {
|
2198
|
+
if (!value || typeof value !== 'object') {
|
2199
|
+
return;
|
2314
2200
|
}
|
2315
|
-
|
2316
|
-
|
2317
|
-
|
2318
|
-
|
2201
|
+
var ob;
|
2202
|
+
if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
|
2203
|
+
ob = value.__ob__;
|
2204
|
+
} else if (shouldConvert && (isArray(value) || isPlainObject(value)) && Object.isExtensible(value) && !value._isVue) {
|
2205
|
+
ob = new Observer(value);
|
2319
2206
|
}
|
2320
|
-
|
2321
|
-
|
2322
|
-
options[key] = strat(parent[key], child[key], vm, key);
|
2207
|
+
if (ob && vm) {
|
2208
|
+
ob.addVm(vm);
|
2323
2209
|
}
|
2324
|
-
return
|
2210
|
+
return ob;
|
2325
2211
|
}
|
2326
2212
|
|
2327
2213
|
/**
|
2328
|
-
*
|
2329
|
-
* This function is used because child instances need access
|
2330
|
-
* to assets defined in its ancestor chain.
|
2214
|
+
* Define a reactive property on an Object.
|
2331
2215
|
*
|
2332
|
-
* @param {Object}
|
2333
|
-
* @param {String}
|
2334
|
-
* @param {
|
2335
|
-
* @return {Object|Function}
|
2216
|
+
* @param {Object} obj
|
2217
|
+
* @param {String} key
|
2218
|
+
* @param {*} val
|
2336
2219
|
*/
|
2337
2220
|
|
2338
|
-
function
|
2339
|
-
|
2340
|
-
|
2221
|
+
function defineReactive(obj, key, val) {
|
2222
|
+
var dep = new Dep();
|
2223
|
+
|
2224
|
+
var property = Object.getOwnPropertyDescriptor(obj, key);
|
2225
|
+
if (property && property.configurable === false) {
|
2341
2226
|
return;
|
2342
2227
|
}
|
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
|
-
}
|
2351
2228
|
|
2352
|
-
|
2353
|
-
|
2354
|
-
|
2229
|
+
// cater for pre-defined getter/setters
|
2230
|
+
var getter = property && property.get;
|
2231
|
+
var setter = property && property.set;
|
2355
2232
|
|
2356
|
-
|
2357
|
-
|
2358
|
-
|
2359
|
-
|
2233
|
+
var childOb = observe(val);
|
2234
|
+
Object.defineProperty(obj, key, {
|
2235
|
+
enumerable: true,
|
2236
|
+
configurable: true,
|
2237
|
+
get: function reactiveGetter() {
|
2238
|
+
var value = getter ? getter.call(obj) : val;
|
2239
|
+
if (Dep.target) {
|
2240
|
+
dep.depend();
|
2241
|
+
if (childOb) {
|
2242
|
+
childOb.dep.depend();
|
2243
|
+
}
|
2244
|
+
if (isArray(value)) {
|
2245
|
+
for (var e, i = 0, l = value.length; i < l; i++) {
|
2246
|
+
e = value[i];
|
2247
|
+
e && e.__ob__ && e.__ob__.dep.depend();
|
2248
|
+
}
|
2249
|
+
}
|
2250
|
+
}
|
2251
|
+
return value;
|
2252
|
+
},
|
2253
|
+
set: function reactiveSetter(newVal) {
|
2254
|
+
var value = getter ? getter.call(obj) : val;
|
2255
|
+
if (newVal === value) {
|
2256
|
+
return;
|
2257
|
+
}
|
2258
|
+
if (setter) {
|
2259
|
+
setter.call(obj, newVal);
|
2260
|
+
} else {
|
2261
|
+
val = newVal;
|
2262
|
+
}
|
2263
|
+
childOb = observe(newVal);
|
2264
|
+
dep.notify();
|
2265
|
+
}
|
2266
|
+
});
|
2360
2267
|
}
|
2361
2268
|
|
2362
2269
|
|
@@ -2424,9 +2331,6 @@ var transition = Object.freeze({
|
|
2424
2331
|
resolveAsset: resolveAsset,
|
2425
2332
|
assertAsset: assertAsset,
|
2426
2333
|
checkComponentAttr: checkComponentAttr,
|
2427
|
-
initProp: initProp,
|
2428
|
-
assertProp: assertProp,
|
2429
|
-
coerceProp: coerceProp,
|
2430
2334
|
commonTagRE: commonTagRE,
|
2431
2335
|
reservedTagRE: reservedTagRE,
|
2432
2336
|
get warn () { return warn; }
|
@@ -3170,7 +3074,7 @@ var expression = Object.freeze({
|
|
3170
3074
|
* This is used for both the $watch() api and directives.
|
3171
3075
|
*
|
3172
3076
|
* @param {Vue} vm
|
3173
|
-
* @param {String}
|
3077
|
+
* @param {String|Function} expOrFn
|
3174
3078
|
* @param {Function} cb
|
3175
3079
|
* @param {Object} options
|
3176
3080
|
* - {Array} filters
|
@@ -3772,6 +3676,7 @@ var template = Object.freeze({
|
|
3772
3676
|
* @param {DocumentFragment} frag
|
3773
3677
|
* @param {Vue} [host]
|
3774
3678
|
* @param {Object} [scope]
|
3679
|
+
* @param {Fragment} [parentFrag]
|
3775
3680
|
*/
|
3776
3681
|
function Fragment(linker, vm, frag, host, scope, parentFrag) {
|
3777
3682
|
this.children = [];
|
@@ -4019,6 +3924,7 @@ var template = Object.freeze({
|
|
4019
3924
|
var vFor = {
|
4020
3925
|
|
4021
3926
|
priority: FOR,
|
3927
|
+
terminal: true,
|
4022
3928
|
|
4023
3929
|
params: ['track-by', 'stagger', 'enter-stagger', 'leave-stagger'],
|
4024
3930
|
|
@@ -4128,7 +4034,9 @@ var template = Object.freeze({
|
|
4128
4034
|
// update data for track-by, object repeat &
|
4129
4035
|
// primitive values.
|
4130
4036
|
if (trackByKey || convertedFromObject || primitive) {
|
4131
|
-
|
4037
|
+
withoutConversion(function () {
|
4038
|
+
frag.scope[alias] = value;
|
4039
|
+
});
|
4132
4040
|
}
|
4133
4041
|
} else {
|
4134
4042
|
// new isntance
|
@@ -4218,7 +4126,11 @@ var template = Object.freeze({
|
|
4218
4126
|
// for two-way binding on alias
|
4219
4127
|
scope.$forContext = this;
|
4220
4128
|
// define scope properties
|
4221
|
-
|
4129
|
+
// important: define the scope alias without forced conversion
|
4130
|
+
// so that frozen data structures remain non-reactive.
|
4131
|
+
withoutConversion(function () {
|
4132
|
+
defineReactive(scope, alias, value);
|
4133
|
+
});
|
4222
4134
|
defineReactive(scope, '$index', index);
|
4223
4135
|
if (key) {
|
4224
4136
|
defineReactive(scope, '$key', key);
|
@@ -4594,6 +4506,7 @@ var template = Object.freeze({
|
|
4594
4506
|
var vIf = {
|
4595
4507
|
|
4596
4508
|
priority: IF,
|
4509
|
+
terminal: true,
|
4597
4510
|
|
4598
4511
|
bind: function bind() {
|
4599
4512
|
var el = this.el;
|
@@ -5519,22 +5432,18 @@ var template = Object.freeze({
|
|
5519
5432
|
|
5520
5433
|
handleObject: function handleObject(value) {
|
5521
5434
|
this.cleanup(value);
|
5522
|
-
|
5523
|
-
|
5524
|
-
var key = keys[i];
|
5525
|
-
if (value[key]) {
|
5526
|
-
addClass(this.el, key);
|
5527
|
-
} else {
|
5528
|
-
removeClass(this.el, key);
|
5529
|
-
}
|
5530
|
-
}
|
5435
|
+
this.prevKeys = Object.keys(value);
|
5436
|
+
setObjectClasses(this.el, value);
|
5531
5437
|
},
|
5532
5438
|
|
5533
5439
|
handleArray: function handleArray(value) {
|
5534
5440
|
this.cleanup(value);
|
5535
5441
|
for (var i = 0, l = value.length; i < l; i++) {
|
5536
|
-
|
5537
|
-
|
5442
|
+
var val = value[i];
|
5443
|
+
if (val && isPlainObject(val)) {
|
5444
|
+
setObjectClasses(this.el, val);
|
5445
|
+
} else if (val && typeof val === 'string') {
|
5446
|
+
addClass(this.el, val);
|
5538
5447
|
}
|
5539
5448
|
}
|
5540
5449
|
this.prevKeys = value.slice();
|
@@ -5545,13 +5454,29 @@ var template = Object.freeze({
|
|
5545
5454
|
var i = this.prevKeys.length;
|
5546
5455
|
while (i--) {
|
5547
5456
|
var key = this.prevKeys[i];
|
5548
|
-
if (
|
5457
|
+
if (!key) continue;
|
5458
|
+
if (isPlainObject(key)) {
|
5459
|
+
var keys = Object.keys(key);
|
5460
|
+
for (var k = 0; k < keys.length; k++) {
|
5461
|
+
removeClass(this.el, keys[k]);
|
5462
|
+
}
|
5463
|
+
} else {
|
5549
5464
|
removeClass(this.el, key);
|
5550
5465
|
}
|
5551
5466
|
}
|
5552
5467
|
}
|
5553
5468
|
}
|
5554
|
-
};
|
5469
|
+
};
|
5470
|
+
|
5471
|
+
function setObjectClasses(el, obj) {
|
5472
|
+
var keys = Object.keys(obj);
|
5473
|
+
for (var i = 0, l = keys.length; i < l; i++) {
|
5474
|
+
var key = keys[i];
|
5475
|
+
if (obj[key]) {
|
5476
|
+
addClass(el, key);
|
5477
|
+
}
|
5478
|
+
}
|
5479
|
+
}
|
5555
5480
|
|
5556
5481
|
function stringToObject(value) {
|
5557
5482
|
var res = {};
|
@@ -5563,10 +5488,6 @@ var template = Object.freeze({
|
|
5563
5488
|
return res;
|
5564
5489
|
}
|
5565
5490
|
|
5566
|
-
function contains(value, key) {
|
5567
|
-
return isArray(value) ? value.indexOf(key) > -1 : hasOwn(value, key);
|
5568
|
-
}
|
5569
|
-
|
5570
5491
|
var component = {
|
5571
5492
|
|
5572
5493
|
priority: COMPONENT,
|
@@ -5663,16 +5584,19 @@ var template = Object.freeze({
|
|
5663
5584
|
/**
|
5664
5585
|
* Resolve the component constructor to use when creating
|
5665
5586
|
* the child vm.
|
5587
|
+
*
|
5588
|
+
* @param {String|Function} value
|
5589
|
+
* @param {Function} cb
|
5666
5590
|
*/
|
5667
5591
|
|
5668
|
-
resolveComponent: function resolveComponent(
|
5592
|
+
resolveComponent: function resolveComponent(value, cb) {
|
5669
5593
|
var self = this;
|
5670
5594
|
this.pendingComponentCb = cancellable(function (Component) {
|
5671
|
-
self.ComponentName = Component.options.name ||
|
5595
|
+
self.ComponentName = Component.options.name || (typeof value === 'string' ? value : null);
|
5672
5596
|
self.Component = Component;
|
5673
5597
|
cb();
|
5674
5598
|
});
|
5675
|
-
this.vm._resolveComponent(
|
5599
|
+
this.vm._resolveComponent(value, this.pendingComponentCb);
|
5676
5600
|
},
|
5677
5601
|
|
5678
5602
|
/**
|
@@ -5804,7 +5728,9 @@ var template = Object.freeze({
|
|
5804
5728
|
|
5805
5729
|
unbuild: function unbuild(defer) {
|
5806
5730
|
if (this.waitingFor) {
|
5807
|
-
this.
|
5731
|
+
if (!this.keepAlive) {
|
5732
|
+
this.waitingFor.$destroy();
|
5733
|
+
}
|
5808
5734
|
this.waitingFor = null;
|
5809
5735
|
}
|
5810
5736
|
var child = this.childVM;
|
@@ -5900,27 +5826,309 @@ var template = Object.freeze({
|
|
5900
5826
|
this.cache = null;
|
5901
5827
|
}
|
5902
5828
|
}
|
5903
|
-
};
|
5829
|
+
};
|
5830
|
+
|
5831
|
+
/**
|
5832
|
+
* Call activate hooks in order (asynchronous)
|
5833
|
+
*
|
5834
|
+
* @param {Array} hooks
|
5835
|
+
* @param {Vue} vm
|
5836
|
+
* @param {Function} cb
|
5837
|
+
*/
|
5838
|
+
|
5839
|
+
function callActivateHooks(hooks, vm, cb) {
|
5840
|
+
var total = hooks.length;
|
5841
|
+
var called = 0;
|
5842
|
+
hooks[0].call(vm, next);
|
5843
|
+
function next() {
|
5844
|
+
if (++called >= total) {
|
5845
|
+
cb();
|
5846
|
+
} else {
|
5847
|
+
hooks[called].call(vm, next);
|
5848
|
+
}
|
5849
|
+
}
|
5850
|
+
}
|
5851
|
+
|
5852
|
+
var propBindingModes = config._propBindingModes;
|
5853
|
+
var empty = {};
|
5854
|
+
|
5855
|
+
// regexes
|
5856
|
+
var identRE$1 = /^[$_a-zA-Z]+[\w$]*$/;
|
5857
|
+
var settablePathRE = /^[A-Za-z_$][\w$]*(\.[A-Za-z_$][\w$]*|\[[^\[\]]+\])*$/;
|
5858
|
+
|
5859
|
+
/**
|
5860
|
+
* Compile props on a root element and return
|
5861
|
+
* a props link function.
|
5862
|
+
*
|
5863
|
+
* @param {Element|DocumentFragment} el
|
5864
|
+
* @param {Array} propOptions
|
5865
|
+
* @return {Function} propsLinkFn
|
5866
|
+
*/
|
5867
|
+
|
5868
|
+
function compileProps(el, propOptions) {
|
5869
|
+
var props = [];
|
5870
|
+
var names = Object.keys(propOptions);
|
5871
|
+
var i = names.length;
|
5872
|
+
var options, name, attr, value, path, parsed, prop;
|
5873
|
+
while (i--) {
|
5874
|
+
name = names[i];
|
5875
|
+
options = propOptions[name] || empty;
|
5876
|
+
|
5877
|
+
if ('development' !== 'production' && name === '$data') {
|
5878
|
+
warn('Do not use $data as prop.');
|
5879
|
+
continue;
|
5880
|
+
}
|
5881
|
+
|
5882
|
+
// props could contain dashes, which will be
|
5883
|
+
// interpreted as minus calculations by the parser
|
5884
|
+
// so we need to camelize the path here
|
5885
|
+
path = camelize(name);
|
5886
|
+
if (!identRE$1.test(path)) {
|
5887
|
+
'development' !== 'production' && warn('Invalid prop key: "' + name + '". Prop keys ' + 'must be valid identifiers.');
|
5888
|
+
continue;
|
5889
|
+
}
|
5890
|
+
|
5891
|
+
prop = {
|
5892
|
+
name: name,
|
5893
|
+
path: path,
|
5894
|
+
options: options,
|
5895
|
+
mode: propBindingModes.ONE_WAY,
|
5896
|
+
raw: null
|
5897
|
+
};
|
5898
|
+
|
5899
|
+
attr = hyphenate(name);
|
5900
|
+
// first check dynamic version
|
5901
|
+
if ((value = getBindAttr(el, attr)) === null) {
|
5902
|
+
if ((value = getBindAttr(el, attr + '.sync')) !== null) {
|
5903
|
+
prop.mode = propBindingModes.TWO_WAY;
|
5904
|
+
} else if ((value = getBindAttr(el, attr + '.once')) !== null) {
|
5905
|
+
prop.mode = propBindingModes.ONE_TIME;
|
5906
|
+
}
|
5907
|
+
}
|
5908
|
+
if (value !== null) {
|
5909
|
+
// has dynamic binding!
|
5910
|
+
prop.raw = value;
|
5911
|
+
parsed = parseDirective(value);
|
5912
|
+
value = parsed.expression;
|
5913
|
+
prop.filters = parsed.filters;
|
5914
|
+
// check binding type
|
5915
|
+
if (isLiteral(value) && !parsed.filters) {
|
5916
|
+
// for expressions containing literal numbers and
|
5917
|
+
// booleans, there's no need to setup a prop binding,
|
5918
|
+
// so we can optimize them as a one-time set.
|
5919
|
+
prop.optimizedLiteral = true;
|
5920
|
+
} else {
|
5921
|
+
prop.dynamic = true;
|
5922
|
+
// check non-settable path for two-way bindings
|
5923
|
+
if ('development' !== 'production' && prop.mode === propBindingModes.TWO_WAY && !settablePathRE.test(value)) {
|
5924
|
+
prop.mode = propBindingModes.ONE_WAY;
|
5925
|
+
warn('Cannot bind two-way prop with non-settable ' + 'parent path: ' + value);
|
5926
|
+
}
|
5927
|
+
}
|
5928
|
+
prop.parentPath = value;
|
5929
|
+
|
5930
|
+
// warn required two-way
|
5931
|
+
if ('development' !== 'production' && options.twoWay && prop.mode !== propBindingModes.TWO_WAY) {
|
5932
|
+
warn('Prop "' + name + '" expects a two-way binding type.');
|
5933
|
+
}
|
5934
|
+
} else if ((value = getAttr(el, attr)) !== null) {
|
5935
|
+
// has literal binding!
|
5936
|
+
prop.raw = value;
|
5937
|
+
} else if ('development' !== 'production') {
|
5938
|
+
// check possible camelCase prop usage
|
5939
|
+
var lowerCaseName = path.toLowerCase();
|
5940
|
+
value = /[A-Z\-]/.test(name) && (el.getAttribute(lowerCaseName) || el.getAttribute(':' + lowerCaseName) || el.getAttribute('v-bind:' + lowerCaseName) || el.getAttribute(':' + lowerCaseName + '.once') || el.getAttribute('v-bind:' + lowerCaseName + '.once') || el.getAttribute(':' + lowerCaseName + '.sync') || el.getAttribute('v-bind:' + lowerCaseName + '.sync'));
|
5941
|
+
if (value) {
|
5942
|
+
warn('Possible usage error for prop `' + lowerCaseName + '` - ' + 'did you mean `' + attr + '`? HTML is case-insensitive, remember to use ' + 'kebab-case for props in templates.');
|
5943
|
+
} else if (options.required) {
|
5944
|
+
// warn missing required
|
5945
|
+
warn('Missing required prop: ' + name);
|
5946
|
+
}
|
5947
|
+
}
|
5948
|
+
// push prop
|
5949
|
+
props.push(prop);
|
5950
|
+
}
|
5951
|
+
return makePropsLinkFn(props);
|
5952
|
+
}
|
5953
|
+
|
5954
|
+
/**
|
5955
|
+
* Build a function that applies props to a vm.
|
5956
|
+
*
|
5957
|
+
* @param {Array} props
|
5958
|
+
* @return {Function} propsLinkFn
|
5959
|
+
*/
|
5960
|
+
|
5961
|
+
function makePropsLinkFn(props) {
|
5962
|
+
return function propsLinkFn(vm, scope) {
|
5963
|
+
// store resolved props info
|
5964
|
+
vm._props = {};
|
5965
|
+
var i = props.length;
|
5966
|
+
var prop, path, options, value, raw;
|
5967
|
+
while (i--) {
|
5968
|
+
prop = props[i];
|
5969
|
+
raw = prop.raw;
|
5970
|
+
path = prop.path;
|
5971
|
+
options = prop.options;
|
5972
|
+
vm._props[path] = prop;
|
5973
|
+
if (raw === null) {
|
5974
|
+
// initialize absent prop
|
5975
|
+
initProp(vm, prop, undefined);
|
5976
|
+
} else if (prop.dynamic) {
|
5977
|
+
// dynamic prop
|
5978
|
+
if (prop.mode === propBindingModes.ONE_TIME) {
|
5979
|
+
// one time binding
|
5980
|
+
value = (scope || vm._context || vm).$get(prop.parentPath);
|
5981
|
+
initProp(vm, prop, value);
|
5982
|
+
} else {
|
5983
|
+
if (vm._context) {
|
5984
|
+
// dynamic binding
|
5985
|
+
vm._bindDir({
|
5986
|
+
name: 'prop',
|
5987
|
+
def: propDef,
|
5988
|
+
prop: prop
|
5989
|
+
}, null, null, scope); // el, host, scope
|
5990
|
+
} else {
|
5991
|
+
// root instance
|
5992
|
+
initProp(vm, prop, vm.$get(prop.parentPath));
|
5993
|
+
}
|
5994
|
+
}
|
5995
|
+
} else if (prop.optimizedLiteral) {
|
5996
|
+
// optimized literal, cast it and just set once
|
5997
|
+
var stripped = stripQuotes(raw);
|
5998
|
+
value = stripped === raw ? toBoolean(toNumber(raw)) : stripped;
|
5999
|
+
initProp(vm, prop, value);
|
6000
|
+
} else {
|
6001
|
+
// string literal, but we need to cater for
|
6002
|
+
// Boolean props with no value, or with same
|
6003
|
+
// literal value (e.g. disabled="disabled")
|
6004
|
+
// see https://github.com/vuejs/vue-loader/issues/182
|
6005
|
+
value = options.type === Boolean && (raw === '' || raw === hyphenate(prop.name)) ? true : raw;
|
6006
|
+
initProp(vm, prop, value);
|
6007
|
+
}
|
6008
|
+
}
|
6009
|
+
};
|
6010
|
+
}
|
6011
|
+
|
6012
|
+
/**
|
6013
|
+
* Set a prop's initial value on a vm and its data object.
|
6014
|
+
*
|
6015
|
+
* @param {Vue} vm
|
6016
|
+
* @param {Object} prop
|
6017
|
+
* @param {*} value
|
6018
|
+
*/
|
6019
|
+
|
6020
|
+
function initProp(vm, prop, value) {
|
6021
|
+
var key = prop.path;
|
6022
|
+
value = coerceProp(prop, value);
|
6023
|
+
if (value === undefined) {
|
6024
|
+
value = getPropDefaultValue(vm, prop.options);
|
6025
|
+
}
|
6026
|
+
if (assertProp(prop, value)) {
|
6027
|
+
defineReactive(vm, key, value);
|
6028
|
+
}
|
6029
|
+
}
|
6030
|
+
|
6031
|
+
/**
|
6032
|
+
* Get the default value of a prop.
|
6033
|
+
*
|
6034
|
+
* @param {Vue} vm
|
6035
|
+
* @param {Object} options
|
6036
|
+
* @return {*}
|
6037
|
+
*/
|
6038
|
+
|
6039
|
+
function getPropDefaultValue(vm, options) {
|
6040
|
+
// no default, return undefined
|
6041
|
+
if (!hasOwn(options, 'default')) {
|
6042
|
+
// absent boolean value defaults to false
|
6043
|
+
return options.type === Boolean ? false : undefined;
|
6044
|
+
}
|
6045
|
+
var def = options['default'];
|
6046
|
+
// warn against non-factory defaults for Object & Array
|
6047
|
+
if (isObject(def)) {
|
6048
|
+
'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.');
|
6049
|
+
}
|
6050
|
+
// call factory function for non-Function types
|
6051
|
+
return typeof def === 'function' && options.type !== Function ? def.call(vm) : def;
|
6052
|
+
}
|
6053
|
+
|
6054
|
+
/**
|
6055
|
+
* Assert whether a prop is valid.
|
6056
|
+
*
|
6057
|
+
* @param {Object} prop
|
6058
|
+
* @param {*} value
|
6059
|
+
*/
|
6060
|
+
|
6061
|
+
function assertProp(prop, value) {
|
6062
|
+
if (!prop.options.required && ( // non-required
|
6063
|
+
prop.raw === null || // abscent
|
6064
|
+
value == null) // null or undefined
|
6065
|
+
) {
|
6066
|
+
return true;
|
6067
|
+
}
|
6068
|
+
var options = prop.options;
|
6069
|
+
var type = options.type;
|
6070
|
+
var valid = true;
|
6071
|
+
var expectedType;
|
6072
|
+
if (type) {
|
6073
|
+
if (type === String) {
|
6074
|
+
expectedType = 'string';
|
6075
|
+
valid = typeof value === expectedType;
|
6076
|
+
} else if (type === Number) {
|
6077
|
+
expectedType = 'number';
|
6078
|
+
valid = typeof value === 'number';
|
6079
|
+
} else if (type === Boolean) {
|
6080
|
+
expectedType = 'boolean';
|
6081
|
+
valid = typeof value === 'boolean';
|
6082
|
+
} else if (type === Function) {
|
6083
|
+
expectedType = 'function';
|
6084
|
+
valid = typeof value === 'function';
|
6085
|
+
} else if (type === Object) {
|
6086
|
+
expectedType = 'object';
|
6087
|
+
valid = isPlainObject(value);
|
6088
|
+
} else if (type === Array) {
|
6089
|
+
expectedType = 'array';
|
6090
|
+
valid = isArray(value);
|
6091
|
+
} else {
|
6092
|
+
valid = value instanceof type;
|
6093
|
+
}
|
6094
|
+
}
|
6095
|
+
if (!valid) {
|
6096
|
+
'development' !== 'production' && warn('Invalid prop: type check failed for ' + prop.path + '="' + prop.raw + '".' + ' Expected ' + formatType(expectedType) + ', got ' + formatValue(value) + '.');
|
6097
|
+
return false;
|
6098
|
+
}
|
6099
|
+
var validator = options.validator;
|
6100
|
+
if (validator) {
|
6101
|
+
if (!validator(value)) {
|
6102
|
+
'development' !== 'production' && warn('Invalid prop: custom validator check failed for ' + prop.path + '="' + prop.raw + '"');
|
6103
|
+
return false;
|
6104
|
+
}
|
6105
|
+
}
|
6106
|
+
return true;
|
6107
|
+
}
|
5904
6108
|
|
5905
6109
|
/**
|
5906
|
-
*
|
6110
|
+
* Force parsing value with coerce option.
|
5907
6111
|
*
|
5908
|
-
* @param {
|
5909
|
-
* @param {
|
5910
|
-
* @
|
6112
|
+
* @param {*} value
|
6113
|
+
* @param {Object} options
|
6114
|
+
* @return {*}
|
5911
6115
|
*/
|
5912
6116
|
|
5913
|
-
function
|
5914
|
-
var
|
5915
|
-
|
5916
|
-
|
5917
|
-
function next() {
|
5918
|
-
if (++called >= total) {
|
5919
|
-
cb();
|
5920
|
-
} else {
|
5921
|
-
hooks[called].call(vm, next);
|
5922
|
-
}
|
6117
|
+
function coerceProp(prop, value) {
|
6118
|
+
var coerce = prop.options.coerce;
|
6119
|
+
if (!coerce) {
|
6120
|
+
return value;
|
5923
6121
|
}
|
6122
|
+
// coerce is a function
|
6123
|
+
return coerce(value);
|
6124
|
+
}
|
6125
|
+
|
6126
|
+
function formatType(val) {
|
6127
|
+
return val ? val.charAt(0).toUpperCase() + val.slice(1) : 'custom type';
|
6128
|
+
}
|
6129
|
+
|
6130
|
+
function formatValue(val) {
|
6131
|
+
return Object.prototype.toString.call(val).slice(8, -1);
|
5924
6132
|
}
|
5925
6133
|
|
5926
6134
|
var bindingModes = config._propBindingModes;
|
@@ -5935,11 +6143,18 @@ var template = Object.freeze({
|
|
5935
6143
|
var childKey = prop.path;
|
5936
6144
|
var parentKey = prop.parentPath;
|
5937
6145
|
var twoWay = prop.mode === bindingModes.TWO_WAY;
|
6146
|
+
var isSimple = isSimplePath(parentKey);
|
5938
6147
|
|
5939
6148
|
var parentWatcher = this.parentWatcher = new Watcher(parent, parentKey, function (val) {
|
5940
6149
|
val = coerceProp(prop, val);
|
5941
6150
|
if (assertProp(prop, val)) {
|
5942
|
-
|
6151
|
+
if (isSimple) {
|
6152
|
+
withoutConversion(function () {
|
6153
|
+
child[childKey] = val;
|
6154
|
+
});
|
6155
|
+
} else {
|
6156
|
+
child[childKey] = val;
|
6157
|
+
}
|
5943
6158
|
}
|
5944
6159
|
}, {
|
5945
6160
|
twoWay: twoWay,
|
@@ -5950,7 +6165,14 @@ var template = Object.freeze({
|
|
5950
6165
|
});
|
5951
6166
|
|
5952
6167
|
// set the child initial value.
|
5953
|
-
|
6168
|
+
var value = parentWatcher.value;
|
6169
|
+
if (isSimple && value !== undefined) {
|
6170
|
+
withoutConversion(function () {
|
6171
|
+
initProp(child, prop, value);
|
6172
|
+
});
|
6173
|
+
} else {
|
6174
|
+
initProp(child, prop, value);
|
6175
|
+
}
|
5954
6176
|
|
5955
6177
|
// setup two-way binding
|
5956
6178
|
if (twoWay) {
|
@@ -6018,6 +6240,32 @@ var template = Object.freeze({
|
|
6018
6240
|
var transDurationProp = transitionProp + 'Duration';
|
6019
6241
|
var animDurationProp = animationProp + 'Duration';
|
6020
6242
|
|
6243
|
+
/**
|
6244
|
+
* If a just-entered element is applied the
|
6245
|
+
* leave class while its enter transition hasn't started yet,
|
6246
|
+
* and the transitioned property has the same value for both
|
6247
|
+
* enter/leave, then the leave transition will be skipped and
|
6248
|
+
* the transitionend event never fires. This function ensures
|
6249
|
+
* its callback to be called after a transition has started
|
6250
|
+
* by waiting for double raf.
|
6251
|
+
*
|
6252
|
+
* It falls back to setTimeout on devices that support CSS
|
6253
|
+
* transitions but not raf (e.g. Android 4.2 browser) - since
|
6254
|
+
* these environments are usually slow, we are giving it a
|
6255
|
+
* relatively large timeout.
|
6256
|
+
*/
|
6257
|
+
|
6258
|
+
var raf = inBrowser && window.requestAnimationFrame;
|
6259
|
+
var waitForTransitionStart = raf
|
6260
|
+
/* istanbul ignore next */
|
6261
|
+
? function (fn) {
|
6262
|
+
raf(function () {
|
6263
|
+
raf(fn);
|
6264
|
+
});
|
6265
|
+
} : function (fn) {
|
6266
|
+
setTimeout(fn, 50);
|
6267
|
+
};
|
6268
|
+
|
6021
6269
|
/**
|
6022
6270
|
* A Transition object that encapsulates the state and logic
|
6023
6271
|
* of the transition.
|
@@ -6102,19 +6350,13 @@ var template = Object.freeze({
|
|
6102
6350
|
*/
|
6103
6351
|
|
6104
6352
|
p$1.enterNextTick = function () {
|
6105
|
-
|
6106
|
-
// in Chrome, if a just-entered element is applied the
|
6107
|
-
// leave class while its interpolated property still has
|
6108
|
-
// a very small value (within one frame), Chrome will
|
6109
|
-
// skip the leave transition entirely and not firing the
|
6110
|
-
// transtionend event. Therefore we need to protected
|
6111
|
-
// against such cases using a one-frame timeout.
|
6112
|
-
this.justEntered = true;
|
6113
|
-
var self = this;
|
6114
|
-
setTimeout(function () {
|
6115
|
-
self.justEntered = false;
|
6116
|
-
}, 17);
|
6353
|
+
var _this = this;
|
6117
6354
|
|
6355
|
+
// prevent transition skipping
|
6356
|
+
this.justEntered = true;
|
6357
|
+
waitForTransitionStart(function () {
|
6358
|
+
_this.justEntered = false;
|
6359
|
+
});
|
6118
6360
|
var enterDone = this.enterDone;
|
6119
6361
|
var type = this.getCssTransitionType(this.enterClass);
|
6120
6362
|
if (!this.pendingJsCb) {
|
@@ -6391,164 +6633,6 @@ var template = Object.freeze({
|
|
6391
6633
|
transition: transition$1
|
6392
6634
|
};
|
6393
6635
|
|
6394
|
-
var propBindingModes = config._propBindingModes;
|
6395
|
-
var empty = {};
|
6396
|
-
|
6397
|
-
// regexes
|
6398
|
-
var identRE$1 = /^[$_a-zA-Z]+[\w$]*$/;
|
6399
|
-
var settablePathRE = /^[A-Za-z_$][\w$]*(\.[A-Za-z_$][\w$]*|\[[^\[\]]+\])*$/;
|
6400
|
-
|
6401
|
-
/**
|
6402
|
-
* Compile props on a root element and return
|
6403
|
-
* a props link function.
|
6404
|
-
*
|
6405
|
-
* @param {Element|DocumentFragment} el
|
6406
|
-
* @param {Array} propOptions
|
6407
|
-
* @return {Function} propsLinkFn
|
6408
|
-
*/
|
6409
|
-
|
6410
|
-
function compileProps(el, propOptions) {
|
6411
|
-
var props = [];
|
6412
|
-
var names = Object.keys(propOptions);
|
6413
|
-
var i = names.length;
|
6414
|
-
var options, name, attr, value, path, parsed, prop;
|
6415
|
-
while (i--) {
|
6416
|
-
name = names[i];
|
6417
|
-
options = propOptions[name] || empty;
|
6418
|
-
|
6419
|
-
if ('development' !== 'production' && name === '$data') {
|
6420
|
-
warn('Do not use $data as prop.');
|
6421
|
-
continue;
|
6422
|
-
}
|
6423
|
-
|
6424
|
-
// props could contain dashes, which will be
|
6425
|
-
// interpreted as minus calculations by the parser
|
6426
|
-
// so we need to camelize the path here
|
6427
|
-
path = camelize(name);
|
6428
|
-
if (!identRE$1.test(path)) {
|
6429
|
-
'development' !== 'production' && warn('Invalid prop key: "' + name + '". Prop keys ' + 'must be valid identifiers.');
|
6430
|
-
continue;
|
6431
|
-
}
|
6432
|
-
|
6433
|
-
prop = {
|
6434
|
-
name: name,
|
6435
|
-
path: path,
|
6436
|
-
options: options,
|
6437
|
-
mode: propBindingModes.ONE_WAY,
|
6438
|
-
raw: null
|
6439
|
-
};
|
6440
|
-
|
6441
|
-
attr = hyphenate(name);
|
6442
|
-
// first check dynamic version
|
6443
|
-
if ((value = getBindAttr(el, attr)) === null) {
|
6444
|
-
if ((value = getBindAttr(el, attr + '.sync')) !== null) {
|
6445
|
-
prop.mode = propBindingModes.TWO_WAY;
|
6446
|
-
} else if ((value = getBindAttr(el, attr + '.once')) !== null) {
|
6447
|
-
prop.mode = propBindingModes.ONE_TIME;
|
6448
|
-
}
|
6449
|
-
}
|
6450
|
-
if (value !== null) {
|
6451
|
-
// has dynamic binding!
|
6452
|
-
prop.raw = value;
|
6453
|
-
parsed = parseDirective(value);
|
6454
|
-
value = parsed.expression;
|
6455
|
-
prop.filters = parsed.filters;
|
6456
|
-
// check binding type
|
6457
|
-
if (isLiteral(value) && !parsed.filters) {
|
6458
|
-
// for expressions containing literal numbers and
|
6459
|
-
// booleans, there's no need to setup a prop binding,
|
6460
|
-
// so we can optimize them as a one-time set.
|
6461
|
-
prop.optimizedLiteral = true;
|
6462
|
-
} else {
|
6463
|
-
prop.dynamic = true;
|
6464
|
-
// check non-settable path for two-way bindings
|
6465
|
-
if ('development' !== 'production' && prop.mode === propBindingModes.TWO_WAY && !settablePathRE.test(value)) {
|
6466
|
-
prop.mode = propBindingModes.ONE_WAY;
|
6467
|
-
warn('Cannot bind two-way prop with non-settable ' + 'parent path: ' + value);
|
6468
|
-
}
|
6469
|
-
}
|
6470
|
-
prop.parentPath = value;
|
6471
|
-
|
6472
|
-
// warn required two-way
|
6473
|
-
if ('development' !== 'production' && options.twoWay && prop.mode !== propBindingModes.TWO_WAY) {
|
6474
|
-
warn('Prop "' + name + '" expects a two-way binding type.');
|
6475
|
-
}
|
6476
|
-
} else if ((value = getAttr(el, attr)) !== null) {
|
6477
|
-
// has literal binding!
|
6478
|
-
prop.raw = value;
|
6479
|
-
} else if ('development' !== 'production') {
|
6480
|
-
// check possible camelCase prop usage
|
6481
|
-
var lowerCaseName = path.toLowerCase();
|
6482
|
-
value = /[A-Z\-]/.test(name) && (el.getAttribute(lowerCaseName) || el.getAttribute(':' + lowerCaseName) || el.getAttribute('v-bind:' + lowerCaseName) || el.getAttribute(':' + lowerCaseName + '.once') || el.getAttribute('v-bind:' + lowerCaseName + '.once') || el.getAttribute(':' + lowerCaseName + '.sync') || el.getAttribute('v-bind:' + lowerCaseName + '.sync'));
|
6483
|
-
if (value) {
|
6484
|
-
warn('Possible usage error for prop `' + lowerCaseName + '` - ' + 'did you mean `' + attr + '`? HTML is case-insensitive, remember to use ' + 'kebab-case for props in templates.');
|
6485
|
-
} else if (options.required) {
|
6486
|
-
// warn missing required
|
6487
|
-
warn('Missing required prop: ' + name);
|
6488
|
-
}
|
6489
|
-
}
|
6490
|
-
// push prop
|
6491
|
-
props.push(prop);
|
6492
|
-
}
|
6493
|
-
return makePropsLinkFn(props);
|
6494
|
-
}
|
6495
|
-
|
6496
|
-
/**
|
6497
|
-
* Build a function that applies props to a vm.
|
6498
|
-
*
|
6499
|
-
* @param {Array} props
|
6500
|
-
* @return {Function} propsLinkFn
|
6501
|
-
*/
|
6502
|
-
|
6503
|
-
function makePropsLinkFn(props) {
|
6504
|
-
return function propsLinkFn(vm, scope) {
|
6505
|
-
// store resolved props info
|
6506
|
-
vm._props = {};
|
6507
|
-
var i = props.length;
|
6508
|
-
var prop, path, options, value, raw;
|
6509
|
-
while (i--) {
|
6510
|
-
prop = props[i];
|
6511
|
-
raw = prop.raw;
|
6512
|
-
path = prop.path;
|
6513
|
-
options = prop.options;
|
6514
|
-
vm._props[path] = prop;
|
6515
|
-
if (raw === null) {
|
6516
|
-
// initialize absent prop
|
6517
|
-
initProp(vm, prop, undefined);
|
6518
|
-
} else if (prop.dynamic) {
|
6519
|
-
// dynamic prop
|
6520
|
-
if (prop.mode === propBindingModes.ONE_TIME) {
|
6521
|
-
// one time binding
|
6522
|
-
value = (scope || vm._context || vm).$get(prop.parentPath);
|
6523
|
-
initProp(vm, prop, value);
|
6524
|
-
} else {
|
6525
|
-
if (vm._context) {
|
6526
|
-
// dynamic binding
|
6527
|
-
vm._bindDir({
|
6528
|
-
name: 'prop',
|
6529
|
-
def: propDef,
|
6530
|
-
prop: prop
|
6531
|
-
}, null, null, scope); // el, host, scope
|
6532
|
-
} else {
|
6533
|
-
// root instance
|
6534
|
-
initProp(vm, prop, vm.$get(prop.parentPath));
|
6535
|
-
}
|
6536
|
-
}
|
6537
|
-
} else if (prop.optimizedLiteral) {
|
6538
|
-
// optimized literal, cast it and just set once
|
6539
|
-
var stripped = stripQuotes(raw);
|
6540
|
-
value = stripped === raw ? toBoolean(toNumber(raw)) : stripped;
|
6541
|
-
initProp(vm, prop, value);
|
6542
|
-
} else {
|
6543
|
-
// string literal, but we need to cater for
|
6544
|
-
// Boolean props with no value
|
6545
|
-
value = options.type === Boolean && raw === '' ? true : raw;
|
6546
|
-
initProp(vm, prop, value);
|
6547
|
-
}
|
6548
|
-
}
|
6549
|
-
};
|
6550
|
-
}
|
6551
|
-
|
6552
6636
|
// special binding prefixes
|
6553
6637
|
var bindRE = /^v-bind:|^:/;
|
6554
6638
|
var onRE = /^v-on:|^@/;
|
@@ -6556,11 +6640,9 @@ var template = Object.freeze({
|
|
6556
6640
|
var modifierRE = /\.[^\.]+/g;
|
6557
6641
|
var transitionRE = /^(v-bind:|:)?transition$/;
|
6558
6642
|
|
6559
|
-
// terminal directives
|
6560
|
-
var terminalDirectives = ['for', 'if'];
|
6561
|
-
|
6562
6643
|
// default directive priority
|
6563
6644
|
var DEFAULT_PRIORITY = 1000;
|
6645
|
+
var DEFAULT_TERMINAL_PRIORITY = 2000;
|
6564
6646
|
|
6565
6647
|
/**
|
6566
6648
|
* Compile a template and return a reusable composite link
|
@@ -6826,9 +6908,10 @@ var template = Object.freeze({
|
|
6826
6908
|
}
|
6827
6909
|
var linkFn;
|
6828
6910
|
var hasAttrs = el.hasAttributes();
|
6911
|
+
var attrs = hasAttrs && toArray(el.attributes);
|
6829
6912
|
// check terminal directives (for & if)
|
6830
6913
|
if (hasAttrs) {
|
6831
|
-
linkFn = checkTerminalDirectives(el, options);
|
6914
|
+
linkFn = checkTerminalDirectives(el, attrs, options);
|
6832
6915
|
}
|
6833
6916
|
// check element directives
|
6834
6917
|
if (!linkFn) {
|
@@ -6840,7 +6923,7 @@ var template = Object.freeze({
|
|
6840
6923
|
}
|
6841
6924
|
// normal directives
|
6842
6925
|
if (!linkFn && hasAttrs) {
|
6843
|
-
linkFn = compileDirectives(
|
6926
|
+
linkFn = compileDirectives(attrs, options);
|
6844
6927
|
}
|
6845
6928
|
return linkFn;
|
6846
6929
|
}
|
@@ -7069,11 +7152,12 @@ var template = Object.freeze({
|
|
7069
7152
|
* If it finds one, return a terminal link function.
|
7070
7153
|
*
|
7071
7154
|
* @param {Element} el
|
7155
|
+
* @param {Array} attrs
|
7072
7156
|
* @param {Object} options
|
7073
7157
|
* @return {Function} terminalLinkFn
|
7074
7158
|
*/
|
7075
7159
|
|
7076
|
-
function checkTerminalDirectives(el, options) {
|
7160
|
+
function checkTerminalDirectives(el, attrs, options) {
|
7077
7161
|
// skip v-pre
|
7078
7162
|
if (getAttr(el, 'v-pre') !== null) {
|
7079
7163
|
return skip;
|
@@ -7085,14 +7169,29 @@ var template = Object.freeze({
|
|
7085
7169
|
return skip;
|
7086
7170
|
}
|
7087
7171
|
}
|
7088
|
-
|
7089
|
-
|
7090
|
-
|
7091
|
-
|
7092
|
-
|
7093
|
-
|
7172
|
+
|
7173
|
+
var attr, name, value, modifiers, matched, dirName, rawName, arg, def, termDef;
|
7174
|
+
for (var i = 0, j = attrs.length; i < j; i++) {
|
7175
|
+
attr = attrs[i];
|
7176
|
+
modifiers = parseModifiers(attr.name);
|
7177
|
+
name = attr.name.replace(modifierRE, '');
|
7178
|
+
if (matched = name.match(dirAttrRE)) {
|
7179
|
+
def = resolveAsset(options, 'directives', matched[1]);
|
7180
|
+
if (def && def.terminal) {
|
7181
|
+
if (!termDef || (def.priority || DEFAULT_TERMINAL_PRIORITY) > termDef.priority) {
|
7182
|
+
termDef = def;
|
7183
|
+
rawName = attr.name;
|
7184
|
+
value = attr.value;
|
7185
|
+
dirName = matched[1];
|
7186
|
+
arg = matched[2];
|
7187
|
+
}
|
7188
|
+
}
|
7094
7189
|
}
|
7095
7190
|
}
|
7191
|
+
|
7192
|
+
if (termDef) {
|
7193
|
+
return makeTerminalNodeLinkFn(el, dirName, value, options, termDef, rawName, arg, modifiers);
|
7194
|
+
}
|
7096
7195
|
}
|
7097
7196
|
|
7098
7197
|
function skip() {}
|
@@ -7108,20 +7207,24 @@ var template = Object.freeze({
|
|
7108
7207
|
* @param {String} dirName
|
7109
7208
|
* @param {String} value
|
7110
7209
|
* @param {Object} options
|
7111
|
-
* @param {Object}
|
7210
|
+
* @param {Object} def
|
7211
|
+
* @param {String} [rawName]
|
7212
|
+
* @param {String} [arg]
|
7213
|
+
* @param {Object} [modifiers]
|
7112
7214
|
* @return {Function} terminalLinkFn
|
7113
7215
|
*/
|
7114
7216
|
|
7115
|
-
function makeTerminalNodeLinkFn(el, dirName, value, options, def) {
|
7217
|
+
function makeTerminalNodeLinkFn(el, dirName, value, options, def, rawName, arg, modifiers) {
|
7116
7218
|
var parsed = parseDirective(value);
|
7117
7219
|
var descriptor = {
|
7118
7220
|
name: dirName,
|
7221
|
+
arg: arg,
|
7119
7222
|
expression: parsed.expression,
|
7120
7223
|
filters: parsed.filters,
|
7121
7224
|
raw: value,
|
7122
|
-
|
7123
|
-
|
7124
|
-
def: def
|
7225
|
+
attr: rawName,
|
7226
|
+
modifiers: modifiers,
|
7227
|
+
def: def
|
7125
7228
|
};
|
7126
7229
|
// check ref for v-for and router-view
|
7127
7230
|
if (dirName === 'for' || dirName === 'router-view') {
|
@@ -7464,6 +7567,9 @@ var template = Object.freeze({
|
|
7464
7567
|
(contents[name] || (contents[name] = [])).push(el);
|
7465
7568
|
}
|
7466
7569
|
/* eslint-enable no-cond-assign */
|
7570
|
+
if ('development' !== 'production' && getBindAttr(el, 'slot')) {
|
7571
|
+
warn('The "slot" attribute must be static.');
|
7572
|
+
}
|
7467
7573
|
}
|
7468
7574
|
for (name in contents) {
|
7469
7575
|
contents[name] = extractFragment(contents[name], content);
|
@@ -7500,7 +7606,6 @@ var template = Object.freeze({
|
|
7500
7606
|
compile: compile,
|
7501
7607
|
compileAndLinkProps: compileAndLinkProps,
|
7502
7608
|
compileRoot: compileRoot,
|
7503
|
-
terminalDirectives: terminalDirectives,
|
7504
7609
|
transclude: transclude,
|
7505
7610
|
resolveSlots: resolveSlots
|
7506
7611
|
});
|
@@ -7564,6 +7669,10 @@ var template = Object.freeze({
|
|
7564
7669
|
Vue.prototype._initData = function () {
|
7565
7670
|
var dataFn = this.$options.data;
|
7566
7671
|
var data = this._data = dataFn ? dataFn() : {};
|
7672
|
+
if (!isPlainObject(data)) {
|
7673
|
+
data = {};
|
7674
|
+
'development' !== 'production' && warn('data functions should return an object.');
|
7675
|
+
}
|
7567
7676
|
var props = this._props;
|
7568
7677
|
var runtimeData = this._runtimeData ? typeof this._runtimeData === 'function' ? this._runtimeData() : this._runtimeData : null;
|
7569
7678
|
// proxy data on instance
|
@@ -7916,18 +8025,21 @@ var template = Object.freeze({
|
|
7916
8025
|
* It registers a watcher with the expression and calls
|
7917
8026
|
* the DOM update function when a change is triggered.
|
7918
8027
|
*
|
7919
|
-
* @param {String} name
|
7920
|
-
* @param {Node} el
|
7921
|
-
* @param {Vue} vm
|
7922
8028
|
* @param {Object} descriptor
|
7923
8029
|
* - {String} name
|
7924
8030
|
* - {Object} def
|
7925
8031
|
* - {String} expression
|
7926
8032
|
* - {Array<Object>} [filters]
|
8033
|
+
* - {Object} [modifiers]
|
7927
8034
|
* - {Boolean} literal
|
7928
8035
|
* - {String} attr
|
8036
|
+
* - {String} arg
|
7929
8037
|
* - {String} raw
|
7930
|
-
*
|
8038
|
+
* - {String} [ref]
|
8039
|
+
* - {Array<Object>} [interp]
|
8040
|
+
* - {Boolean} [hasOneTime]
|
8041
|
+
* @param {Vue} vm
|
8042
|
+
* @param {Node} el
|
7931
8043
|
* @param {Vue} [host] - transclusion host component
|
7932
8044
|
* @param {Object} [scope] - v-for scope
|
7933
8045
|
* @param {Fragment} [frag] - owner fragment
|
@@ -7963,8 +8075,6 @@ var template = Object.freeze({
|
|
7963
8075
|
* Initialize the directive, mixin definition properties,
|
7964
8076
|
* setup the watcher, call definition bind() and update()
|
7965
8077
|
* if present.
|
7966
|
-
*
|
7967
|
-
* @param {Object} def
|
7968
8078
|
*/
|
7969
8079
|
|
7970
8080
|
Directive.prototype._bind = function () {
|
@@ -8045,7 +8155,7 @@ var template = Object.freeze({
|
|
8045
8155
|
var i = params.length;
|
8046
8156
|
var key, val, mappedKey;
|
8047
8157
|
while (i--) {
|
8048
|
-
key = params[i];
|
8158
|
+
key = hyphenate(params[i]);
|
8049
8159
|
mappedKey = camelize(key);
|
8050
8160
|
val = getBindAttr(this.el, key);
|
8051
8161
|
if (val != null) {
|
@@ -8323,10 +8433,8 @@ var template = Object.freeze({
|
|
8323
8433
|
/**
|
8324
8434
|
* Create and bind a directive to an element.
|
8325
8435
|
*
|
8326
|
-
* @param {
|
8436
|
+
* @param {Object} descriptor - parsed directive descriptor
|
8327
8437
|
* @param {Node} node - target node
|
8328
|
-
* @param {Object} desc - parsed directive descriptor
|
8329
|
-
* @param {Object} def - directive definition object
|
8330
8438
|
* @param {Vue} [host] - transclusion host component
|
8331
8439
|
* @param {Object} [scope] - v-for scope
|
8332
8440
|
* @param {Fragment} [frag] - owner fragment
|
@@ -8469,7 +8577,7 @@ var template = Object.freeze({
|
|
8469
8577
|
Vue.prototype._applyFilters = function (value, oldValue, filters, write) {
|
8470
8578
|
var filter, fn, args, arg, offset, i, l, j, k;
|
8471
8579
|
for (i = 0, l = filters.length; i < l; i++) {
|
8472
|
-
filter = filters[i];
|
8580
|
+
filter = filters[write ? l - i - 1 : i];
|
8473
8581
|
fn = resolveAsset(this.$options, 'filters', filter.name);
|
8474
8582
|
if ('development' !== 'production') {
|
8475
8583
|
assertAsset(fn, 'filter', filter.name);
|
@@ -8497,14 +8605,19 @@ var template = Object.freeze({
|
|
8497
8605
|
* resolves asynchronously and caches the resolved
|
8498
8606
|
* constructor on the factory.
|
8499
8607
|
*
|
8500
|
-
* @param {String}
|
8608
|
+
* @param {String|Function} value
|
8501
8609
|
* @param {Function} cb
|
8502
8610
|
*/
|
8503
8611
|
|
8504
|
-
Vue.prototype._resolveComponent = function (
|
8505
|
-
var factory
|
8506
|
-
if (
|
8507
|
-
|
8612
|
+
Vue.prototype._resolveComponent = function (value, cb) {
|
8613
|
+
var factory;
|
8614
|
+
if (typeof value === 'function') {
|
8615
|
+
factory = value;
|
8616
|
+
} else {
|
8617
|
+
factory = resolveAsset(this.$options, 'components', value);
|
8618
|
+
if ('development' !== 'production') {
|
8619
|
+
assertAsset(factory, 'component', value);
|
8620
|
+
}
|
8508
8621
|
}
|
8509
8622
|
if (!factory) {
|
8510
8623
|
return;
|
@@ -8531,7 +8644,7 @@ var template = Object.freeze({
|
|
8531
8644
|
cbs[i](res);
|
8532
8645
|
}
|
8533
8646
|
}, function reject(reason) {
|
8534
|
-
'development' !== 'production' && warn('Failed to resolve async component: ' +
|
8647
|
+
'development' !== 'production' && warn('Failed to resolve async component' + (typeof value === 'string' ? ': ' + value : '') + '. ' + (reason ? '\nReason: ' + reason : ''));
|
8535
8648
|
});
|
8536
8649
|
}
|
8537
8650
|
} else {
|
@@ -9137,6 +9250,9 @@ var template = Object.freeze({
|
|
9137
9250
|
/**
|
9138
9251
|
* Teardown the instance, simply delegate to the internal
|
9139
9252
|
* _destroy.
|
9253
|
+
*
|
9254
|
+
* @param {Boolean} remove
|
9255
|
+
* @param {Boolean} deferCleanup
|
9140
9256
|
*/
|
9141
9257
|
|
9142
9258
|
Vue.prototype.$destroy = function (remove, deferCleanup) {
|
@@ -9149,6 +9265,8 @@ var template = Object.freeze({
|
|
9149
9265
|
*
|
9150
9266
|
* @param {Element|DocumentFragment} el
|
9151
9267
|
* @param {Vue} [host]
|
9268
|
+
* @param {Object} [scope]
|
9269
|
+
* @param {Fragment} [frag]
|
9152
9270
|
* @return {Function}
|
9153
9271
|
*/
|
9154
9272
|
|
@@ -9331,12 +9449,12 @@ var template = Object.freeze({
|
|
9331
9449
|
if (j) {
|
9332
9450
|
while (j--) {
|
9333
9451
|
key = keys[j];
|
9334
|
-
if (key === '$key' && contains
|
9452
|
+
if (key === '$key' && contains(item.$key, search) || contains(getPath(val, key), search)) {
|
9335
9453
|
res.push(item);
|
9336
9454
|
break;
|
9337
9455
|
}
|
9338
9456
|
}
|
9339
|
-
} else if (contains
|
9457
|
+
} else if (contains(item, search)) {
|
9340
9458
|
res.push(item);
|
9341
9459
|
}
|
9342
9460
|
}
|
@@ -9375,20 +9493,20 @@ var template = Object.freeze({
|
|
9375
9493
|
* @param {String} search
|
9376
9494
|
*/
|
9377
9495
|
|
9378
|
-
function contains
|
9496
|
+
function contains(val, search) {
|
9379
9497
|
var i;
|
9380
9498
|
if (isPlainObject(val)) {
|
9381
9499
|
var keys = Object.keys(val);
|
9382
9500
|
i = keys.length;
|
9383
9501
|
while (i--) {
|
9384
|
-
if (contains
|
9502
|
+
if (contains(val[keys[i]], search)) {
|
9385
9503
|
return true;
|
9386
9504
|
}
|
9387
9505
|
}
|
9388
9506
|
} else if (isArray(val)) {
|
9389
9507
|
i = val.length;
|
9390
9508
|
while (i--) {
|
9391
|
-
if (contains
|
9509
|
+
if (contains(val[i], search)) {
|
9392
9510
|
return true;
|
9393
9511
|
}
|
9394
9512
|
}
|
@@ -9685,7 +9803,7 @@ var template = Object.freeze({
|
|
9685
9803
|
|
9686
9804
|
installGlobalAPI(Vue);
|
9687
9805
|
|
9688
|
-
Vue.version = '1.0.
|
9806
|
+
Vue.version = '1.0.20';
|
9689
9807
|
|
9690
9808
|
// devtools global hook
|
9691
9809
|
/* istanbul ignore next */
|