vuejs 1.0.37 → 1.0.38

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,52 +1,52 @@
1
1
  /**
2
- * vuex v2.1.1
3
- * (c) 2016 Evan You
2
+ * vuex v2.1.2
3
+ * (c) 2017 Evan You
4
4
  * @license MIT
5
5
  */
6
6
  (function (global, factory) {
7
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
8
- typeof define === 'function' && define.amd ? define(factory) :
9
- (global.Vuex = factory());
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
8
+ typeof define === 'function' && define.amd ? define(factory) :
9
+ (global.Vuex = factory());
10
10
  }(this, (function () { 'use strict';
11
11
 
12
12
  var devtoolHook =
13
13
  typeof window !== 'undefined' &&
14
- window.__VUE_DEVTOOLS_GLOBAL_HOOK__
14
+ window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
15
15
 
16
16
  function devtoolPlugin (store) {
17
17
  if (!devtoolHook) { return }
18
18
 
19
- store._devtoolHook = devtoolHook
19
+ store._devtoolHook = devtoolHook;
20
20
 
21
- devtoolHook.emit('vuex:init', store)
21
+ devtoolHook.emit('vuex:init', store);
22
22
 
23
23
  devtoolHook.on('vuex:travel-to-state', function (targetState) {
24
- store.replaceState(targetState)
25
- })
24
+ store.replaceState(targetState);
25
+ });
26
26
 
27
27
  store.subscribe(function (mutation, state) {
28
- devtoolHook.emit('vuex:mutation', mutation, state)
29
- })
28
+ devtoolHook.emit('vuex:mutation', mutation, state);
29
+ });
30
30
  }
31
31
 
32
- function applyMixin (Vue) {
33
- var version = Number(Vue.version.split('.')[0])
32
+ var applyMixin = function (Vue) {
33
+ var version = Number(Vue.version.split('.')[0]);
34
34
 
35
35
  if (version >= 2) {
36
- var usesInit = Vue.config._lifecycleHooks.indexOf('init') > -1
37
- Vue.mixin(usesInit ? { init: vuexInit } : { beforeCreate: vuexInit })
36
+ var usesInit = Vue.config._lifecycleHooks.indexOf('init') > -1;
37
+ Vue.mixin(usesInit ? { init: vuexInit } : { beforeCreate: vuexInit });
38
38
  } else {
39
39
  // override init and inject vuex init procedure
40
40
  // for 1.x backwards compatibility.
41
- var _init = Vue.prototype._init
41
+ var _init = Vue.prototype._init;
42
42
  Vue.prototype._init = function (options) {
43
43
  if ( options === void 0 ) options = {};
44
44
 
45
45
  options.init = options.init
46
46
  ? [vuexInit].concat(options.init)
47
- : vuexInit
48
- _init.call(this, options)
49
- }
47
+ : vuexInit;
48
+ _init.call(this, options);
49
+ };
50
50
  }
51
51
 
52
52
  /**
@@ -54,92 +54,101 @@ function applyMixin (Vue) {
54
54
  */
55
55
 
56
56
  function vuexInit () {
57
- var options = this.$options
57
+ var options = this.$options;
58
58
  // store injection
59
59
  if (options.store) {
60
- this.$store = options.store
60
+ this.$store = options.store;
61
61
  } else if (options.parent && options.parent.$store) {
62
- this.$store = options.parent.$store
62
+ this.$store = options.parent.$store;
63
63
  }
64
64
  }
65
- }
65
+ };
66
66
 
67
67
  var mapState = normalizeNamespace(function (namespace, states) {
68
- var res = {}
68
+ var res = {};
69
69
  normalizeMap(states).forEach(function (ref) {
70
70
  var key = ref.key;
71
71
  var val = ref.val;
72
72
 
73
73
  res[key] = function mappedState () {
74
- var state = this.$store.state
75
- var getters = this.$store.getters
74
+ var state = this.$store.state;
75
+ var getters = this.$store.getters;
76
76
  if (namespace) {
77
- var module = this.$store._modulesNamespaceMap[namespace]
77
+ var module = getModuleByNamespace(this.$store, 'mapState', namespace);
78
78
  if (!module) {
79
- warnNamespace('mapState', namespace)
80
79
  return
81
80
  }
82
- state = module.state
83
- getters = module.context.getters
81
+ state = module.context.state;
82
+ getters = module.context.getters;
84
83
  }
85
84
  return typeof val === 'function'
86
85
  ? val.call(this, state, getters)
87
86
  : state[val]
88
- }
89
- })
87
+ };
88
+ });
90
89
  return res
91
- })
90
+ });
92
91
 
