| 'use strict'; |
| |
| const configuration = require('./configuration'); |
| |
| const validColours = [ |
| 'white', 'grey', 'black', |
| 'blue', 'cyan', 'green', |
| 'magenta', 'red', 'yellow' |
| ]; |
| |
| class Level { |
| constructor(level, levelStr, colour) { |
| this.level = level; |
| this.levelStr = levelStr; |
| this.colour = colour; |
| } |
| |
| toString() { |
| return this.levelStr; |
| } |
| |
| /** |
| * converts given String to corresponding Level |
| * @param {Level|String} sArg -- String value of Level OR Log4js.Level |
| * @param {Level} [defaultLevel] -- default Level, if no String representation |
| * @return {Level} |
| */ |
| static getLevel(sArg, defaultLevel) { |
| if (!sArg) { |
| return defaultLevel; |
| } |
| |
| if (sArg instanceof Level) { |
| return sArg; |
| } |
| |
| // a json-serialised level won't be an instance of Level (see issue #768) |
| if (sArg instanceof Object && sArg.levelStr) { |
| sArg = sArg.levelStr; |
| } |
| |
| if (typeof sArg === 'string') { |
| return Level[sArg.toUpperCase()] || defaultLevel; |
| } |
| |
| return Level.getLevel(sArg.toString()); |
| } |
| |
| static addLevels(customLevels) { |
| if (customLevels) { |
| const levels = Object.keys(customLevels); |
| levels.forEach((l) => { |
| const levelStr = l.toUpperCase(); |
| Level[levelStr] = new Level( |
| customLevels[l].value, |
| levelStr, |
| customLevels[l].colour |
| ); |
| const existingLevelIndex = Level.levels.findIndex(lvl => lvl.levelStr === levelStr); |
| if (existingLevelIndex > -1) { |
| Level.levels[existingLevelIndex] = Level[levelStr]; |
| } else { |
| Level.levels.push(Level[levelStr]); |
| } |
| }); |
| Level.levels.sort((a, b) => a.level - b.level); |
| } |
| } |
| |
| |
| isLessThanOrEqualTo(otherLevel) { |
| if (typeof otherLevel === 'string') { |
| otherLevel = Level.getLevel(otherLevel); |
| } |
| return this.level <= otherLevel.level; |
| } |
| |
| isGreaterThanOrEqualTo(otherLevel) { |
| if (typeof otherLevel === 'string') { |
| otherLevel = Level.getLevel(otherLevel); |
| } |
| return this.level >= otherLevel.level; |
| } |
| |
| isEqualTo(otherLevel) { |
| if (typeof otherLevel === 'string') { |
| otherLevel = Level.getLevel(otherLevel); |
| } |
| return this.level === otherLevel.level; |
| } |
| } |
| |
| Level.levels = []; |
| Level.addLevels({ |
| ALL: { value: Number.MIN_VALUE, colour: 'grey' }, |
| TRACE: { value: 5000, colour: 'blue' }, |
| DEBUG: { value: 10000, colour: 'cyan' }, |
| INFO: { value: 20000, colour: 'green' }, |
| WARN: { value: 30000, colour: 'yellow' }, |
| ERROR: { value: 40000, colour: 'red' }, |
| FATAL: { value: 50000, colour: 'magenta' }, |
| MARK: { value: 9007199254740992, colour: 'grey' }, // 2^53 |
| OFF: { value: Number.MAX_VALUE, colour: 'grey' } |
| }); |
| |
| configuration.addListener((config) => { |
| const levelConfig = config.levels; |
| if (levelConfig) { |
| configuration.throwExceptionIf( |
| config, |
| configuration.not(configuration.anObject(levelConfig)), |
| 'levels must be an object' |
| ); |
| const newLevels = Object.keys(levelConfig); |
| newLevels.forEach((l) => { |
| configuration.throwExceptionIf( |
| config, |
| configuration.not(configuration.validIdentifier(l)), |
| `level name "${l}" is not a valid identifier (must start with a letter, only contain A-Z,a-z,0-9,_)` |
| ); |
| configuration.throwExceptionIf( |
| config, |
| configuration.not(configuration.anObject(levelConfig[l])), |
| `level "${l}" must be an object` |
| ); |
| configuration.throwExceptionIf( |
| config, |
| configuration.not(levelConfig[l].value), |
| `level "${l}" must have a 'value' property` |
| ); |
| configuration.throwExceptionIf( |
| config, |
| configuration.not(configuration.anInteger(levelConfig[l].value)), |
| `level "${l}".value must have an integer value` |
| ); |
| configuration.throwExceptionIf( |
| config, |
| configuration.not(levelConfig[l].colour), |
| `level "${l}" must have a 'colour' property` |
| ); |
| configuration.throwExceptionIf( |
| config, |
| configuration.not(validColours.indexOf(levelConfig[l].colour) > -1), |
| `level "${l}".colour must be one of ${validColours.join(', ')}` |
| ); |
| }); |
| } |
| }); |
| |
| configuration.addListener((config) => { |
| Level.addLevels(config.levels); |
| }); |
| |
| module.exports = Level; |