UNPKG

@graphql-hive/logger-pino

Version:
100 lines (97 loc) 2.6 kB
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 };