| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 | 'use strict';const noop = () => {};const levels = Symbol('valid log levels');const instance = Symbol('a log instance');module.exports = class MethodFactory {  constructor(logger) {    this[instance] = logger;    this[levels] = {      TRACE: 0,      DEBUG: 1,      INFO: 2,      WARN: 3,      ERROR: 4,      SILENT: 5    };  }  get levels() {    return this[levels];  }  get logger() {    return this[instance];  }  set logger(logger) {    this[instance] = logger;  }  get methods() {    return Object.keys(this.levels)      .map(key => key.toLowerCase())      .filter(key => key !== 'silent');  }  // eslint-disable-next-line class-methods-use-this  bindMethod(obj, methodName) {    const method = obj[methodName];    if (typeof method.bind === 'function') {      return method.bind(obj);    }    try {      return Function.prototype.bind.call(method, obj);    } catch (e) {      // Missing bind shim or IE8 + Modernizr, fallback to wrapping      return function result() {        // eslint-disable-next-line prefer-rest-params        return Function.prototype.apply.apply(method, [obj, arguments]);      };    }  }  distillLevel(level) {    let result = level;    if (typeof result === 'string' && typeof this.levels[result.toUpperCase()] !== 'undefined') {      result = this.levels[result.toUpperCase()];    }    if (this.levelValid(result)) {      return result;    }  }  levelValid(level) {    if (typeof level === 'number' && level >= 0 && level <= this.levels.SILENT) {      return true;    }    return false;  }  /**   * Build the best logging method possible for this env   * Wherever possible we want to bind, not wrap, to preserve stack traces.   * Since we're targeting modern browsers, there's no need to wait for the   * console to become available.   */  // eslint-disable-next-line class-methods-use-this  make(methodName) {    if (methodName === 'debug') {      methodName = 'log';    }    /* eslint-disable no-console */    if (typeof console[methodName] !== 'undefined') {      return this.bindMethod(console, methodName);    } else if (typeof console.log !== 'undefined') {      return this.bindMethod(console, 'log');    }    /* eslint-enable no-console */    return noop;  }  replaceMethods(logLevel) {    const level = this.distillLevel(logLevel);    if (level == null) {      throw new Error(`loglevelnext: replaceMethods() called with invalid level: ${logLevel}`);    }    if (!this.logger || this.logger.type !== 'LogLevel') {      throw new TypeError('loglevelnext: Logger is undefined or invalid. Please specify a valid Logger instance.');    }    this.methods.forEach((methodName) => {      const { [methodName.toUpperCase()]: methodLevel } = this.levels;      this.logger[methodName] = (methodLevel < level) ? noop : this.make(methodName);    });    // Define log.log as an alias for log.debug    this.logger.log = this.logger.debug;  }};
 |