Blame view

node_modules/vuex/dist/logger.js 3.68 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
  (function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
    typeof define === 'function' && define.amd ? define(factory) :
    (global = global || self, global.createVuexLogger = factory());
  }(this, function () { 'use strict';
  
    /**
     * Get the first item that pass the test
     * by second argument function
     *
     * @param {Array} list
     * @param {Function} f
     * @return {*}
     */
    function find (list, f) {
      return list.filter(f)[0]
    }
  
    /**
     * Deep copy the given object considering circular structure.
     * This function caches all nested objects and its copies.
     * If it detects circular structure, use cached copy to avoid infinite loop.
     *
     * @param {*} obj
     * @param {Array<Object>} cache
     * @return {*}
     */
    function deepCopy (obj, cache) {
      if ( cache === void 0 ) cache = [];
  
      // just return if obj is immutable value
      if (obj === null || typeof obj !== 'object') {
        return obj
      }
  
      // if obj is hit, it is in circular structure
      var hit = find(cache, function (c) { return c.original === obj; });
      if (hit) {
        return hit.copy
      }
  
      var copy = Array.isArray(obj) ? [] : {};
      // put the copy into cache at first
      // because we want to refer it in recursive deepCopy
      cache.push({
        original: obj,
        copy: copy
      });
  
      Object.keys(obj).forEach(function (key) {
        copy[key] = deepCopy(obj[key], cache);
      });
  
      return copy
    }
  
    // Credits: borrowed code from fcomb/redux-logger
  
    function createLogger (ref) {
      if ( ref === void 0 ) ref = {};
      var collapsed = ref.collapsed; if ( collapsed === void 0 ) collapsed = true;
      var filter = ref.filter; if ( filter === void 0 ) filter = function (mutation, stateBefore, stateAfter) { return true; };
      var transformer = ref.transformer; if ( transformer === void 0 ) transformer = function (state) { return state; };
      var mutationTransformer = ref.mutationTransformer; if ( mutationTransformer === void 0 ) mutationTransformer = function (mut) { return mut; };
      var logger = ref.logger; if ( logger === void 0 ) logger = console;
  
      return function (store) {
        var prevState = deepCopy(store.state);
  
        store.subscribe(function (mutation, state) {
          if (typeof logger === 'undefined') {
            return
          }
          var nextState = deepCopy(state);
  
          if (filter(mutation, prevState, nextState)) {
            var time = new Date();
            var formattedTime = " @ " + (pad(time.getHours(), 2)) + ":" + (pad(time.getMinutes(), 2)) + ":" + (pad(time.getSeconds(), 2)) + "." + (pad(time.getMilliseconds(), 3));
            var formattedMutation = mutationTransformer(mutation);
            var message = "mutation " + (mutation.type) + formattedTime;
            var startMessage = collapsed
              ? logger.groupCollapsed
              : logger.group;
  
            // render
            try {
              startMessage.call(logger, message);
            } catch (e) {
              console.log(message);
            }
  
            logger.log('%c prev state', 'color: #9E9E9E; font-weight: bold', transformer(prevState));
            logger.log('%c mutation', 'color: #03A9F4; font-weight: bold', formattedMutation);
            logger.log('%c next state', 'color: #4CAF50; font-weight: bold', transformer(nextState));
  
            try {
              logger.groupEnd();
            } catch (e) {
              logger.log('—— log end ——');
            }
          }
  
          prevState = nextState;
        });
      }
    }
  
    function repeat (str, times) {
      return (new Array(times + 1)).join(str)
    }
  
    function pad (num, maxLength) {
      return repeat('0', maxLength - num.toString().length) + num
    }
  
    return createLogger;
  
  }));