1 | const LEVELS = [
|
2 | 'debug',
|
3 | 'info',
|
4 | 'warn',
|
5 | 'error',
|
6 | 'silent'
|
7 | ];
|
8 |
|
9 | const LEVEL_TO_CONSOLE_METHOD = new Map([
|
10 | ['debug', 'log'],
|
11 | ['info', 'log'],
|
12 | ['warn', 'log']
|
13 | ]);
|
14 |
|
15 | class Logger {
|
16 |
|
17 | static levels = LEVELS;
|
18 | static defaultLevel = 'info';
|
19 |
|
20 | constructor(level = Logger.defaultLevel) {
|
21 | this.activeLevels = new Set();
|
22 | this.setLogLevel(level);
|
23 | }
|
24 |
|
25 | setLogLevel(level) {
|
26 | const levelIndex = LEVELS.indexOf(level);
|
27 |
|
28 | if (levelIndex === -1) throw new Error(`Invalid log level "${level}". Use one of these: ${LEVELS.join(', ')}`);
|
29 |
|
30 | this.activeLevels.clear();
|
31 |
|
32 | for (const [i, level] of LEVELS.entries()) {
|
33 | if (i >= levelIndex) this.activeLevels.add(level);
|
34 | }
|
35 | }
|
36 |
|
37 | _log(level, ...args) {
|
38 | console[LEVEL_TO_CONSOLE_METHOD.get(level) || level](...args);
|
39 | }
|
40 |
|
41 | };
|
42 |
|
43 | LEVELS.forEach(level => {
|
44 | if (level === 'silent') return;
|
45 |
|
46 | Logger.prototype[level] = function (...args) {
|
47 | if (this.activeLevels.has(level)) this._log(level, ...args);
|
48 | };
|
49 | });
|
50 |
|
51 | module.exports = Logger;
|