summit-logger
Version:
A logger/debug tool for Summit University Dev Students. Creates "pretty-print" log messages, pleasant to the eye and easy to digest. (Summit University All Rights Reserved)
80 lines (68 loc) • 2.4 kB
JavaScript
class SummitLogger {
constructor(namespace) {
this.namespace = namespace;
this.enabled = this.isEnabled();
this.color = this.generateColor();
this._children = {};
}
isEnabled() {
const storedDebugValue = storage.getItem("debug");
if (!storedDebugValue) return false;
const debugNamespaces = new Set(
storedDebugValue.split(",").map((ns) => ns.trim())
);
return (
debugNamespaces.has("*") ||
debugNamespaces.has(this.namespace) ||
[...debugNamespaces].some((ns) => ns.startsWith(`${this.namespace}:`))
);
}
generateColor() {
let hash = 0;
for (let i = 0; i < this.namespace.length; i++) {
hash = this.namespace.charCodeAt(i) + ((hash << 5) - hash);
}
const hue = Math.abs(hash) % 360;
return `color: hsl(${hue}, 70%, 60%); font-weight: bold;`;
}
log(message, ...args) {
if (!this.enabled) return;
console.groupCollapsed(`%c${this.namespace}: ${message}`, this.color);
args.forEach((arg) => console.log(arg));
console.groupEnd();
}
extend(subspace) {
if (!this._children) this._children = {};
if (!this._children[subspace]) {
this._children[subspace] = new SummitLogger(`${this.namespace}:${subspace}`);
}
return this._children[subspace];
}
enable() {
const debugNamespaces = new Set(
(storage.getItem("debug") || "").split(",").map((ns) => ns.trim())
);
debugNamespaces.add(this.namespace);
storage.setItem("debug", [...debugNamespaces].join(","));
this.enabled = true;
}
disable() {
const debugNamespaces = new Set(
(storage.getItem("debug") || "").split(",").map((ns) => ns.trim())
);
debugNamespaces.delete(this.namespace);
storage.setItem("debug", [...debugNamespaces].join(","));
this.enabled = false;
}
}
const storage =
typeof localStorage !== "undefined"
? localStorage
: {
store: {},
getItem: (key) => storage.store[key] || null,
setItem: (key, value) => (storage.store[key] = value),
clear: () => (storage.store = {}),
};
const _summitLogger = (namespace) => new SummitLogger(namespace);
export default _summitLogger;