93
92
  var mapMutations = normalizeNamespace(function (namespace, mutations) {
94
- var res = {}
93
+ var res = {};
95
94
  normalizeMap(mutations).forEach(function (ref) {
96
95
  var key = ref.key;
97
96
  var val = ref.val;
98
97
 
99
- val = namespace + val
98
+ val = namespace + val;
100
99
  res[key] = function mappedMutation () {
101
100
  var args = [], len = arguments.length;
102
101
  while ( len-- ) args[ len ] = arguments[ len ];
103
102
 
103
+ if (namespace && !getModuleByNamespace(this.$store, 'mapMutations', namespace)) {
104
+ return
105
+ }
104
106
  return this.$store.commit.apply(this.$store, [val].concat(args))
105
- }
106
- })
107
+ };
108
+ });
107
109
  return res
108
- })
110
+ });
109
111
 
110
112
  var mapGetters = normalizeNamespace(function (namespace, getters) {
111
- var res = {}
113
+ var res = {};
112
114
  normalizeMap(getters).forEach(function (ref) {
113
115
  var key = ref.key;
114
116
  var val = ref.val;
115
117
 
116
- val = namespace + val
118
+ val = namespace + val;
117
119
  res[key] = function mappedGetter () {
120
+ if (namespace && !getModuleByNamespace(this.$store, 'mapGetters', namespace)) {
121
+ return
122
+ }
118
123
  if (!(val in this.$store.getters)) {
119
- console.error(("[vuex] unknown getter: " + val))
124
+ console.error(("[vuex] unknown getter: " + val));
125
+ return
120
126
  }
121
127
  return this.$store.getters[val]
122
- }
123
- })
128
+ };
129
+ });
124
130
  return res
125
- })
131
+ });
126
132
 
127
133
  var mapActions = normalizeNamespace(function (namespace, actions) {
128
- var res = {}
134
+ var res = {};
129
135
  normalizeMap(actions).forEach(function (ref) {
130
136
  var key = ref.key;
131
137
  var val = ref.val;
132
138
 
133
- val = namespace + val
139
+ val = namespace + val;
134
140
  res[key] = function mappedAction () {
135
141
  var args = [], len = arguments.length;
136
142
  while ( len-- ) args[ len ] = arguments[ len ];
137
143
 
144
+ if (namespace && !getModuleByNamespace(this.$store, 'mapActions', namespace)) {
145
+ return
146
+ }
138
147
  return this.$store.dispatch.apply(this.$store, [val].concat(args))
139
- }
140
- })
148
+ };
149
+ });
141
150
  return res
142
- })
151
+ });
143
152
 
