/
logger.js
93 lines (80 loc) · 2.23 KB
/
logger.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
"use strict";
const readline = require("readline");
const wcwidth = require("wcwidth");
// eslint-disable-next-line no-restricted-modules
const { default: stripAnsi } = require("../../vendors/strip-ansi.js");
// eslint-disable-next-line no-restricted-modules
const { default: chalk } = require("../../vendors/chalk.js");
const countLines = (stream, text) => {
const columns = stream.columns || 80;
let lineCount = 0;
for (const line of stripAnsi(text).split("\n")) {
lineCount += Math.max(1, Math.ceil(wcwidth(line) / columns));
}
return lineCount;
};
const clear = (stream, text) => () => {
const lineCount = countLines(stream, text);
for (let line = 0; line < lineCount; line++) {
if (line > 0) {
readline.moveCursor(stream, 0, -1);
}
readline.clearLine(stream, 0);
readline.cursorTo(stream, 0);
}
};
const emptyLogResult = { clear() {} };
function createLogger(logLevel = "log") {
return {
logLevel,
warn: createLogFunc("warn", "yellow"),
error: createLogFunc("error", "red"),
debug: createLogFunc("debug", "blue"),
log: createLogFunc("log"),
};
function createLogFunc(loggerName, color) {
if (!shouldLog(loggerName)) {
return () => emptyLogResult;
}
const prefix = color ? `[${chalk[color](loggerName)}] ` : "";
const stream = process[loggerName === "log" ? "stdout" : "stderr"];
return (message, options) => {
options = {
newline: true,
clearable: false,
...options,
};
message = message.replace(/^/gm, prefix) + (options.newline ? "\n" : "");
stream.write(message);
if (options.clearable) {
return {
clear: clear(stream, message),
};
}
};
}
function shouldLog(loggerName) {
switch (logLevel) {
case "silent":
return false;
case "debug":
if (loggerName === "debug") {
return true;
}
// fall through
case "log":
if (loggerName === "log") {
return true;
}
// fall through
case "warn":
if (loggerName === "warn") {
return true;
}
// fall through
case "error":
return loggerName === "error";
}
}
}
module.exports = createLogger;