Projekt

Obecné

Profil

Stáhnout (8.38 KB) Statistiky
| Větev: | Revize:
1
/*! loglevel - v1.6.7 - https://github.com/pimterry/loglevel - (c) 2020 Tim Perry - licensed MIT */
2
(function (root, definition) {
3
    "use strict";
4
    if (typeof define === 'function' && define.amd) {
5
        define(definition);
6
    } else if (typeof module === 'object' && module.exports) {
7
        module.exports = definition();
8
    } else {
9
        root.log = definition();
10
    }
11
}(this, function () {
12
    "use strict";
13

    
14
    // Slightly dubious tricks to cut down minimized file size
15
    var noop = function() {};
16
    var undefinedType = "undefined";
17
    var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (
18
        /Trident\/|MSIE /.test(window.navigator.userAgent)
19
    );
20

    
21
    var logMethods = [
22
        "trace",
23
        "debug",
24
        "info",
25
        "warn",
26
        "error"
27
    ];
28

    
29
    // Cross-browser bind equivalent that works at least back to IE6
30
    function bindMethod(obj, methodName) {
31
        var method = obj[methodName];
32
        if (typeof method.bind === 'function') {
33
            return method.bind(obj);
34
        } else {
35
            try {
36
                return Function.prototype.bind.call(method, obj);
37
            } catch (e) {
38
                // Missing bind shim or IE8 + Modernizr, fallback to wrapping
39
                return function() {
40
                    return Function.prototype.apply.apply(method, [obj, arguments]);
41
                };
42
            }
43
        }
44
    }
45

    
46
    // Trace() doesn't print the message in IE, so for that case we need to wrap it
47
    function traceForIE() {
48
        if (console.log) {
49
            if (console.log.apply) {
50
                console.log.apply(console, arguments);
51
            } else {
52
                // In old IE, native console methods themselves don't have apply().
53
                Function.prototype.apply.apply(console.log, [console, arguments]);
54
            }
55
        }
56
        if (console.trace) console.trace();
57
    }
58

    
59
    // Build the best logging method possible for this env
60
    // Wherever possible we want to bind, not wrap, to preserve stack traces
61
    function realMethod(methodName) {
62
        if (methodName === 'debug') {
63
            methodName = 'log';
64
        }
65

    
66
        if (typeof console === undefinedType) {
67
            return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives
68
        } else if (methodName === 'trace' && isIE) {
69
            return traceForIE;
70
        } else if (console[methodName] !== undefined) {
71
            return bindMethod(console, methodName);
72
        } else if (console.log !== undefined) {
73
            return bindMethod(console, 'log');
74
        } else {
75
            return noop;
76
        }
77
    }
78

    
79
    // These private functions always need `this` to be set properly
80

    
81
    function replaceLoggingMethods(level, loggerName) {
82
        /*jshint validthis:true */
83
        for (var i = 0; i < logMethods.length; i++) {
84
            var methodName = logMethods[i];
85
            this[methodName] = (i < level) ?
86
                noop :
87
                this.methodFactory(methodName, level, loggerName);
88
        }
89

    
90
        // Define log.log as an alias for log.debug
91
        this.log = this.debug;
92
    }
93

    
94
    // In old IE versions, the console isn't present until you first open it.
95
    // We build realMethod() replacements here that regenerate logging methods
96
    function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {
97
        return function () {
98
            if (typeof console !== undefinedType) {
99
                replaceLoggingMethods.call(this, level, loggerName);
100
                this[methodName].apply(this, arguments);
101
            }
102
        };
103
    }
104

    
105
    // By default, we use closely bound real methods wherever possible, and
106
    // otherwise we wait for a console to appear, and then try again.
107
    function defaultMethodFactory(methodName, level, loggerName) {
108
        /*jshint validthis:true */
109
        return realMethod(methodName) ||
110
               enableLoggingWhenConsoleArrives.apply(this, arguments);
111
    }
112

    
113
    function Logger(name, defaultLevel, factory) {
114
      var self = this;
115
      var currentLevel;
116
      var storageKey = "loglevel";
117
      if (name) {
118
        storageKey += ":" + name;
119
      }
120

    
121
      function persistLevelIfPossible(levelNum) {
122
          var levelName = (logMethods[levelNum] || 'silent').toUpperCase();
123

    
124
          if (typeof window === undefinedType) return;
125

    
126
          // Use localStorage if available
127
          try {
128
              window.localStorage[storageKey] = levelName;
129
              return;
130
          } catch (ignore) {}
131

    
132
          // Use session cookie as fallback
133
          try {
134
              window.document.cookie =
135
                encodeURIComponent(storageKey) + "=" + levelName + ";";
136
          } catch (ignore) {}
137
      }
138

    
139
      function getPersistedLevel() {
140
          var storedLevel;
141

    
142
          if (typeof window === undefinedType) return;
143

    
144
          try {
145
              storedLevel = window.localStorage[storageKey];
146
          } catch (ignore) {}
147

    
148
          // Fallback to cookies if local storage gives us nothing
149
          if (typeof storedLevel === undefinedType) {
150
              try {
151
                  var cookie = window.document.cookie;
152
                  var location = cookie.indexOf(
153
                      encodeURIComponent(storageKey) + "=");
154
                  if (location !== -1) {
155
                      storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];
156
                  }
157
              } catch (ignore) {}
158
          }
159

    
160
          // If the stored level is not valid, treat it as if nothing was stored.
161
          if (self.levels[storedLevel] === undefined) {
162
              storedLevel = undefined;
163
          }
164

    
165
          return storedLevel;
166
      }
167

    
168
      /*
169
       *
170
       * Public logger API - see https://github.com/pimterry/loglevel for details
171
       *
172
       */
173

    
174
      self.name = name;
175

    
176
      self.levels = { "TRACE": 0, "DEBUG": 1, "INFO": 2, "WARN": 3,
177
          "ERROR": 4, "SILENT": 5};
178

    
179
      self.methodFactory = factory || defaultMethodFactory;
180

    
181
      self.getLevel = function () {
182
          return currentLevel;
183
      };
184

    
185
      self.setLevel = function (level, persist) {
186
          if (typeof level === "string" && self.levels[level.toUpperCase()] !== undefined) {
187
              level = self.levels[level.toUpperCase()];
188
          }
189
          if (typeof level === "number" && level >= 0 && level <= self.levels.SILENT) {
190
              currentLevel = level;
191
              if (persist !== false) {  // defaults to true
192
                  persistLevelIfPossible(level);
193
              }
194
              replaceLoggingMethods.call(self, level, name);
195
              if (typeof console === undefinedType && level < self.levels.SILENT) {
196
                  return "No console available for logging";
197
              }
198
          } else {
199
              throw "log.setLevel() called with invalid level: " + level;
200
          }
201
      };
202

    
203
      self.setDefaultLevel = function (level) {
204
          if (!getPersistedLevel()) {
205
              self.setLevel(level, false);
206
          }
207
      };
208

    
209
      self.enableAll = function(persist) {
210
          self.setLevel(self.levels.TRACE, persist);
211
      };
212

    
213
      self.disableAll = function(persist) {
214
          self.setLevel(self.levels.SILENT, persist);
215
      };
216

    
217
      // Initialize with the right level
218
      var initialLevel = getPersistedLevel();
219
      if (initialLevel == null) {
220
          initialLevel = defaultLevel == null ? "WARN" : defaultLevel;
221
      }
222
      self.setLevel(initialLevel, false);
223
    }
224

    
225
    /*
226
     *
227
     * Top-level API
228
     *
229
     */
230

    
231
    var defaultLogger = new Logger();
232

    
233
    var _loggersByName = {};
234
    defaultLogger.getLogger = function getLogger(name) {
235
        if (typeof name !== "string" || name === "") {
236
          throw new TypeError("You must supply a name when creating a logger.");
237
        }
238

    
239
        var logger = _loggersByName[name];
240
        if (!logger) {
241
          logger = _loggersByName[name] = new Logger(
242
            name, defaultLogger.getLevel(), defaultLogger.methodFactory);
243
        }
244
        return logger;
245
    };
246

    
247
    // Grab the current global log variable in case of overwrite
248
    var _log = (typeof window !== undefinedType) ? window.log : undefined;
249
    defaultLogger.noConflict = function() {
250
        if (typeof window !== undefinedType &&
251
               window.log === defaultLogger) {
252
            window.log = _log;
253
        }
254

    
255
        return defaultLogger;
256
    };
257

    
258
    defaultLogger.getLoggers = function getLoggers() {
259
        return _loggersByName;
260
    };
261

    
262
    return defaultLogger;
263
}));
(1-1/2)