144
153
  function normalizeMap (map) {
145
154
  return Array.isArray(map)
@@ -150,24 +159,47 @@ function normalizeMap (map) {
150
159
  function normalizeNamespace (fn) {
151
160
  return function (namespace, map) {
152
161
  if (typeof namespace !== 'string') {
153
- map = namespace
154
- namespace = ''
162
+ map = namespace;
163
+ namespace = '';
155
164
  } else if (namespace.charAt(namespace.length - 1) !== '/') {
156
- namespace += '/'
165
+ namespace += '/';
157
166
  }
158
167
  return fn(namespace, map)
159
168
  }
160
169
  }
161
170
 
162
- function warnNamespace (helper, namespace) {
163
- console.error(("[vuex] module namespace not found in " + helper + "(): " + namespace))
171
+ function getModuleByNamespace (store, helper, namespace) {
172
+ var module = store._modulesNamespaceMap[namespace];
173
+ if (!module) {
174
+ console.error(("[vuex] module namespace not found in " + helper + "(): " + namespace));
175
+ }
176
+ return module
164
177
  }
165
178
 
179
+ /**
180
+ * Get the first item that pass the test
181
+ * by second argument function
182
+ *
183
+ * @param {Array} list
184
+ * @param {Function} f
185
+ * @return {*}
186
+ */
187
+ /**
188
+ * Deep copy the given object considering circular structure.
189
+ * This function caches all nested objects and its copies.
190
+ * If it detects circular structure, use cached copy to avoid infinite loop.
191
+ *
192
+ * @param {*} obj
193
+ * @param {Array<Object>} cache
194
+ * @return {*}
195
+ */
196
+
197
+
166
198
  /**
167
199
  * forEach for object
168
200
  */
169
201
  function forEachValue (obj, fn) {
170
- Object.keys(obj).forEach(function (key) { return fn(obj[key], key); })
202
+ Object.keys(obj).forEach(function (key) { return fn(obj[key], key); });
171
203
  }
172
204
 
173
205
  function isObject (obj) {
@@ -183,9 +215,9 @@ function assert (condition, msg) {
183
215
  }
184
216
 
185
217
  var Module = function Module (rawModule, runtime) {
186
- this.runtime = runtime
187
- this._children = Object.create(null)
188
- this._rawModule = rawModule
218
+ this.runtime = runtime;
219
+ this._children = Object.create(null);
220
+ this._rawModule = rawModule;
189
221
  };
190
222
 
191
223
  var prototypeAccessors$1 = { state: {},namespaced: {} };
@@ -199,11 +231,11 @@ prototypeAccessors$1.namespaced.get = function () {
199
231
  };
200
232
 
201
233
  Module.prototype.addChild = function addChild (key, module) {
202
- this._children[key] = module
234
+ this._children[key] = module;
203
235
  };
204
236
 
205
237
  Module.prototype.removeChild = function removeChild (key) {
206
- delete this._children[key]
238
+ delete this._children[key];
207
239
  };
208
240
 
209
241
  Module.prototype.getChild = function getChild (key) {
@@ -211,37 +243,37 @@ Module.prototype.getChild = function getChild (key) {
211
243
  };
212
244
 
213
245
  Module.prototype.update = function update (rawModule) {
214
- this._rawModule.namespaced = rawModule.namespaced
246
+ this._rawModule.namespaced = rawModule.namespaced;
215
247
  if (rawModule.actions) {
216
- this._rawModule.actions = rawModule.actions
248
+ this._rawModule.actions = rawModule.actions;
217
249
  }
218
250
  if (rawModule.mutations) {
219
- this._rawModule.mutations = rawModule.mutations
251
+ this._rawModule.mutations = rawModule.mutations;
220
252
  }
221
253
  if (rawModule.getters) {
222
- this._rawModule.getters = rawModule.getters
254
+ this._rawModule.getters = rawModule.getters;
223
255
  }
224
256
  };
225
257
 
226
258
  Module.prototype.forEachChild = function forEachChild (fn) {
227
- forEachValue(this._children, fn)
259
+ forEachValue(this._children, fn);
228
260
  };
229
261
 
230
262
  Module.prototype.forEachGetter = function forEachGetter (fn) {
231
263
  if (this._rawModule.getters) {
232
- forEachValue(this._rawModule.getters, fn)
264
+ forEachValue(this._rawModule.getters, fn);
233
265
  }
234
266
  };
235
267
 
236
268
  Module.prototype.forEachAction = function forEachAction (fn) {
237
269
  if (this._rawModule.actions) {
238
- forEachValue(this._rawModule.actions, fn)
270
+ forEachValue(this._rawModule.actions, fn);
239
271
  }
240
272
  };
241
273
 
242
274
  Module.prototype.forEachMutation = function forEachMutation (fn) {
243
275
  if (this._rawModule.mutations) {
244
- forEachValue(this._rawModule.mutations, fn)
276
+ forEachValue(this._rawModule.mutations, fn);
245
277
  }
246
278
  };
247
279
 
@@ -251,13 +283,13 @@ var ModuleCollection = function ModuleCollection (rawRootModule) {
251
283
  var this$1 = this;
252
284
 
253
285
  // register root module (Vuex.Store options)
254
- this.root = new Module(rawRootModule, false)
286
+ this.root = new Module(rawRootModule, false);
255
287
 
256
288
  // register all nested modules
257
289
  if (rawRootModule.modules) {
258
290
  forEachValue(rawRootModule.modules, function (rawModule, key) {
259
- this$1.register([key], rawModule, false)
260
- })
291
+ this$1.register([key], rawModule, false);
292
+ });
261
293
  }
262
294
  };
263
295
 
@@ -268,44 +300,44 @@ ModuleCollection.prototype.get = function get (path) {
268
300
  };
269
301
 
270
302
  ModuleCollection.prototype.getNamespace = function getNamespace (path) {
271
- var module = this.root
303
+ var module = this.root;
272
304
  return path.reduce(function (namespace, key) {
273
- module = module.getChild(key)
305
+ module = module.getChild(key);
274
306
  return namespace + (module.namespaced ? key + '/' : '')
275
307
  }, '')
276
308
  };
277
309
 
278
310
  ModuleCollection.prototype.update = function update$1 (rawRootModule) {
279
- update(this.root, rawRootModule)
311
+ update(this.root, rawRootModule);
280
312
  };
281
313
 
282
314
  ModuleCollection.prototype.register = function register (path, rawModule, runtime) {
283
315
  var this$1 = this;
284
316
  if ( runtime === void 0 ) runtime = true;
285
317
 
286
- var parent = this.get(path.slice(0, -1))
287
- var newModule = new Module(rawModule, runtime)
288
- parent.addChild(path[path.length - 1], newModule)
318
+ var parent = this.get(path.slice(0, -1));
319
+ var newModule = new Module(rawModule, runtime);
320
+ parent.addChild(path[path.length - 1], newModule);
289
321
 
290
322
  // register nested modules
291
323
  if (rawModule.modules) {
292
324
  forEachValue(rawModule.modules, function (rawChildModule, key) {
293
- this$1.register(path.concat(key), rawChildModule, runtime)
294
- })
325
+ this$1.register(path.concat(key), rawChildModule, runtime);
326
+ });
295
327
  }
296
328
  };
297
329
 
298
330
  ModuleCollection.prototype.unregister = function unregister (path) {
299
- var parent = this.get(path.slice(0, -1))
300
- var key = path[path.length - 1]
331
+ var parent = this.get(path.slice(0, -1));
332
+ var key = path[path.length - 1];
301
333
  if (!parent.getChild(key).runtime) { return }
302
334
 
303
- parent.removeChild(key)
335
+ parent.removeChild(key);
304
336
  };
305
337
 
306
338
  function update (targetModule, newModule) {
307
339
  // update target module
308
- targetModule.update(newModule)
340
+ targetModule.update(newModule);
309
341
 
310
342
  // update nested modules
311
343
  if (newModule.modules) {
@@ -314,63 +346,63 @@ function update (targetModule, newModule) {
314
346
  console.warn(
315
347
  "[vuex] trying to add a new module '" + key + "' on hot reloading, " +
316
348
  'manual reload is needed'
317
- )
349
+ );
318
350
  return
319
351
  }
320
- update(targetModule.getChild(key), newModule.modules[key])
352
+ update(targetModule.getChild(key), newModule.modules[key]);
321
353
  }
322
354
  }
