vuejs-rails 0.12.12 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,2997 @@
1
+ /*!
2
+ * vue-router v0.7.5
3
+ * (c) 2015 Evan You
4
+ * Released under the MIT License.
5
+ */
6
+ (function webpackUniversalModuleDefinition(root, factory) {
7
+ if(typeof exports === 'object' && typeof module === 'object')
8
+ module.exports = factory();
9
+ else if(typeof define === 'function' && define.amd)
10
+ define([], factory);
11
+ else if(typeof exports === 'object')
12
+ exports["VueRouter"] = factory();
13
+ else
14
+ root["VueRouter"] = factory();
15
+ })(this, function() {
16
+ return /******/ (function(modules) { // webpackBootstrap
17
+ /******/ // The module cache
18
+ /******/ var installedModules = {};
19
+
20
+ /******/ // The require function
21
+ /******/ function __webpack_require__(moduleId) {
22
+
23
+ /******/ // Check if module is in cache
24
+ /******/ if(installedModules[moduleId])
25
+ /******/ return installedModules[moduleId].exports;
26
+
27
+ /******/ // Create a new module (and put it into the cache)
28
+ /******/ var module = installedModules[moduleId] = {
29
+ /******/ exports: {},
30
+ /******/ id: moduleId,
31
+ /******/ loaded: false
32
+ /******/ };
33
+
34
+ /******/ // Execute the module function
35
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
36
+
37
+ /******/ // Flag the module as loaded
38
+ /******/ module.loaded = true;
39
+
40
+ /******/ // Return the exports of the module
41
+ /******/ return module.exports;
42
+ /******/ }
43
+
44
+
45
+ /******/ // expose the modules object (__webpack_modules__)
46
+ /******/ __webpack_require__.m = modules;
47
+
48
+ /******/ // expose the module cache
49
+ /******/ __webpack_require__.c = installedModules;
50
+
51
+ /******/ // __webpack_public_path__
52
+ /******/ __webpack_require__.p = "";
53
+
54
+ /******/ // Load entry module and return exports
55
+ /******/ return __webpack_require__(0);
56
+ /******/ })
57
+ /************************************************************************/
58
+ /******/ ([
59
+ /* 0 */
60
+ /***/ function(module, exports, __webpack_require__) {
61
+
62
+ 'use strict';
63
+
64
+ var _classCallCheck = __webpack_require__(1)['default'];
65
+
66
+ var _interopRequireDefault = __webpack_require__(2)['default'];
67
+
68
+ exports.__esModule = true;
69
+
70
+ var _util = __webpack_require__(3);
71
+
72
+ var _util2 = _interopRequireDefault(_util);
73
+
74
+ var _override = __webpack_require__(7);
75
+
76
+ var _override2 = _interopRequireDefault(_override);
77
+
78
+ var _routeRecognizer = __webpack_require__(4);
79
+
80
+ var _routeRecognizer2 = _interopRequireDefault(_routeRecognizer);
81
+
82
+ var _route = __webpack_require__(8);
83
+
84
+ var _route2 = _interopRequireDefault(_route);
85
+
86
+ var _transition = __webpack_require__(18);
87
+
88
+ var _transition2 = _interopRequireDefault(_transition);
89
+
90
+ var _directivesView = __webpack_require__(28);
91
+
92
+ var _directivesView2 = _interopRequireDefault(_directivesView);
93
+
94
+ var _directivesLink = __webpack_require__(29);
95
+
96
+ var _directivesLink2 = _interopRequireDefault(_directivesLink);
97
+
98
+ var _historyAbstract = __webpack_require__(30);
99
+
100
+ var _historyAbstract2 = _interopRequireDefault(_historyAbstract);
101
+
102
+ var _historyHash = __webpack_require__(31);
103
+
104
+ var _historyHash2 = _interopRequireDefault(_historyHash);
105
+
106
+ var _historyHtml5 = __webpack_require__(32);
107
+
108
+ var _historyHtml52 = _interopRequireDefault(_historyHtml5);
109
+
110
+ var historyBackends = {
111
+ abstract: _historyAbstract2['default'],
112
+ hash: _historyHash2['default'],
113
+ html5: _historyHtml52['default']
114
+ };
115
+
116
+ // late bind during install
117
+ var Vue = undefined;
118
+
119
+ /**
120
+ * Router constructor
121
+ *
122
+ * @param {Object} [options]
123
+ */
124
+
125
+ var Router = (function () {
126
+ function Router() {
127
+ var _ref = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
128
+
129
+ var _ref$hashbang = _ref.hashbang;
130
+ var hashbang = _ref$hashbang === undefined ? true : _ref$hashbang;
131
+ var _ref$abstract = _ref.abstract;
132
+ var abstract = _ref$abstract === undefined ? false : _ref$abstract;
133
+ var _ref$history = _ref.history;
134
+ var history = _ref$history === undefined ? false : _ref$history;
135
+ var _ref$saveScrollPosition = _ref.saveScrollPosition;
136
+ var saveScrollPosition = _ref$saveScrollPosition === undefined ? false : _ref$saveScrollPosition;
137
+ var _ref$transitionOnLoad = _ref.transitionOnLoad;
138
+ var transitionOnLoad = _ref$transitionOnLoad === undefined ? false : _ref$transitionOnLoad;
139
+ var _ref$suppressTransitionError = _ref.suppressTransitionError;
140
+ var suppressTransitionError = _ref$suppressTransitionError === undefined ? false : _ref$suppressTransitionError;
141
+ var _ref$root = _ref.root;
142
+ var root = _ref$root === undefined ? null : _ref$root;
143
+ var _ref$linkActiveClass = _ref.linkActiveClass;
144
+ var linkActiveClass = _ref$linkActiveClass === undefined ? 'v-link-active' : _ref$linkActiveClass;
145
+
146
+ _classCallCheck(this, Router);
147
+
148
+ /* istanbul ignore if */
149
+ if (!Router.installed) {
150
+ throw new Error('Please install the Router with Vue.use() before ' + 'creating an instance.');
151
+ }
152
+
153
+ // Vue instances
154
+ this.app = null;
155
+ this._views = [];
156
+ this._children = [];
157
+
158
+ // route recognizer
159
+ this._recognizer = new _routeRecognizer2['default']();
160
+ this._guardRecognizer = new _routeRecognizer2['default']();
161
+
162
+ // state
163
+ this._started = false;
164
+ this._startCb = null;
165
+ this._currentRoute = {};
166
+ this._currentTransition = null;
167
+ this._previousTransition = null;
168
+ this._notFoundHandler = null;
169
+ this._notFoundRedirect = null;
170
+ this._beforeEachHooks = [];
171
+ this._afterEachHooks = [];
172
+
173
+ // feature detection
174
+ this._hasPushState = typeof window !== 'undefined' && window.history && window.history.pushState;
175
+
176
+ // trigger transition on initial render?
177
+ this._rendered = false;
178
+ this._transitionOnLoad = transitionOnLoad;
179
+
180
+ // history mode
181
+ this._abstract = abstract;
182
+ this._hashbang = hashbang;
183
+ this._history = this._hasPushState && history;
184
+
185
+ // other options
186
+ this._saveScrollPosition = saveScrollPosition;
187
+ this._linkActiveClass = linkActiveClass;
188
+ this._suppress = suppressTransitionError;
189
+
190
+ // create history object
191
+ var inBrowser = Vue.util.inBrowser;
192
+ this.mode = !inBrowser || this._abstract ? 'abstract' : this._history ? 'html5' : 'hash';
193
+
194
+ var History = historyBackends[this.mode];
195
+ var self = this;
196
+ this.history = new History({
197
+ root: root,
198
+ hashbang: this._hashbang,
199
+ onChange: function onChange(path, state, anchor) {
200
+ self._match(path, state, anchor);
201
+ }
202
+ });
203
+ }
204
+
205
+ /**
206
+ * Allow directly passing components to a route
207
+ * definition.
208
+ *
209
+ * @param {String} path
210
+ * @param {Object} handler
211
+ */
212
+
213
+ // API ===================================================
214
+
215
+ /**
216
+ * Register a map of top-level paths.
217
+ *
218
+ * @param {Object} map
219
+ */
220
+
221
+ Router.prototype.map = function map(_map) {
222
+ for (var route in _map) {
223
+ this.on(route, _map[route]);
224
+ }
225
+ };
226
+
227
+ /**
228
+ * Register a single root-level path
229
+ *
230
+ * @param {String} rootPath
231
+ * @param {Object} handler
232
+ * - {String} component
233
+ * - {Object} [subRoutes]
234
+ * - {Boolean} [forceRefresh]
235
+ * - {Function} [before]
236
+ * - {Function} [after]
237
+ */
238
+
239
+ Router.prototype.on = function on(rootPath, handler) {
240
+ if (rootPath === '*') {
241
+ this._notFound(handler);
242
+ } else {
243
+ this._addRoute(rootPath, handler, []);
244
+ }
245
+ };
246
+
247
+ /**
248
+ * Set redirects.
249
+ *
250
+ * @param {Object} map
251
+ */
252
+
253
+ Router.prototype.redirect = function redirect(map) {
254
+ for (var path in map) {
255
+ this._addRedirect(path, map[path]);
256
+ }
257
+ };
258
+
259
+ /**
260
+ * Set aliases.
261
+ *
262
+ * @param {Object} map
263
+ */
264
+
265
+ Router.prototype.alias = function alias(map) {
266
+ for (var path in map) {
267
+ this._addAlias(path, map[path]);
268
+ }
269
+ };
270
+
271
+ /**
272
+ * Set global before hook.
273
+ *
274
+ * @param {Function} fn
275
+ */
276
+
277
+ Router.prototype.beforeEach = function beforeEach(fn) {
278
+ this._beforeEachHooks.push(fn);
279
+ };
280
+
281
+ /**
282
+ * Set global after hook.
283
+ *
284
+ * @param {Function} fn
285
+ */
286
+
287
+ Router.prototype.afterEach = function afterEach(fn) {
288
+ this._afterEachHooks.push(fn);
289
+ };
290
+
291
+ /**
292
+ * Navigate to a given path.
293
+ * The path can be an object describing a named path in
294
+ * the format of { name: '...', params: {}, query: {}}
295
+ * The path is assumed to be already decoded, and will
296
+ * be resolved against root (if provided)
297
+ *
298
+ * @param {String|Object} path
299
+ * @param {Boolean} [replace]
300
+ */
301
+
302
+ Router.prototype.go = function go(path) {
303
+ var replace = false;
304
+ var append = false;
305
+ if (Vue.util.isObject(path)) {
306
+ replace = path.replace;
307
+ append = path.append;
308
+ }
309
+ path = this._stringifyPath(path);
310
+ if (path) {
311
+ this.history.go(path, replace, append);
312
+ }
313
+ };
314
+
315
+ /**
316
+ * Short hand for replacing current path
317
+ *
318
+ * @param {String} path
319
+ */
320
+
321
+ Router.prototype.replace = function replace(path) {
322
+ this.go({ path: path, replace: true });
323
+ };
324
+
325
+ /**
326
+ * Start the router.
327
+ *
328
+ * @param {VueConstructor} App
329
+ * @param {String|Element} container
330
+ * @param {Function} [cb]
331
+ */
332
+
333
+ Router.prototype.start = function start(App, container, cb) {
334
+ /* istanbul ignore if */
335
+ if (this._started) {
336
+ _util.warn('already started.');
337
+ return;
338
+ }
339
+ this._started = true;
340
+ this._startCb = cb;
341
+ if (!this.app) {
342
+ /* istanbul ignore if */
343
+ if (!App || !container) {
344
+ throw new Error('Must start vue-router with a component and a ' + 'root container.');
345
+ }
346
+ this._appContainer = container;
347
+ var Ctor = this._appConstructor = typeof App === 'function' ? App : Vue.extend(App);
348
+ // give it a name for better debugging
349
+ Ctor.options.name = Ctor.options.name || 'RouterApp';
350
+ }
351
+ this.history.start();
352
+ };
353
+
354
+ /**
355
+ * Stop listening to route changes.
356
+ */
357
+
358
+ Router.prototype.stop = function stop() {
359
+ this.history.stop();
360
+ this._started = false;
361
+ };
362
+
363
+ // Internal methods ======================================
364
+
365
+ /**
366
+ * Add a route containing a list of segments to the internal
367
+ * route recognizer. Will be called recursively to add all
368
+ * possible sub-routes.
369
+ *
370
+ * @param {String} path
371
+ * @param {Object} handler
372
+ * @param {Array} segments
373
+ */
374
+
375
+ Router.prototype._addRoute = function _addRoute(path, handler, segments) {
376
+ guardComponent(path, handler);
377
+ handler.path = path;
378
+ handler.fullPath = (segments.reduce(function (path, segment) {
379
+ return path + segment.path;
380
+ }, '') + path).replace('//', '/');
381
+ segments.push({
382
+ path: path,
383
+ handler: handler
384
+ });
385
+ this._recognizer.add(segments, {
386
+ as: handler.name
387
+ });
388
+ // add sub routes
389
+ if (handler.subRoutes) {
390
+ for (var subPath in handler.subRoutes) {
391
+ // recursively walk all sub routes
392
+ this._addRoute(subPath, handler.subRoutes[subPath],
393
+ // pass a copy in recursion to avoid mutating
394
+ // across branches
395
+ segments.slice());
396
+ }
397
+ }
398
+ };
399
+
400
+ /**
401
+ * Set the notFound route handler.
402
+ *
403
+ * @param {Object} handler
404
+ */
405
+
406
+ Router.prototype._notFound = function _notFound(handler) {
407
+ guardComponent('*', handler);
408
+ this._notFoundHandler = [{ handler: handler }];
409
+ };
410
+
411
+ /**
412
+ * Add a redirect record.
413
+ *
414
+ * @param {String} path
415
+ * @param {String} redirectPath
416
+ */
417
+
418
+ Router.prototype._addRedirect = function _addRedirect(path, redirectPath) {
419
+ if (path === '*') {
420
+ this._notFoundRedirect = redirectPath;
421
+ } else {
422
+ this._addGuard(path, redirectPath, this.replace);
423
+ }
424
+ };
425
+
426
+ /**
427
+ * Add an alias record.
428
+ *
429
+ * @param {String} path
430
+ * @param {String} aliasPath
431
+ */
432
+
433
+ Router.prototype._addAlias = function _addAlias(path, aliasPath) {
434
+ this._addGuard(path, aliasPath, this._match);
435
+ };
436
+
437
+ /**
438
+ * Add a path guard.
439
+ *
440
+ * @param {String} path
441
+ * @param {String} mappedPath
442
+ * @param {Function} handler
443
+ */
444
+
445
+ Router.prototype._addGuard = function _addGuard(path, mappedPath, _handler) {
446
+ var _this = this;
447
+
448
+ this._guardRecognizer.add([{
449
+ path: path,
450
+ handler: function handler(match, query) {
451
+ var realPath = _util.mapParams(mappedPath, match.params, query);
452
+ _handler.call(_this, realPath);
453
+ }
454
+ }]);
455
+ };
456
+
457
+ /**
458
+ * Check if a path matches any redirect records.
459
+ *
460
+ * @param {String} path
461
+ * @return {Boolean} - if true, will skip normal match.
462
+ */
463
+
464
+ Router.prototype._checkGuard = function _checkGuard(path) {
465
+ var matched = this._guardRecognizer.recognize(path);
466
+ if (matched) {
467
+ matched[0].handler(matched[0], matched.queryParams);
468
+ return true;
469
+ } else if (this._notFoundRedirect) {
470
+ matched = this._recognizer.recognize(path);
471
+ if (!matched) {
472
+ this.replace(this._notFoundRedirect);
473
+ return true;
474
+ }
475
+ }
476
+ };
477
+
478
+ /**
479
+ * Match a URL path and set the route context on vm,
480
+ * triggering view updates.
481
+ *
482
+ * @param {String} path
483
+ * @param {Object} [state]
484
+ * @param {String} [anchor]
485
+ */
486
+
487
+ Router.prototype._match = function _match(path, state, anchor) {
488
+ var _this2 = this;
489
+
490
+ if (this._checkGuard(path)) {
491
+ return;
492
+ }
493
+
494
+ var currentRoute = this._currentRoute;
495
+ var currentTransition = this._currentTransition;
496
+
497
+ if (currentTransition) {
498
+ if (currentTransition.to.path === path) {
499
+ // do nothing if we have an active transition going to the same path
500
+ return;
501
+ } else if (currentRoute.path === path) {
502
+ // We are going to the same path, but we also have an ongoing but
503
+ // not-yet-validated transition. Abort that transition and reset to
504
+ // prev transition.
505
+ currentTransition.aborted = true;
506
+ this._currentTransition = this._prevTransition;
507
+ return;
508
+ } else {
509
+ // going to a totally different path. abort ongoing transition.
510
+ currentTransition.aborted = true;
511
+ }
512
+ }
513
+
514
+ // construct new route and transition context
515
+ var route = new _route2['default'](path, this);
516
+ var transition = new _transition2['default'](this, route, currentRoute);
517
+
518
+ // current transition is updated right now.
519
+ // however, current route will only be updated after the transition has
520
+ // been validated.
521
+ this._prevTransition = currentTransition;
522
+ this._currentTransition = transition;
523
+
524
+ if (!this.app) {
525
+ // initial render
526
+ this.app = new this._appConstructor({
527
+ el: this._appContainer,
528
+ _meta: {
529
+ $route: route
530
+ }
531
+ });
532
+ }
533
+
534
+ // check global before hook
535
+ var beforeHooks = this._beforeEachHooks;
536
+ var startTransition = function startTransition() {
537
+ transition.start(function () {
538
+ _this2._postTransition(route, state, anchor);
539
+ });
540
+ };
541
+
542
+ if (beforeHooks.length) {
543
+ transition.runQueue(beforeHooks, function (hook, _, next) {
544
+ if (transition === _this2._currentTransition) {
545
+ transition.callHook(hook, null, next, {
546
+ expectBoolean: true
547
+ });
548
+ }
549
+ }, startTransition);
550
+ } else {
551
+ startTransition();
552
+ }
553
+
554
+ if (!this._rendered && this._startCb) {
555
+ this._startCb.call(null);
556
+ }
557
+
558
+ // HACK:
559
+ // set rendered to true after the transition start, so
560
+ // that components that are acitvated synchronously know
561
+ // whether it is the initial render.
562
+ this._rendered = true;
563
+ };
564
+
565
+ /**
566
+ * Set current to the new transition.
567
+ * This is called by the transition object when the
568
+ * validation of a route has succeeded.
569
+ *
570
+ * @param {Transition} transition
571
+ */
572
+
573
+ Router.prototype._onTransitionValidated = function _onTransitionValidated(transition) {
574
+ // set current route
575
+ var route = this._currentRoute = transition.to;
576
+ // update route context for all children
577
+ if (this.app.$route !== route) {
578
+ this.app.$route = route;
579
+ this._children.forEach(function (child) {
580
+ child.$route = route;
581
+ });
582
+ }
583
+ // call global after hook
584
+ if (this._afterEachHooks.length) {
585
+ this._afterEachHooks.forEach(function (hook) {
586
+ return hook.call(null, {
587
+ to: transition.to,
588
+ from: transition.from
589
+ });
590
+ });
591
+ }
592
+ this._currentTransition.done = true;
593
+ };
594
+
595
+ /**
596
+ * Handle stuff after the transition.
597
+ *
598
+ * @param {Route} route
599
+ * @param {Object} [state]
600
+ * @param {String} [anchor]
601
+ */
602
+
603
+ Router.prototype._postTransition = function _postTransition(route, state, anchor) {
604
+ // handle scroll positions
605
+ // saved scroll positions take priority
606
+ // then we check if the path has an anchor
607
+ var pos = state && state.pos;
608
+ if (pos && this._saveScrollPosition) {
609
+ Vue.nextTick(function () {
610
+ window.scrollTo(pos.x, pos.y);
611
+ });
612
+ } else if (anchor) {
613
+ Vue.nextTick(function () {
614
+ var el = document.getElementById(anchor.slice(1));
615
+ if (el) {
616
+ window.scrollTo(window.scrollX, el.offsetTop);
617
+ }
618
+ });
619
+ }
620
+ };
621
+
622
+ /**
623
+ * Normalize named route object / string paths into
624
+ * a string.
625
+ *
626
+ * @param {Object|String|Number} path
627
+ * @return {String}
628
+ */
629
+
630
+ Router.prototype._stringifyPath = function _stringifyPath(path) {
631
+ if (path && typeof path === 'object') {
632
+ if (path.name) {
633
+ var params = path.params || {};
634
+ if (path.query) {
635
+ params.queryParams = path.query;
636
+ }
637
+ return this._recognizer.generate(path.name, params);
638
+ } else if (path.path) {
639
+ return path.path;
640
+ } else {
641
+ return '';
642
+ }
643
+ } else {
644
+ return path ? path + '' : '';
645
+ }
646
+ };
647
+
648
+ return Router;
649
+ })();
650
+
651
+ function guardComponent(path, handler) {
652
+ var comp = handler.component;
653
+ if (Vue.util.isPlainObject(comp)) {
654
+ comp = handler.component = Vue.extend(comp);
655
+ }
656
+ /* istanbul ignore if */
657
+ if (typeof comp !== 'function') {
658
+ handler.component = null;
659
+ _util.warn('invalid component for route "' + path + '".');
660
+ }
661
+ }
662
+
663
+ /* Installation */
664
+
665
+ Router.installed = false;
666
+
667
+ /**
668
+ * Installation interface.
669
+ * Install the necessary directives.
670
+ */
671
+
672
+ Router.install = function (externalVue) {
673
+ /* istanbul ignore if */
674
+ if (Router.installed) {
675
+ _util.warn('already installed.');
676
+ return;
677
+ }
678
+ Vue = externalVue;
679
+ _override2['default'](Vue);
680
+ _directivesView2['default'](Vue);
681
+ _directivesLink2['default'](Vue);
682
+ _util2['default'].Vue = Vue;
683
+ Router.installed = true;
684
+ };
685
+
686
+ // auto install
687
+ /* istanbul ignore if */
688
+ if (typeof window !== 'undefined' && window.Vue) {
689
+ window.Vue.use(Router);
690
+ }
691
+
692
+ exports['default'] = Router;
693
+ module.exports = exports['default'];
694
+
695
+ /***/ },
696
+ /* 1 */
697
+ /***/ function(module, exports) {
698
+
699
+ "use strict";
700
+
701
+ exports["default"] = function (instance, Constructor) {
702
+ if (!(instance instanceof Constructor)) {
703
+ throw new TypeError("Cannot call a class as a function");
704
+ }
705
+ };
706
+
707
+ exports.__esModule = true;
708
+
709
+ /***/ },
710
+ /* 2 */
711
+ /***/ function(module, exports) {
712
+
713
+ "use strict";
714
+
715
+ exports["default"] = function (obj) {
716
+ return obj && obj.__esModule ? obj : {
717
+ "default": obj
718
+ };
719
+ };
720
+
721
+ exports.__esModule = true;
722
+
723
+ /***/ },
724
+ /* 3 */
725
+ /***/ function(module, exports, __webpack_require__) {
726
+
727
+ 'use strict';
728
+
729
+ var _interopRequireDefault = __webpack_require__(2)['default'];
730
+
731
+ exports.__esModule = true;
732
+ exports.warn = warn;
733
+ exports.resolvePath = resolvePath;
734
+ exports.isPromise = isPromise;
735
+ exports.getRouteConfig = getRouteConfig;
736
+ exports.resolveAsyncComponent = resolveAsyncComponent;
737
+ exports.mapParams = mapParams;
738
+
739
+ var _routeRecognizer = __webpack_require__(4);
740
+
741
+ var _routeRecognizer2 = _interopRequireDefault(_routeRecognizer);
742
+
743
+ var genQuery = _routeRecognizer2['default'].prototype.generateQueryString;
744
+
745
+ // export default for holding the Vue reference
746
+ var _exports = {};
747
+ exports['default'] = _exports;
748
+
749
+ /**
750
+ * Warn stuff.
751
+ *
752
+ * @param {String} msg
753
+ */
754
+
755
+ function warn(msg) {
756
+ /* istanbul ignore next */
757
+ if (window.console) {
758
+ console.warn('[vue-router] ' + msg);
759
+ /* istanbul ignore if */
760
+ if (!_exports.Vue || _exports.Vue.config.debug) {
761
+ console.warn(new Error('warning stack trace:').stack);
762
+ }
763
+ }
764
+ }
765
+
766
+ /**
767
+ * Resolve a relative path.
768
+ *
769
+ * @param {String} base
770
+ * @param {String} relative
771
+ * @param {Boolean} append
772
+ * @return {String}
773
+ */
774
+
775
+ function resolvePath(base, relative, append) {
776
+ var query = base.match(/(\?.*)$/);
777
+ if (query) {
778
+ query = query[1];
779
+ base = base.slice(0, -query.length);
780
+ }
781
+ // a query!
782
+ if (relative.charAt(0) === '?') {
783
+ return base + relative;
784
+ }
785
+ var stack = base.split('/');
786
+ // remove trailing segment if:
787
+ // - not appending
788
+ // - appending to trailing slash (last segment is empty)
789
+ if (!append || !stack[stack.length - 1]) {
790
+ stack.pop();
791
+ }
792
+ // resolve relative path
793
+ var segments = relative.replace(/^\//, '').split('/');
794
+ for (var i = 0; i < segments.length; i++) {
795
+ var segment = segments[i];
796
+ if (segment === '.') {
797
+ continue;
798
+ } else if (segment === '..') {
799
+ stack.pop();
800
+ } else {
801
+ stack.push(segment);
802
+ }
803
+ }
804
+ // ensure leading slash
805
+ if (stack[0] !== '') {
806
+ stack.unshift('');
807
+ }
808
+ return stack.join('/');
809
+ }
810
+
811
+ /**
812
+ * Forgiving check for a promise
813
+ *
814
+ * @param {Object} p
815
+ * @return {Boolean}
816
+ */
817
+
818
+ function isPromise(p) {
819
+ return p && typeof p.then === 'function';
820
+ }
821
+
822
+ /**
823
+ * Retrive a route config field from a component instance
824
+ * OR a component contructor.
825
+ *
826
+ * @param {Function|Vue} component
827
+ * @param {String} name
828
+ * @return {*}
829
+ */
830
+
831
+ function getRouteConfig(component, name) {
832
+ var options = component && (component.$options || component.options);
833
+ return options && options.route && options.route[name];
834
+ }
835
+
836
+ /**
837
+ * Resolve an async component factory. Have to do a dirty
838
+ * mock here because of Vue core's internal API depends on
839
+ * an ID check.
840
+ *
841
+ * @param {Object} handler
842
+ * @param {Function} cb
843
+ */
844
+
845
+ var resolver = undefined;
846
+
847
+ function resolveAsyncComponent(handler, cb) {
848
+ if (!resolver) {
849
+ resolver = {
850
+ resolve: _exports.Vue.prototype._resolveComponent,
851
+ $options: {
852
+ components: {
853
+ _: handler.component
854
+ }
855
+ }
856
+ };
857
+ } else {
858
+ resolver.$options.components._ = handler.component;
859
+ }
860
+ resolver.resolve('_', function (Component) {
861
+ handler.component = Component;
862
+ cb(Component);
863
+ });
864
+ }
865
+
866
+ /**
867
+ * Map the dynamic segments in a path to params.
868
+ *
869
+ * @param {String} path
870
+ * @param {Object} params
871
+ * @param {Object} query
872
+ */
873
+
874
+ function mapParams(path, params, query) {
875
+ if (params === undefined) params = {};
876
+
877
+ path = path.replace(/:([^\/]+)/g, function (_, key) {
878
+ var val = params[key];
879
+ if (!val) {
880
+ warn('param "' + key + '" not found when generating ' + 'path for "' + path + '" with params ' + JSON.stringify(params));
881
+ }
882
+ return val || '';
883
+ });
884
+ if (query) {
885
+ path += genQuery(query);
886
+ }
887
+ return path;
888
+ }
889
+
890
+ /***/ },
891
+ /* 4 */
892
+ /***/ function(module, exports, __webpack_require__) {
893
+
894
+ var __WEBPACK_AMD_DEFINE_RESULT__;/* WEBPACK VAR INJECTION */(function(module) {(function() {
895
+ "use strict";
896
+ function $$route$recognizer$dsl$$Target(path, matcher, delegate) {
897
+ this.path = path;
898
+ this.matcher = matcher;
899
+ this.delegate = delegate;
900
+ }
901
+
902
+ $$route$recognizer$dsl$$Target.prototype = {
903
+ to: function(target, callback) {
904
+ var delegate = this.delegate;
905
+
906
+ if (delegate && delegate.willAddRoute) {
907
+ target = delegate.willAddRoute(this.matcher.target, target);
908
+ }
909
+
910
+ this.matcher.add(this.path, target);
911
+
912
+ if (callback) {
913
+ if (callback.length === 0) { throw new Error("You must have an argument in the function passed to `to`"); }
914
+ this.matcher.addChild(this.path, target, callback, this.delegate);
915
+ }
916
+ return this;
917
+ }
918
+ };
919
+
920
+ function $$route$recognizer$dsl$$Matcher(target) {
921
+ this.routes = {};
922
+ this.children = {};
923
+ this.target = target;
924
+ }
925
+
926
+ $$route$recognizer$dsl$$Matcher.prototype = {
927
+ add: function(path, handler) {
928
+ this.routes[path] = handler;
929
+ },
930
+
931
+ addChild: function(path, target, callback, delegate) {
932
+ var matcher = new $$route$recognizer$dsl$$Matcher(target);
933
+ this.children[path] = matcher;
934
+
935
+ var match = $$route$recognizer$dsl$$generateMatch(path, matcher, delegate);
936
+
937
+ if (delegate && delegate.contextEntered) {
938
+ delegate.contextEntered(target, match);
939
+ }
940
+
941
+ callback(match);
942
+ }
943
+ };
944
+
945
+ function $$route$recognizer$dsl$$generateMatch(startingPath, matcher, delegate) {
946
+ return function(path, nestedCallback) {
947
+ var fullPath = startingPath + path;
948
+
949
+ if (nestedCallback) {
950
+ nestedCallback($$route$recognizer$dsl$$generateMatch(fullPath, matcher, delegate));
951
+ } else {
952
+ return new $$route$recognizer$dsl$$Target(startingPath + path, matcher, delegate);
953
+ }
954
+ };
955
+ }
956
+
957
+ function $$route$recognizer$dsl$$addRoute(routeArray, path, handler) {
958
+ var len = 0;
959
+ for (var i=0, l=routeArray.length; i<l; i++) {
960
+ len += routeArray[i].path.length;
961
+ }
962
+
963
+ path = path.substr(len);
964
+ var route = { path: path, handler: handler };
965
+ routeArray.push(route);
966
+ }
967
+
968
+ function $$route$recognizer$dsl$$eachRoute(baseRoute, matcher, callback, binding) {
969
+ var routes = matcher.routes;
970
+
971
+ for (var path in routes) {
972
+ if (routes.hasOwnProperty(path)) {
973
+ var routeArray = baseRoute.slice();
974
+ $$route$recognizer$dsl$$addRoute(routeArray, path, routes[path]);
975
+
976
+ if (matcher.children[path]) {
977
+ $$route$recognizer$dsl$$eachRoute(routeArray, matcher.children[path], callback, binding);
978
+ } else {
979
+ callback.call(binding, routeArray);
980
+ }
981
+ }
982
+ }
983
+ }
984
+
985
+ var $$route$recognizer$dsl$$default = function(callback, addRouteCallback) {
986
+ var matcher = new $$route$recognizer$dsl$$Matcher();
987
+
988
+ callback($$route$recognizer$dsl$$generateMatch("", matcher, this.delegate));
989
+
990
+ $$route$recognizer$dsl$$eachRoute([], matcher, function(route) {
991
+ if (addRouteCallback) { addRouteCallback(this, route); }
992
+ else { this.add(route); }
993
+ }, this);
994
+ };
995
+
996
+ var $$route$recognizer$$specials = [
997
+ '/', '.', '*', '+', '?', '|',
998
+ '(', ')', '[', ']', '{', '}', '\\'
999
+ ];
1000
+
1001
+ var $$route$recognizer$$escapeRegex = new RegExp('(\\' + $$route$recognizer$$specials.join('|\\') + ')', 'g');
1002
+
1003
+ function $$route$recognizer$$isArray(test) {
1004
+ return Object.prototype.toString.call(test) === "[object Array]";
1005
+ }
1006
+
1007
+ // A Segment represents a segment in the original route description.
1008
+ // Each Segment type provides an `eachChar` and `regex` method.
1009
+ //
1010
+ // The `eachChar` method invokes the callback with one or more character
1011
+ // specifications. A character specification consumes one or more input
1012
+ // characters.
1013
+ //
1014
+ // The `regex` method returns a regex fragment for the segment. If the
1015
+ // segment is a dynamic of star segment, the regex fragment also includes
1016
+ // a capture.
1017
+ //
1018
+ // A character specification contains:
1019
+ //
1020
+ // * `validChars`: a String with a list of all valid characters, or
1021
+ // * `invalidChars`: a String with a list of all invalid characters
1022
+ // * `repeat`: true if the character specification can repeat
1023
+
1024
+ function $$route$recognizer$$StaticSegment(string) { this.string = string; }
1025
+ $$route$recognizer$$StaticSegment.prototype = {
1026
+ eachChar: function(callback) {
1027
+ var string = this.string, ch;
1028
+
1029
+ for (var i=0, l=string.length; i<l; i++) {
1030
+ ch = string.charAt(i);
1031
+ callback({ validChars: ch });
1032
+ }
1033
+ },
1034
+
1035
+ regex: function() {
1036
+ return this.string.replace($$route$recognizer$$escapeRegex, '\\$1');
1037
+ },
1038
+
1039
+ generate: function() {
1040
+ return this.string;
1041
+ }
1042
+ };
1043
+
1044
+ function $$route$recognizer$$DynamicSegment(name) { this.name = name; }
1045
+ $$route$recognizer$$DynamicSegment.prototype = {
1046
+ eachChar: function(callback) {
1047
+ callback({ invalidChars: "/", repeat: true });
1048
+ },
1049
+
1050
+ regex: function() {
1051
+ return "([^/]+)";
1052
+ },
1053
+
1054
+ generate: function(params) {
1055
+ return params[this.name];
1056
+ }
1057
+ };
1058
+
1059
+ function $$route$recognizer$$StarSegment(name) { this.name = name; }
1060
+ $$route$recognizer$$StarSegment.prototype = {
1061
+ eachChar: function(callback) {
1062
+ callback({ invalidChars: "", repeat: true });
1063
+ },
1064
+
1065
+ regex: function() {
1066
+ return "(.+)";
1067
+ },
1068
+
1069
+ generate: function(params) {
1070
+ return params[this.name];
1071
+ }
1072
+ };
1073
+
1074
+ function $$route$recognizer$$EpsilonSegment() {}
1075
+ $$route$recognizer$$EpsilonSegment.prototype = {
1076
+ eachChar: function() {},
1077
+ regex: function() { return ""; },
1078
+ generate: function() { return ""; }
1079
+ };
1080
+
1081
+ function $$route$recognizer$$parse(route, names, specificity) {
1082
+ // normalize route as not starting with a "/". Recognition will
1083
+ // also normalize.
1084
+ if (route.charAt(0) === "/") { route = route.substr(1); }
1085
+
1086
+ var segments = route.split("/"), results = [];
1087
+
1088
+ // A routes has specificity determined by the order that its different segments
1089
+ // appear in. This system mirrors how the magnitude of numbers written as strings
1090
+ // works.
1091
+ // Consider a number written as: "abc". An example would be "200". Any other number written
1092
+ // "xyz" will be smaller than "abc" so long as `a > z`. For instance, "199" is smaller
1093
+ // then "200", even though "y" and "z" (which are both 9) are larger than "0" (the value
1094
+ // of (`b` and `c`). This is because the leading symbol, "2", is larger than the other
1095
+ // leading symbol, "1".
1096
+ // The rule is that symbols to the left carry more weight than symbols to the right
1097
+ // when a number is written out as a string. In the above strings, the leading digit
1098
+ // represents how many 100's are in the number, and it carries more weight than the middle
1099
+ // number which represents how many 10's are in the number.
1100
+ // This system of number magnitude works well for route specificity, too. A route written as
1101
+ // `a/b/c` will be more specific than `x/y/z` as long as `a` is more specific than
1102
+ // `x`, irrespective of the other parts.
1103
+ // Because of this similarity, we assign each type of segment a number value written as a
1104
+ // string. We can find the specificity of compound routes by concatenating these strings
1105
+ // together, from left to right. After we have looped through all of the segments,
1106
+ // we convert the string to a number.
1107
+ specificity.val = '';
1108
+
1109
+ for (var i=0, l=segments.length; i<l; i++) {
1110
+ var segment = segments[i], match;
1111
+
1112
+ if (match = segment.match(/^:([^\/]+)$/)) {
1113
+ results.push(new $$route$recognizer$$DynamicSegment(match[1]));
1114
+ names.push(match[1]);
1115
+ specificity.val += '3';
1116
+ } else if (match = segment.match(/^\*([^\/]+)$/)) {
1117
+ results.push(new $$route$recognizer$$StarSegment(match[1]));
1118
+ specificity.val += '2';
1119
+ names.push(match[1]);
1120
+ } else if(segment === "") {
1121
+ results.push(new $$route$recognizer$$EpsilonSegment());
1122
+ specificity.val += '1';
1123
+ } else {
1124
+ results.push(new $$route$recognizer$$StaticSegment(segment));
1125
+ specificity.val += '4';
1126
+ }
1127
+ }
1128
+
1129
+ specificity.val = +specificity.val;
1130
+
1131
+ return results;
1132
+ }
1133
+
1134
+ // A State has a character specification and (`charSpec`) and a list of possible
1135
+ // subsequent states (`nextStates`).
1136
+ //
1137
+ // If a State is an accepting state, it will also have several additional
1138
+ // properties:
1139
+ //
1140
+ // * `regex`: A regular expression that is used to extract parameters from paths
1141
+ // that reached this accepting state.
1142
+ // * `handlers`: Information on how to convert the list of captures into calls
1143
+ // to registered handlers with the specified parameters
1144
+ // * `types`: How many static, dynamic or star segments in this route. Used to
1145
+ // decide which route to use if multiple registered routes match a path.
1146
+ //
1147
+ // Currently, State is implemented naively by looping over `nextStates` and
1148
+ // comparing a character specification against a character. A more efficient
1149
+ // implementation would use a hash of keys pointing at one or more next states.
1150
+
1151
+ function $$route$recognizer$$State(charSpec) {
1152
+ this.charSpec = charSpec;
1153
+ this.nextStates = [];
1154
+ }
1155
+
1156
+ $$route$recognizer$$State.prototype = {
1157
+ get: function(charSpec) {
1158
+ var nextStates = this.nextStates;
1159
+
1160
+ for (var i=0, l=nextStates.length; i<l; i++) {
1161
+ var child = nextStates[i];
1162
+
1163
+ var isEqual = child.charSpec.validChars === charSpec.validChars;
1164
+ isEqual = isEqual && child.charSpec.invalidChars === charSpec.invalidChars;
1165
+
1166
+ if (isEqual) { return child; }
1167
+ }
1168
+ },
1169
+
1170
+ put: function(charSpec) {
1171
+ var state;
1172
+
1173
+ // If the character specification already exists in a child of the current
1174
+ // state, just return that state.
1175
+ if (state = this.get(charSpec)) { return state; }
1176
+
1177
+ // Make a new state for the character spec
1178
+ state = new $$route$recognizer$$State(charSpec);
1179
+
1180
+ // Insert the new state as a child of the current state
1181
+ this.nextStates.push(state);
1182
+
1183
+ // If this character specification repeats, insert the new state as a child
1184
+ // of itself. Note that this will not trigger an infinite loop because each
1185
+ // transition during recognition consumes a character.
1186
+ if (charSpec.repeat) {
1187
+ state.nextStates.push(state);
1188
+ }
1189
+
1190
+ // Return the new state
1191
+ return state;
1192
+ },
1193
+
1194
+ // Find a list of child states matching the next character
1195
+ match: function(ch) {
1196
+ // DEBUG "Processing `" + ch + "`:"
1197
+ var nextStates = this.nextStates,
1198
+ child, charSpec, chars;
1199
+
1200
+ // DEBUG " " + debugState(this)
1201
+ var returned = [];
1202
+
1203
+ for (var i=0, l=nextStates.length; i<l; i++) {
1204
+ child = nextStates[i];
1205
+
1206
+ charSpec = child.charSpec;
1207
+
1208
+ if (typeof (chars = charSpec.validChars) !== 'undefined') {
1209
+ if (chars.indexOf(ch) !== -1) { returned.push(child); }
1210
+ } else if (typeof (chars = charSpec.invalidChars) !== 'undefined') {
1211
+ if (chars.indexOf(ch) === -1) { returned.push(child); }
1212
+ }
1213
+ }
1214
+
1215
+ return returned;
1216
+ }
1217
+
1218
+ /** IF DEBUG
1219
+ , debug: function() {
1220
+ var charSpec = this.charSpec,
1221
+ debug = "[",
1222
+ chars = charSpec.validChars || charSpec.invalidChars;
1223
+
1224
+ if (charSpec.invalidChars) { debug += "^"; }
1225
+ debug += chars;
1226
+ debug += "]";
1227
+
1228
+ if (charSpec.repeat) { debug += "+"; }
1229
+
1230
+ return debug;
1231
+ }
1232
+ END IF **/
1233
+ };
1234
+
1235
+ /** IF DEBUG
1236
+ function debug(log) {
1237
+ console.log(log);
1238
+ }
1239
+
1240
+ function debugState(state) {
1241
+ return state.nextStates.map(function(n) {
1242
+ if (n.nextStates.length === 0) { return "( " + n.debug() + " [accepting] )"; }
1243
+ return "( " + n.debug() + " <then> " + n.nextStates.map(function(s) { return s.debug() }).join(" or ") + " )";
1244
+ }).join(", ")
1245
+ }
1246
+ END IF **/
1247
+
1248
+ // Sort the routes by specificity
1249
+ function $$route$recognizer$$sortSolutions(states) {
1250
+ return states.sort(function(a, b) {
1251
+ return b.specificity.val - a.specificity.val;
1252
+ });
1253
+ }
1254
+
1255
+ function $$route$recognizer$$recognizeChar(states, ch) {
1256
+ var nextStates = [];
1257
+
1258
+ for (var i=0, l=states.length; i<l; i++) {
1259
+ var state = states[i];
1260
+
1261
+ nextStates = nextStates.concat(state.match(ch));
1262
+ }
1263
+
1264
+ return nextStates;
1265
+ }
1266
+
1267
+ var $$route$recognizer$$oCreate = Object.create || function(proto) {
1268
+ function F() {}
1269
+ F.prototype = proto;
1270
+ return new F();
1271
+ };
1272
+
1273
+ function $$route$recognizer$$RecognizeResults(queryParams) {
1274
+ this.queryParams = queryParams || {};
1275
+ }
1276
+ $$route$recognizer$$RecognizeResults.prototype = $$route$recognizer$$oCreate({
1277
+ splice: Array.prototype.splice,
1278
+ slice: Array.prototype.slice,
1279
+ push: Array.prototype.push,
1280
+ length: 0,
1281
+ queryParams: null
1282
+ });
1283
+
1284
+ function $$route$recognizer$$findHandler(state, path, queryParams) {
1285
+ var handlers = state.handlers, regex = state.regex;
1286
+ var captures = path.match(regex), currentCapture = 1;
1287
+ var result = new $$route$recognizer$$RecognizeResults(queryParams);
1288
+
1289
+ for (var i=0, l=handlers.length; i<l; i++) {
1290
+ var handler = handlers[i], names = handler.names, params = {};
1291
+
1292
+ for (var j=0, m=names.length; j<m; j++) {
1293
+ params[names[j]] = captures[currentCapture++];
1294
+ }
1295
+
1296
+ result.push({ handler: handler.handler, params: params, isDynamic: !!names.length });
1297
+ }
1298
+
1299
+ return result;
1300
+ }
1301
+
1302
+ function $$route$recognizer$$addSegment(currentState, segment) {
1303
+ segment.eachChar(function(ch) {
1304
+ var state;
1305
+
1306
+ currentState = currentState.put(ch);
1307
+ });
1308
+
1309
+ return currentState;
1310
+ }
1311
+
1312
+ function $$route$recognizer$$decodeQueryParamPart(part) {
1313
+ // http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
1314
+ part = part.replace(/\+/gm, '%20');
1315
+ return decodeURIComponent(part);
1316
+ }
1317
+
1318
+ // The main interface
1319
+
1320
+ var $$route$recognizer$$RouteRecognizer = function() {
1321
+ this.rootState = new $$route$recognizer$$State();
1322
+ this.names = {};
1323
+ };
1324
+
1325
+
1326
+ $$route$recognizer$$RouteRecognizer.prototype = {
1327
+ add: function(routes, options) {
1328
+ var currentState = this.rootState, regex = "^",
1329
+ specificity = {},
1330
+ handlers = [], allSegments = [], name;
1331
+
1332
+ var isEmpty = true;
1333
+
1334
+ for (var i=0, l=routes.length; i<l; i++) {
1335
+ var route = routes[i], names = [];
1336
+
1337
+ var segments = $$route$recognizer$$parse(route.path, names, specificity);
1338
+
1339
+ allSegments = allSegments.concat(segments);
1340
+
1341
+ for (var j=0, m=segments.length; j<m; j++) {
1342
+ var segment = segments[j];
1343
+
1344
+ if (segment instanceof $$route$recognizer$$EpsilonSegment) { continue; }
1345
+
1346
+ isEmpty = false;
1347
+
1348
+ // Add a "/" for the new segment
1349
+ currentState = currentState.put({ validChars: "/" });
1350
+ regex += "/";
1351
+
1352
+ // Add a representation of the segment to the NFA and regex
1353
+ currentState = $$route$recognizer$$addSegment(currentState, segment);
1354
+ regex += segment.regex();
1355
+ }
1356
+
1357
+ var handler = { handler: route.handler, names: names };
1358
+ handlers.push(handler);
1359
+ }
1360
+
1361
+ if (isEmpty) {
1362
+ currentState = currentState.put({ validChars: "/" });
1363
+ regex += "/";
1364
+ }
1365
+
1366
+ currentState.handlers = handlers;
1367
+ currentState.regex = new RegExp(regex + "$");
1368
+ currentState.specificity = specificity;
1369
+
1370
+ if (name = options && options.as) {
1371
+ this.names[name] = {
1372
+ segments: allSegments,
1373
+ handlers: handlers
1374
+ };
1375
+ }
1376
+ },
1377
+
1378
+ handlersFor: function(name) {
1379
+ var route = this.names[name], result = [];
1380
+ if (!route) { throw new Error("There is no route named " + name); }
1381
+
1382
+ for (var i=0, l=route.handlers.length; i<l; i++) {
1383
+ result.push(route.handlers[i]);
1384
+ }
1385
+
1386
+ return result;
1387
+ },
1388
+
1389
+ hasRoute: function(name) {
1390
+ return !!this.names[name];
1391
+ },
1392
+
1393
+ generate: function(name, params) {
1394
+ var route = this.names[name], output = "";
1395
+ if (!route) { throw new Error("There is no route named " + name); }
1396
+
1397
+ var segments = route.segments;
1398
+
1399
+ for (var i=0, l=segments.length; i<l; i++) {
1400
+ var segment = segments[i];
1401
+
1402
+ if (segment instanceof $$route$recognizer$$EpsilonSegment) { continue; }
1403
+
1404
+ output += "/";
1405
+ output += segment.generate(params);
1406
+ }
1407
+
1408
+ if (output.charAt(0) !== '/') { output = '/' + output; }
1409
+
1410
+ if (params && params.queryParams) {
1411
+ output += this.generateQueryString(params.queryParams, route.handlers);
1412
+ }
1413
+
1414
+ return output;
1415
+ },
1416
+
1417
+ generateQueryString: function(params, handlers) {
1418
+ var pairs = [];
1419
+ var keys = [];
1420
+ for(var key in params) {
1421
+ if (params.hasOwnProperty(key)) {
1422
+ keys.push(key);
1423
+ }
1424
+ }
1425
+ keys.sort();
1426
+ for (var i = 0, len = keys.length; i < len; i++) {
1427
+ key = keys[i];
1428
+ var value = params[key];
1429
+ if (value == null) {
1430
+ continue;
1431
+ }
1432
+ var pair = encodeURIComponent(key);
1433
+ if ($$route$recognizer$$isArray(value)) {
1434
+ for (var j = 0, l = value.length; j < l; j++) {
1435
+ var arrayPair = key + '[]' + '=' + encodeURIComponent(value[j]);
1436
+ pairs.push(arrayPair);
1437
+ }
1438
+ } else {
1439
+ pair += "=" + encodeURIComponent(value);
1440
+ pairs.push(pair);
1441
+ }
1442
+ }
1443
+
1444
+ if (pairs.length === 0) { return ''; }
1445
+
1446
+ return "?" + pairs.join("&");
1447
+ },
1448
+
1449
+ parseQueryString: function(queryString) {
1450
+ var pairs = queryString.split("&"), queryParams = {};
1451
+ for(var i=0; i < pairs.length; i++) {
1452
+ var pair = pairs[i].split('='),
1453
+ key = $$route$recognizer$$decodeQueryParamPart(pair[0]),
1454
+ keyLength = key.length,
1455
+ isArray = false,
1456
+ value;
1457
+ if (pair.length === 1) {
1458
+ value = 'true';
1459
+ } else {
1460
+ //Handle arrays
1461
+ if (keyLength > 2 && key.slice(keyLength -2) === '[]') {
1462
+ isArray = true;
1463
+ key = key.slice(0, keyLength - 2);
1464
+ if(!queryParams[key]) {
1465
+ queryParams[key] = [];
1466
+ }
1467
+ }
1468
+ value = pair[1] ? $$route$recognizer$$decodeQueryParamPart(pair[1]) : '';
1469
+ }
1470
+ if (isArray) {
1471
+ queryParams[key].push(value);
1472
+ } else {
1473
+ queryParams[key] = value;
1474
+ }
1475
+ }
1476
+ return queryParams;
1477
+ },
1478
+
1479
+ recognize: function(path) {
1480
+ var states = [ this.rootState ],
1481
+ pathLen, i, l, queryStart, queryParams = {},
1482
+ isSlashDropped = false;
1483
+
1484
+ queryStart = path.indexOf('?');
1485
+ if (queryStart !== -1) {
1486
+ var queryString = path.substr(queryStart + 1, path.length);
1487
+ path = path.substr(0, queryStart);
1488
+ queryParams = this.parseQueryString(queryString);
1489
+ }
1490
+
1491
+ path = decodeURI(path);
1492
+
1493
+ // DEBUG GROUP path
1494
+
1495
+ if (path.charAt(0) !== "/") { path = "/" + path; }
1496
+
1497
+ pathLen = path.length;
1498
+ if (pathLen > 1 && path.charAt(pathLen - 1) === "/") {
1499
+ path = path.substr(0, pathLen - 1);
1500
+ isSlashDropped = true;
1501
+ }
1502
+
1503
+ for (i=0, l=path.length; i<l; i++) {
1504
+ states = $$route$recognizer$$recognizeChar(states, path.charAt(i));
1505
+ if (!states.length) { break; }
1506
+ }
1507
+
1508
+ // END DEBUG GROUP
1509
+
1510
+ var solutions = [];
1511
+ for (i=0, l=states.length; i<l; i++) {
1512
+ if (states[i].handlers) { solutions.push(states[i]); }
1513
+ }
1514
+
1515
+ states = $$route$recognizer$$sortSolutions(solutions);
1516
+
1517
+ var state = solutions[0];
1518
+
1519
+ if (state && state.handlers) {
1520
+ // if a trailing slash was dropped and a star segment is the last segment
1521
+ // specified, put the trailing slash back
1522
+ if (isSlashDropped && state.regex.source.slice(-5) === "(.+)$") {
1523
+ path = path + "/";
1524
+ }
1525
+ return $$route$recognizer$$findHandler(state, path, queryParams);
1526
+ }
1527
+ }
1528
+ };
1529
+
1530
+ $$route$recognizer$$RouteRecognizer.prototype.map = $$route$recognizer$dsl$$default;
1531
+
1532
+ $$route$recognizer$$RouteRecognizer.VERSION = '0.1.9';
1533
+
1534
+ var $$route$recognizer$$default = $$route$recognizer$$RouteRecognizer;
1535
+
1536
+ /* global define:true module:true window: true */
1537
+ if ("function" === 'function' && __webpack_require__(6)['amd']) {
1538
+ !(__WEBPACK_AMD_DEFINE_RESULT__ = function() { return $$route$recognizer$$default; }.call(exports, __webpack_require__, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1539
+ } else if (typeof module !== 'undefined' && module['exports']) {
1540
+ module['exports'] = $$route$recognizer$$default;
1541
+ } else if (typeof this !== 'undefined') {
1542
+ this['RouteRecognizer'] = $$route$recognizer$$default;
1543
+ }
1544
+ }).call(this);
1545
+
1546
+ //# sourceMappingURL=route-recognizer.js.map
1547
+ /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(5)(module)))
1548
+
1549
+ /***/ },
1550
+ /* 5 */
1551
+ /***/ function(module, exports) {
1552
+
1553
+ module.exports = function(module) {
1554
+ if(!module.webpackPolyfill) {
1555
+ module.deprecate = function() {};
1556
+ module.paths = [];
1557
+ // module.parent = undefined by default
1558
+ module.children = [];
1559
+ module.webpackPolyfill = 1;
1560
+ }
1561
+ return module;
1562
+ }
1563
+
1564
+
1565
+ /***/ },
1566
+ /* 6 */
1567
+ /***/ function(module, exports) {
1568
+
1569
+ module.exports = function() { throw new Error("define cannot be used indirect"); };
1570
+
1571
+
1572
+ /***/ },
1573
+ /* 7 */
1574
+ /***/ function(module, exports) {
1575
+
1576
+ 'use strict';
1577
+
1578
+ exports.__esModule = true;
1579
+
1580
+ exports['default'] = function (Vue) {
1581
+
1582
+ var _ = Vue.util;
1583
+
1584
+ // override Vue's init and destroy process to keep track of router instances
1585
+ var init = Vue.prototype._init;
1586
+ Vue.prototype._init = function (options) {
1587
+ var root = options._parent || options.parent || this;
1588
+ var route = root.$route;
1589
+ if (route) {
1590
+ route.router._children.push(this);
1591
+ if (!this.$route) {
1592
+ /* istanbul ignore if */
1593
+ if (this._defineMeta) {
1594
+ // 0.12
1595
+ this._defineMeta('$route', route);
1596
+ } else {
1597
+ // 1.0
1598
+ _.defineReactive(this, '$route', route);
1599
+ }
1600
+ }
1601
+ }
1602
+ init.call(this, options);
1603
+ };
1604
+
1605
+ var destroy = Vue.prototype._destroy;
1606
+ Vue.prototype._destroy = function () {
1607
+ if (!this._isBeingDestroyed) {
1608
+ var route = this.$root.$route;
1609
+ if (route) {
1610
+ route.router._children.$remove(this);
1611
+ }
1612
+ destroy.apply(this, arguments);
1613
+ }
1614
+ };
1615
+
1616
+ // 1.0 only: enable route mixins
1617
+ var strats = Vue.config.optionMergeStrategies;
1618
+ var hooksToMergeRE = /^(data|activate|deactivate)$/;
1619
+
1620
+ if (strats) {
1621
+ strats.route = function (parentVal, childVal) {
1622
+ if (!childVal) return parentVal;
1623
+ if (!parentVal) return childVal;
1624
+ var ret = {};
1625
+ _.extend(ret, parentVal);
1626
+ for (var key in childVal) {
1627
+ var a = ret[key];
1628
+ var b = childVal[key];
1629
+ // for data, activate and deactivate, we need to merge them into
1630
+ // arrays similar to lifecycle hooks.
1631
+ if (a && hooksToMergeRE.test(key)) {
1632
+ ret[key] = (_.isArray(a) ? a : [a]).concat(b);
1633
+ } else {
1634
+ ret[key] = b;
1635
+ }
1636
+ }
1637
+ return ret;
1638
+ };
1639
+ }
1640
+ };
1641
+
1642
+ module.exports = exports['default'];
1643
+
1644
+ /***/ },
1645
+ /* 8 */
1646
+ /***/ function(module, exports, __webpack_require__) {
1647
+
1648
+ "use strict";
1649
+
1650
+ var _classCallCheck = __webpack_require__(1)["default"];
1651
+
1652
+ var _Object$freeze = __webpack_require__(9)["default"];
1653
+
1654
+ exports.__esModule = true;
1655
+ var internalKeysRE = /^(component|subRoutes)$/;
1656
+
1657
+ /**
1658
+ * Route Context Object
1659
+ *
1660
+ * @param {String} path
1661
+ * @param {Router} router
1662
+ */
1663
+
1664
+ var Route = function Route(path, router) {
1665
+ var _this = this;
1666
+
1667
+ _classCallCheck(this, Route);
1668
+
1669
+ var matched = router._recognizer.recognize(path);
1670
+ if (matched) {
1671
+ // copy all custom fields from route configs
1672
+ [].forEach.call(matched, function (match) {
1673
+ for (var key in match.handler) {
1674
+ if (!internalKeysRE.test(key)) {
1675
+ _this[key] = match.handler[key];
1676
+ }
1677
+ }
1678
+ });
1679
+ // set query and params
1680
+ this.query = matched.queryParams;
1681
+ this.params = [].reduce.call(matched, function (prev, cur) {
1682
+ if (cur.params) {
1683
+ for (var key in cur.params) {
1684
+ prev[key] = cur.params[key];
1685
+ }
1686
+ }
1687
+ return prev;
1688
+ }, {});
1689
+ }
1690
+ // expose path and router
1691
+ this.path = path;
1692
+ this.router = router;
1693
+ // for internal use
1694
+ this.matched = matched || router._notFoundHandler;
1695
+ // Important: freeze self to prevent observation
1696
+ _Object$freeze(this);
1697
+ };
1698
+
1699
+ exports["default"] = Route;
1700
+ module.exports = exports["default"];
1701
+
1702
+ /***/ },
1703
+ /* 9 */
1704
+ /***/ function(module, exports, __webpack_require__) {
1705
+
1706
+ module.exports = { "default": __webpack_require__(10), __esModule: true };
1707
+
1708
+ /***/ },
1709
+ /* 10 */
1710
+ /***/ function(module, exports, __webpack_require__) {
1711
+
1712
+ __webpack_require__(11);
1713
+ module.exports = __webpack_require__(16).Object.freeze;
1714
+
1715
+ /***/ },
1716
+ /* 11 */
1717
+ /***/ function(module, exports, __webpack_require__) {
1718
+
1719
+ // 19.1.2.5 Object.freeze(O)
1720
+ var isObject = __webpack_require__(12);
1721
+
1722
+ __webpack_require__(13)('freeze', function($freeze){
1723
+ return function freeze(it){
1724
+ return $freeze && isObject(it) ? $freeze(it) : it;
1725
+ };
1726
+ });
1727
+
1728
+ /***/ },
1729
+ /* 12 */
1730
+ /***/ function(module, exports) {
1731
+
1732
+ // http://jsperf.com/core-js-isobject
1733
+ module.exports = function(it){
1734
+ return it !== null && (typeof it == 'object' || typeof it == 'function');
1735
+ };
1736
+
1737
+ /***/ },
1738
+ /* 13 */
1739
+ /***/ function(module, exports, __webpack_require__) {
1740
+
1741
+ // most Object methods by ES6 should accept primitives
1742
+ module.exports = function(KEY, exec){
1743
+ var $def = __webpack_require__(14)
1744
+ , fn = (__webpack_require__(16).Object || {})[KEY] || Object[KEY]
1745
+ , exp = {};
1746
+ exp[KEY] = exec(fn);
1747
+ $def($def.S + $def.F * __webpack_require__(17)(function(){ fn(1); }), 'Object', exp);
1748
+ };
1749
+
1750
+ /***/ },
1751
+ /* 14 */
1752
+ /***/ function(module, exports, __webpack_require__) {
1753
+
1754
+ var global = __webpack_require__(15)
1755
+ , core = __webpack_require__(16)
1756
+ , PROTOTYPE = 'prototype';
1757
+ var ctx = function(fn, that){
1758
+ return function(){
1759
+ return fn.apply(that, arguments);
1760
+ };
1761
+ };
1762
+ var $def = function(type, name, source){
1763
+ var key, own, out, exp
1764
+ , isGlobal = type & $def.G
1765
+ , isProto = type & $def.P
1766
+ , target = isGlobal ? global : type & $def.S
1767
+ ? global[name] : (global[name] || {})[PROTOTYPE]
1768
+ , exports = isGlobal ? core : core[name] || (core[name] = {});
1769
+ if(isGlobal)source = name;
1770
+ for(key in source){
1771
+ // contains in native
1772
+ own = !(type & $def.F) && target && key in target;
1773
+ if(own && key in exports)continue;
1774
+ // export native or passed
1775
+ out = own ? target[key] : source[key];
1776
+ // prevent global pollution for namespaces
1777
+ if(isGlobal && typeof target[key] != 'function')exp = source[key];
1778
+ // bind timers to global for call from export context
1779
+ else if(type & $def.B && own)exp = ctx(out, global);
1780
+ // wrap global constructors for prevent change them in library
1781
+ else if(type & $def.W && target[key] == out)!function(C){
1782
+ exp = function(param){
1783
+ return this instanceof C ? new C(param) : C(param);
1784
+ };
1785
+ exp[PROTOTYPE] = C[PROTOTYPE];
1786
+ }(out);
1787
+ else exp = isProto && typeof out == 'function' ? ctx(Function.call, out) : out;
1788
+ // export
1789
+ exports[key] = exp;
1790
+ if(isProto)(exports[PROTOTYPE] || (exports[PROTOTYPE] = {}))[key] = out;
1791
+ }
1792
+ };
1793
+ // type bitmap
1794
+ $def.F = 1; // forced
1795
+ $def.G = 2; // global
1796
+ $def.S = 4; // static
1797
+ $def.P = 8; // proto
1798
+ $def.B = 16; // bind
1799
+ $def.W = 32; // wrap
1800
+ module.exports = $def;
1801
+
1802
+ /***/ },
1803
+ /* 15 */
1804
+ /***/ function(module, exports) {
1805
+
1806
+ // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
1807
+ var UNDEFINED = 'undefined';
1808
+ var global = module.exports = typeof window != UNDEFINED && window.Math == Math
1809
+ ? window : typeof self != UNDEFINED && self.Math == Math ? self : Function('return this')();
1810
+ if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef
1811
+
1812
+ /***/ },
1813
+ /* 16 */
1814
+ /***/ function(module, exports) {
1815
+
1816
+ var core = module.exports = {};
1817
+ if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef
1818
+
1819
+ /***/ },
1820
+ /* 17 */
1821
+ /***/ function(module, exports) {
1822
+
1823
+ module.exports = function(exec){
1824
+ try {
1825
+ return !!exec();
1826
+ } catch(e){
1827
+ return true;
1828
+ }
1829
+ };
1830
+
1831
+ /***/ },
1832
+ /* 18 */
1833
+ /***/ function(module, exports, __webpack_require__) {
1834
+
1835
+ 'use strict';
1836
+
1837
+ var _classCallCheck = __webpack_require__(1)['default'];
1838
+
1839
+ exports.__esModule = true;
1840
+
1841
+ var _util = __webpack_require__(3);
1842
+
1843
+ var _pipeline = __webpack_require__(19);
1844
+
1845
+ /**
1846
+ * A RouteTransition object manages the pipeline of a
1847
+ * router-view switching process. This is also the object
1848
+ * passed into user route hooks.
1849
+ *
1850
+ * @param {Router} router
1851
+ * @param {Route} to
1852
+ * @param {Route} from
1853
+ */
1854
+
1855
+ var RouteTransition = (function () {
1856
+ function RouteTransition(router, to, from) {
1857
+ _classCallCheck(this, RouteTransition);
1858
+
1859
+ this.router = router;
1860
+ this.to = to;
1861
+ this.from = from;
1862
+ this.next = null;
1863
+ this.aborted = false;
1864
+ this.done = false;
1865
+
1866
+ // start by determine the queues
1867
+
1868
+ // the deactivate queue is an array of router-view
1869
+ // directive instances that need to be deactivated,
1870
+ // deepest first.
1871
+ this.deactivateQueue = router._views;
1872
+
1873
+ // check the default handler of the deepest match
1874
+ var matched = to.matched ? Array.prototype.slice.call(to.matched) : [];
1875
+
1876
+ // the activate queue is an array of route handlers
1877
+ // that need to be activated
1878
+ this.activateQueue = matched.map(function (match) {
1879
+ return match.handler;
1880
+ });
1881
+ }
1882
+
1883
+ /**
1884
+ * Abort current transition and return to previous location.
1885
+ */
1886
+
1887
+ RouteTransition.prototype.abort = function abort() {
1888
+ if (!this.aborted) {
1889
+ this.aborted = true;
1890
+ // if the root path throws an error during validation
1891
+ // on initial load, it gets caught in an infinite loop.
1892
+ var abortingOnLoad = !this.from.path && this.to.path === '/';
1893
+ if (!abortingOnLoad) {
1894
+ this.router.replace(this.from.path || '/');
1895
+ }
1896
+ }
1897
+ };
1898
+
1899
+ /**
1900
+ * Abort current transition and redirect to a new location.
1901
+ *
1902
+ * @param {String} path
1903
+ */
1904
+
1905
+ RouteTransition.prototype.redirect = function redirect(path) {
1906
+ if (!this.aborted) {
1907
+ this.aborted = true;
1908
+ if (typeof path === 'string') {
1909
+ path = _util.mapParams(path, this.to.params, this.to.query);
1910
+ } else {
1911
+ path.params = this.to.params;
1912
+ path.query = this.to.query;
1913
+ }
1914
+ this.router.replace(path);
1915
+ }
1916
+ };
1917
+
1918
+ /**
1919
+ * A router view transition's pipeline can be described as
1920
+ * follows, assuming we are transitioning from an existing
1921
+ * <router-view> chain [Component A, Component B] to a new
1922
+ * chain [Component A, Component C]:
1923
+ *
1924
+ * A A
1925
+ * | => |
1926
+ * B C
1927
+ *
1928
+ * 1. Reusablity phase:
1929
+ * -> canReuse(A, A)
1930
+ * -> canReuse(B, C)
1931
+ * -> determine new queues:
1932
+ * - deactivation: [B]
1933
+ * - activation: [C]
1934
+ *
1935
+ * 2. Validation phase:
1936
+ * -> canDeactivate(B)
1937
+ * -> canActivate(C)
1938
+ *
1939
+ * 3. Activation phase:
1940
+ * -> deactivate(B)
1941
+ * -> activate(C)
1942
+ *
1943
+ * Each of these steps can be asynchronous, and any
1944
+ * step can potentially abort the transition.
1945
+ *
1946
+ * @param {Function} cb
1947
+ */
1948
+
1949
+ RouteTransition.prototype.start = function start(cb) {
1950
+ var transition = this;
1951
+ var daq = this.deactivateQueue;
1952
+ var aq = this.activateQueue;
1953
+ var rdaq = daq.slice().reverse();
1954
+ var reuseQueue = undefined;
1955
+
1956
+ // 1. Reusability phase
1957
+ var i = undefined;
1958
+ for (i = 0; i < rdaq.length; i++) {
1959
+ if (!_pipeline.canReuse(rdaq[i], aq[i], transition)) {
1960
+ break;
1961
+ }
1962
+ }
1963
+ if (i > 0) {
1964
+ reuseQueue = rdaq.slice(0, i);
1965
+ daq = rdaq.slice(i).reverse();
1966
+ aq = aq.slice(i);
1967
+ }
1968
+
1969
+ // 2. Validation phase
1970
+ transition.runQueue(daq, _pipeline.canDeactivate, function () {
1971
+ transition.runQueue(aq, _pipeline.canActivate, function () {
1972
+ transition.runQueue(daq, _pipeline.deactivate, function () {
1973
+ // 3. Activation phase
1974
+
1975
+ // Update router current route
1976
+ transition.router._onTransitionValidated(transition);
1977
+
1978
+ // trigger reuse for all reused views
1979
+ reuseQueue && reuseQueue.forEach(function (view) {
1980
+ _pipeline.reuse(view, transition);
1981
+ });
1982
+
1983
+ // the root of the chain that needs to be replaced
1984
+ // is the top-most non-reusable view.
1985
+ if (daq.length) {
1986
+ var view = daq[daq.length - 1];
1987
+ var depth = reuseQueue ? reuseQueue.length : 0;
1988
+ _pipeline.activate(view, transition, depth, cb);
1989
+ } else {
1990
+ cb();
1991
+ }
1992
+ });
1993
+ });
1994
+ });
1995
+ };
1996
+
1997
+ /**
1998
+ * Asynchronously and sequentially apply a function to a
1999
+ * queue.
2000
+ *
2001
+ * @param {Array} queue
2002
+ * @param {Function} fn
2003
+ * @param {Function} cb
2004
+ */
2005
+
2006
+ RouteTransition.prototype.runQueue = function runQueue(queue, fn, cb) {
2007
+ var transition = this;
2008
+ step(0);
2009
+ function step(index) {
2010
+ if (index >= queue.length) {
2011
+ cb();
2012
+ } else {
2013
+ fn(queue[index], transition, function () {
2014
+ step(index + 1);
2015
+ });
2016
+ }
2017
+ }
2018
+ };
2019
+
2020
+ /**
2021
+ * Call a user provided route transition hook and handle
2022
+ * the response (e.g. if the user returns a promise).
2023
+ *
2024
+ * If the user neither expects an argument nor returns a
2025
+ * promise, the hook is assumed to be synchronous.
2026
+ *
2027
+ * @param {Function} hook
2028
+ * @param {*} [context]
2029
+ * @param {Function} [cb]
2030
+ * @param {Object} [options]
2031
+ * - {Boolean} expectBoolean
2032
+ * - {Boolean} expectData
2033
+ * - {Function} cleanup
2034
+ */
2035
+
2036
+ RouteTransition.prototype.callHook = function callHook(hook, context, cb) {
2037
+ var _ref = arguments.length <= 3 || arguments[3] === undefined ? {} : arguments[3];
2038
+
2039
+ var _ref$expectBoolean = _ref.expectBoolean;
2040
+ var expectBoolean = _ref$expectBoolean === undefined ? false : _ref$expectBoolean;
2041
+ var _ref$expectData = _ref.expectData;
2042
+ var expectData = _ref$expectData === undefined ? false : _ref$expectData;
2043
+ var cleanup = _ref.cleanup;
2044
+
2045
+ var transition = this;
2046
+ var nextCalled = false;
2047
+
2048
+ // abort the transition
2049
+ var abort = function abort() {
2050
+ cleanup && cleanup();
2051
+ transition.abort();
2052
+ };
2053
+
2054
+ // handle errors
2055
+ var onError = function onError(err) {
2056
+ // cleanup indicates an after-activation hook,
2057
+ // so instead of aborting we just let the transition
2058
+ // finish.
2059
+ cleanup ? next() : abort();
2060
+ if (err && !transition.router._suppress) {
2061
+ _util.warn('Uncaught error during transition: ');
2062
+ throw err instanceof Error ? err : new Error(err);
2063
+ }
2064
+ };
2065
+
2066
+ // advance the transition to the next step
2067
+ var next = function next(data) {
2068
+ if (nextCalled) {
2069
+ _util.warn('transition.next() should be called only once.');
2070
+ return;
2071
+ }
2072
+ nextCalled = true;
2073
+ if (transition.aborted) {
2074
+ cleanup && cleanup();
2075
+ return;
2076
+ }
2077
+ cb && cb(data, onError);
2078
+ };
2079
+
2080
+ // expose a clone of the transition object, so that each
2081
+ // hook gets a clean copy and prevent the user from
2082
+ // messing with the internals.
2083
+ var exposed = {
2084
+ to: transition.to,
2085
+ from: transition.from,
2086
+ abort: abort,
2087
+ next: next,
2088
+ redirect: function redirect() {
2089
+ transition.redirect.apply(transition, arguments);
2090
+ }
2091
+ };
2092
+
2093
+ // actually call the hook
2094
+ var res = undefined;
2095
+ try {
2096
+ res = hook.call(context, exposed);
2097
+ } catch (err) {
2098
+ return onError(err);
2099
+ }
2100
+
2101
+ // handle boolean/promise return values
2102
+ var resIsPromise = _util.isPromise(res);
2103
+ if (expectBoolean) {
2104
+ if (typeof res === 'boolean') {
2105
+ res ? next() : abort();
2106
+ } else if (resIsPromise) {
2107
+ res.then(function (ok) {
2108
+ ok ? next() : abort();
2109
+ }, onError);
2110
+ } else if (!hook.length) {
2111
+ next(res);
2112
+ }
2113
+ } else if (resIsPromise) {
2114
+ res.then(next, onError);
2115
+ } else if (expectData && isPlainOjbect(res) || !hook.length) {
2116
+ next(res);
2117
+ }
2118
+ };
2119
+
2120
+ /**
2121
+ * Call a single hook or an array of async hooks in series.
2122
+ *
2123
+ * @param {Array} hooks
2124
+ * @param {*} context
2125
+ * @param {Function} cb
2126
+ * @param {Object} [options]
2127
+ */
2128
+
2129
+ RouteTransition.prototype.callHooks = function callHooks(hooks, context, cb, options) {
2130
+ var _this = this;
2131
+
2132
+ if (Array.isArray(hooks)) {
2133
+ (function () {
2134
+ var res = [];
2135
+ res._needMerge = true;
2136
+ var onError = undefined;
2137
+ _this.runQueue(hooks, function (hook, _, next) {
2138
+ if (!_this.aborted) {
2139
+ _this.callHook(hook, context, function (r, onError) {
2140
+ if (r) res.push(r);
2141
+ onError = onError;
2142
+ next();
2143
+ }, options);
2144
+ }
2145
+ }, function () {
2146
+ cb(res, onError);
2147
+ });
2148
+ })();
2149
+ } else {
2150
+ this.callHook(hooks, context, cb, options);
2151
+ }
2152
+ };
2153
+
2154
+ return RouteTransition;
2155
+ })();
2156
+
2157
+ exports['default'] = RouteTransition;
2158
+
2159
+ function isPlainOjbect(val) {
2160
+ return Object.prototype.toString.call(val) === '[object Object]';
2161
+ }
2162
+ module.exports = exports['default'];
2163
+
2164
+ /***/ },
2165
+ /* 19 */
2166
+ /***/ function(module, exports, __webpack_require__) {
2167
+
2168
+ 'use strict';
2169
+
2170
+ var _Object$keys = __webpack_require__(20)['default'];
2171
+
2172
+ var _Object$create = __webpack_require__(25)['default'];
2173
+
2174
+ exports.__esModule = true;
2175
+ exports.canReuse = canReuse;
2176
+ exports.canDeactivate = canDeactivate;
2177
+ exports.canActivate = canActivate;
2178
+ exports.deactivate = deactivate;
2179
+ exports.activate = activate;
2180
+ exports.reuse = reuse;
2181
+
2182
+ var _util = __webpack_require__(3);
2183
+
2184
+ /**
2185
+ * Determine the reusability of an existing router view.
2186
+ *
2187
+ * @param {Directive} view
2188
+ * @param {Object} handler
2189
+ * @param {Transition} transition
2190
+ */
2191
+
2192
+ function canReuse(view, handler, transition) {
2193
+ var component = view.childVM;
2194
+ if (!component || !handler) {
2195
+ return false;
2196
+ }
2197
+ // important: check view.Component here because it may
2198
+ // have been changed in activate hook
2199
+ if (view.Component !== handler.component) {
2200
+ return false;
2201
+ }
2202
+ var canReuseFn = _util.getRouteConfig(component, 'canReuse');
2203
+ return typeof canReuseFn === 'boolean' ? canReuseFn : canReuseFn ? canReuseFn.call(component, {
2204
+ to: transition.to,
2205
+ from: transition.from
2206
+ }) : true; // defaults to true
2207
+ }
2208
+
2209
+ /**
2210
+ * Check if a component can deactivate.
2211
+ *
2212
+ * @param {Directive} view
2213
+ * @param {Transition} transition
2214
+ * @param {Function} next
2215
+ */
2216
+
2217
+ function canDeactivate(view, transition, next) {
2218
+ var fromComponent = view.childVM;
2219
+ var hook = _util.getRouteConfig(fromComponent, 'canDeactivate');
2220
+ if (!hook) {
2221
+ next();
2222
+ } else {
2223
+ transition.callHook(hook, fromComponent, next, {
2224
+ expectBoolean: true
2225
+ });
2226
+ }
2227
+ }
2228
+
2229
+ /**
2230
+ * Check if a component can activate.
2231
+ *
2232
+ * @param {Object} handler
2233
+ * @param {Transition} transition
2234
+ * @param {Function} next
2235
+ */
2236
+
2237
+ function canActivate(handler, transition, next) {
2238
+ _util.resolveAsyncComponent(handler, function (Component) {
2239
+ // have to check due to async-ness
2240
+ if (transition.aborted) {
2241
+ return;
2242
+ }
2243
+ // determine if this component can be activated
2244
+ var hook = _util.getRouteConfig(Component, 'canActivate');
2245
+ if (!hook) {
2246
+ next();
2247
+ } else {
2248
+ transition.callHook(hook, null, next, {
2249
+ expectBoolean: true
2250
+ });
2251
+ }
2252
+ });
2253
+ }
2254
+
2255
+ /**
2256
+ * Call deactivate hooks for existing router-views.
2257
+ *
2258
+ * @param {Directive} view
2259
+ * @param {Transition} transition
2260
+ * @param {Function} next
2261
+ */
2262
+
2263
+ function deactivate(view, transition, next) {
2264
+ var component = view.childVM;
2265
+ var hook = _util.getRouteConfig(component, 'deactivate');
2266
+ if (!hook) {
2267
+ next();
2268
+ } else {
2269
+ transition.callHooks(hook, component, next);
2270
+ }
2271
+ }
2272
+
2273
+ /**
2274
+ * Activate / switch component for a router-view.
2275
+ *
2276
+ * @param {Directive} view
2277
+ * @param {Transition} transition
2278
+ * @param {Number} depth
2279
+ * @param {Function} [cb]
2280
+ */
2281
+
2282
+ function activate(view, transition, depth, cb, reuse) {
2283
+ var handler = transition.activateQueue[depth];
2284
+ if (!handler) {
2285
+ // fix 1.0.0-alpha.3 compat
2286
+ if (view._bound) {
2287
+ view.setComponent(null);
2288
+ }
2289
+ cb && cb();
2290
+ return;
2291
+ }
2292
+
2293
+ var Component = view.Component = handler.component;
2294
+ var activateHook = _util.getRouteConfig(Component, 'activate');
2295
+ var dataHook = _util.getRouteConfig(Component, 'data');
2296
+ var waitForData = _util.getRouteConfig(Component, 'waitForData');
2297
+
2298
+ view.depth = depth;
2299
+ view.activated = false;
2300
+
2301
+ var component = undefined;
2302
+ var loading = !!(dataHook && !waitForData);
2303
+
2304
+ // "reuse" is a flag passed down when the parent view is
2305
+ // either reused via keep-alive or as a child of a kept-alive view.
2306
+ // of course we can only reuse if the current kept-alive instance
2307
+ // is of the correct type.
2308
+ reuse = reuse && view.childVM && view.childVM.constructor === Component;
2309
+
2310
+ if (reuse) {
2311
+ // just reuse
2312
+ component = view.childVM;
2313
+ component.$loadingRouteData = loading;
2314
+ } else {
2315
+ // unbuild current component. this step also destroys
2316
+ // and removes all nested child views.
2317
+ view.unbuild(true);
2318
+ // handle keep-alive.
2319
+ // if the view has keep-alive, the child vm is not actually
2320
+ // destroyed - its nested views will still be in router's
2321
+ // view list. We need to removed these child views and
2322
+ // cache them on the child vm.
2323
+ if (view.keepAlive) {
2324
+ var views = transition.router._views;
2325
+ var i = views.indexOf(view);
2326
+ if (i > 0) {
2327
+ transition.router._views = views.slice(i);
2328
+ if (view.childVM) {
2329
+ view.childVM._routerViews = views.slice(0, i);
2330
+ }
2331
+ }
2332
+ }
2333
+
2334
+ // build the new component. this will also create the
2335
+ // direct child view of the current one. it will register
2336
+ // itself as view.childView.
2337
+ component = view.build({
2338
+ _meta: {
2339
+ $loadingRouteData: loading
2340
+ }
2341
+ });
2342
+ // handle keep-alive.
2343
+ // when a kept-alive child vm is restored, we need to
2344
+ // add its cached child views into the router's view list,
2345
+ // and also properly update current view's child view.
2346
+ if (view.keepAlive) {
2347
+ component.$loadingRouteData = loading;
2348
+ var cachedViews = component._routerViews;
2349
+ if (cachedViews) {
2350
+ transition.router._views = cachedViews.concat(transition.router._views);
2351
+ view.childView = cachedViews[cachedViews.length - 1];
2352
+ component._routerViews = null;
2353
+ }
2354
+ }
2355
+ }
2356
+
2357
+ // cleanup the component in case the transition is aborted
2358
+ // before the component is ever inserted.
2359
+ var cleanup = function cleanup() {
2360
+ component.$destroy();
2361
+ };
2362
+
2363
+ // actually insert the component and trigger transition
2364
+ var insert = function insert() {
2365
+ if (reuse) {
2366
+ cb && cb();
2367
+ return;
2368
+ }
2369
+ var router = transition.router;
2370
+ if (router._rendered || router._transitionOnLoad) {
2371
+ view.transition(component);
2372
+ } else {
2373
+ // no transition on first render, manual transition
2374
+ /* istanbul ignore if */
2375
+ if (view.setCurrent) {
2376
+ // 0.12 compat
2377
+ view.setCurrent(component);
2378
+ } else {
2379
+ // 1.0
2380
+ view.childVM = component;
2381
+ }
2382
+ component.$before(view.anchor, null, false);
2383
+ }
2384
+ cb && cb();
2385
+ };
2386
+
2387
+ // called after activation hook is resolved
2388
+ var afterActivate = function afterActivate() {
2389
+ view.activated = true;
2390
+ // activate the child view
2391
+ if (view.childView) {
2392
+ activate(view.childView, transition, depth + 1, null, reuse || view.keepAlive);
2393
+ }
2394
+ if (dataHook && waitForData) {
2395
+ // wait until data loaded to insert
2396
+ loadData(component, transition, dataHook, insert, cleanup);
2397
+ } else {
2398
+ // load data and insert at the same time
2399
+ if (dataHook) {
2400
+ loadData(component, transition, dataHook);
2401
+ }
2402
+ insert();
2403
+ }
2404
+ };
2405
+
2406
+ if (activateHook) {
2407
+ transition.callHooks(activateHook, component, afterActivate, {
2408
+ cleanup: cleanup
2409
+ });
2410
+ } else {
2411
+ afterActivate();
2412
+ }
2413
+ }
2414
+
2415
+ /**
2416
+ * Reuse a view, just reload data if necessary.
2417
+ *
2418
+ * @param {Directive} view
2419
+ * @param {Transition} transition
2420
+ */
2421
+
2422
+ function reuse(view, transition) {
2423
+ var component = view.childVM;
2424
+ var dataHook = _util.getRouteConfig(component, 'data');
2425
+ if (dataHook) {
2426
+ loadData(component, transition, dataHook);
2427
+ }
2428
+ }
2429
+
2430
+ /**
2431
+ * Asynchronously load and apply data to component.
2432
+ *
2433
+ * @param {Vue} component
2434
+ * @param {Transition} transition
2435
+ * @param {Function} hook
2436
+ * @param {Function} cb
2437
+ * @param {Function} cleanup
2438
+ */
2439
+
2440
+ function loadData(component, transition, hook, cb, cleanup) {
2441
+ component.$loadingRouteData = true;
2442
+ transition.callHooks(hook, component, function (data, onError) {
2443
+ // merge data from multiple data hooks
2444
+ if (Array.isArray(data) && data._needMerge) {
2445
+ data = data.reduce(function (res, obj) {
2446
+ if (isPlainObject(obj)) {
2447
+ _Object$keys(obj).forEach(function (key) {
2448
+ res[key] = obj[key];
2449
+ });
2450
+ }
2451
+ return res;
2452
+ }, _Object$create(null));
2453
+ }
2454
+ // handle promise sugar syntax
2455
+ var promises = [];
2456
+ if (isPlainObject(data)) {
2457
+ _Object$keys(data).forEach(function (key) {
2458
+ var val = data[key];
2459
+ if (_util.isPromise(val)) {
2460
+ promises.push(val.then(function (resolvedVal) {
2461
+ component.$set(key, resolvedVal);
2462
+ }));
2463
+ } else {
2464
+ component.$set(key, val);
2465
+ }
2466
+ });
2467
+ }
2468
+ if (!promises.length) {
2469
+ component.$loadingRouteData = false;
2470
+ cb && cb();
2471
+ } else {
2472
+ promises[0].constructor.all(promises).then(function (_) {
2473
+ component.$loadingRouteData = false;
2474
+ cb && cb();
2475
+ }, onError);
2476
+ }
2477
+ }, {
2478
+ cleanup: cleanup,
2479
+ expectData: true
2480
+ });
2481
+ }
2482
+
2483
+ function isPlainObject(obj) {
2484
+ return Object.prototype.toString.call(obj) === '[object Object]';
2485
+ }
2486
+
2487
+ /***/ },
2488
+ /* 20 */
2489
+ /***/ function(module, exports, __webpack_require__) {
2490
+
2491
+ module.exports = { "default": __webpack_require__(21), __esModule: true };
2492
+
2493
+ /***/ },
2494
+ /* 21 */
2495
+ /***/ function(module, exports, __webpack_require__) {
2496
+
2497
+ __webpack_require__(22);
2498
+ module.exports = __webpack_require__(16).Object.keys;
2499
+
2500
+ /***/ },
2501
+ /* 22 */
2502
+ /***/ function(module, exports, __webpack_require__) {
2503
+
2504
+ // 19.1.2.14 Object.keys(O)
2505
+ var toObject = __webpack_require__(23);
2506
+
2507
+ __webpack_require__(13)('keys', function($keys){
2508
+ return function keys(it){
2509
+ return $keys(toObject(it));
2510
+ };
2511
+ });
2512
+
2513
+ /***/ },
2514
+ /* 23 */
2515
+ /***/ function(module, exports, __webpack_require__) {
2516
+
2517
+ // 7.1.13 ToObject(argument)
2518
+ var defined = __webpack_require__(24);
2519
+ module.exports = function(it){
2520
+ return Object(defined(it));
2521
+ };
2522
+
2523
+ /***/ },
2524
+ /* 24 */
2525
+ /***/ function(module, exports) {
2526
+
2527
+ // 7.2.1 RequireObjectCoercible(argument)
2528
+ module.exports = function(it){
2529
+ if(it == undefined)throw TypeError("Can't call method on " + it);
2530
+ return it;
2531
+ };
2532
+
2533
+ /***/ },
2534
+ /* 25 */
2535
+ /***/ function(module, exports, __webpack_require__) {
2536
+
2537
+ module.exports = { "default": __webpack_require__(26), __esModule: true };
2538
+
2539
+ /***/ },
2540
+ /* 26 */
2541
+ /***/ function(module, exports, __webpack_require__) {
2542
+
2543
+ var $ = __webpack_require__(27);
2544
+ module.exports = function create(P, D){
2545
+ return $.create(P, D);
2546
+ };
2547
+
2548
+ /***/ },
2549
+ /* 27 */
2550
+ /***/ function(module, exports) {
2551
+
2552
+ var $Object = Object;
2553
+ module.exports = {
2554
+ create: $Object.create,
2555
+ getProto: $Object.getPrototypeOf,
2556
+ isEnum: {}.propertyIsEnumerable,
2557
+ getDesc: $Object.getOwnPropertyDescriptor,
2558
+ setDesc: $Object.defineProperty,
2559
+ setDescs: $Object.defineProperties,
2560
+ getKeys: $Object.keys,
2561
+ getNames: $Object.getOwnPropertyNames,
2562
+ getSymbols: $Object.getOwnPropertySymbols,
2563
+ each: [].forEach
2564
+ };
2565
+
2566
+ /***/ },
2567
+ /* 28 */
2568
+ /***/ function(module, exports, __webpack_require__) {
2569
+
2570
+ 'use strict';
2571
+
2572
+ exports.__esModule = true;
2573
+
2574
+ var _util = __webpack_require__(3);
2575
+
2576
+ var _pipeline = __webpack_require__(19);
2577
+
2578
+ exports['default'] = function (Vue) {
2579
+
2580
+ var _ = Vue.util;
2581
+ var componentDef =
2582
+ // 0.12
2583
+ Vue.directive('_component') ||
2584
+ // 1.0
2585
+ Vue.internalDirectives.component;
2586
+ // <router-view> extends the internal component directive
2587
+ var viewDef = _.extend({}, componentDef);
2588
+
2589
+ // with some overrides
2590
+ _.extend(viewDef, {
2591
+
2592
+ _isRouterView: true,
2593
+
2594
+ bind: function bind() {
2595
+ var route = this.vm.$route;
2596
+ /* istanbul ignore if */
2597
+ if (!route) {
2598
+ _util.warn('<router-view> can only be used inside a ' + 'router-enabled app.');
2599
+ return;
2600
+ }
2601
+ // force dynamic directive so v-component doesn't
2602
+ // attempt to build right now
2603
+ this._isDynamicLiteral = true;
2604
+ // finally, init by delegating to v-component
2605
+ componentDef.bind.call(this);
2606
+
2607
+ // all we need to do here is registering this view
2608
+ // in the router. actual component switching will be
2609
+ // managed by the pipeline.
2610
+ var router = this.router = route.router;
2611
+ router._views.unshift(this);
2612
+
2613
+ // note the views are in reverse order.
2614
+ var parentView = router._views[1];
2615
+ if (parentView) {
2616
+ // register self as a child of the parent view,
2617
+ // instead of activating now. This is so that the
2618
+ // child's activate hook is called after the
2619
+ // parent's has resolved.
2620
+ parentView.childView = this;
2621
+ }
2622
+
2623
+ // handle late-rendered view
2624
+ // two possibilities:
2625
+ // 1. root view rendered after transition has been
2626
+ // validated;
2627
+ // 2. child view rendered after parent view has been
2628
+ // activated.
2629
+ var transition = route.router._currentTransition;
2630
+ if (!parentView && transition.done || parentView && parentView.activated) {
2631
+ var depth = parentView ? parentView.depth + 1 : 0;
2632
+ _pipeline.activate(this, transition, depth);
2633
+ }
2634
+ },
2635
+
2636
+ unbind: function unbind() {
2637
+ this.router._views.$remove(this);
2638
+ componentDef.unbind.call(this);
2639
+ }
2640
+ });
2641
+
2642
+ Vue.elementDirective('router-view', viewDef);
2643
+ };
2644
+
2645
+ module.exports = exports['default'];
2646
+
2647
+ /***/ },
2648
+ /* 29 */
2649
+ /***/ function(module, exports, __webpack_require__) {
2650
+
2651
+ 'use strict';
2652
+
2653
+ exports.__esModule = true;
2654
+
2655
+ var _util = __webpack_require__(3);
2656
+
2657
+ var trailingSlashRE = /\/$/;
2658
+ var regexEscapeRE = /[-.*+?^${}()|[\]\/\\]/g;
2659
+
2660
+ // install v-link, which provides navigation support for
2661
+ // HTML5 history mode
2662
+
2663
+ exports['default'] = function (Vue) {
2664
+
2665
+ var _ = Vue.util;
2666
+
2667
+ Vue.directive('link', {
2668
+
2669
+ bind: function bind() {
2670
+ var _this = this;
2671
+
2672
+ var vm = this.vm;
2673
+ /* istanbul ignore if */
2674
+ if (!vm.$route) {
2675
+ _util.warn('v-link can only be used inside a ' + 'router-enabled app.');
2676
+ return;
2677
+ }
2678
+ var router = vm.$route.router;
2679
+ this.handler = function (e) {
2680
+ // don't redirect with control keys
2681
+ if (e.metaKey || e.ctrlKey || e.shiftKey) return;
2682
+ // don't redirect when preventDefault called
2683
+ if (e.defaultPrevented) return;
2684
+ // don't redirect on right click
2685
+ if (e.button !== 0) return;
2686
+
2687
+ var target = _this.target;
2688
+ var go = function go(target) {
2689
+ e.preventDefault();
2690
+ if (target != null) {
2691
+ router.go(target);
2692
+ }
2693
+ };
2694
+
2695
+ if (_this.el.tagName === 'A' || e.target === _this.el) {
2696
+ // v-link on <a v-link="'path'">
2697
+ go(target);
2698
+ } else {
2699
+ // v-link delegate on <div v-link>
2700
+ var el = e.target;
2701
+ while (el && el.tagName !== 'A' && el !== _this.el) {
2702
+ el = el.parentNode;
2703
+ }
2704
+ if (!el) return;
2705
+ if (el.tagName !== 'A' || !el.href) {
2706
+ // allow not anchor
2707
+ go(target);
2708
+ } else if (sameOrigin(el)) {
2709
+ go({
2710
+ path: el.pathname,
2711
+ replace: target && target.replace,
2712
+ append: target && target.append
2713
+ });
2714
+ }
2715
+ }
2716
+ };
2717
+ this.el.addEventListener('click', this.handler);
2718
+ // manage active link class
2719
+ this.unwatch = vm.$watch('$route.path', _.bind(this.updateClasses, this));
2720
+ },
2721
+
2722
+ update: function update(path) {
2723
+ var router = this.vm.$route.router;
2724
+ var append = undefined;
2725
+ this.target = path;
2726
+ if (_.isObject(path)) {
2727
+ append = path.append;
2728
+ this.exact = path.exact;
2729
+ this.prevActiveClass = this.activeClass;
2730
+ this.activeClass = path.activeClass;
2731
+ }
2732
+ path = this.path = router._stringifyPath(path);
2733
+ this.activeRE = path && !this.exact ? new RegExp('^' + path.replace(/\/$/, '').replace(regexEscapeRE, '\\$&') + '(\\/|$)') : null;
2734
+ this.updateClasses(this.vm.$route.path);
2735
+ var isAbsolute = path.charAt(0) === '/';
2736
+ // do not format non-hash relative paths
2737
+ var href = path && (router.mode === 'hash' || isAbsolute) ? router.history.formatPath(path, append) : path;
2738
+ if (this.el.tagName === 'A') {
2739
+ if (href) {
2740
+ this.el.href = href;
2741
+ } else {
2742
+ this.el.removeAttribute('href');
2743
+ }
2744
+ }
2745
+ },
2746
+
2747
+ updateClasses: function updateClasses(path) {
2748
+ var el = this.el;
2749
+ var dest = this.path;
2750
+ var router = this.vm.$route.router;
2751
+ var activeClass = this.activeClass || router._linkActiveClass;
2752
+ // clear old class
2753
+ if (this.prevActiveClass !== activeClass) {
2754
+ _.removeClass(el, this.prevActiveClass);
2755
+ }
2756
+ // add new class
2757
+ if (this.exact) {
2758
+ if (dest === path ||
2759
+ // also allow additional trailing slash
2760
+ dest.charAt(dest.length - 1) !== '/' && dest === path.replace(trailingSlashRE, '')) {
2761
+ _.addClass(el, activeClass);
2762
+ } else {
2763
+ _.removeClass(el, activeClass);
2764
+ }
2765
+ } else {
2766
+ if (this.activeRE && this.activeRE.test(path)) {
2767
+ _.addClass(el, activeClass);
2768
+ } else {
2769
+ _.removeClass(el, activeClass);
2770
+ }
2771
+ }
2772
+ },
2773
+
2774
+ unbind: function unbind() {
2775
+ this.el.removeEventListener('click', this.handler);
2776
+ this.unwatch && this.unwatch();
2777
+ }
2778
+ });
2779
+
2780
+ function sameOrigin(link) {
2781
+ return link.protocol === location.protocol && link.hostname === location.hostname && link.port === location.port;
2782
+ }
2783
+ };
2784
+
2785
+ module.exports = exports['default'];
2786
+
2787
+ /***/ },
2788
+ /* 30 */
2789
+ /***/ function(module, exports, __webpack_require__) {
2790
+
2791
+ 'use strict';
2792
+
2793
+ var _classCallCheck = __webpack_require__(1)['default'];
2794
+
2795
+ exports.__esModule = true;
2796
+
2797
+ var _util = __webpack_require__(3);
2798
+
2799
+ var AbstractHistory = (function () {
2800
+ function AbstractHistory(_ref) {
2801
+ var onChange = _ref.onChange;
2802
+
2803
+ _classCallCheck(this, AbstractHistory);
2804
+
2805
+ this.onChange = onChange;
2806
+ this.currentPath = '/';
2807
+ }
2808
+
2809
+ AbstractHistory.prototype.start = function start() {
2810
+ this.onChange('/');
2811
+ };
2812
+
2813
+ AbstractHistory.prototype.stop = function stop() {
2814
+ // noop
2815
+ };
2816
+
2817
+ AbstractHistory.prototype.go = function go(path, replace, append) {
2818
+ path = this.currentPath = this.formatPath(path, append);
2819
+ this.onChange(path);
2820
+ };
2821
+
2822
+ AbstractHistory.prototype.formatPath = function formatPath(path, append) {
2823
+ return path.charAt(0) === '/' ? path : _util.resolvePath(this.currentPath, path, append);
2824
+ };
2825
+
2826
+ return AbstractHistory;
2827
+ })();
2828
+
2829
+ exports['default'] = AbstractHistory;
2830
+ module.exports = exports['default'];
2831
+
2832
+ /***/ },
2833
+ /* 31 */
2834
+ /***/ function(module, exports, __webpack_require__) {
2835
+
2836
+ 'use strict';
2837
+
2838
+ var _classCallCheck = __webpack_require__(1)['default'];
2839
+
2840
+ exports.__esModule = true;
2841
+
2842
+ var _util = __webpack_require__(3);
2843
+
2844
+ var HashHistory = (function () {
2845
+ function HashHistory(_ref) {
2846
+ var hashbang = _ref.hashbang;
2847
+ var onChange = _ref.onChange;
2848
+
2849
+ _classCallCheck(this, HashHistory);
2850
+
2851
+ this.hashbang = hashbang;
2852
+ this.onChange = onChange;
2853
+ }
2854
+
2855
+ HashHistory.prototype.start = function start() {
2856
+ var self = this;
2857
+ this.listener = function () {
2858
+ var path = location.hash;
2859
+ var raw = path.replace(/^#!?/, '');
2860
+ // always
2861
+ if (raw.charAt(0) !== '/') {
2862
+ raw = '/' + raw;
2863
+ }
2864
+ var formattedPath = self.formatPath(raw);
2865
+ if (formattedPath !== path) {
2866
+ location.replace(formattedPath);
2867
+ return;
2868
+ }
2869
+ var pathToMatch = decodeURI(path.replace(/^#!?/, '') + location.search);
2870
+ self.onChange(pathToMatch);
2871
+ };
2872
+ window.addEventListener('hashchange', this.listener);
2873
+ this.listener();
2874
+ };
2875
+
2876
+ HashHistory.prototype.stop = function stop() {
2877
+ window.removeEventListener('hashchange', this.listener);
2878
+ };
2879
+
2880
+ HashHistory.prototype.go = function go(path, replace, append) {
2881
+ path = this.formatPath(path, append);
2882
+ if (replace) {
2883
+ location.replace(path);
2884
+ } else {
2885
+ location.hash = path;
2886
+ }
2887
+ };
2888
+
2889
+ HashHistory.prototype.formatPath = function formatPath(path, append) {
2890
+ var isAbsoloute = path.charAt(0) === '/';
2891
+ var prefix = '#' + (this.hashbang ? '!' : '');
2892
+ return isAbsoloute ? prefix + path : prefix + _util.resolvePath(location.hash.replace(/^#!?/, ''), path, append);
2893
+ };
2894
+
2895
+ return HashHistory;
2896
+ })();
2897
+
2898
+ exports['default'] = HashHistory;
2899
+ module.exports = exports['default'];
2900
+
2901
+ /***/ },
2902
+ /* 32 */
2903
+ /***/ function(module, exports, __webpack_require__) {
2904
+
2905
+ 'use strict';
2906
+
2907
+ var _classCallCheck = __webpack_require__(1)['default'];
2908
+
2909
+ exports.__esModule = true;
2910
+
2911
+ var _util = __webpack_require__(3);
2912
+
2913
+ var hashRE = /#.*$/;
2914
+
2915
+ var HTML5History = (function () {
2916
+ function HTML5History(_ref) {
2917
+ var root = _ref.root;
2918
+ var onChange = _ref.onChange;
2919
+
2920
+ _classCallCheck(this, HTML5History);
2921
+
2922
+ if (root) {
2923
+ // make sure there's the starting slash
2924
+ if (root.charAt(0) !== '/') {
2925
+ root = '/' + root;
2926
+ }
2927
+ // remove trailing slash
2928
+ this.root = root.replace(/\/$/, '');
2929
+ this.rootRE = new RegExp('^\\' + this.root);
2930
+ } else {
2931
+ this.root = null;
2932
+ }
2933
+ this.onChange = onChange;
2934
+ // check base tag
2935
+ var baseEl = document.querySelector('base');
2936
+ this.base = baseEl && baseEl.getAttribute('href');
2937
+ }
2938
+
2939
+ HTML5History.prototype.start = function start() {
2940
+ var _this = this;
2941
+
2942
+ this.listener = function (e) {
2943
+ var url = decodeURI(location.pathname + location.search);
2944
+ if (_this.root) {
2945
+ url = url.replace(_this.rootRE, '');
2946
+ }
2947
+ _this.onChange(url, e && e.state, location.hash);
2948
+ };
2949
+ window.addEventListener('popstate', this.listener);
2950
+ this.listener();
2951
+ };
2952
+
2953
+ HTML5History.prototype.stop = function stop() {
2954
+ window.removeEventListener('popstate', this.listener);
2955
+ };
2956
+
2957
+ HTML5History.prototype.go = function go(path, replace, append) {
2958
+ var url = this.formatPath(path, append);
2959
+ if (replace) {
2960
+ history.replaceState({}, '', url);
2961
+ } else {
2962
+ // record scroll position by replacing current state
2963
+ history.replaceState({
2964
+ pos: {
2965
+ x: window.pageXOffset,
2966
+ y: window.pageYOffset
2967
+ }
2968
+ }, '');
2969
+ // then push new state
2970
+ history.pushState({}, '', url);
2971
+ }
2972
+ var hashMatch = path.match(hashRE);
2973
+ var hash = hashMatch && hashMatch[0];
2974
+ path = url
2975
+ // strip hash so it doesn't mess up params
2976
+ .replace(hashRE, '')
2977
+ // remove root before matching
2978
+ .replace(this.rootRE, '');
2979
+ this.onChange(path, null, hash);
2980
+ };
2981
+
2982
+ HTML5History.prototype.formatPath = function formatPath(path, append) {
2983
+ return path.charAt(0) === '/'
2984
+ // absolute path
2985
+ ? this.root ? this.root + '/' + path.replace(/^\//, '') : path : _util.resolvePath(this.base || location.pathname, path, append);
2986
+ };
2987
+
2988
+ return HTML5History;
2989
+ })();
2990
+
2991
+ exports['default'] = HTML5History;
2992
+ module.exports = exports['default'];
2993
+
2994
+ /***/ }
2995
+ /******/ ])
2996
+ });
2997
+ ;