@discoveryjs/discovery
Version:
Frontend framework for rapid data (JSON) analysis, shareable serverless reports and dashboards
81 lines (80 loc) • 2.54 kB
JavaScript
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: () => () => {
}
});
}
}
}
}
}