323
355
  }
324
356
 
325
- var Vue // bind on install
357
+ var Vue; // bind on install
326
358
 
327
359
  var Store = function Store (options) {
328
360
  var this$1 = this;
329
361
  if ( options === void 0 ) options = {};
330
362
 
331
- assert(Vue, "must call Vue.use(Vuex) before creating a store instance.")
332
- assert(typeof Promise !== 'undefined', "vuex requires a Promise polyfill in this browser.")
363
+ assert(Vue, "must call Vue.use(Vuex) before creating a store instance.");
364
+ assert(typeof Promise !== 'undefined', "vuex requires a Promise polyfill in this browser.");
333
365
 
334
366
  var state = options.state; if ( state === void 0 ) state = {};
335
367
  var plugins = options.plugins; if ( plugins === void 0 ) plugins = [];
336
368
  var strict = options.strict; if ( strict === void 0 ) strict = false;
337
369
 
338
370
  // store internal state
339
- this._committing = false
340
- this._actions = Object.create(null)
341
- this._mutations = Object.create(null)
342
- this._wrappedGetters = Object.create(null)
343
- this._modules = new ModuleCollection(options)
344
- this._modulesNamespaceMap = Object.create(null)
345
- this._subscribers = []
346
- this._watcherVM = new Vue()
371
+ this._committing = false;
372
+ this._actions = Object.create(null);
373
+ this._mutations = Object.create(null);
374
+ this._wrappedGetters = Object.create(null);
375
+ this._modules = new ModuleCollection(options);
376
+ this._modulesNamespaceMap = Object.create(null);
377
+ this._subscribers = [];
378
+ this._watcherVM = new Vue();
347
379
 
348
380
  // bind commit and dispatch to self
349
- var store = this
381
+ var store = this;
350
382
  var ref = this;
351
383
  var dispatch = ref.dispatch;
352
384
  var commit = ref.commit;
353
- this.dispatch = function boundDispatch (type, payload) {
385
+ this.dispatch = function boundDispatch (type, payload) {
354
386
  return dispatch.call(store, type, payload)
355
- }
387
+ };
356
388
  this.commit = function boundCommit (type, payload, options) {
357
389
  return commit.call(store, type, payload, options)
358
- }
390
+ };
359
391
 
360
- // strict mode
361
- this.strict = strict
392
+ // strict mode
393
+ this.strict = strict;
362
394
 
363
395
  // init root module.
364
396
  // this also recursively registers all sub-modules
365
397
  // and collects all module getters inside this._wrappedGetters
366
- installModule(this, state, [], this._modules.root)
398
+ installModule(this, state, [], this._modules.root);
367
399
 
368
400
  // initialize the store vm, which is responsible for the reactivity
369
401
  // (also registers _wrappedGetters as computed properties)
370
- resetStoreVM(this, state)
402
+ resetStoreVM(this, state);
371
403
 
372
404
  // apply plugins
373
- plugins.concat(devtoolPlugin).forEach(function (plugin) { return plugin(this$1); })
405
+ plugins.concat(devtoolPlugin).forEach(function (plugin) { return plugin(this$1); });
374
406
  };
375
407
 
376
408
  var prototypeAccessors = { state: {} };
@@ -380,7 +412,7 @@ prototypeAccessors.state.get = function () {
380
412
  };
381
413
 
382
414
  prototypeAccessors.state.set = function (v) {
383
- assert(false, "Use store.replaceState() to explicit replace store state.")
415
+ assert(false, "Use store.replaceState() to explicit replace store state.");
384
416
  };
385
417
 
