vuejs-rails 1.0.24 → 1.0.26
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/vuejs-rails/version.rb +1 -1
- data/vendor/assets/javascripts/vue-resource.js +1082 -1450
- data/vendor/assets/javascripts/vue-router.js +245 -170
- data/vendor/assets/javascripts/vue.js +149 -105
- metadata +3 -3
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* vue-router v0.7.
|
2
|
+
* vue-router v0.7.13
|
3
3
|
* (c) 2016 Evan You
|
4
4
|
* Released under the MIT License.
|
5
5
|
*/
|
@@ -125,6 +125,21 @@
|
|
125
125
|
|
126
126
|
var escapeRegex = new RegExp('(\\' + specials.join('|\\') + ')', 'g');
|
127
127
|
|
128
|
+
var noWarning = false;
|
129
|
+
function warn(msg) {
|
130
|
+
if (!noWarning && typeof console !== 'undefined') {
|
131
|
+
console.error('[vue-router] ' + msg);
|
132
|
+
}
|
133
|
+
}
|
134
|
+
|
135
|
+
function tryDecode(uri, asComponent) {
|
136
|
+
try {
|
137
|
+
return asComponent ? decodeURIComponent(uri) : decodeURI(uri);
|
138
|
+
} catch (e) {
|
139
|
+
warn('malformed URI' + (asComponent ? ' component: ' : ': ') + uri);
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
128
143
|
function isArray(test) {
|
129
144
|
return Object.prototype.toString.call(test) === "[object Array]";
|
130
145
|
}
|
@@ -465,7 +480,7 @@
|
|
465
480
|
function decodeQueryParamPart(part) {
|
466
481
|
// http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
|
467
482
|
part = part.replace(/\+/gm, '%20');
|
468
|
-
return
|
483
|
+
return tryDecode(part, true);
|
469
484
|
}
|
470
485
|
|
471
486
|
// The main interface
|
@@ -647,7 +662,8 @@
|
|
647
662
|
return queryParams;
|
648
663
|
},
|
649
664
|
|
650
|
-
recognize: function recognize(path) {
|
665
|
+
recognize: function recognize(path, silent) {
|
666
|
+
noWarning = silent;
|
651
667
|
var states = [this.rootState],
|
652
668
|
pathLen,
|
653
669
|
i,
|
@@ -660,10 +676,13 @@
|
|
660
676
|
if (queryStart !== -1) {
|
661
677
|
var queryString = path.substr(queryStart + 1, path.length);
|
662
678
|
path = path.substr(0, queryStart);
|
663
|
-
|
679
|
+
if (queryString) {
|
680
|
+
queryParams = this.parseQueryString(queryString);
|
681
|
+
}
|
664
682
|
}
|
665
683
|
|
666
|
-
path =
|
684
|
+
path = tryDecode(path);
|
685
|
+
if (!path) return;
|
667
686
|
|
668
687
|
// DEBUG GROUP path
|
669
688
|
|
@@ -710,8 +729,6 @@
|
|
710
729
|
|
711
730
|
RouteRecognizer.prototype.map = map;
|
712
731
|
|
713
|
-
RouteRecognizer.VERSION = '0.1.9';
|
714
|
-
|
715
732
|
var genQuery = RouteRecognizer.prototype.generateQueryString;
|
716
733
|
|
717
734
|
// export default for holding the Vue reference
|
@@ -722,13 +739,10 @@
|
|
722
739
|
* @param {String} msg
|
723
740
|
*/
|
724
741
|
|
725
|
-
function warn(msg) {
|
742
|
+
function warn$1(msg) {
|
726
743
|
/* istanbul ignore next */
|
727
|
-
if (
|
728
|
-
console.
|
729
|
-
if (!exports$1.Vue || exports$1.Vue.config.debug) {
|
730
|
-
console.warn(new Error('warning stack trace:').stack);
|
731
|
-
}
|
744
|
+
if (typeof console !== 'undefined') {
|
745
|
+
console.error('[vue-router] ' + msg);
|
732
746
|
}
|
733
747
|
}
|
734
748
|
|
@@ -847,7 +861,7 @@
|
|
847
861
|
var val = params[key];
|
848
862
|
/* istanbul ignore if */
|
849
863
|
if (!val) {
|
850
|
-
warn('param "' + key + '" not found when generating ' + 'path for "' + path + '" with params ' + JSON.stringify(params));
|
864
|
+
warn$1('param "' + key + '" not found when generating ' + 'path for "' + path + '" with params ' + JSON.stringify(params));
|
851
865
|
}
|
852
866
|
return val || '';
|
853
867
|
});
|
@@ -865,7 +879,7 @@
|
|
865
879
|
var onChange = _ref.onChange;
|
866
880
|
babelHelpers.classCallCheck(this, HTML5History);
|
867
881
|
|
868
|
-
if (root) {
|
882
|
+
if (root && root !== '/') {
|
869
883
|
// make sure there's the starting slash
|
870
884
|
if (root.charAt(0) !== '/') {
|
871
885
|
root = '/' + root;
|
@@ -886,7 +900,7 @@
|
|
886
900
|
var _this = this;
|
887
901
|
|
888
902
|
this.listener = function (e) {
|
889
|
-
var url =
|
903
|
+
var url = location.pathname + location.search;
|
890
904
|
if (_this.root) {
|
891
905
|
url = url.replace(_this.rootRE, '');
|
892
906
|
}
|
@@ -911,7 +925,7 @@
|
|
911
925
|
x: window.pageXOffset,
|
912
926
|
y: window.pageYOffset
|
913
927
|
}
|
914
|
-
}, '');
|
928
|
+
}, '', location.href);
|
915
929
|
// then push new state
|
916
930
|
history.pushState({}, '', url);
|
917
931
|
}
|
@@ -962,7 +976,7 @@
|
|
962
976
|
// note it's possible to have queries in both the actual URL
|
963
977
|
// and the hash fragment itself.
|
964
978
|
var query = location.search && path.indexOf('?') > -1 ? '&' + location.search.slice(1) : location.search;
|
965
|
-
self.onChange(
|
979
|
+
self.onChange(path.replace(/^#!?/, '') + query);
|
966
980
|
};
|
967
981
|
window.addEventListener('hashchange', this.listener);
|
968
982
|
this.listener();
|
@@ -1236,7 +1250,10 @@
|
|
1236
1250
|
};
|
1237
1251
|
|
1238
1252
|
if (activateHook) {
|
1239
|
-
transition.callHooks(activateHook, component, afterActivate, {
|
1253
|
+
transition.callHooks(activateHook, component, afterActivate, {
|
1254
|
+
cleanup: cleanup,
|
1255
|
+
postActivate: true
|
1256
|
+
});
|
1240
1257
|
} else {
|
1241
1258
|
afterActivate();
|
1242
1259
|
}
|
@@ -1269,46 +1286,32 @@
|
|
1269
1286
|
|
1270
1287
|
function loadData(component, transition, hook, cb, cleanup) {
|
1271
1288
|
component.$loadingRouteData = true;
|
1272
|
-
transition.callHooks(hook, component, function (
|
1273
|
-
|
1274
|
-
|
1275
|
-
|
1276
|
-
if (isPlainObject(obj)) {
|
1277
|
-
Object.keys(obj).forEach(function (key) {
|
1278
|
-
res[key] = obj[key];
|
1279
|
-
});
|
1280
|
-
}
|
1281
|
-
return res;
|
1282
|
-
}, Object.create(null));
|
1283
|
-
}
|
1284
|
-
// handle promise sugar syntax
|
1285
|
-
var promises = [];
|
1286
|
-
if (isPlainObject(data)) {
|
1287
|
-
Object.keys(data).forEach(function (key) {
|
1288
|
-
var val = data[key];
|
1289
|
-
if (isPromise(val)) {
|
1290
|
-
promises.push(val.then(function (resolvedVal) {
|
1291
|
-
component.$set(key, resolvedVal);
|
1292
|
-
}));
|
1293
|
-
} else {
|
1294
|
-
component.$set(key, val);
|
1295
|
-
}
|
1296
|
-
});
|
1297
|
-
}
|
1298
|
-
if (!promises.length) {
|
1299
|
-
component.$loadingRouteData = false;
|
1300
|
-
component.$emit('route-data-loaded', component);
|
1301
|
-
cb && cb();
|
1302
|
-
} else {
|
1303
|
-
promises[0].constructor.all(promises).then(function () {
|
1304
|
-
component.$loadingRouteData = false;
|
1305
|
-
component.$emit('route-data-loaded', component);
|
1306
|
-
cb && cb();
|
1307
|
-
}, onError);
|
1308
|
-
}
|
1289
|
+
transition.callHooks(hook, component, function () {
|
1290
|
+
component.$loadingRouteData = false;
|
1291
|
+
component.$emit('route-data-loaded', component);
|
1292
|
+
cb && cb();
|
1309
1293
|
}, {
|
1310
1294
|
cleanup: cleanup,
|
1311
|
-
|
1295
|
+
postActivate: true,
|
1296
|
+
processData: function processData(data) {
|
1297
|
+
// handle promise sugar syntax
|
1298
|
+
var promises = [];
|
1299
|
+
if (isPlainObject(data)) {
|
1300
|
+
Object.keys(data).forEach(function (key) {
|
1301
|
+
var val = data[key];
|
1302
|
+
if (isPromise(val)) {
|
1303
|
+
promises.push(val.then(function (resolvedVal) {
|
1304
|
+
component.$set(key, resolvedVal);
|
1305
|
+
}));
|
1306
|
+
} else {
|
1307
|
+
component.$set(key, val);
|
1308
|
+
}
|
1309
|
+
});
|
1310
|
+
}
|
1311
|
+
if (promises.length) {
|
1312
|
+
return promises[0].constructor.all(promises);
|
1313
|
+
}
|
1314
|
+
}
|
1312
1315
|
});
|
1313
1316
|
}
|
1314
1317
|
|
@@ -1518,7 +1521,8 @@
|
|
1518
1521
|
* @param {Function} [cb]
|
1519
1522
|
* @param {Object} [options]
|
1520
1523
|
* - {Boolean} expectBoolean
|
1521
|
-
* - {Boolean}
|
1524
|
+
* - {Boolean} postActive
|
1525
|
+
* - {Function} processData
|
1522
1526
|
* - {Function} cleanup
|
1523
1527
|
*/
|
1524
1528
|
|
@@ -1527,8 +1531,9 @@
|
|
1527
1531
|
|
1528
1532
|
var _ref$expectBoolean = _ref.expectBoolean;
|
1529
1533
|
var expectBoolean = _ref$expectBoolean === undefined ? false : _ref$expectBoolean;
|
1530
|
-
var _ref$
|
1531
|
-
var
|
1534
|
+
var _ref$postActivate = _ref.postActivate;
|
1535
|
+
var postActivate = _ref$postActivate === undefined ? false : _ref$postActivate;
|
1536
|
+
var processData = _ref.processData;
|
1532
1537
|
var cleanup = _ref.cleanup;
|
1533
1538
|
|
1534
1539
|
var transition = this;
|
@@ -1542,20 +1547,29 @@
|
|
1542
1547
|
|
1543
1548
|
// handle errors
|
1544
1549
|
var onError = function onError(err) {
|
1545
|
-
|
1546
|
-
// so instead of aborting we just let the transition
|
1547
|
-
// finish.
|
1548
|
-
cleanup ? next() : abort();
|
1550
|
+
postActivate ? next() : abort();
|
1549
1551
|
if (err && !transition.router._suppress) {
|
1550
|
-
warn('Uncaught error during transition: ');
|
1552
|
+
warn$1('Uncaught error during transition: ');
|
1551
1553
|
throw err instanceof Error ? err : new Error(err);
|
1552
1554
|
}
|
1553
1555
|
};
|
1554
1556
|
|
1557
|
+
// since promise swallows errors, we have to
|
1558
|
+
// throw it in the next tick...
|
1559
|
+
var onPromiseError = function onPromiseError(err) {
|
1560
|
+
try {
|
1561
|
+
onError(err);
|
1562
|
+
} catch (e) {
|
1563
|
+
setTimeout(function () {
|
1564
|
+
throw e;
|
1565
|
+
}, 0);
|
1566
|
+
}
|
1567
|
+
};
|
1568
|
+
|
1555
1569
|
// advance the transition to the next step
|
1556
|
-
var next = function next(
|
1570
|
+
var next = function next() {
|
1557
1571
|
if (nextCalled) {
|
1558
|
-
warn('transition.next() should be called only once.');
|
1572
|
+
warn$1('transition.next() should be called only once.');
|
1559
1573
|
return;
|
1560
1574
|
}
|
1561
1575
|
nextCalled = true;
|
@@ -1563,7 +1577,33 @@
|
|
1563
1577
|
cleanup && cleanup();
|
1564
1578
|
return;
|
1565
1579
|
}
|
1566
|
-
cb && cb(
|
1580
|
+
cb && cb();
|
1581
|
+
};
|
1582
|
+
|
1583
|
+
var nextWithBoolean = function nextWithBoolean(res) {
|
1584
|
+
if (typeof res === 'boolean') {
|
1585
|
+
res ? next() : abort();
|
1586
|
+
} else if (isPromise(res)) {
|
1587
|
+
res.then(function (ok) {
|
1588
|
+
ok ? next() : abort();
|
1589
|
+
}, onPromiseError);
|
1590
|
+
} else if (!hook.length) {
|
1591
|
+
next();
|
1592
|
+
}
|
1593
|
+
};
|
1594
|
+
|
1595
|
+
var nextWithData = function nextWithData(data) {
|
1596
|
+
var res = undefined;
|
1597
|
+
try {
|
1598
|
+
res = processData(data);
|
1599
|
+
} catch (err) {
|
1600
|
+
return onError(err);
|
1601
|
+
}
|
1602
|
+
if (isPromise(res)) {
|
1603
|
+
res.then(next, onPromiseError);
|
1604
|
+
} else {
|
1605
|
+
next();
|
1606
|
+
}
|
1567
1607
|
};
|
1568
1608
|
|
1569
1609
|
// expose a clone of the transition object, so that each
|
@@ -1573,7 +1613,7 @@
|
|
1573
1613
|
to: transition.to,
|
1574
1614
|
from: transition.from,
|
1575
1615
|
abort: abort,
|
1576
|
-
next: next,
|
1616
|
+
next: processData ? nextWithData : next,
|
1577
1617
|
redirect: function redirect() {
|
1578
1618
|
transition.redirect.apply(transition, arguments);
|
1579
1619
|
}
|
@@ -1587,22 +1627,21 @@
|
|
1587
1627
|
return onError(err);
|
1588
1628
|
}
|
1589
1629
|
|
1590
|
-
// handle boolean/promise return values
|
1591
|
-
var resIsPromise = isPromise(res);
|
1592
1630
|
if (expectBoolean) {
|
1593
|
-
|
1594
|
-
|
1595
|
-
|
1596
|
-
|
1597
|
-
|
1598
|
-
|
1599
|
-
} else
|
1600
|
-
next
|
1631
|
+
// boolean hooks
|
1632
|
+
nextWithBoolean(res);
|
1633
|
+
} else if (isPromise(res)) {
|
1634
|
+
// promise
|
1635
|
+
if (processData) {
|
1636
|
+
res.then(nextWithData, onPromiseError);
|
1637
|
+
} else {
|
1638
|
+
res.then(next, onPromiseError);
|
1601
1639
|
}
|
1602
|
-
} else if (
|
1603
|
-
|
1604
|
-
|
1605
|
-
|
1640
|
+
} else if (processData && isPlainOjbect(res)) {
|
1641
|
+
// data promise sugar
|
1642
|
+
nextWithData(res);
|
1643
|
+
} else if (!hook.length) {
|
1644
|
+
next();
|
1606
1645
|
}
|
1607
1646
|
};
|
1608
1647
|
|
@@ -1619,22 +1658,11 @@
|
|
1619
1658
|
var _this = this;
|
1620
1659
|
|
1621
1660
|
if (Array.isArray(hooks)) {
|
1622
|
-
(function () {
|
1623
|
-
|
1624
|
-
|
1625
|
-
|
1626
|
-
|
1627
|
-
if (!_this.aborted) {
|
1628
|
-
_this.callHook(hook, context, function (r, onError) {
|
1629
|
-
if (r) res.push(r);
|
1630
|
-
onError = onError;
|
1631
|
-
next();
|
1632
|
-
}, options);
|
1633
|
-
}
|
1634
|
-
}, function () {
|
1635
|
-
cb(res, onError);
|
1636
|
-
});
|
1637
|
-
})();
|
1661
|
+
this.runQueue(hooks, function (hook, _, next) {
|
1662
|
+
if (!_this.aborted) {
|
1663
|
+
_this.callHook(hook, context, next, options);
|
1664
|
+
}
|
1665
|
+
}, cb);
|
1638
1666
|
} else {
|
1639
1667
|
this.callHook(hooks, context, cb, options);
|
1640
1668
|
}
|
@@ -1651,7 +1679,7 @@
|
|
1651
1679
|
return val ? Array.prototype.slice.call(val) : [];
|
1652
1680
|
}
|
1653
1681
|
|
1654
|
-
var internalKeysRE = /^(component|subRoutes)$/;
|
1682
|
+
var internalKeysRE = /^(component|subRoutes|fullPath)$/;
|
1655
1683
|
|
1656
1684
|
/**
|
1657
1685
|
* Route Context Object
|
@@ -1688,9 +1716,13 @@
|
|
1688
1716
|
}
|
1689
1717
|
// expose path and router
|
1690
1718
|
this.path = path;
|
1691
|
-
this.router = router;
|
1692
1719
|
// for internal use
|
1693
1720
|
this.matched = matched || router._notFoundHandler;
|
1721
|
+
// internal reference to router
|
1722
|
+
Object.defineProperty(this, 'router', {
|
1723
|
+
enumerable: false,
|
1724
|
+
value: router
|
1725
|
+
});
|
1694
1726
|
// Important: freeze self to prevent observation
|
1695
1727
|
Object.freeze(this);
|
1696
1728
|
};
|
@@ -1778,7 +1810,7 @@
|
|
1778
1810
|
var route = this.vm.$route;
|
1779
1811
|
/* istanbul ignore if */
|
1780
1812
|
if (!route) {
|
1781
|
-
warn('<router-view> can only be used inside a ' + 'router-enabled app.');
|
1813
|
+
warn$1('<router-view> can only be used inside a ' + 'router-enabled app.');
|
1782
1814
|
return;
|
1783
1815
|
}
|
1784
1816
|
// force dynamic directive so v-component doesn't
|
@@ -1847,35 +1879,58 @@
|
|
1847
1879
|
var addClass = _Vue$util.addClass;
|
1848
1880
|
var removeClass = _Vue$util.removeClass;
|
1849
1881
|
|
1882
|
+
var onPriority = Vue.directive('on').priority;
|
1883
|
+
var LINK_UPDATE = '__vue-router-link-update__';
|
1884
|
+
|
1885
|
+
var activeId = 0;
|
1886
|
+
|
1850
1887
|
Vue.directive('link-active', {
|
1851
|
-
priority:
|
1888
|
+
priority: 9999,
|
1852
1889
|
bind: function bind() {
|
1853
|
-
|
1890
|
+
var _this = this;
|
1891
|
+
|
1892
|
+
var id = String(activeId++);
|
1893
|
+
// collect v-links contained within this element.
|
1894
|
+
// we need do this here before the parent-child relationship
|
1895
|
+
// gets messed up by terminal directives (if, for, components)
|
1896
|
+
var childLinks = this.el.querySelectorAll('[v-link]');
|
1897
|
+
for (var i = 0, l = childLinks.length; i < l; i++) {
|
1898
|
+
var link = childLinks[i];
|
1899
|
+
var existingId = link.getAttribute(LINK_UPDATE);
|
1900
|
+
var value = existingId ? existingId + ',' + id : id;
|
1901
|
+
// leave a mark on the link element which can be persisted
|
1902
|
+
// through fragment clones.
|
1903
|
+
link.setAttribute(LINK_UPDATE, value);
|
1904
|
+
}
|
1905
|
+
this.vm.$on(LINK_UPDATE, this.cb = function (link, path) {
|
1906
|
+
if (link.activeIds.indexOf(id) > -1) {
|
1907
|
+
link.updateClasses(path, _this.el);
|
1908
|
+
}
|
1909
|
+
});
|
1910
|
+
},
|
1911
|
+
unbind: function unbind() {
|
1912
|
+
this.vm.$off(LINK_UPDATE, this.cb);
|
1854
1913
|
}
|
1855
1914
|
});
|
1856
1915
|
|
1857
1916
|
Vue.directive('link', {
|
1858
|
-
priority:
|
1917
|
+
priority: onPriority - 2,
|
1859
1918
|
|
1860
1919
|
bind: function bind() {
|
1861
1920
|
var vm = this.vm;
|
1862
1921
|
/* istanbul ignore if */
|
1863
1922
|
if (!vm.$route) {
|
1864
|
-
warn('v-link can only be used inside a router-enabled app.');
|
1923
|
+
warn$1('v-link can only be used inside a router-enabled app.');
|
1865
1924
|
return;
|
1866
1925
|
}
|
1867
1926
|
this.router = vm.$route.router;
|
1868
1927
|
// update things when the route changes
|
1869
1928
|
this.unwatch = vm.$watch('$route', _bind(this.onRouteUpdate, this));
|
1870
|
-
// check
|
1871
|
-
|
1872
|
-
|
1873
|
-
|
1874
|
-
|
1875
|
-
this.activeEl = parent;
|
1876
|
-
break;
|
1877
|
-
}
|
1878
|
-
parent = parent.parentNode;
|
1929
|
+
// check v-link-active ids
|
1930
|
+
var activeIds = this.el.getAttribute(LINK_UPDATE);
|
1931
|
+
if (activeIds) {
|
1932
|
+
this.el.removeAttribute(LINK_UPDATE);
|
1933
|
+
this.activeIds = activeIds.split(',');
|
1879
1934
|
}
|
1880
1935
|
// no need to handle click if link expects to be opened
|
1881
1936
|
// in a new window/tab.
|
@@ -1884,7 +1939,8 @@
|
|
1884
1939
|
return;
|
1885
1940
|
}
|
1886
1941
|
// handle click
|
1887
|
-
this.
|
1942
|
+
this.handler = _bind(this.onClick, this);
|
1943
|
+
this.el.addEventListener('click', this.handler);
|
1888
1944
|
},
|
1889
1945
|
|
1890
1946
|
update: function update(target) {
|
@@ -1922,8 +1978,12 @@
|
|
1922
1978
|
}
|
1923
1979
|
if (el.tagName === 'A' && sameOrigin(el)) {
|
1924
1980
|
e.preventDefault();
|
1981
|
+
var path = el.pathname;
|
1982
|
+
if (this.router.history.root) {
|
1983
|
+
path = path.replace(this.router.history.rootRE, '');
|
1984
|
+
}
|
1925
1985
|
this.router.go({
|
1926
|
-
path:
|
1986
|
+
path: path,
|
1927
1987
|
replace: target && target.replace,
|
1928
1988
|
append: target && target.append
|
1929
1989
|
});
|
@@ -1932,15 +1992,19 @@
|
|
1932
1992
|
},
|
1933
1993
|
|
1934
1994
|
onRouteUpdate: function onRouteUpdate(route) {
|
1935
|
-
// router.
|
1995
|
+
// router.stringifyPath is dependent on current route
|
1936
1996
|
// and needs to be called again whenver route changes.
|
1937
|
-
var newPath = this.router.
|
1997
|
+
var newPath = this.router.stringifyPath(this.target);
|
1938
1998
|
if (this.path !== newPath) {
|
1939
1999
|
this.path = newPath;
|
1940
2000
|
this.updateActiveMatch();
|
1941
2001
|
this.updateHref();
|
1942
2002
|
}
|
1943
|
-
this.
|
2003
|
+
if (this.activeIds) {
|
2004
|
+
this.vm.$emit(LINK_UPDATE, this, route.path);
|
2005
|
+
} else {
|
2006
|
+
this.updateClasses(route.path, this.el);
|
2007
|
+
}
|
1944
2008
|
},
|
1945
2009
|
|
1946
2010
|
updateActiveMatch: function updateActiveMatch() {
|
@@ -1963,12 +2027,11 @@
|
|
1963
2027
|
}
|
1964
2028
|
},
|
1965
2029
|
|
1966
|
-
updateClasses: function updateClasses(path) {
|
1967
|
-
var el = this.activeEl;
|
2030
|
+
updateClasses: function updateClasses(path, el) {
|
1968
2031
|
var activeClass = this.activeClass || this.router._linkActiveClass;
|
1969
2032
|
// clear old class
|
1970
|
-
if (this.prevActiveClass !== activeClass) {
|
1971
|
-
|
2033
|
+
if (this.prevActiveClass && this.prevActiveClass !== activeClass) {
|
2034
|
+
toggleClasses(el, this.prevActiveClass, removeClass);
|
1972
2035
|
}
|
1973
2036
|
// remove query string before matching
|
1974
2037
|
var dest = this.path.replace(queryStringRE, '');
|
@@ -1978,15 +2041,15 @@
|
|
1978
2041
|
if (dest === path ||
|
1979
2042
|
// also allow additional trailing slash
|
1980
2043
|
dest.charAt(dest.length - 1) !== '/' && dest === path.replace(trailingSlashRE, '')) {
|
1981
|
-
|
2044
|
+
toggleClasses(el, activeClass, addClass);
|
1982
2045
|
} else {
|
1983
|
-
|
2046
|
+
toggleClasses(el, activeClass, removeClass);
|
1984
2047
|
}
|
1985
2048
|
} else {
|
1986
2049
|
if (this.activeRE && this.activeRE.test(path)) {
|
1987
|
-
|
2050
|
+
toggleClasses(el, activeClass, addClass);
|
1988
2051
|
} else {
|
1989
|
-
|
2052
|
+
toggleClasses(el, activeClass, removeClass);
|
1990
2053
|
}
|
1991
2054
|
}
|
1992
2055
|
},
|
@@ -2000,6 +2063,20 @@
|
|
2000
2063
|
function sameOrigin(link) {
|
2001
2064
|
return link.protocol === location.protocol && link.hostname === location.hostname && link.port === location.port;
|
2002
2065
|
}
|
2066
|
+
|
2067
|
+
// this function is copied from v-bind:class implementation until
|
2068
|
+
// we properly expose it...
|
2069
|
+
function toggleClasses(el, key, fn) {
|
2070
|
+
key = key.trim();
|
2071
|
+
if (key.indexOf(' ') === -1) {
|
2072
|
+
fn(el, key);
|
2073
|
+
return;
|
2074
|
+
}
|
2075
|
+
var keys = key.split(/\s+/);
|
2076
|
+
for (var i = 0, l = keys.length; i < l; i++) {
|
2077
|
+
fn(el, keys[i]);
|
2078
|
+
}
|
2079
|
+
}
|
2003
2080
|
}
|
2004
2081
|
|
2005
2082
|
var historyBackends = {
|
@@ -2208,7 +2285,7 @@
|
|
2208
2285
|
replace = path.replace;
|
2209
2286
|
append = path.append;
|
2210
2287
|
}
|
2211
|
-
path = this.
|
2288
|
+
path = this.stringifyPath(path);
|
2212
2289
|
if (path) {
|
2213
2290
|
this.history.go(path, replace, append);
|
2214
2291
|
}
|
@@ -2239,7 +2316,7 @@
|
|
2239
2316
|
Router.prototype.start = function start(App, container, cb) {
|
2240
2317
|
/* istanbul ignore if */
|
2241
2318
|
if (this._started) {
|
2242
|
-
warn('already started.');
|
2319
|
+
warn$1('already started.');
|
2243
2320
|
return;
|
2244
2321
|
}
|
2245
2322
|
this._started = true;
|
@@ -2283,6 +2360,41 @@
|
|
2283
2360
|
this._started = false;
|
2284
2361
|
};
|
2285
2362
|
|
2363
|
+
/**
|
2364
|
+
* Normalize named route object / string paths into
|
2365
|
+
* a string.
|
2366
|
+
*
|
2367
|
+
* @param {Object|String|Number} path
|
2368
|
+
* @return {String}
|
2369
|
+
*/
|
2370
|
+
|
2371
|
+
Router.prototype.stringifyPath = function stringifyPath(path) {
|
2372
|
+
var generatedPath = '';
|
2373
|
+
if (path && typeof path === 'object') {
|
2374
|
+
if (path.name) {
|
2375
|
+
var extend = Vue.util.extend;
|
2376
|
+
var currentParams = this._currentTransition && this._currentTransition.to.params;
|
2377
|
+
var targetParams = path.params || {};
|
2378
|
+
var params = currentParams ? extend(extend({}, currentParams), targetParams) : targetParams;
|
2379
|
+
generatedPath = encodeURI(this._recognizer.generate(path.name, params));
|
2380
|
+
} else if (path.path) {
|
2381
|
+
generatedPath = encodeURI(path.path);
|
2382
|
+
}
|
2383
|
+
if (path.query) {
|
2384
|
+
// note: the generated query string is pre-URL-encoded by the recognizer
|
2385
|
+
var query = this._recognizer.generateQueryString(path.query);
|
2386
|
+
if (generatedPath.indexOf('?') > -1) {
|
2387
|
+
generatedPath += '&' + query.slice(1);
|
2388
|
+
} else {
|
2389
|
+
generatedPath += query;
|
2390
|
+
}
|
2391
|
+
}
|
2392
|
+
} else {
|
2393
|
+
generatedPath = encodeURI(path ? path + '' : '');
|
2394
|
+
}
|
2395
|
+
return generatedPath;
|
2396
|
+
};
|
2397
|
+
|
2286
2398
|
// Internal methods ======================================
|
2287
2399
|
|
2288
2400
|
/**
|
@@ -2385,7 +2497,7 @@
|
|
2385
2497
|
*/
|
2386
2498
|
|
2387
2499
|
Router.prototype._checkGuard = function _checkGuard(path) {
|
2388
|
-
var matched = this._guardRecognizer.recognize(path);
|
2500
|
+
var matched = this._guardRecognizer.recognize(path, true);
|
2389
2501
|
if (matched) {
|
2390
2502
|
matched[0].handler(matched[0], matched.queryParams);
|
2391
2503
|
return true;
|
@@ -2548,43 +2660,6 @@
|
|
2548
2660
|
}
|
2549
2661
|
};
|
2550
2662
|
|
2551
|
-
/**
|
2552
|
-
* Normalize named route object / string paths into
|
2553
|
-
* a string.
|
2554
|
-
*
|
2555
|
-
* @param {Object|String|Number} path
|
2556
|
-
* @return {String}
|
2557
|
-
*/
|
2558
|
-
|
2559
|
-
Router.prototype._stringifyPath = function _stringifyPath(path) {
|
2560
|
-
var fullPath = '';
|
2561
|
-
if (path && typeof path === 'object') {
|
2562
|
-
if (path.name) {
|
2563
|
-
var extend = Vue.util.extend;
|
2564
|
-
var currentParams = this._currentTransition && this._currentTransition.to.params;
|
2565
|
-
var targetParams = path.params || {};
|
2566
|
-
var params = currentParams ? extend(extend({}, currentParams), targetParams) : targetParams;
|
2567
|
-
if (path.query) {
|
2568
|
-
params.queryParams = path.query;
|
2569
|
-
}
|
2570
|
-
fullPath = this._recognizer.generate(path.name, params);
|
2571
|
-
} else if (path.path) {
|
2572
|
-
fullPath = path.path;
|
2573
|
-
if (path.query) {
|
2574
|
-
var query = this._recognizer.generateQueryString(path.query);
|
2575
|
-
if (fullPath.indexOf('?') > -1) {
|
2576
|
-
fullPath += '&' + query.slice(1);
|
2577
|
-
} else {
|
2578
|
-
fullPath += query;
|
2579
|
-
}
|
2580
|
-
}
|
2581
|
-
}
|
2582
|
-
} else {
|
2583
|
-
fullPath = path ? path + '' : '';
|
2584
|
-
}
|
2585
|
-
return encodeURI(fullPath);
|
2586
|
-
};
|
2587
|
-
|
2588
2663
|
return Router;
|
2589
2664
|
})();
|
2590
2665
|
|
@@ -2596,7 +2671,7 @@
|
|
2596
2671
|
/* istanbul ignore if */
|
2597
2672
|
if (typeof comp !== 'function') {
|
2598
2673
|
handler.component = null;
|
2599
|
-
warn('invalid component for route "' + path + '".');
|
2674
|
+
warn$1('invalid component for route "' + path + '".');
|
2600
2675
|
}
|
2601
2676
|
}
|
2602
2677
|
|
@@ -2612,7 +2687,7 @@
|
|
2612
2687
|
Router.install = function (externalVue) {
|
2613
2688
|
/* istanbul ignore if */
|
2614
2689
|
if (Router.installed) {
|
2615
|
-
warn('already installed.');
|
2690
|
+
warn$1('already installed.');
|
2616
2691
|
return;
|
2617
2692
|
}
|
2618
2693
|
Vue = externalVue;
|