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');
- }
-
- 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) {
-
- return function result() {
-
- 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;
- }
-
-
- make(methodName) {
- if (methodName === 'debug') {
- methodName = 'log';
- }
-
- if (typeof console[methodName] !== 'undefined') {
- return this.bindMethod(console, methodName);
- } else if (typeof console.log !== 'undefined') {
- return this.bindMethod(console, 'log');
- }
-
- 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);
- });
-
- this.logger.log = this.logger.debug;
- }
- };
|