| 'use strict'; | 
|   | 
| /* eslint-disable | 
|   arrow-parens, | 
|   multiline-ternary, | 
|   consistent-return, | 
|   no-param-reassign, | 
|   prefer-destructuring | 
| */ | 
| const noop = () => {}; | 
|   | 
| const levels = Symbol('levels'); | 
| const instance = Symbol('instance'); | 
|   | 
| class MethodFactory { | 
|   constructor(logger) { | 
|     this[levels] = { | 
|       TRACE: 0, | 
|       DEBUG: 1, | 
|       INFO: 2, | 
|       WARN: 3, | 
|       ERROR: 4, | 
|       SILENT: 5 | 
|     }; | 
|   | 
|     this[instance] = logger; | 
|   } | 
|   | 
|   set logger(logger) { | 
|     this[instance] = logger; | 
|   } | 
|   | 
|   get logger() { | 
|     return this[instance]; | 
|   } | 
|   | 
|   get levels() { | 
|     return this[levels]; | 
|   } | 
|   | 
|   get methods() { | 
|     return Object.keys(this.levels) | 
|       .map((key) => key.toLowerCase()) | 
|       .filter((key) => key !== 'silent'); | 
|   } | 
|   | 
|   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(method) { | 
|     if (method === 'debug') { | 
|       method = 'log'; | 
|     } | 
|   | 
|     /* eslint-disable no-console */ | 
|     if (typeof console[method] !== 'undefined') { | 
|       return this.bindMethod(console, method); | 
|     } else if (typeof console.log !== 'undefined') { | 
|       return this.bindMethod(console, 'log'); | 
|     } | 
|   | 
|     /* eslint-enable no-console */ | 
|     return noop; | 
|   } | 
|   | 
|   // eslint-disable-next-line class-methods-use-this | 
|   bindMethod(obj, name) { | 
|     const method = obj[name]; | 
|   | 
|     if (typeof method.bind === 'function') { | 
|       return method.bind(obj); | 
|     } | 
|   | 
|     try { | 
|       return Function.prototype.bind.call(method, obj); | 
|     } catch (err) { | 
|       // 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]); | 
|       }; | 
|     } | 
|   } | 
|   | 
|   replaceMethods(logLevel) { | 
|     const level = this.distillLevel(logLevel); | 
|   | 
|     if (level == null) { | 
|       throw new Error( | 
|         `loglevel: replaceMethods() called with invalid level: ${logLevel}` | 
|       ); | 
|     } | 
|   | 
|     if (!this.logger || this.logger.type !== 'LogLevel') { | 
|       throw new TypeError( | 
|         'loglevel: Logger is undefined or invalid. Please specify a valid Logger instance.' | 
|       ); | 
|     } | 
|   | 
|     this.methods.forEach((method) => { | 
|       this.logger[method] = (this.levels[method.toUpperCase()] < level) | 
|         ? noop | 
|         : this.make(method); | 
|     }); | 
|   | 
|     // Define log.log as an alias for log.debug | 
|     this.logger.log = this.logger.debug; | 
|   } | 
| } | 
|   | 
| module.exports = MethodFactory; |