'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; } 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) => { Level[l.toUpperCase()] = new Level( customLevels[l].value, l.toUpperCase(), customLevels[l].colour ); Level.levels.push(Level[l.toUpperCase()]); }); 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;