UNPKG

@discoveryjs/discovery

Version:

Frontend framework for rapid data (JSON) analysis, shareable serverless reports and dashboards

81 lines (80 loc) 2.54 kB
const noopApi = new Proxy({}, { get: () => () => { } }); const logLevels = ["silent", "error", "warn", "info", "perf", "debug"]; const logMethods = { error: ["error", "error"], warn: ["warn", "warn"], info: ["info", "info"], perf: ["log", "perf"], log: ["log", "any"], debug: ["debug", "debug"] }; export class Logger { #logLevel; #prefix; #api; // stub methods error; warn; info; perf; debug; log; constructor(prefix = "", logLevel = "debug", consoleLikeApi = console) { this.#prefix = prefix; this.#api = consoleLikeApi || noopApi; this.logLevel = logLevel; } shouldLogLevel(logLevel) { const logLevelIndex = logLevels.indexOf(logLevel); return this.#logLevel !== "silent" && logLevelIndex !== -1 && logLevelIndex <= logLevels.indexOf(this.#logLevel); } get logLevel() { return this.#logLevel; } set logLevel(logLevel) { const levelIndex = logLevels.indexOf(logLevel); if (levelIndex === -1) { console.error(this.#prefix, `Bad log level "${logLevel}", supported: ${logLevels.join(", ")}`); } if (logLevel !== this.#logLevel) { const api = this.#api; const prefix = this.#prefix; const createApiMethodWrapper = (apiMethodName) => Function.prototype.bind.call( this.#api[apiMethodName], this.#api, ...this.#prefix ? [this.#prefix] : [] ); const createGroupMethod = (methodName, collapsed) => { return (message, content) => { const groupMethodName = collapsed ? "groupCollapsed" : "group"; api[groupMethodName](`${prefix} ${message}`); const messages = typeof content === "function" ? content() : content; if (Array.isArray(messages)) { for (const entry of messages) { api[methodName](...Array.isArray(entry) ? entry : [entry]); } } api.groupEnd(); }; }; this.#logLevel = logLevel; for (const [methodName, [apiMethod, level]] of Object.entries(logMethods)) { if (level === "any" || this.shouldLogLevel(level)) { this[methodName] = Object.assign(createApiMethodWrapper(apiMethod), { group: createGroupMethod(apiMethod, false), groupCollapsed: createGroupMethod(apiMethod, true) }); } else { this[methodName] = Object.assign(() => { }, { group: () => () => { }, groupCollapsed: () => () => { } }); } } } } }