vuejs 1.0.31 → 1.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0fb17c28a2b5a3b6f2b885c3e2af74027a8a7455
4
- data.tar.gz: f1199247c7c103f4747d1bf9eaf2c23554209767
3
+ metadata.gz: fe041e1a6b68a6696d909a9fca031365eb253e3e
4
+ data.tar.gz: 6931c0cc73878f29662cbc1c0d4cafe5352740b2
5
5
  SHA512:
6
- metadata.gz: 2d75e002debdd0e3af5ba963682793b78d3b47106c74de3bd34f81dd751ef7dc0568562de13edb919d44066371f426f99f8de0ba9fbb4042df0a71c1eda651c8
7
- data.tar.gz: e360efdcbb5ca9dc2cc2fa22c3f62245f3f87d9233f1c33902c4e62a248f65ea4704f92a0e7c276642fed3ec38df663aa5c9617cd2f9841aff5f27676bcc2999
6
+ metadata.gz: 6a561d056defcc05587efcbd7584745ad2e30be5b18faf38ac2b9ccc1ae765457f14f22b6affc8a78c8cd8b7b15a68f890517287dcbfa7376d7b3b84c202ed32
7
+ data.tar.gz: 5433cbe1231f2add28c136fa2bb3a3f449250c3004b1b42cc8e47f199c22e53a6eddad0e1029771b90e08a9f4d3a28433b3c56018e3a8be3c2dc29529c2aa01d
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  gem `vuejs` ships with the 1.x & 2.x latest [Vue.js + vue-router + vue-resource + vue-validator + vuex](http://vuejs.org/) and integrate with Rails' asset pipeline. Vue.js is created by Evan You and the vuejs team.
6
6
 
7
- The current 2.x version is `Vue.js` (v2.1.0) + `vue-router` (v2.0.0) + `vue-validator` (v2.1.3) + `vuex` (v2.0.0).
7
+ The current 2.x version is `Vue.js` (v2.1.4) + `vue-router` (v2.1.1) + `vue-validator` (v2.1.3) + `vuex` (v2.0.0).
8
8
  > Note that Vue 2.x is not compatible with 1.x. vue-router 2.0 only works with Vue 2.x`
9
9
 
10
10
  The current 1.x version is `Vue.js` (v1.0.28) + `vue-router` (v0.7.13) + `vue-resource` (v1.0.3)
@@ -0,0 +1,7 @@
1
+ module SyntaxHelper
2
+ def info
3
+
4
+ #return a block that gives you the version
5
+ return "<div>#{Rails.version}</div>"
6
+ end
7
+ end
@@ -1,6 +1,33 @@
1
1
  require "vuejs/version"
2
+ require "thor"
2
3
 
3
4
  module Vuejs
4
- class Engine < ::Rails::Engine
5
+ class Engine < Rails::Engine
5
6
  end
7
+
8
+ class Base < Thor
9
+ check_unknown_options!
10
+ package_name 'vuejs'
11
+ default_task :info
12
+
13
+ desc :info, ""
14
+ def info
15
+ puts "version: "
16
+ end
17
+ end
18
+
19
+
20
+
21
+
22
+
23
+ # class Base < Thor
24
+ # check_unknown_options!
25
+ # package_name 'vuejs'
26
+ # default_task :info
27
+ #
28
+ # desc :info
29
+ # def info
30
+ # puts "version: "
31
+ # end
32
+ # end
6
33
  end
@@ -1,3 +1,3 @@
1
1
  module Vuejs
2
- VERSION = "1.0.31"
2
+ VERSION = "1.0.33"
3
3
  end
@@ -1521,4 +1521,4 @@ if (typeof window !== 'undefined' && window.Vue) {
1521
1521
 
1522
1522
  return plugin;
1523
1523
 
1524
- })));
1524
+ })));
@@ -1,13 +1,9 @@
1
1
  /**
2
- * vue-router v2.0.0
3
- * (c) 2016 Evan You
4
- * @license MIT
5
- */
6
- (function (global, factory) {
7
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
8
- typeof define === 'function' && define.amd ? define(factory) :
9
- (global.VueRouter = factory());
10
- }(this, (function () { 'use strict';
2
+ * vue-router v2.1.1
3
+ * (c) 2016 Evan You
4
+ * @license MIT
5
+ */
6
+ 'use strict';
11
7
 
12
8
  var View = {
13
9
  name: 'router-view',
@@ -47,13 +43,23 @@ var View = {
47
43
  return h()
48
44
  }
49
45
 
46
+ var name = props.name
50
47
  var component = inactive
51
- ? cache[props.name]
52
- : (cache[props.name] = matched.components[props.name])
48
+ ? cache[name]
49
+ : (cache[name] = matched.components[name])
53
50
 
54
51
  if (!inactive) {
55
- (data.hook || (data.hook = {})).init = function (vnode) {
56
- matched.instances[props.name] = vnode.child
52
+ var hooks = data.hook || (data.hook = {})
53
+ hooks.init = function (vnode) {
54
+ matched.instances[name] = vnode.child
55
+ }
56
+ hooks.prepatch = function (oldVnode, vnode) {
57
+ matched.instances[name] = vnode.child
58
+ }
59
+ hooks.destroy = function (vnode) {
60
+ if (matched.instances[name] === vnode.child) {
61
+ matched.instances[name] = undefined
62
+ }
57
63
  }
58
64
  }
59
65
 
@@ -63,78 +69,6 @@ var View = {
63
69
 
64
70
  /* */
65
71
 
66
- function resolvePath (
67
- relative,
68
- base,
69
- append
70
- ) {
71
- if (relative.charAt(0) === '/') {
72
- return relative
73
- }
74
-
75
- if (relative.charAt(0) === '?' || relative.charAt(0) === '#') {
76
- return base + relative
77
- }
78
-
79
- var stack = base.split('/')
80
-
81
- // remove trailing segment if:
82
- // - not appending
83
- // - appending to trailing slash (last segment is empty)
84
- if (!append || !stack[stack.length - 1]) {
85
- stack.pop()
86
- }
87
-
88
- // resolve relative path
89
- var segments = relative.replace(/^\//, '').split('/')
90
- for (var i = 0; i < segments.length; i++) {
91
- var segment = segments[i]
92
- if (segment === '.') {
93
- continue
94
- } else if (segment === '..') {
95
- stack.pop()
96
- } else {
97
- stack.push(segment)
98
- }
99
- }
100
-
101
- // ensure leading slash
102
- if (stack[0] !== '') {
103
- stack.unshift('')
104
- }
105
-
106
- return stack.join('/')
107
- }
108
-
109
- function parsePath (path) {
110
- var hash = ''
111
- var query = ''
112
-
113
- var hashIndex = path.indexOf('#')
114
- if (hashIndex >= 0) {
115
- hash = path.slice(hashIndex)
116
- path = path.slice(0, hashIndex)
117
- }
118
-
119
- var queryIndex = path.indexOf('?')
120
- if (queryIndex >= 0) {
121
- query = path.slice(queryIndex + 1)
122
- path = path.slice(0, queryIndex)
123
- }
124
-
125
- return {
126
- path: path,
127
- query: query,
128
- hash: hash
129
- }
130
- }
131
-
132
- function cleanPath (path) {
133
- return path.replace(/\/\//g, '/')
134
- }
135
-
136
- /* */
137
-
138
72
  function assert (condition, message) {
139
73
  if (!condition) {
140
74
  throw new Error(("[vue-router] " + message))
@@ -163,7 +97,7 @@ function resolveQuery (
163
97
  try {
164
98
  parsedQuery = parseQuery(query)
165
99
  } catch (e) {
166
- warn(false, e.message)
100
+ process.env.NODE_ENV !== 'production' && warn(false, e.message)
167
101
  parsedQuery = {}
168
102
  }
169
103
  for (var key in extraQuery) {
@@ -176,7 +110,7 @@ function resolveQuery (
176
110
  }
177
111
 
178
112
  function parseQuery (query) {
179
- var res = Object.create(null)
113
+ var res = {}
180
114
 
181
115
  query = query.trim().replace(/^(\?|#|&)/, '')
182
116
 
@@ -204,7 +138,7 @@ function parseQuery (query) {
204
138
  }
205
139
 
206
140
  function stringifyQuery (obj) {
207
- var res = obj ? Object.keys(obj).sort().map(function (key) {
141
+ var res = obj ? Object.keys(obj).map(function (key) {
208
142
  var val = obj[key]
209
143
 
210
144
  if (val === undefined) {
@@ -318,7 +252,7 @@ function isObjectEqual (a, b) {
318
252
 
319
253
  function isIncludedRoute (current, target) {
320
254
  return (
321
- current.path.indexOf(target.path) === 0 &&
255
+ current.path.indexOf(target.path.replace(/\/$/, '')) === 0 &&
322
256
  (!target.hash || current.hash === target.hash) &&
323
257
  queryIncludes(current.query, target.query)
324
258
  )
@@ -335,37 +269,6 @@ function queryIncludes (current, target) {
335
269
 
336
270
  /* */
337
271
 
338
- function normalizeLocation (
339
- raw,
340
- current,
341
- append
342
- ) {
343
- var next = typeof raw === 'string' ? { path: raw } : raw
344
- if (next.name || next._normalized) {
345
- return next
346
- }
347
-
348
- var parsedPath = parsePath(next.path || '')
349
- var basePath = (current && current.path) || '/'
350
- var path = parsedPath.path
351
- ? resolvePath(parsedPath.path, basePath, append)
352
- : (current && current.path) || '/'
353
- var query = resolveQuery(parsedPath.query, next.query)
354
- var hash = next.hash || parsedPath.hash
355
- if (hash && hash.charAt(0) !== '#') {
356
- hash = "#" + hash
357
- }
358
-
359
- return {
360
- _normalized: true,
361
- path: path,
362
- query: query,
363
- hash: hash
364
- }
365
- }
366
-
367
- /* */
368
-
369
272
  // work around weird flow bug
370
273
  var toTypes = [String, Object]
371
274
 
@@ -383,36 +286,45 @@ var Link = {
383
286
  exact: Boolean,
384
287
  append: Boolean,
385
288
  replace: Boolean,
386
- activeClass: String
289
+ activeClass: String,
290
+ event: {
291
+ type: [String, Array],
292
+ default: 'click'
293
+ }
387
294
  },
388
295
  render: function render (h) {
389
296
  var this$1 = this;
390
297
 
391
298
  var router = this.$router
392
299
  var current = this.$route
393
- var to = normalizeLocation(this.to, current, this.append)
394
- var resolved = router.match(to)
395
- var fullPath = resolved.redirectedFrom || resolved.fullPath
396
- var base = router.history.base
397
- var href = base ? cleanPath(base + fullPath) : fullPath
300
+ var ref = router.resolve(this.to, current, this.append);
301
+ var normalizedTo = ref.normalizedTo;
302
+ var resolved = ref.resolved;
303
+ var href = ref.href;
398
304
  var classes = {}
399
305
  var activeClass = this.activeClass || router.options.linkActiveClass || 'router-link-active'
400
- var compareTarget = to.path ? createRoute(null, to) : resolved
306
+ var compareTarget = normalizedTo.path ? createRoute(null, normalizedTo) : resolved
401
307
  classes[activeClass] = this.exact
402
308
  ? isSameRoute(current, compareTarget)
403
309
  : isIncludedRoute(current, compareTarget)
404
310
 
405
- var on = {
406
- click: function (e) {
407
- e.preventDefault()
311
+ var handler = function (e) {
312
+ if (guardEvent(e)) {
408
313
  if (this$1.replace) {
409
- router.replace(to)
314
+ router.replace(normalizedTo)
410
315
  } else {
411
- router.push(to)
316
+ router.push(normalizedTo)
412
317
  }
413
318
  }
414
319
  }
415
320
 
321
+ var on = { click: guardEvent }
322
+ if (Array.isArray(this.event)) {
323
+ this.event.forEach(function (e) { on[e] = handler })
324
+ } else {
325
+ on[this.event] = handler
326
+ }
327
+
416
328
  var data = {
417
329
  class: classes
418
330
  }
@@ -424,10 +336,16 @@ var Link = {
424
336
  // find the first <a> child and apply listener and href
425
337
  var a = findAnchor(this.$slots.default)
426
338
  if (a) {
427
- var aData = a.data || (a.data = {})
339
+ // in case the <a> is a static node
340
+ a.isStatic = false
341
+ var extend = _Vue.util.extend
342
+ var aData = a.data = extend({}, a.data)
428
343
  aData.on = on
429
- var aAttrs = aData.attrs || (aData.attrs = {})
344
+ var aAttrs = a.data.attrs = extend({}, a.data.attrs)
430
345
  aAttrs.href = href
346
+ } else {
347
+ // doesn't have <a> child, apply listener to self
348
+ data.on = on
431
349
  }
432
350
  }
433
351
 
@@ -435,6 +353,25 @@ var Link = {
435
353
  }
436
354
  }
437
355
 
356
+ function guardEvent (e) {
357
+ // don't redirect with control keys
358
+ /* istanbul ignore if */
359
+ if (e.metaKey || e.ctrlKey || e.shiftKey) { return }
360
+ // don't redirect when preventDefault called
361
+ /* istanbul ignore if */
362
+ if (e.defaultPrevented) { return }
363
+ // don't redirect on right click
364
+ /* istanbul ignore if */
365
+ if (e.button !== 0) { return }
366
+ // don't redirect if `target="_blank"`
367
+ /* istanbul ignore if */
368
+ var target = e.target.getAttribute('target')
369
+ if (/\b_blank\b/i.test(target)) { return }
370
+
371
+ e.preventDefault()
372
+ return true
373
+ }
374
+
438
375
  function findAnchor (children) {
439
376
  if (children) {
440
377
  var child
@@ -450,10 +387,14 @@ function findAnchor (children) {
450
387
  }
451
388
  }
452
389
 
390
+ var _Vue
391
+
453
392
  function install (Vue) {
454
393
  if (install.installed) { return }
455
394
  install.installed = true
456
395
 
396
+ _Vue = Vue
397
+
457
398
  Object.defineProperty(Vue.prototype, '$router', {
458
399
  get: function get () { return this.$root._router }
459
400
  })
@@ -474,6 +415,172 @@ function install (Vue) {
474
415
 
475
416
  Vue.component('router-view', View)
476
417
  Vue.component('router-link', Link)
418
+
419
+ var strats = Vue.config.optionMergeStrategies
420
+ // use the same hook merging strategy for route hooks
421
+ strats.beforeRouteEnter = strats.beforeRouteLeave = strats.created
422
+ }
423
+
424
+ /* */
425
+
426
+ function resolvePath (
427
+ relative,
428
+ base,
429
+ append
430
+ ) {
431
+ if (relative.charAt(0) === '/') {
432
+ return relative
433
+ }
434
+
435
+ if (relative.charAt(0) === '?' || relative.charAt(0) === '#') {
436
+ return base + relative
437
+ }
438
+
439
+ var stack = base.split('/')
440
+
441
+ // remove trailing segment if:
442
+ // - not appending
443
+ // - appending to trailing slash (last segment is empty)
444
+ if (!append || !stack[stack.length - 1]) {
445
+ stack.pop()
446
+ }
447
+
448
+ // resolve relative path
449
+ var segments = relative.replace(/^\//, '').split('/')
450
+ for (var i = 0; i < segments.length; i++) {
451
+ var segment = segments[i]
452
+ if (segment === '.') {
453
+ continue
454
+ } else if (segment === '..') {
455
+ stack.pop()
456
+ } else {
457
+ stack.push(segment)
458
+ }
459
+ }
460
+
461
+ // ensure leading slash
462
+ if (stack[0] !== '') {
463
+ stack.unshift('')
464
+ }
465
+
466
+ return stack.join('/')
467
+ }
468
+
469
+ function parsePath (path) {
470
+ var hash = ''
471
+ var query = ''
472
+
473
+ var hashIndex = path.indexOf('#')
474
+ if (hashIndex >= 0) {
475
+ hash = path.slice(hashIndex)
476
+ path = path.slice(0, hashIndex)
477
+ }
478
+
479
+ var queryIndex = path.indexOf('?')
480
+ if (queryIndex >= 0) {
481
+ query = path.slice(queryIndex + 1)
482
+ path = path.slice(0, queryIndex)
483
+ }
484
+
485
+ return {
486
+ path: path,
487
+ query: query,
488
+ hash: hash
489
+ }
490
+ }
491
+
492
+ function cleanPath (path) {
493
+ return path.replace(/\/\//g, '/')
494
+ }
495
+
496
+ /* */
497
+
498
+ function createRouteMap (routes) {
499
+ var pathMap = Object.create(null)
500
+ var nameMap = Object.create(null)
501
+
502
+ routes.forEach(function (route) {
503
+ addRouteRecord(pathMap, nameMap, route)
504
+ })
505
+
506
+ return {
507
+ pathMap: pathMap,
508
+ nameMap: nameMap
509
+ }
510
+ }
511
+
512
+ function addRouteRecord (
513
+ pathMap,
514
+ nameMap,
515
+ route,
516
+ parent,
517
+ matchAs
518
+ ) {
519
+ var path = route.path;
520
+ var name = route.name;
521
+ if (process.env.NODE_ENV !== 'production') {
522
+ assert(path != null, "\"path\" is required in a route configuration.")
523
+ assert(
524
+ typeof route.component !== 'string',
525
+ "route config \"component\" for path: " + (String(path || name)) + " cannot be a " +
526
+ "string id. Use an actual component instead."
527
+ )
528
+ }
529
+
530
+ var record = {
531
+ path: normalizePath(path, parent),
532
+ components: route.components || { default: route.component },
533
+ instances: {},
534
+ name: name,
535
+ parent: parent,
536
+ matchAs: matchAs,
537
+ redirect: route.redirect,
538
+ beforeEnter: route.beforeEnter,
539
+ meta: route.meta || {}
540
+ }
541
+
542
+ if (route.children) {
543
+ // Warn if route is named and has a default child route.
544
+ // If users navigate to this route by name, the default child will
545
+ // not be rendered (GH Issue #629)
546
+ if (process.env.NODE_ENV !== 'production') {
547
+ if (route.name && route.children.some(function (child) { return /^\/?$/.test(child.path); })) {
548
+ warn(false, ("Named Route '" + (route.name) + "' has a default child route.\n When navigating to this named route (:to=\"{name: '" + (route.name) + "'\"), the default child route will not be rendered.\n Remove the name from this route and use the name of the default child route for named links instead.")
549
+ )
550
+ }
551
+ }
552
+ route.children.forEach(function (child) {
553
+ addRouteRecord(pathMap, nameMap, child, record)
554
+ })
555
+ }
556
+
557
+ if (route.alias !== undefined) {
558
+ if (Array.isArray(route.alias)) {
559
+ route.alias.forEach(function (alias) {
560
+ addRouteRecord(pathMap, nameMap, { path: alias }, parent, record.path)
561
+ })
562
+ } else {
563
+ addRouteRecord(pathMap, nameMap, { path: route.alias }, parent, record.path)
564
+ }
565
+ }
566
+
567
+ if (!pathMap[record.path]) {
568
+ pathMap[record.path] = record
569
+ }
570
+ if (name) {
571
+ if (!nameMap[name]) {
572
+ nameMap[name] = record
573
+ } else if (process.env.NODE_ENV !== 'production') {
574
+ warn(false, ("Duplicate named routes definition: { name: \"" + name + "\", path: \"" + (record.path) + "\" }"))
575
+ }
576
+ }
577
+ }
578
+
579
+ function normalizePath (path, parent) {
580
+ path = path.replace(/\/$/, '')
581
+ if (path[0] === '/') { return path }
582
+ if (parent == null) { return path }
583
+ return cleanPath(((parent.path) + "/" + path))
477
584
  }
478
585
 
479
586
  var __moduleExports = Array.isArray || function (arr) {
@@ -512,14 +619,16 @@ var PATH_REGEXP = new RegExp([
512
619
  /**
513
620
  * Parse a string for the raw tokens.
514
621
  *
515
- * @param {string} str
622
+ * @param {string} str
623
+ * @param {Object=} options
516
624
  * @return {!Array}
517
625
  */
518
- function parse (str) {
626
+ function parse (str, options) {
519
627
  var tokens = []
520
628
  var key = 0
521
629
  var index = 0
522
630
  var path = ''
631
+ var defaultDelimiter = options && options.delimiter || '/'
523
632
  var res
524
633
 
525
634
  while ((res = PATH_REGEXP.exec(str)) != null) {
@@ -552,8 +661,8 @@ function parse (str) {
552
661
  var partial = prefix != null && next != null && next !== prefix
553
662
  var repeat = modifier === '+' || modifier === '*'
554
663
  var optional = modifier === '?' || modifier === '*'
555
- var delimiter = res[2] || '/'
556
- var pattern = capture || group || (asterisk ? '.*' : '[^' + delimiter + ']+?')
664
+ var delimiter = res[2] || defaultDelimiter
665
+ var pattern = capture || group
557
666
 
558
667
  tokens.push({
559
668
  name: name || key++,
@@ -563,7 +672,7 @@ function parse (str) {
563
672
  repeat: repeat,
564
673
  partial: partial,
565
674
  asterisk: !!asterisk,
566
- pattern: escapeGroup(pattern)
675
+ pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')
567
676
  })
568
677
  }
569
678
 
@@ -584,10 +693,11 @@ function parse (str) {
584
693
  * Compile a string to a template function for the path.
585
694
  *
586
695
  * @param {string} str
696
+ * @param {Object=} options
587
697
  * @return {!function(Object=, Object=)}
588
698
  */
589
- function compile (str) {
590
- return tokensToFunction(parse(str))
699
+ function compile (str, options) {
700
+ return tokensToFunction(parse(str, options))
591
701
  }
592
702
 
593
703
  /**
@@ -798,34 +908,28 @@ function arrayToRegexp (path, keys, options) {
798
908
  * @return {!RegExp}
799
909
  */
800
910
  function stringToRegexp (path, keys, options) {
801
- var tokens = parse(path)
802
- var re = tokensToRegExp(tokens, options)
803
-
804
- // Attach keys back to the regexp.
805
- for (var i = 0; i < tokens.length; i++) {
806
- if (typeof tokens[i] !== 'string') {
807
- keys.push(tokens[i])
808
- }
809
- }
810
-
811
- return attachKeys(re, keys)
911
+ return tokensToRegExp(parse(path, options), keys, options)
812
912
  }
813
913
 
814
914
  /**
815
915
  * Expose a function for taking tokens and returning a RegExp.
816
916
  *
817
- * @param {!Array} tokens
818
- * @param {Object=} options
917
+ * @param {!Array} tokens
918
+ * @param {(Array|Object)=} keys
919
+ * @param {Object=} options
819
920
  * @return {!RegExp}
820
921
  */
821
- function tokensToRegExp (tokens, options) {
922
+ function tokensToRegExp (tokens, keys, options) {
923
+ if (!isarray(keys)) {
924
+ options = /** @type {!Object} */ (keys || options)
925
+ keys = []
926
+ }
927
+
822
928
  options = options || {}
823
929
 
824
930
  var strict = options.strict
825
931
  var end = options.end !== false
826
932
  var route = ''
827
- var lastToken = tokens[tokens.length - 1]
828
- var endsWithSlash = typeof lastToken === 'string' && /\/$/.test(lastToken)
829
933
 
830
934
  // Iterate over the tokens and create our regexp string.
831
935
  for (var i = 0; i < tokens.length; i++) {
@@ -837,6 +941,8 @@ function tokensToRegExp (tokens, options) {
837
941
  var prefix = escapeString(token.prefix)
838
942
  var capture = '(?:' + token.pattern + ')'
839
943
 
944
+ keys.push(token)
945
+
840
946
  if (token.repeat) {
841
947
  capture += '(?:' + prefix + capture + ')*'
842
948
  }
@@ -855,12 +961,15 @@ function tokensToRegExp (tokens, options) {
855
961
  }
856
962
  }
857
963
 
964
+ var delimiter = escapeString(options.delimiter || '/')
965
+ var endsWithDelimiter = route.slice(-delimiter.length) === delimiter
966
+
858
967
  // In non-strict mode we allow a slash at the end of match. If the path to
859
968
  // match already ends with a slash, we remove it for consistency. The slash
860
969
  // is valid at the end of a path match, not in the middle. This is important
861
970
  // in non-ending mode, where "/test/" shouldn't match "/test//route".
862
971
  if (!strict) {
863
- route = (endsWithSlash ? route.slice(0, -2) : route) + '(?:\\/(?=$))?'
972
+ route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?'
864
973
  }
865
974
 
866
975
  if (end) {
@@ -868,10 +977,10 @@ function tokensToRegExp (tokens, options) {
868
977
  } else {
869
978
  // In non-ending mode, we need the capturing groups to match as much as
870
979
  // possible by using a positive lookahead to the end or next path segment.
871
- route += strict && endsWithSlash ? '' : '(?=\\/|$)'
980
+ route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)'
872
981
  }
873
982
 
874
- return new RegExp('^' + route, flags(options))
983
+ return attachKeys(new RegExp('^' + route, flags(options)), keys)
875
984
  }
876
985
 
877
986
  /**
@@ -887,15 +996,13 @@ function tokensToRegExp (tokens, options) {
887
996
  * @return {!RegExp}
888
997
  */
889
998
  function pathToRegexp (path, keys, options) {
890
- keys = keys || []
891
-
892
999
  if (!isarray(keys)) {
893
- options = /** @type {!Object} */ (keys)
1000
+ options = /** @type {!Object} */ (keys || options)
894
1001
  keys = []
895
- } else if (!options) {
896
- options = {}
897
1002
  }
898
1003
 
1004
+ options = options || {}
1005
+
899
1006
  if (path instanceof RegExp) {
900
1007
  return regexpToRegexp(path, /** @type {!Array} */ (keys))
901
1008
  }
@@ -914,80 +1021,102 @@ index.tokensToRegExp = tokensToRegExp_1;
914
1021
 
915
1022
  /* */
916
1023
 
917
- function createRouteMap (routes) {
918
- var pathMap = Object.create(null)
919
- var nameMap = Object.create(null)
1024
+ var regexpCache = Object.create(null)
920
1025
 
921
- routes.forEach(function (route) {
922
- addRouteRecord(pathMap, nameMap, route)
923
- })
1026
+ function getRouteRegex (path) {
1027
+ var hit = regexpCache[path]
1028
+ var keys, regexp
924
1029
 
925
- return {
926
- pathMap: pathMap,
927
- nameMap: nameMap
1030
+ if (hit) {
1031
+ keys = hit.keys
1032
+ regexp = hit.regexp
1033
+ } else {
1034
+ keys = []
1035
+ regexp = index(path, keys)
1036
+ regexpCache[path] = { keys: keys, regexp: regexp }
928
1037
  }
1038
+
1039
+ return { keys: keys, regexp: regexp }
929
1040
  }
930
1041
 
931
- function addRouteRecord (
932
- pathMap,
933
- nameMap,
934
- route,
935
- parent,
936
- matchAs
937
- ) {
938
- var path = route.path;
939
- var name = route.name;
940
- assert(path != null, "\"path\" is required in a route configuration.")
1042
+ var regexpCompileCache = Object.create(null)
941
1043
 
942
- var record = {
943
- path: normalizePath(path, parent),
944
- components: route.components || { default: route.component },
945
- instances: {},
946
- name: name,
947
- parent: parent,
948
- matchAs: matchAs,
949
- redirect: route.redirect,
950
- beforeEnter: route.beforeEnter,
951
- meta: route.meta || {}
1044
+ function fillParams (
1045
+ path,
1046
+ params,
1047
+ routeMsg
1048
+ ) {
1049
+ try {
1050
+ var filler =
1051
+ regexpCompileCache[path] ||
1052
+ (regexpCompileCache[path] = index.compile(path))
1053
+ return filler(params || {}, { pretty: true })
1054
+ } catch (e) {
1055
+ if (process.env.NODE_ENV !== 'production') {
1056
+ warn(false, ("missing param for " + routeMsg + ": " + (e.message)))
1057
+ }
1058
+ return ''
952
1059
  }
1060
+ }
953
1061
 
954
- if (route.children) {
955
- // Warn if route is named and has a default child route.
956
- // If users navigate to this route by name, the default child will
957
- // not be rendered (GH Issue #629)
958
- if ("production" !== 'production') {}
959
- route.children.forEach(function (child) {
960
- addRouteRecord(pathMap, nameMap, child, record)
961
- })
1062
+ /* */
1063
+
1064
+ function normalizeLocation (
1065
+ raw,
1066
+ current,
1067
+ append
1068
+ ) {
1069
+ var next = typeof raw === 'string' ? { path: raw } : raw
1070
+ // named target
1071
+ if (next.name || next._normalized) {
1072
+ return next
962
1073
  }
963
1074
 
964
- if (route.alias) {
965
- if (Array.isArray(route.alias)) {
966
- route.alias.forEach(function (alias) {
967
- addRouteRecord(pathMap, nameMap, { path: alias }, parent, record.path)
968
- })
969
- } else {
970
- addRouteRecord(pathMap, nameMap, { path: route.alias }, parent, record.path)
1075
+ // relative params
1076
+ if (!next.path && next.params && current) {
1077
+ next = assign({}, next)
1078
+ next._normalized = true
1079
+ var params = assign(assign({}, current.params), next.params)
1080
+ if (current.name) {
1081
+ next.name = current.name
1082
+ next.params = params
1083
+ } else if (current.matched) {
1084
+ var rawPath = current.matched[current.matched.length - 1].path
1085
+ next.path = fillParams(rawPath, params, ("path " + (current.path)))
1086
+ } else if (process.env.NODE_ENV !== 'production') {
1087
+ warn(false, "relative params navigation requires a current route.")
971
1088
  }
1089
+ return next
972
1090
  }
973
1091
 
974
- pathMap[record.path] = record
975
- if (name) { nameMap[name] = record }
1092
+ var parsedPath = parsePath(next.path || '')
1093
+ var basePath = (current && current.path) || '/'
1094
+ var path = parsedPath.path
1095
+ ? resolvePath(parsedPath.path, basePath, append || next.append)
1096
+ : (current && current.path) || '/'
1097
+ var query = resolveQuery(parsedPath.query, next.query)
1098
+ var hash = next.hash || parsedPath.hash
1099
+ if (hash && hash.charAt(0) !== '#') {
1100
+ hash = "#" + hash
1101
+ }
1102
+
1103
+ return {
1104
+ _normalized: true,
1105
+ path: path,
1106
+ query: query,
1107
+ hash: hash
1108
+ }
976
1109
  }
977
1110
 
978
- function normalizePath (path, parent) {
979
- path = path.replace(/\/$/, '')
980
- if (path[0] === '/') { return path }
981
- if (parent == null) { return path }
982
- return cleanPath(((parent.path) + "/" + path))
1111
+ function assign (a, b) {
1112
+ for (var key in b) {
1113
+ a[key] = b[key]
1114
+ }
1115
+ return a
983
1116
  }
984
1117
 
985
1118
  /* */
986
1119
 
987
- var regexpCache = Object.create(null)
988
-
989
- var regexpCompileCache = Object.create(null)
990
-
991
1120
  function createMatcher (routes) {
992
1121
  var ref = createRouteMap(routes);
993
1122
  var pathMap = ref.pathMap;
@@ -1003,6 +1132,22 @@ function createMatcher (routes) {
1003
1132
 
1004
1133
  if (name) {
1005
1134
  var record = nameMap[name]
1135
+ var paramNames = getRouteRegex(record.path).keys
1136
+ .filter(function (key) { return !key.optional; })
1137
+ .map(function (key) { return key.name; })
1138
+
1139
+ if (typeof location.params !== 'object') {
1140
+ location.params = {}
1141
+ }
1142
+
1143
+ if (currentRoute && typeof currentRoute.params === 'object') {
1144
+ for (var key in currentRoute.params) {
1145
+ if (!(key in location.params) && paramNames.indexOf(key) > -1) {
1146
+ location.params[key] = currentRoute.params[key]
1147
+ }
1148
+ }
1149
+ }
1150
+
1006
1151
  if (record) {
1007
1152
  location.path = fillParams(record.path, location.params, ("named route \"" + name + "\""))
1008
1153
  return _createRoute(record, location, redirectedFrom)
@@ -1033,7 +1178,9 @@ function createMatcher (routes) {
1033
1178
  }
1034
1179
 
1035
1180
  if (!redirect || typeof redirect !== 'object') {
1036
- warn(false, ("invalid redirect option: " + (JSON.stringify(redirect))))
1181
+ process.env.NODE_ENV !== 'production' && warn(
1182
+ false, ("invalid redirect option: " + (JSON.stringify(redirect)))
1183
+ )
1037
1184
  return _createRoute(null, location)
1038
1185
  }
1039
1186
 
@@ -1050,7 +1197,9 @@ function createMatcher (routes) {
1050
1197
  if (name) {
1051
1198
  // resolved named direct
1052
1199
  var targetRecord = nameMap[name]
1053
- assert(targetRecord, ("redirect failed: named route \"" + name + "\" not found."))
1200
+ if (process.env.NODE_ENV !== 'production') {
1201
+ assert(targetRecord, ("redirect failed: named route \"" + name + "\" not found."))
1202
+ }
1054
1203
  return match({
1055
1204
  _normalized: true,
1056
1205
  name: name,
@@ -1117,16 +1266,9 @@ function matchRoute (
1117
1266
  params,
1118
1267
  pathname
1119
1268
  ) {
1120
- var keys, regexp
1121
- var hit = regexpCache[path]
1122
- if (hit) {
1123
- keys = hit.keys
1124
- regexp = hit.regexp
1125
- } else {
1126
- keys = []
1127
- regexp = index(path, keys)
1128
- regexpCache[path] = { keys: keys, regexp: regexp }
1129
- }
1269
+ var ref = getRouteRegex(path);
1270
+ var regexp = ref.regexp;
1271
+ var keys = ref.keys;
1130
1272
  var m = pathname.match(regexp)
1131
1273
 
1132
1274
  if (!m) {
@@ -1144,22 +1286,6 @@ function matchRoute (
1144
1286
  return true
1145
1287
  }
1146
1288
 
1147
- function fillParams (
1148
- path,
1149
- params,
1150
- routeMsg
1151
- ) {
1152
- try {
1153
- var filler =
1154
- regexpCompileCache[path] ||
1155
- (regexpCompileCache[path] = index.compile(path))
1156
- return filler(params || {}, { pretty: true })
1157
- } catch (e) {
1158
- assert(false, ("missing param for " + routeMsg + ": " + (e.message)))
1159
- return ''
1160
- }
1161
- }
1162
-
1163
1289
  function resolveRecordPath (path, record) {
1164
1290
  return resolvePath(path, record.parent ? record.parent.path : '/', true)
1165
1291
  }
@@ -1217,24 +1343,25 @@ History.prototype.listen = function listen (cb) {
1217
1343
  this.cb = cb
1218
1344
  };
1219
1345
 
1220
- History.prototype.transitionTo = function transitionTo (location, cb) {
1346
+ History.prototype.transitionTo = function transitionTo (location, onComplete, onAbort) {
1221
1347
  var this$1 = this;
1222
1348
 
1223
1349
  var route = this.router.match(location, this.current)
1224
1350
  this.confirmTransition(route, function () {
1225
1351
  this$1.updateRoute(route)
1226
- cb && cb(route)
1352
+ onComplete && onComplete(route)
1227
1353
  this$1.ensureURL()
1228
- })
1354
+ }, onAbort)
1229
1355
  };
1230
1356
 
1231
- History.prototype.confirmTransition = function confirmTransition (route, cb) {
1357
+ History.prototype.confirmTransition = function confirmTransition (route, onComplete, onAbort) {
1232
1358
  var this$1 = this;
1233
1359
 
1234
1360
  var current = this.current
1361
+ var abort = function () { onAbort && onAbort() }
1235
1362
  if (isSameRoute(route, current)) {
1236
1363
  this.ensureURL()
1237
- return
1364
+ return abort()
1238
1365
  }
1239
1366
 
1240
1367
  var ref = resolveQueue(this.current.matched, route.matched);
@@ -1254,14 +1381,18 @@ History.prototype.confirmTransition = function confirmTransition (route, cb) {
1254
1381
 
1255
1382
  this.pending = route
1256
1383
  var iterator = function (hook, next) {
1257
- if (this$1.pending !== route) { return }
1384
+ if (this$1.pending !== route) {
1385
+ return abort()
1386
+ }
1258
1387
  hook(route, current, function (to) {
1259
1388
  if (to === false) {
1260
1389
  // next(false) -> abort navigation, ensure current URL
1261
- this$1.ensureURL()
1390
+ this$1.ensureURL(true)
1391
+ abort()
1262
1392
  } else if (typeof to === 'string' || typeof to === 'object') {
1263
1393
  // next('/') or next({ path: '/' }) -> redirect
1264
- this$1.push(to)
1394
+ (typeof to === 'object' && to.replace) ? this$1.replace(to) : this$1.push(to)
1395
+ abort()
1265
1396
  } else {
1266
1397
  // confirm transition and pass on the value
1267
1398
  next(to)
@@ -1271,12 +1402,18 @@ History.prototype.confirmTransition = function confirmTransition (route, cb) {
1271
1402
 
1272
1403
  runQueue(queue, iterator, function () {
1273
1404
  var postEnterCbs = []
1405
+ var enterGuards = extractEnterGuards(activated, postEnterCbs, function () {
1406
+ return this$1.current === route
1407
+ })
1274
1408
  // wait until async components are resolved before
1275
1409
  // extracting in-component enter guards
1276
- runQueue(extractEnterGuards(activated, postEnterCbs), iterator, function () {
1277
- if (this$1.pending === route) {
1278
- this$1.pending = null
1279
- cb(route)
1410
+ runQueue(enterGuards, iterator, function () {
1411
+ if (this$1.pending !== route) {
1412
+ return abort()
1413
+ }
1414
+ this$1.pending = null
1415
+ onComplete(route)
1416
+ if (this$1.router.app) {
1280
1417
  this$1.router.app.$nextTick(function () {
1281
1418
  postEnterCbs.forEach(function (cb) { return cb(); })
1282
1419
  })
@@ -1329,33 +1466,89 @@ function resolveQueue (
1329
1466
  }
1330
1467
  }
1331
1468
 
1469
+ function extractGuard (
1470
+ def,
1471
+ key
1472
+ ) {
1473
+ if (typeof def !== 'function') {
1474
+ // extend now so that global mixins are applied.
1475
+ def = _Vue.extend(def)
1476
+ }
1477
+ return def.options[key]
1478
+ }
1479
+
1332
1480
  function extractLeaveGuards (matched) {
1333
- return flatMapComponents(matched, function (def, instance) {
1334
- var guard = def && def.beforeRouteLeave
1481
+ return flatten(flatMapComponents(matched, function (def, instance) {
1482
+ var guard = extractGuard(def, 'beforeRouteLeave')
1335
1483
  if (guard) {
1336
- return function routeLeaveGuard () {
1337
- return guard.apply(instance, arguments)
1338
- }
1484
+ return Array.isArray(guard)
1485
+ ? guard.map(function (guard) { return wrapLeaveGuard(guard, instance); })
1486
+ : wrapLeaveGuard(guard, instance)
1339
1487
  }
1340
- }).reverse()
1488
+ }).reverse())
1341
1489
  }
1342
1490
 
1343
- function extractEnterGuards (matched, cbs) {
1344
- return flatMapComponents(matched, function (def, _, match, key) {
1345
- var guard = def && def.beforeRouteEnter
1491
+ function wrapLeaveGuard (
1492
+ guard,
1493
+ instance
1494
+ ) {
1495
+ return function routeLeaveGuard () {
1496
+ return guard.apply(instance, arguments)
1497
+ }
1498
+ }
1499
+
1500
+ function extractEnterGuards (
1501
+ matched,
1502
+ cbs,
1503
+ isValid
1504
+ ) {
1505
+ return flatten(flatMapComponents(matched, function (def, _, match, key) {
1506
+ var guard = extractGuard(def, 'beforeRouteEnter')
1346
1507
  if (guard) {
1347
- return function routeEnterGuard (to, from, next) {
1348
- return guard(to, from, function (cb) {
1349
- next(cb)
1350
- if (typeof cb === 'function') {
1351
- cbs.push(function () {
1352
- cb(match.instances[key])
1353
- })
1354
- }
1508
+ return Array.isArray(guard)
1509
+ ? guard.map(function (guard) { return wrapEnterGuard(guard, cbs, match, key, isValid); })
1510
+ : wrapEnterGuard(guard, cbs, match, key, isValid)
1511
+ }
1512
+ }))
1513
+ }
1514
+
1515
+ function wrapEnterGuard (
1516
+ guard,
1517
+ cbs,
1518
+ match,
1519
+ key,
1520
+ isValid
1521
+ ) {
1522
+ return function routeEnterGuard (to, from, next) {
1523
+ return guard(to, from, function (cb) {
1524
+ next(cb)
1525
+ if (typeof cb === 'function') {
1526
+ cbs.push(function () {
1527
+ // #750
1528
+ // if a router-view is wrapped with an out-in transition,
1529
+ // the instance may not have been registered at this time.
1530
+ // we will need to poll for registration until current route
1531
+ // is no longer valid.
1532
+ poll(cb, match.instances, key, isValid)
1355
1533
  })
1356
1534
  }
1357
- }
1358
- })
1535
+ })
1536
+ }
1537
+ }
1538
+
1539
+ function poll (
1540
+ cb, // somehow flow cannot infer this is a function
1541
+ instances,
1542
+ key,
1543
+ isValid
1544
+ ) {
1545
+ if (instances[key]) {
1546
+ cb(instances[key])
1547
+ } else if (isValid()) {
1548
+ setTimeout(function () {
1549
+ poll(cb, instances, key, isValid)
1550
+ }, 16)
1551
+ }
1359
1552
  }
1360
1553
 
1361
1554
  function resolveAsyncComponents (matched) {
@@ -1390,7 +1583,7 @@ function flatMapComponents (
1390
1583
  matched,
1391
1584
  fn
1392
1585
  ) {
1393
- return Array.prototype.concat.apply([], matched.map(function (m) {
1586
+ return flatten(matched.map(function (m) {
1394
1587
  return Object.keys(m.components).map(function (key) { return fn(
1395
1588
  m.components[key],
1396
1589
  m.instances[key],
@@ -1399,19 +1592,25 @@ function flatMapComponents (
1399
1592
  }))
1400
1593
  }
1401
1594
 
1595
+ function flatten (arr) {
1596
+ return Array.prototype.concat.apply([], arr)
1597
+ }
1598
+
1402
1599
  /* */
1403
1600
 
1601
+ var positionStore = Object.create(null)
1602
+
1404
1603
  function saveScrollPosition (key) {
1405
1604
  if (!key) { return }
1406
- window.sessionStorage.setItem(key, JSON.stringify({
1605
+ positionStore[key] = {
1407
1606
  x: window.pageXOffset,
1408
1607
  y: window.pageYOffset
1409
- }))
1608
+ }
1410
1609
  }
1411
1610
 
1412
1611
  function getScrollPosition (key) {
1413
1612
  if (!key) { return }
1414
- return JSON.parse(window.sessionStorage.getItem(key))
1613
+ return positionStore[key]
1415
1614
  }
1416
1615
 
1417
1616
  function getElementPosition (el) {
@@ -1450,8 +1649,6 @@ var HTML5History = (function (History) {
1450
1649
 
1451
1650
  History.call(this, router, base)
1452
1651
 
1453
- this.transitionTo(getLocation(this.base))
1454
-
1455
1652
  var expectScroll = router.options.scrollBehavior
1456
1653
  window.addEventListener('popstate', function (e) {
1457
1654
  _key = e.state && e.state.key
@@ -1498,9 +1695,10 @@ var HTML5History = (function (History) {
1498
1695
  })
1499
1696
  };
1500
1697
 
1501
- HTML5History.prototype.ensureURL = function ensureURL () {
1698
+ HTML5History.prototype.ensureURL = function ensureURL (push) {
1502
1699
  if (getLocation(this.base) !== this.current.fullPath) {
1503
- replaceState(cleanPath(this.base + this.current.fullPath))
1700
+ var current = cleanPath(this.base + this.current.fullPath)
1701
+ push ? pushState(current) : replaceState(current)
1504
1702
  }
1505
1703
  };
1506
1704
 
@@ -1514,7 +1712,9 @@ var HTML5History = (function (History) {
1514
1712
  if (!behavior) {
1515
1713
  return
1516
1714
  }
1517
- assert(typeof behavior === 'function', "scrollBehavior must be a function")
1715
+ if (process.env.NODE_ENV !== 'production') {
1716
+ assert(typeof behavior === 'function', "scrollBehavior must be a function")
1717
+ }
1518
1718
 
1519
1719
  // wait until re-render finishes before scrolling
1520
1720
  router.app.$nextTick(function () {
@@ -1578,21 +1778,12 @@ function replaceState (url) {
1578
1778
 
1579
1779
  var HashHistory = (function (History) {
1580
1780
  function HashHistory (router, base, fallback) {
1581
- var this$1 = this;
1582
-
1583
1781
  History.call(this, router, base)
1584
-
1585
1782
  // check history fallback deeplinking
1586
1783
  if (fallback && this.checkFallback()) {
1587
1784
  return
1588
1785
  }
1589
-
1590
1786
  ensureSlash()
1591
- this.transitionTo(getHash())
1592
-
1593
- window.addEventListener('hashchange', function () {
1594
- this$1.onHashChange()
1595
- })
1596
1787
  }
1597
1788
 
1598
1789
  if ( History ) HashHistory.__proto__ = History;
@@ -1619,13 +1810,13 @@ var HashHistory = (function (History) {
1619
1810
  };
1620
1811
 
1621
1812
  HashHistory.prototype.push = function push (location) {
1622
- History.prototype.transitionTo.call(this, location, function (route) {
1813
+ this.transitionTo(location, function (route) {
1623
1814
  pushHash(route.fullPath)
1624
1815
  })
1625
1816
  };
1626
1817
 
1627
1818
  HashHistory.prototype.replace = function replace (location) {
1628
- History.prototype.transitionTo.call(this, location, function (route) {
1819
+ this.transitionTo(location, function (route) {
1629
1820
  replaceHash(route.fullPath)
1630
1821
  })
1631
1822
  };
@@ -1634,9 +1825,10 @@ var HashHistory = (function (History) {
1634
1825
  window.history.go(n)
1635
1826
  };
1636
1827
 
1637
- HashHistory.prototype.ensureURL = function ensureURL () {
1638
- if (getHash() !== this.current.fullPath) {
1639
- replaceHash(this.current.fullPath)
1828
+ HashHistory.prototype.ensureURL = function ensureURL (push) {
1829
+ var current = this.current.fullPath
1830
+ if (getHash() !== current) {
1831
+ push ? pushHash(current) : replaceHash(current)
1640
1832
  }
1641
1833
  };
1642
1834
 
@@ -1678,7 +1870,7 @@ var AbstractHistory = (function (History) {
1678
1870
  function AbstractHistory (router) {
1679
1871
  History.call(this, router)
1680
1872
  this.stack = []
1681
- this.index = 0
1873
+ this.index = -1
1682
1874
  }
1683
1875
 
1684
1876
  if ( History ) AbstractHistory.__proto__ = History;
@@ -1688,7 +1880,7 @@ var AbstractHistory = (function (History) {
1688
1880
  AbstractHistory.prototype.push = function push (location) {
1689
1881
  var this$1 = this;
1690
1882
 
1691
- History.prototype.transitionTo.call(this, location, function (route) {
1883
+ this.transitionTo(location, function (route) {
1692
1884
  this$1.stack = this$1.stack.slice(0, this$1.index + 1).concat(route)
1693
1885
  this$1.index++
1694
1886
  })
@@ -1697,7 +1889,7 @@ var AbstractHistory = (function (History) {
1697
1889
  AbstractHistory.prototype.replace = function replace (location) {
1698
1890
  var this$1 = this;
1699
1891
 
1700
- History.prototype.transitionTo.call(this, location, function (route) {
1892
+ this.transitionTo(location, function (route) {
1701
1893
  this$1.stack = this$1.stack.slice(0, this$1.index).concat(route)
1702
1894
  })
1703
1895
  };
@@ -1709,10 +1901,10 @@ var AbstractHistory = (function (History) {
1709
1901
  if (targetIndex < 0 || targetIndex >= this.stack.length) {
1710
1902
  return
1711
1903
  }
1712
- var location = this.stack[targetIndex]
1713
- this.confirmTransition(location, function () {
1904
+ var route = this.stack[targetIndex]
1905
+ this.confirmTransition(route, function () {
1714
1906
  this$1.index = targetIndex
1715
- this$1.updateRoute(location)
1907
+ this$1.updateRoute(route)
1716
1908
  })
1717
1909
  };
1718
1910
 
@@ -1743,6 +1935,20 @@ var VueRouter = function VueRouter (options) {
1743
1935
  mode = 'abstract'
1744
1936
  }
1745
1937
  this.mode = mode
1938
+
1939
+ switch (mode) {
1940
+ case 'history':
1941
+ this.history = new HTML5History(this, options.base)
1942
+ break
1943
+ case 'hash':
1944
+ this.history = new HashHistory(this, options.base, this.fallback)
1945
+ break
1946
+ case 'abstract':
1947
+ this.history = new AbstractHistory(this)
1948
+ break
1949
+ default:
1950
+ process.env.NODE_ENV !== 'production' && assert(false, ("invalid mode: " + mode))
1951
+ }
1746
1952
  };
1747
1953
 
1748
1954
  var prototypeAccessors = { currentRoute: {} };
@@ -1754,7 +1960,7 @@ prototypeAccessors.currentRoute.get = function () {
1754
1960
  VueRouter.prototype.init = function init (app /* Vue component instance */) {
1755
1961
  var this$1 = this;
1756
1962
 
1757
- assert(
1963
+ process.env.NODE_ENV !== 'production' && assert(
1758
1964
  install.installed,
1759
1965
  "not installed. Make sure to call `Vue.use(VueRouter)` " +
1760
1966
  "before creating root instance."
@@ -1762,25 +1968,20 @@ VueRouter.prototype.init = function init (app /* Vue component instance */) {
1762
1968
 
1763
1969
  this.app = app
1764
1970
 
1765
- var ref = this;
1766
- var mode = ref.mode;
1767
- var options = ref.options;
1768
- var fallback = ref.fallback;
1769
- switch (mode) {
1770
- case 'history':
1771
- this.history = new HTML5History(this, options.base)
1772
- break
1773
- case 'hash':
1774
- this.history = new HashHistory(this, options.base, fallback)
1775
- break
1776
- case 'abstract':
1777
- this.history = new AbstractHistory(this)
1778
- break
1779
- default:
1780
- assert(false, ("invalid mode: " + mode))
1971
+ var history = this.history
1972
+
1973
+ if (history instanceof HTML5History) {
1974
+ history.transitionTo(getLocation(history.base))
1975
+ } else if (history instanceof HashHistory) {
1976
+ var setupHashListener = function () {
1977
+ window.addEventListener('hashchange', function () {
1978
+ history.onHashChange()
1979
+ })
1980
+ }
1981
+ history.transitionTo(getHash(), setupHashListener, setupHashListener)
1781
1982
  }
1782
1983
 
1783
- this.history.listen(function (route) {
1984
+ history.listen(function (route) {
1784
1985
  this$1.app._route = route
1785
1986
  })
1786
1987
  };
@@ -1813,25 +2014,49 @@ VueRouter.prototype.forward = function forward () {
1813
2014
  this.go(1)
1814
2015
  };
1815
2016
 
1816
- VueRouter.prototype.getMatchedComponents = function getMatchedComponents () {
1817
- if (!this.currentRoute) {
2017
+ VueRouter.prototype.getMatchedComponents = function getMatchedComponents (to) {
2018
+ var route = to
2019
+ ? this.resolve(to).resolved
2020
+ : this.currentRoute
2021
+ if (!route) {
1818
2022
  return []
1819
2023
  }
1820
- return [].concat.apply([], this.currentRoute.matched.map(function (m) {
2024
+ return [].concat.apply([], route.matched.map(function (m) {
1821
2025
  return Object.keys(m.components).map(function (key) {
1822
2026
  return m.components[key]
1823
2027
  })
1824
2028
  }))
1825
2029
  };
1826
2030
 
2031
+ VueRouter.prototype.resolve = function resolve (
2032
+ to,
2033
+ current,
2034
+ append
2035
+ ) {
2036
+ var normalizedTo = normalizeLocation(to, current || this.history.current, append)
2037
+ var resolved = this.match(normalizedTo, current)
2038
+ var fullPath = resolved.redirectedFrom || resolved.fullPath
2039
+ var base = this.history.base
2040
+ var href = createHref(base, fullPath, this.mode)
2041
+ return {
2042
+ normalizedTo: normalizedTo,
2043
+ resolved: resolved,
2044
+ href: href
2045
+ }
2046
+ };
2047
+
1827
2048
  Object.defineProperties( VueRouter.prototype, prototypeAccessors );
1828
2049
 
1829
- VueRouter.install = install
2050
+ function createHref (base, fullPath, mode) {
2051
+ var path = mode === 'hash' ? '#' + fullPath : fullPath
2052
+ return base ? cleanPath(base + '/' + path) : path
2053
+ }
2054
+
2055
+ VueRouter.install = install;
2056
+ VueRouter.version = 'v2.1.1'
1830
2057
 
1831
2058
  if (inBrowser && window.Vue) {
1832
2059
  window.Vue.use(VueRouter)
1833
2060
  }
1834
2061
 
1835
- return VueRouter;
1836
-
1837
- })));
2062
+ module.exports = VueRouter;