386
418
  Store.prototype.commit = function commit (_type, _payload, _options) {
@@ -392,24 +424,24 @@ Store.prototype.commit = function commit (_type, _payload, _options) {
392
424
  var payload = ref.payload;
393
425
  var options = ref.options;
394
426
 
395
- var mutation = { type: type, payload: payload }
396
- var entry = this._mutations[type]
427
+ var mutation = { type: type, payload: payload };
428
+ var entry = this._mutations[type];
397
429
  if (!entry) {
398
- console.error(("[vuex] unknown mutation type: " + type))
430
+ console.error(("[vuex] unknown mutation type: " + type));
399
431
  return
400
432
  }
401
433
  this._withCommit(function () {
402
434
  entry.forEach(function commitIterator (handler) {
403
- handler(payload)
404
- })
405
- })
406
- this._subscribers.forEach(function (sub) { return sub(mutation, this$1.state); })
435
+ handler(payload);
436
+ });
437
+ });
438
+ this._subscribers.forEach(function (sub) { return sub(mutation, this$1.state); });
407
439
 
408
440
  if (options && options.silent) {
409
441
  console.warn(
410
442
  "[vuex] mutation type: " + type + ". Silent option has been removed. " +
411
443
  'Use the filter functionality in the vue-devtools'
412
- )
444
+ );
413
445
  }
414
446
  };
415
447
 
@@ -419,9 +451,9 @@ Store.prototype.dispatch = function dispatch (_type, _payload) {
419
451
  var type = ref.type;
420
452
  var payload = ref.payload;
421
453
 
422
- var entry = this._actions[type]
454
+ var entry = this._actions[type];
423
455
  if (!entry) {
424
- console.error(("[vuex] unknown action type: " + type))
456
+ console.error(("[vuex] unknown action type: " + type));
425
457
  return
426
458
  }
427
459
  return entry.length > 1
@@ -430,14 +462,14 @@ Store.prototype.dispatch = function dispatch (_type, _payload) {
430
462
  };
431
463
 
432
464
  Store.prototype.subscribe = function subscribe (fn) {
433
- var subs = this._subscribers
465
+ var subs = this._subscribers;
434
466
  if (subs.indexOf(fn) < 0) {
435
- subs.push(fn)
467
+ subs.push(fn);
436
468
  }
437
469
  return function () {
438
- var i = subs.indexOf(fn)
470
+ var i = subs.indexOf(fn);
439
471
  if (i > -1) {
440
- subs.splice(i, 1)
472
+ subs.splice(i, 1);
441
473
  }
442
474
  }
443
475
  };
@@ -445,7 +477,7 @@ Store.prototype.subscribe = function subscribe (fn) {
445
477
  Store.prototype.watch = function watch (getter, cb, options) {
446
478
  var this$1 = this;
447
479
 
448
- assert(typeof getter === 'function', "store.watch only accepts a function.")
480
+ assert(typeof getter === 'function', "store.watch only accepts a function.");
449
481
  return this._watcherVM.$watch(function () { return getter(this$1.state, this$1.getters); }, cb, options)
450
482
  };
451
483
 
@@ -453,158 +485,160 @@ Store.prototype.replaceState = function replaceState (state) {
453
485
  var this$1 = this;
454
486
 
455
487
  this._withCommit(function () {
456
- this$1._vm.state = state
457
- })
488
+ this$1._vm.state = state;
489
+ });
458
490
  };
459
491
 
460
492
  Store.prototype.registerModule = function registerModule (path, rawModule) {
461
- if (typeof path === 'string') { path = [path] }
462
- assert(Array.isArray(path), "module path must be a string or an Array.")
463
- this._modules.register(path, rawModule)
464
- installModule(this, this.state, path, this._modules.get(path))
493
+ if (typeof path === 'string') { path = [path]; }
494
+ assert(Array.isArray(path), "module path must be a string or an Array.");
495
+ this._modules.register(path, rawModule);
496
+ installModule(this, this.state, path, this._modules.get(path));
465
497
  // reset store to update getters...
466
- resetStoreVM(this, this.state)
498
+ resetStoreVM(this, this.state);
467
499
  };
468
500
 
469
501
  Store.prototype.unregisterModule = function unregisterModule (path) {
470
502
  var this$1 = this;
471
503
 
472
- if (typeof path === 'string') { path = [path] }
473
- assert(Array.isArray(path), "module path must be a string or an Array.")
474
- this._modules.unregister(path)
504
+ if (typeof path === 'string') { path = [path]; }
505
+ assert(Array.isArray(path), "module path must be a string or an Array.");
506
+ this._modules.unregister(path);
475
507
  this._withCommit(function () {
476
- var parentState = getNestedState(this$1.state, path.slice(0, -1))
477
- Vue.delete(parentState, path[path.length - 1])
478
- })
479
- resetStore(this)
508
+ var parentState = getNestedState(this$1.state, path.slice(0, -1));
509
+ Vue.delete(parentState, path[path.length - 1]);
510
+ });
511
+ resetStore(this);
480
512
  };
