Spaces:
Runtime error
Runtime error
| const LogLevel = { | |
| Debug: { | |
| name: "Debug", | |
| color: [ 38, 5, 13 ], | |
| error: false, | |
| production: false, | |
| textColor: null | |
| }, | |
| Info: { | |
| name: "Info", | |
| color: null, | |
| error: false, | |
| production: true, | |
| textColor: null | |
| }, | |
| Success: { | |
| name: "Success", | |
| color: [ 38, 5, 10 ], | |
| error: false, | |
| production: true, | |
| textColor: null | |
| }, | |
| Warning: { | |
| name: "Warning", | |
| color: [ 38, 5, 11 ], | |
| error: true, | |
| production: true, | |
| textColor: [ 38, 5, 11 ] | |
| }, | |
| Error: { | |
| name: "Error", | |
| color: [ 38, 5, 9 ], | |
| error: true, | |
| production: true, | |
| textColor: [ 38, 5, 9 ] | |
| }, | |
| Fatal: { | |
| name: "Fatal", | |
| color: [ 38, 5, 0, 48, 5, 9 ], | |
| error: true, | |
| production: true, | |
| textColor: [ 38, 5, 9 ] | |
| } | |
| }; | |
| const LogLevel_ = Object.keys(LogLevel).reduce((r, v) => { r[v] = v; return r; }, {}); | |
| function color(colors, text) { | |
| if (colors == null) return text; | |
| if (typeof colors != "object") colors = [ 38, 5, colors ]; | |
| return `\x1b[${colors.join(";")}m${text}\x1b[0m`; | |
| } | |
| function bracket(text) { | |
| return `${color(7, "[")}${text}${color(7, "]")}`; | |
| } | |
| function Logger(production, prefix) { | |
| if (production != null && arguments.length === 1 && production.data != null && typeof production.data === "object") { | |
| production = production.data; | |
| } | |
| if (production != null && typeof production === "object" && arguments.length === 1 && typeof production.production === "boolean") { | |
| ({ prefix, production } = production); | |
| } | |
| if (typeof production !== "boolean") { | |
| throw new TypeError("production must be of type boolean"); | |
| } | |
| if (prefix != null && typeof prefix !== "string") { | |
| throw new TypeError("prefix must be of type string"); | |
| } | |
| if (prefix == null || prefix.length == 0) prefix = null; | |
| const log = function(level, ...messages) { | |
| if (typeof level !== "string" || !Object.keys(LogLevel).includes(level)) { | |
| throw new TypeError("type must be a LogLevel"); | |
| } | |
| const logType = LogLevel[level]; | |
| if (production && !logType.production) return; | |
| const prefixText = prefix != null ? bracket(prefix) + " " : ""; | |
| const typeText = bracket(color(logType.color, logType.name.toUpperCase())); | |
| for (const i in messages) { | |
| if (!messages.hasOwnProperty(i)) continue; | |
| const output = `${prefixText}${typeText} `; | |
| process[logType.error ? "stderr" : "stdout"].write(output); | |
| console[logType.error ? "error" : "log"](messages[i]); | |
| } | |
| }; | |
| log.data = Object.freeze({ production, prefix }); | |
| return Object.freeze(log); | |
| } | |
| module.exports = { Logger, LogLevel: Object.freeze(LogLevel_) }; | |