1 |
|
---|
2 |
|
---|
3 | const configuration = require('./configuration');
|
---|
4 |
|
---|
5 | const validColours = [
|
---|
6 | 'white', 'grey', 'black',
|
---|
7 | 'blue', 'cyan', 'green',
|
---|
8 | 'magenta', 'red', 'yellow'
|
---|
9 | ];
|
---|
10 |
|
---|
11 | class Level {
|
---|
12 | constructor(level, levelStr, colour) {
|
---|
13 | this.level = level;
|
---|
14 | this.levelStr = levelStr;
|
---|
15 | this.colour = colour;
|
---|
16 | }
|
---|
17 |
|
---|
18 | toString() {
|
---|
19 | return this.levelStr;
|
---|
20 | }
|
---|
21 |
|
---|
22 | /**
|
---|
23 | * converts given String to corresponding Level
|
---|
24 | * @param {(Level|string)} sArg -- String value of Level OR Log4js.Level
|
---|
25 | * @param {Level} [defaultLevel] -- default Level, if no String representation
|
---|
26 | * @return {Level}
|
---|
27 | */
|
---|
28 | static getLevel(sArg, defaultLevel) {
|
---|
29 | if (!sArg) {
|
---|
30 | return defaultLevel;
|
---|
31 | }
|
---|
32 |
|
---|
33 | if (sArg instanceof Level) {
|
---|
34 | return sArg;
|
---|
35 | }
|
---|
36 |
|
---|
37 | // a json-serialised level won't be an instance of Level (see issue #768)
|
---|
38 | if (sArg instanceof Object && sArg.levelStr) {
|
---|
39 | sArg = sArg.levelStr;
|
---|
40 | }
|
---|
41 |
|
---|
42 | return Level[sArg.toString().toUpperCase()] || defaultLevel;
|
---|
43 | }
|
---|
44 |
|
---|
45 | static addLevels(customLevels) {
|
---|
46 | if (customLevels) {
|
---|
47 | const levels = Object.keys(customLevels);
|
---|
48 | levels.forEach((l) => {
|
---|
49 | const levelStr = l.toUpperCase();
|
---|
50 | Level[levelStr] = new Level(
|
---|
51 | customLevels[l].value,
|
---|
52 | levelStr,
|
---|
53 | customLevels[l].colour
|
---|
54 | );
|
---|
55 | const existingLevelIndex = Level.levels.findIndex(lvl => lvl.levelStr === levelStr);
|
---|
56 | if (existingLevelIndex > -1) {
|
---|
57 | Level.levels[existingLevelIndex] = Level[levelStr];
|
---|
58 | } else {
|
---|
59 | Level.levels.push(Level[levelStr]);
|
---|
60 | }
|
---|
61 | });
|
---|
62 | Level.levels.sort((a, b) => a.level - b.level);
|
---|
63 | }
|
---|
64 | }
|
---|
65 |
|
---|
66 |
|
---|
67 | isLessThanOrEqualTo(otherLevel) {
|
---|
68 | if (typeof otherLevel === 'string') {
|
---|
69 | otherLevel = Level.getLevel(otherLevel);
|
---|
70 | }
|
---|
71 | return this.level <= otherLevel.level;
|
---|
72 | }
|
---|
73 |
|
---|
74 | isGreaterThanOrEqualTo(otherLevel) {
|
---|
75 | if (typeof otherLevel === 'string') {
|
---|
76 | otherLevel = Level.getLevel(otherLevel);
|
---|
77 | }
|
---|
78 | return this.level >= otherLevel.level;
|
---|
79 | }
|
---|
80 |
|
---|
81 | isEqualTo(otherLevel) {
|
---|
82 | if (typeof otherLevel === 'string') {
|
---|
83 | otherLevel = Level.getLevel(otherLevel);
|
---|
84 | }
|
---|
85 | return this.level === otherLevel.level;
|
---|
86 | }
|
---|
87 | }
|
---|
88 |
|
---|
89 | Level.levels = [];
|
---|
90 | Level.addLevels({
|
---|
91 | ALL: { value: Number.MIN_VALUE, colour: 'grey' },
|
---|
92 | TRACE: { value: 5000, colour: 'blue' },
|
---|
93 | DEBUG: { value: 10000, colour: 'cyan' },
|
---|
94 | INFO: { value: 20000, colour: 'green' },
|
---|
95 | WARN: { value: 30000, colour: 'yellow' },
|
---|
96 | ERROR: { value: 40000, colour: 'red' },
|
---|
97 | FATAL: { value: 50000, colour: 'magenta' },
|
---|
98 | MARK: { value: 9007199254740992, colour: 'grey' }, // 2^53
|
---|
99 | OFF: { value: Number.MAX_VALUE, colour: 'grey' }
|
---|
100 | });
|
---|
101 |
|
---|
102 | configuration.addListener((config) => {
|
---|
103 | const levelConfig = config.levels;
|
---|
104 | if (levelConfig) {
|
---|
105 | configuration.throwExceptionIf(
|
---|
106 | config,
|
---|
107 | configuration.not(configuration.anObject(levelConfig)),
|
---|
108 | 'levels must be an object'
|
---|
109 | );
|
---|
110 | const newLevels = Object.keys(levelConfig);
|
---|
111 | newLevels.forEach((l) => {
|
---|
112 | configuration.throwExceptionIf(
|
---|
113 | config,
|
---|
114 | configuration.not(configuration.validIdentifier(l)),
|
---|
115 | `level name "${l}" is not a valid identifier (must start with a letter, only contain A-Z,a-z,0-9,_)`
|
---|
116 | );
|
---|
117 | configuration.throwExceptionIf(
|
---|
118 | config,
|
---|
119 | configuration.not(configuration.anObject(levelConfig[l])),
|
---|
120 | `level "${l}" must be an object`
|
---|
121 | );
|
---|
122 | configuration.throwExceptionIf(
|
---|
123 | config,
|
---|
124 | configuration.not(levelConfig[l].value),
|
---|
125 | `level "${l}" must have a 'value' property`
|
---|
126 | );
|
---|
127 | configuration.throwExceptionIf(
|
---|
128 | config,
|
---|
129 | configuration.not(configuration.anInteger(levelConfig[l].value)),
|
---|
130 | `level "${l}".value must have an integer value`
|
---|
131 | );
|
---|
132 | configuration.throwExceptionIf(
|
---|
133 | config,
|
---|
134 | configuration.not(levelConfig[l].colour),
|
---|
135 | `level "${l}" must have a 'colour' property`
|
---|
136 | );
|
---|
137 | configuration.throwExceptionIf(
|
---|
138 | config,
|
---|
139 | configuration.not(validColours.indexOf(levelConfig[l].colour) > -1),
|
---|
140 | `level "${l}".colour must be one of ${validColours.join(', ')}`
|
---|
141 | );
|
---|
142 | });
|
---|
143 | }
|
---|
144 | });
|
---|
145 |
|
---|
146 | configuration.addListener((config) => {
|
---|
147 | Level.addLevels(config.levels);
|
---|
148 | });
|
---|
149 |
|
---|
150 | module.exports = Level;
|
---|