481
513
 
482
514
  Store.prototype.hotUpdate = function hotUpdate (newOptions) {
483
- this._modules.update(newOptions)
484
- resetStore(this)
515
+ this._modules.update(newOptions);
516
+ resetStore(this, true);
485
517
  };
486
518
 
487
519
  Store.prototype._withCommit = function _withCommit (fn) {
488
- var committing = this._committing
489
- this._committing = true
490
- fn()
491
- this._committing = committing
520
+ var committing = this._committing;
521
+ this._committing = true;
522
+ fn();
523
+ this._committing = committing;
492
524
  };
493
525
 
494
526
  Object.defineProperties( Store.prototype, prototypeAccessors );
495
527
 
496
- function resetStore (store) {
497
- store._actions = Object.create(null)
498
- store._mutations = Object.create(null)
499
- store._wrappedGetters = Object.create(null)
500
- store._modulesNamespaceMap = Object.create(null)
501
- var state = store.state
528
+ function resetStore (store, hot) {
529
+ store._actions = Object.create(null);
530
+ store._mutations = Object.create(null);
531
+ store._wrappedGetters = Object.create(null);
532
+ store._modulesNamespaceMap = Object.create(null);
533
+ var state = store.state;
502
534
  // init all modules
503
- installModule(store, state, [], store._modules.root, true)
535
+ installModule(store, state, [], store._modules.root, true);
504
536
  // reset vm
505
- resetStoreVM(store, state)
537
+ resetStoreVM(store, state, hot);
506
538
  }
507
539
 
508
- function resetStoreVM (store, state) {
509
- var oldVm = store._vm
540
+ function resetStoreVM (store, state, hot) {
541
+ var oldVm = store._vm;
510
542
 
511
543
  // bind store public getters
512
- store.getters = {}
513
- var wrappedGetters = store._wrappedGetters
514
- var computed = {}
544
+ store.getters = {};
545
+ var wrappedGetters = store._wrappedGetters;
546
+ var computed = {};
515
547
  forEachValue(wrappedGetters, function (fn, key) {
516
548
  // use computed to leverage its lazy-caching mechanism
517
- computed[key] = function () { return fn(store); }
549
+ computed[key] = function () { return fn(store); };
518
550
  Object.defineProperty(store.getters, key, {
519
551
  get: function () { return store._vm[key]; },
520
552
  enumerable: true // for local getters
521
- })
522
- })
553
+ });
554
+ });
523
555
 
524
556
  // use a Vue instance to store the state tree
525
557
  // suppress warnings just in case the user has added
526
558
  // some funky global mixins
527
- var silent = Vue.config.silent
528
- Vue.config.silent = true
559
+ var silent = Vue.config.silent;
560
+ Vue.config.silent = true;
529
561
  store._vm = new Vue({
530
562
  data: { state: state },
531
563
  computed: computed
532
- })
533
- Vue.config.silent = silent
564
+ });
565
+ Vue.config.silent = silent;
534
566
 
535
567
  // enable strict mode for new vm
536
568
  if (store.strict) {
537
- enableStrictMode(store)
569
+ enableStrictMode(store);
538
570
  }
539
571
 
540
572
  if (oldVm) {
541
- // dispatch changes in all subscribed watchers
542
- // to force getter re-evaluation.
543
- store._withCommit(function () {
544
- oldVm.state = null
545
- })
546
- Vue.nextTick(function () { return oldVm.$destroy(); })
573
+ if (hot) {
574
+ // dispatch changes in all subscribed watchers
575
+ // to force getter re-evaluation for hot reloading.
576
+ store._withCommit(function () {
577
+ oldVm.state = null;
578
+ });
579
+ }
580
+ Vue.nextTick(function () { return oldVm.$destroy(); });
547
581
  }
548
582
  }
549
583
 
550
584
  function installModule (store, rootState, path, module, hot) {
551
- var isRoot = !path.length
552
- var namespace = store._modules.getNamespace(path)
585
+ var isRoot = !path.length;
586
+ var namespace = store._modules.getNamespace(path);
553
587
 
554
588
  // register in namespace map
555
589
  if (namespace) {
556
- store._modulesNamespaceMap[namespace] = module
590
+ store._modulesNamespaceMap[namespace] = module;
557
591
  }
558
592
 
559
593
  // set state
560
594
  if (!isRoot && !hot) {
561
- var parentState = getNestedState(rootState, path.slice(0, -1))
562
- var moduleName = path[path.length - 1]
595
+ var parentState = getNestedState(rootState, path.slice(0, -1));
596
+ var moduleName = path[path.length - 1];
563
597
  store._withCommit(function () {
564
- Vue.set(parentState, moduleName, module.state)
565
- })
598
+ Vue.set(parentState, moduleName, module.state);
599
+ });
566
600
  }
567
601
 
