acuminous/tripitaka

View on GitHub
lib/Level.js

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
class Level {
  constructor({ name, method, value }) {
    this._name = name;
    this._method = method;
    this._value = value;
  }

  static decorate(logger) {
    Level.LEVELS.forEach((level) => level._decorate(logger));
  }

  get name() {
    return this._name;
  }

  static lookup(name) {
    return Level.LEVELS.find((level) => level.name === name);
  }

  equals(other) {
    return other._value === this._value;
  }

  satisfies(other) {
    return other.compareValue(this._value) >= 0;
  }

  compareValue(value) {
    return value - this._value;
  }

  _decorate(logger) {
    /* eslint-disable-next-line no-param-reassign */
    logger[this._method] = (message, ctx) => logger.log(this, message, ctx);
  }
}

Level.TRACE = new Level({ name: 'TRACE', method: 'trace', value: 100 });
Level.DEBUG = new Level({ name: 'DEBUG', method: 'debug', value: 200 });
Level.INFO = new Level({ name: 'INFO', method: 'info', value: 300 });
Level.WARN = new Level({ name: 'WARN', method: 'warn', value: 400 });
Level.ERROR = new Level({ name: 'ERROR', method: 'error', value: 500 });

Level.LEVELS = [Level.TRACE, Level.DEBUG, Level.INFO, Level.WARN, Level.ERROR];

module.exports = Level;