@graphql-hive/logger-pino
Version:
100 lines (97 loc) • 2.6 kB
JavaScript
import { LogLevel } from '@graphql-mesh/utils';
function prepareArgs(messageArgs) {
const flattenedMessageArgs = messageArgs.flat(Infinity).flatMap((messageArg) => {
if (typeof messageArg === "function") {
messageArg = messageArg();
}
if (messageArg?.toJSON) {
messageArg = messageArg.toJSON();
}
if (messageArg instanceof AggregateError) {
return messageArg.errors;
}
return messageArg;
});
let message = "";
const extras = [];
for (let messageArg of flattenedMessageArgs) {
if (messageArg == null) {
continue;
}
const typeofMessageArg = typeof messageArg;
if (typeofMessageArg === "string" || typeofMessageArg === "number" || typeofMessageArg === "boolean") {
message = message ? message + ", " + messageArg : messageArg;
} else if (typeofMessageArg === "object") {
extras.push(messageArg);
}
}
if (extras.length > 0) {
return [Object.assign({}, ...extras), message];
}
return [message];
}
class PinoLoggerAdapter {
constructor(pinoLogger, meta = {}) {
this.pinoLogger = pinoLogger;
this.meta = meta;
if (meta["name"]) {
this.name = meta["name"];
}
}
name;
get level() {
if (this.pinoLogger.level) {
return LogLevel[this.pinoLogger.level];
}
return LogLevel.silent;
}
set level(level) {
this.pinoLogger.level = LogLevel[level];
}
isLevelEnabled(level) {
if (this.level > level) {
return false;
}
return true;
}
log(...args) {
if (this.isLevelEnabled(LogLevel.info)) {
this.pinoLogger.info(...prepareArgs(args));
}
}
info(...args) {
if (this.isLevelEnabled(LogLevel.info)) {
this.pinoLogger.info(...prepareArgs(args));
}
}
warn(...args) {
if (this.isLevelEnabled(LogLevel.warn)) {
this.pinoLogger.warn(...prepareArgs(args));
}
}
error(...args) {
if (this.isLevelEnabled(LogLevel.error)) {
this.pinoLogger.error(...prepareArgs(args));
}
}
debug(...lazyArgs) {
if (this.isLevelEnabled(LogLevel.debug)) {
this.pinoLogger.debug(...prepareArgs(lazyArgs));
}
}
child(nameOrMeta) {
if (typeof nameOrMeta === "string") {
nameOrMeta = {
name: this.name ? this.name.includes(nameOrMeta) ? this.name : `${this.name}, ${nameOrMeta}` : nameOrMeta
};
}
return new PinoLoggerAdapter(this.pinoLogger.child(nameOrMeta), {
...this.meta,
...nameOrMeta
});
}
}
function createLoggerFromPino(pinoLogger) {
return new PinoLoggerAdapter(pinoLogger);
}
export { createLoggerFromPino };