UNPKG

nightingale-logger

Version:
1 lines 29.6 kB
{"version":3,"file":"index-node20.mjs","sources":["../src/index.ts"],"sourcesContent":["import * as util from \"node:util\";\nimport { Level } from \"nightingale-levels\";\nimport type {\n Handler,\n LogRecord,\n Metadata,\n MetadataStyles,\n Processor,\n Styles,\n} from \"nightingale-types\";\nimport { POB_TARGET } from \"pob-babel\";\n\nexport { Level } from \"nightingale-levels\";\n\nexport interface Options<T extends Metadata> {\n symbol?: string;\n metadataStyles?: MetadataStyles<T>;\n styles?: Styles;\n}\n\nexport interface ComputedConfigForKey {\n handlers: Handler[];\n processors: Processor[];\n}\n\nexport interface ExtendedFunctionNameMetadata {\n functionName: string;\n}\n\nexport interface Config {\n handler?: Handler;\n handlers?: Handler[];\n key?: string;\n keys?: string[];\n pattern?: RegExp;\n processor?: Processor;\n processors?: Processor[];\n stop?: boolean;\n}\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __NIGHTINGALE_CONFIG: Config[];\n // eslint-disable-next-line no-var\n var __NIGHTINGALE_LOGGER_MAP_CACHE: Map<string, ComputedConfigForKey>;\n // eslint-disable-next-line no-var\n var __NIGHTINGALE_CONFIG_DEFAULT: ComputedConfigForKey;\n // eslint-disable-next-line no-var\n var __NIGHTINGALE_GLOBAL_HANDLERS: unknown;\n // eslint-disable-next-line no-var\n var __NIGHTINGALE_GET_CONFIG_FOR_LOGGER: (\n key: string,\n ) => ComputedConfigForKey;\n // eslint-disable-next-line no-var\n var __NIGHTINGALE_GET_CONFIG_FOR_LOGGER_RECORD: (\n key: string,\n level: number,\n ) => ComputedConfigForKey;\n}\n\nconst globalOrWindow: typeof globalThis =\n typeof globalThis !== \"undefined\" ? globalThis : globalThis;\n\nif (!globalOrWindow.__NIGHTINGALE_GET_CONFIG_FOR_LOGGER) {\n globalOrWindow.__NIGHTINGALE_GET_CONFIG_FOR_LOGGER =\n (): ComputedConfigForKey => ({\n handlers: [],\n processors: [],\n });\n}\n\nif (!globalOrWindow.__NIGHTINGALE_GET_CONFIG_FOR_LOGGER_RECORD) {\n globalOrWindow.__NIGHTINGALE_GET_CONFIG_FOR_LOGGER_RECORD = (\n key: string,\n level: Level,\n ): ComputedConfigForKey => {\n const { handlers, processors }: ComputedConfigForKey =\n globalOrWindow.__NIGHTINGALE_GET_CONFIG_FOR_LOGGER(key);\n\n return {\n handlers: handlers.filter(\n (handler) =>\n level >= handler.minLevel &&\n (!handler.isHandling || handler.isHandling(level, key)),\n ),\n processors,\n };\n };\n}\n\nfunction getConfigForLoggerRecord(\n key: string,\n recordLevel: Level,\n): ComputedConfigForKey {\n return globalOrWindow.__NIGHTINGALE_GET_CONFIG_FOR_LOGGER_RECORD(\n key,\n recordLevel,\n );\n}\n\nfunction isError(messageOrError: Error | string): messageOrError is Error {\n return messageOrError instanceof Error;\n}\n\n/**\n * Interface that allows you to log records.\n * This records are treated by handlers\n */\nexport class Logger {\n private contextObject?: Record<string, unknown>;\n\n readonly key: string;\n\n readonly displayName?: string;\n\n /**\n * Create a new Logger\n *\n * @param {string} key\n * @param {string} [displayName]\n */\n constructor(key: string, displayName?: string) {\n this.key = key;\n this.displayName = displayName;\n\n if (process.env.NODE_ENV !== \"production\" && key.includes(\".\")) {\n throw new Error(\n `nightingale: \\`.\\` in key is no longer supported, use \\`:\\` instead (key: ${key})`,\n );\n }\n }\n\n /** @private */\n protected getHandlersAndProcessors(\n recordLevel: number,\n ): ComputedConfigForKey {\n return getConfigForLoggerRecord(this.key, recordLevel);\n }\n\n /** @private */\n getConfig(): Readonly<ComputedConfigForKey> {\n return globalOrWindow.__NIGHTINGALE_GET_CONFIG_FOR_LOGGER(this.key);\n }\n\n /**\n * Create a child logger\n */\n child(childSuffixKey: string, childDisplayName?: string): Logger {\n return new Logger(`${this.key}:${childSuffixKey}`, childDisplayName);\n }\n\n /**\n * Create a new Logger with the same key a this attached context\n *\n * @example\n * ```typescript\n * const loggerMyService = new Logger('app:myService');\n * function someAction(arg1) {\n * const logger = loggerMyService.context({ arg1 });\n * logger.enter(someAction);\n * // do stuff\n * logger.info('info');\n * // do stuff\n * logger.exit(someAction);\n * }\n * ```\n *\n */\n context(context: Record<string, unknown>): Logger {\n const logger = new Logger(this.key);\n logger.setContext(context);\n return logger;\n }\n\n /**\n * Get the context of this logger\n */\n getContextObject(): Readonly<Record<string, unknown>> | undefined {\n return this.contextObject;\n }\n\n /**\n * Set the context of this logger\n *\n * @param {Object} context\n */\n setContext(context: Record<string, unknown>): void {\n this.contextObject = context;\n }\n\n /**\n * Extends existing context of this logger\n */\n extendsContext(extendedContext: Record<string, unknown>): void {\n if (this.contextObject === undefined) {\n throw new Error(\n \"Cannot extends context that does not exists. Use setContext(context) first.\",\n );\n }\n Object.assign(this.contextObject, extendedContext);\n }\n\n /**\n * Handle a record\n *\n * Use this only if you know what you are doing.\n */\n addRecord<T extends Metadata>(record: Readonly<LogRecord<T>>): void {\n const { handlers, processors } = this.getHandlersAndProcessors(\n record.level,\n );\n\n if (handlers.length === 0) {\n if (record.level > Level.ERROR) {\n // eslint-disable-next-line no-console\n console.log(\"[nightingale] no logger for > error level.\", {\n key: record.key,\n message: record.message,\n });\n }\n return;\n }\n\n if (processors) {\n processors.forEach((process) => {\n process(record, record.context);\n });\n }\n\n handlers.some((handler) => handler.handle(record) === false);\n }\n\n /**\n * Log a message\n */\n log<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n level: Level = Level.INFO,\n options?: Options<T>,\n ): void {\n const isMessageError = isError(messageOrError);\n\n const message = isMessageError\n ? `${messageOrError.name}: ${messageOrError.message}`\n : messageOrError;\n\n const extendedMetadata =\n isMessageError && !(metadata && Object.hasOwn(metadata, \"error\"))\n ? { ...metadata, error: messageOrError }\n : metadata;\n\n const context = extendedMetadata?.context;\n if (extendedMetadata) {\n delete extendedMetadata.context;\n }\n\n const record: LogRecord<NonNullable<typeof extendedMetadata>> = {\n level,\n key: this.key,\n displayName: this.displayName,\n datetime: new Date(),\n message,\n context: context || this.contextObject,\n metadata: extendedMetadata as NonNullable<typeof extendedMetadata>,\n extra: {},\n ...options,\n };\n this.addRecord(record);\n }\n\n /**\n * Log a trace message\n */\n trace<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.TRACE, { metadataStyles });\n }\n\n /**\n * Log a debug message\n */\n debug<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.DEBUG, { metadataStyles });\n }\n\n /**\n * Notice an info message\n */\n notice<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.NOTICE, { metadataStyles });\n }\n\n /**\n * Log an info message\n */\n info<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.INFO, { metadataStyles });\n }\n\n /**\n * Log a warn message\n */\n warn<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.WARN, { metadataStyles });\n }\n\n /**\n * Log an error message\n *\n * @example\n * ```typescript\n * const logger = new Logger('something');\n * try {\n * throw new Error('Always throws here');\n * } catch (error) {\n * logger.error('caught error', { error });\n * }\n * ```\n */\n error<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.ERROR, { metadataStyles });\n }\n\n /**\n * Log an critical message\n */\n critical<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.CRITICAL, { metadataStyles });\n }\n\n /**\n * Log a fatal message\n *\n * @example\n * ```typescript\n * const logger = new Logger('something');\n * try {\n * throw new Error('Always throws here');\n * } catch (error) {\n * logger.error('caught error', { error });\n * process.exit(1);\n * }\n */\n fatal<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.FATAL, { metadataStyles });\n }\n\n /**\n * Log an alert message\n */\n alert<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.ALERT, { metadataStyles });\n }\n\n /**\n * Log an inspected value\n */\n inspectValue<T extends Metadata>(\n value: unknown,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n if (POB_TARGET === \"browser\") {\n throw new Error(\"Not supported for the browser. Prefer `debugger;`\");\n } else {\n // Note: inspect is a special function for node:\n // https://github.com/nodejs/node/blob/a1bda1b4deb08dfb3e06cb778f0db40023b18318/lib/util.js#L210\n const inspectedValue = util.inspect(value, { depth: 6 });\n this.log(inspectedValue, metadata, Level.DEBUG, {\n metadataStyles,\n styles: [\"gray\"],\n });\n }\n }\n\n /**\n * Log a debugged var\n */\n inspectVar<T extends Metadata>(\n varName: string,\n varValue: unknown,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n if (POB_TARGET === \"browser\") {\n throw new Error(\"Not supported for the browser. Prefer `debugger;`\");\n } else {\n const inspectedValue = util.inspect(varValue, { depth: 6 });\n this.log(`${varName} = ${inspectedValue}`, metadata, Level.DEBUG, {\n metadataStyles,\n styles: [\"cyan\"],\n });\n }\n }\n\n /**\n * Alias for infoSuccess\n */\n success<T extends Metadata>(\n message: string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.infoSuccess(message, metadata, metadataStyles);\n }\n\n /**\n * Log an info success message\n */\n infoSuccess<T extends Metadata>(\n message: string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(message, metadata, Level.INFO, {\n metadataStyles,\n symbol: \"\",\n styles: [\"green\", \"bold\"],\n });\n }\n\n /**\n * Log an debug success message\n */\n debugSuccess<T extends Metadata>(\n message: string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(message, metadata, Level.DEBUG, {\n metadataStyles,\n symbol: \"\",\n styles: [\"green\"],\n });\n }\n\n /**\n * Alias for infoFail\n */\n fail<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.infoFail(messageOrError, metadata, metadataStyles);\n }\n\n /**\n * Log an info fail message\n */\n infoFail<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.INFO, {\n metadataStyles,\n symbol: \"\",\n styles: [\"red\", \"bold\"],\n });\n }\n\n /**\n * Log an debug fail message\n */\n debugFail<T extends Metadata>(\n messageOrError: Error | string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.log(messageOrError, metadata, Level.DEBUG, {\n metadataStyles,\n symbol: \"\",\n styles: [\"red\"],\n });\n }\n\n /**\n * @returns {number} time to pass to timeEnd\n */\n time<T extends Metadata>(\n message?: string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n level: number = Level.DEBUG,\n ): number {\n if (message) {\n this.log(message, metadata, level, { metadataStyles });\n }\n\n return Date.now();\n }\n\n infoTime<T extends Metadata>(\n message?: string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): number {\n return this.time(message, metadata, metadataStyles, Level.INFO);\n }\n\n /**\n * Finds difference between when this method\n * was called and when the respective time method\n * was called, then logs out the difference\n * and deletes the original record\n */\n timeEnd<T extends Metadata>(\n startTime: number,\n message: string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n level: number = Level.DEBUG,\n options?: Options<T>,\n ): void {\n const now = Date.now();\n\n const diffTime = now - startTime;\n let readableTime;\n\n if (diffTime < 1000) {\n readableTime = `${diffTime}ms`;\n } else {\n const seconds = diffTime > 1000 ? Math.floor(diffTime / 1000) : 0;\n const ms = diffTime - seconds * 1000;\n readableTime = `${seconds ? `${seconds}s and ` : \"\"}${ms}ms`;\n }\n\n const extendedMetadata = {\n ...metadata,\n readableTime,\n timeMs: diffTime,\n };\n\n this.log(message, extendedMetadata, level, { ...options, metadataStyles });\n }\n\n /**\n * Like timeEnd, but with INFO level\n */\n infoTimeEnd<T extends Metadata>(\n time: number,\n message: string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.timeEnd(time, message, metadata, metadataStyles, Level.INFO);\n }\n\n /**\n * Like timeEnd, but with INFO level\n */\n infoSuccessTimeEnd<T extends Metadata>(\n time: number,\n message: string,\n metadata?: T,\n metadataStyles?: MetadataStyles<T>,\n ): void {\n this.timeEnd(time, message, metadata, metadataStyles, Level.INFO, {\n symbol: \"\",\n styles: [\"green\", \"bold\"],\n });\n }\n\n /**\n * Log an enter in a function\n *\n * @example\n * ```typescript\n * class A {\n * method(arg1) {\n * logger.enter(method, { arg1 });\n * // Do your stuff\n * }\n * }\n * ```\n *\n */\n enter<T extends Metadata, Fn extends (...args: unknown[]) => unknown>(\n fn: Fn,\n metadata?: T,\n metadataStyles?: MetadataStyles<ExtendedFunctionNameMetadata & T>,\n ): void {\n const extendedMetadata = {\n ...metadata,\n functionName: fn.name,\n };\n this.log(\"enter\", extendedMetadata, Level.TRACE, { metadataStyles });\n }\n\n /**\n * Log an exit in a function\n *\n * @example\n * ```typescript\n * const logger = new Logger('myNamespace:A');\n * class A {\n * method(arg1) {\n * // Do your stuff\n * logger.exit(method, { arg1 });\n * }\n * }\n * ```\n */\n exit<T extends Metadata, Fn extends (...args: unknown[]) => unknown>(\n fn: Fn,\n metadata?: T,\n metadataStyles?: MetadataStyles<ExtendedFunctionNameMetadata & T>,\n ): void {\n const extendedMetadata = {\n ...metadata,\n functionName: fn.name,\n };\n this.log(\"exit\", extendedMetadata, Level.TRACE, { metadataStyles });\n }\n\n /**\n * Wrap around a function to log enter and exit of a function\n *\n * @example\n * ```typescript\n * const logger = new Logger('myNamespace:A');\n * class A {\n * method() {\n * logger.wrap(method, () => {\n * // Do your stuff\n * });\n * }\n * }\n * ```\n */\n wrap<Fn extends (...args: unknown[]) => unknown>(\n fn: Fn,\n callback: () => void,\n ): void;\n\n wrap<T extends Metadata, Fn extends (...args: unknown[]) => unknown>(\n fn: Fn,\n metadata: T,\n callback: () => void,\n ): void;\n\n wrap<T extends Metadata, Fn extends (...args: unknown[]) => unknown>(\n fn: Fn,\n metadata: T,\n metadataStyles: MetadataStyles<T>,\n callback: () => void,\n ): void;\n\n wrap<T extends Metadata, Fn extends (...args: unknown[]) => unknown>(\n fn: Fn,\n option1: T | (() => void),\n option2?: MetadataStyles<T> | (() => void),\n callback?: () => void,\n ): void {\n let metadata: T | undefined;\n let metadataStyles: MetadataStyles<T> | undefined;\n\n if (typeof option1 === \"function\") {\n callback = option1;\n } else {\n metadata = option1;\n\n if (typeof option2 === \"function\") {\n callback = option2;\n } else {\n metadataStyles = option2;\n }\n }\n\n this.enter(fn, metadata, metadataStyles);\n (callback as () => void)();\n this.exit(fn);\n }\n}\n"],"names":["globalOrWindow","globalThis","__NIGHTINGALE_GET_CONFIG_FOR_LOGGER","handlers","processors","__NIGHTINGALE_GET_CONFIG_FOR_LOGGER_RECORD","key","level","filter","handler","minLevel","isHandling","getConfigForLoggerRecord","recordLevel","isError","messageOrError","Error","Logger","constructor","displayName","process","env","NODE_ENV","includes","getHandlersAndProcessors","getConfig","child","childSuffixKey","childDisplayName","context","logger","setContext","getContextObject","contextObject","extendsContext","extendedContext","undefined","Object","assign","addRecord","record","length","Level","ERROR","console","log","message","forEach","some","handle","metadata","INFO","options","isMessageError","name","extendedMetadata","hasOwn","error","datetime","Date","extra","trace","metadataStyles","TRACE","debug","DEBUG","notice","NOTICE","info","warn","WARN","critical","CRITICAL","fatal","FATAL","alert","ALERT","inspectValue","value","inspectedValue","util","inspect","depth","styles","inspectVar","varName","varValue","success","infoSuccess","symbol","debugSuccess","fail","infoFail","debugFail","time","now","infoTime","timeEnd","startTime","diffTime","readableTime","seconds","Math","floor","timeMs","infoTimeEnd","infoSuccessTimeEnd","enter","fn","functionName","exit","wrap","option1","option2","callback"],"mappings":"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"}