568
- var local = module.context = makeLocalContext(store, namespace)
602
+ var local = module.context = makeLocalContext(store, namespace, path);
569
603
 
570
604
  module.forEachMutation(function (mutation, key) {
571
- var namespacedType = namespace + key
572
- registerMutation(store, namespacedType, mutation, path)
573
- })
605
+ var namespacedType = namespace + key;
606
+ registerMutation(store, namespacedType, mutation, local);
607
+ });
574
608
 
575
609
  module.forEachAction(function (action, key) {
576
- var namespacedType = namespace + key
577
- registerAction(store, namespacedType, action, local, path)
578
- })
610
+ var namespacedType = namespace + key;
611
+ registerAction(store, namespacedType, action, local);
612
+ });
579
613
 
580
614
  module.forEachGetter(function (getter, key) {
581
- var namespacedType = namespace + key
582
- registerGetter(store, namespacedType, getter, local, path)
583
- })
615
+ var namespacedType = namespace + key;
616
+ registerGetter(store, namespacedType, getter, local);
617
+ });
584
618
 
585
619
  module.forEachChild(function (child, key) {
586
- installModule(store, rootState, path.concat(key), child, hot)
587
- })
620
+ installModule(store, rootState, path.concat(key), child, hot);
621
+ });
588
622
  }
589
623
 
590
624
  /**
591
- * make localized dispatch, commit and getters
625
+ * make localized dispatch, commit, getters and state
592
626
  * if there is no namespace, just use root ones
593
627
  */
594
- function makeLocalContext (store, namespace) {
595
- var noNamespace = namespace === ''
628
+ function makeLocalContext (store, namespace, path) {
629
+ var noNamespace = namespace === '';
596
630
 
597
631
  var local = {
598
632
  dispatch: noNamespace ? store.dispatch : function (_type, _payload, _options) {
599
- var args = unifyObjectStyle(_type, _payload, _options)
633
+ var args = unifyObjectStyle(_type, _payload, _options);
600
634
  var payload = args.payload;
601
635
  var options = args.options;
602
636
  var type = args.type;
603
637
 
604
638
  if (!options || !options.root) {
605
- type = namespace + type
639
+ type = namespace + type;
606
640
  if (!store._actions[type]) {
607
- console.error(("[vuex] unknown local action type: " + (args.type) + ", global type: " + type))
641
+ console.error(("[vuex] unknown local action type: " + (args.type) + ", global type: " + type));
608
642
  return
609
643
  }
610
644
  }
@@ -613,42 +647,49 @@ function makeLocalContext (store, namespace) {
613
647
  },
614
648
 
615
649
  commit: noNamespace ? store.commit : function (_type, _payload, _options) {
616
- var args = unifyObjectStyle(_type, _payload, _options)
650
+ var args = unifyObjectStyle(_type, _payload, _options);
617
651
  var payload = args.payload;
618
652
  var options = args.options;
619
653
  var type = args.type;
620
654
 
621
655
  if (!options || !options.root) {
622
- type = namespace + type
656
+ type = namespace + type;
623
657
  if (!store._mutations[type]) {
624
- console.error(("[vuex] unknown local mutation type: " + (args.type) + ", global type: " + type))
658
+ console.error(("[vuex] unknown local mutation type: " + (args.type) + ", global type: " + type));
625
659
  return
626
660
  }
627
661
  }
628
662
 
629
- store.commit(type, payload, options)
663
+ store.commit(type, payload, options);
630
664
  }
631
- }
632
-
633
- // getters object must be gotten lazily
634
- // because store.getters will be changed by vm update
635
- Object.defineProperty(local, 'getters', {
636
- get: noNamespace ? function () { return store.getters; } : function () { return makeLocalGetters(store, namespace); }
637
- })
665
+ };
666
+
667
+ // getters and state object must be gotten lazily
668
+ // because they will be changed by vm update
669
+ Object.defineProperties(local, {
670
+ getters: {
671
+ get: noNamespace
672
+ ? function () { return store.getters; }
673
+ : function () { return makeLocalGetters(store, namespace); }
674
+ },
675
+ state: {
676
+ get: function () { return getNestedState(store.state, path); }
677
+ }
678
+ });
638
679
 
639
680
  return local
640
681
  }
641
682
 
642
683
  function makeLocalGetters (store, namespace) {
643
- var gettersProxy = {}
684
+ var gettersProxy = {};
644
685
 
645
- var splitPos = namespace.length
686
+ var splitPos = namespace.length;
646
687
  Object.keys(store.getters).forEach(function (type) {
647
688
  // skip if the target getter is not match this namespace
648
689
  if (type.slice(0, splitPos) !== namespace) { return }
649
690
 
650
691
  // extract local getter type
651
- var localType = type.slice(splitPos)
692
+ var localType = type.slice(splitPos);
652
693
 
653
694
  // Add a port to the getters proxy.
654
695
  // Define as getter property because
@@ -656,63 +697,63 @@ function makeLocalGetters (store, namespace) {
656
697
  Object.defineProperty(gettersProxy, localType, {
657
698
  get: function () { return store.getters[type]; },
658
699
  enumerable: true
659
- })
660
- })
700
+ });
701
+ });
661
702
 
662
703
  return gettersProxy
663
704
  }
664
705
 
665
- function registerMutation (store, type, handler, path) {
666
- var entry = store._mutations[type] || (store._mutations[type] = [])
706
+ function registerMutation (store, type, handler, local) {
707
+ var entry = store._mutations[type] || (store._mutations[type] = []);
667
708
  entry.push(function wrappedMutationHandler (payload) {
668
- handler(getNestedState(store.state, path), payload)
669
- })
709
+ handler(local.state, payload);
710
+ });
670
711
  }
671
712
 
672
- function registerAction (store, type, handler, local, path) {
673
- var entry = store._actions[type] || (store._actions[type] = [])
713
+ function registerAction (store, type, handler, local) {
714
+ var entry = store._actions[type] || (store._actions[type] = []);
674
715
  entry.push(function wrappedActionHandler (payload, cb) {
675
716
  var res = handler({
676
717
  dispatch: local.dispatch,
677
718
  commit: local.commit,
678
719
  getters: local.getters,
679
- state: getNestedState(store.state, path),
720
+ state: local.state,
680
721
  rootGetters: store.getters,
681
722
  rootState: store.state
682
- }, payload, cb)
723
+ }, payload, cb);
683
724
  if (!isPromise(res)) {
684
- res = Promise.resolve(res)
725
+ res = Promise.resolve(res);
685
726
  }
686
727
  if (store._devtoolHook) {
687
728
  return res.catch(function (err) {
688
- store._devtoolHook.emit('vuex:error', err)
729
+ store._devtoolHook.emit('vuex:error', err);
689
730
  throw err
690
731
  })
691
732
  } else {
692
733
  return res
693
734
  }
694
- })
735
+ });
695
736
  }
696
737
 
697
- function registerGetter (store, type, rawGetter, local, path) {
738
+ function registerGetter (store, type, rawGetter, local) {
698
739
  if (store._wrappedGetters[type]) {
699
- console.error(("[vuex] duplicate getter key: " + type))
740
+ console.error(("[vuex] duplicate getter key: " + type));
700
741
  return
701
742
  }
702
743
  store._wrappedGetters[type] = function wrappedGetter (store) {
703
744
  return rawGetter(
704
- getNestedState(store.state, path), // local state
745
+ local.state, // local state
705
746
  local.getters, // local getters
706
747
  store.state, // root state
707
748
  store.getters // root getters
708
749
  )
709
- }
750
+ };
710
751
  }
711
752
 
712
753
  function enableStrictMode (store) {
713
754
  store._vm.$watch('state', function () {
714
- assert(store._committing, "Do not mutate vuex store state outside mutation handlers.")
715
- }, { deep: true, sync: true })
755
+ assert(store._committing, "Do not mutate vuex store state outside mutation handlers.");
756
+ }, { deep: true, sync: true });
716
757
  }
717
758
 
718
759
  function getNestedState (state, path) {
@@ -723,10 +764,13 @@ function getNestedState (state, path) {
723
764
 
724
765
  function unifyObjectStyle (type, payload, options) {
725
766
  if (isObject(type) && type.type) {
726
- options = payload
727
- payload = type
728
- type = type.type
767
+ options = payload;
768
+ payload = type;
769
+ type = type.type;
729
770
  }
771
+
772
+ assert(typeof type === 'string', ("Expects string as the type, but found " + (typeof type) + "."));
773
+
730
774
  return { type: type, payload: payload, options: options }
731
775
  }
732
776
 
@@ -734,28 +778,28 @@ function install (_Vue) {
734
778
  if (Vue) {
735
779
  console.error(
736
780
  '[vuex] already installed. Vue.use(Vuex) should be called only once.'
737
- )
781
+ );
738
782
  return
739
783
  }
740
- Vue = _Vue
741
- applyMixin(Vue)
784
+ Vue = _Vue;
785
+ applyMixin(Vue);
742
786
  }
743
787
 
744
788
  // auto install in dist mode
745
789
  if (typeof window !== 'undefined' && window.Vue) {
746
- install(window.Vue)
790
+ install(window.Vue);
747
791
  }
748
792
 
749
793
  var index = {
750
794
  Store: Store,
751
795
  install: install,
752
- version: '2.1.1',
796
+ version: '2.1.2',
753
797
  mapState: mapState,
754
798
  mapMutations: mapMutations,
755
799
  mapGetters: mapGetters,
756
800
  mapActions: mapActions
757
- }
801
+ };
758
802
 
759
803
  return index;
760
804
 
761
- })));
805
+ })));