{"version":3,"sources":["../../src/LevelLogger.ts","../../src/NoOpLogFunction.ts","../../src/ConsoleLogger.ts","../../src/getFunctionName.ts","../../src/IdLogger.ts","../../src/SilentLogger.ts"],"sourcesContent":["import type { EnumKey, EnumValue } from '@xylabs/enum'\nimport { Enum } from '@xylabs/enum'\n\nimport { NoOpLogFunction } from './NoOpLogFunction.ts'\n\n/** A generic logging function that accepts any number of arguments. */\nexport type LogFunction = (...data: unknown[]) => void\n\n/**\n * Interface to handle overlap between Winston &\n * `console` with as much congruency as possible.\n */\nexport interface Logger {\n  debug: LogFunction\n  error: LogFunction\n  info: LogFunction\n  log: LogFunction\n  trace: LogFunction\n  warn: LogFunction\n}\n\n/** Numeric log level values, from least verbose (error=1) to most verbose (trace=6). */\nexport const LogLevel = Enum({\n  error: 1,\n  warn: 2,\n  info: 3,\n  log: 4,\n  debug: 5,\n  trace: 6,\n})\n\n/** String key for a log level (e.g. 'error', 'warn', 'info'). */\nexport type LogLevelKey = EnumKey<typeof LogLevel>\n\n/** Alias for LogLevelKey, representing the verbosity setting as a string. */\nexport type LogVerbosity = LogLevelKey\n\n/** Numeric value of a log level (1 through 6). */\nexport type LogLevelValue = EnumValue<typeof LogLevel>\n\n/**\n * A logger that filters messages based on a configured log level.\n * Methods for levels above the configured threshold return a no-op function.\n */\nexport class LevelLogger implements Logger {\n  readonly level: LogLevelValue\n  readonly logger: Logger\n  constructor(logger: Logger, level: LogLevelValue = LogLevel.warn) {\n    this.level = level\n    this.logger = logger\n  }\n\n  get debug() {\n    return this.level >= LogLevel.debug ? this.logger.debug : NoOpLogFunction\n  }\n\n  get error() {\n    return this.level >= LogLevel.error ? this.logger.error : NoOpLogFunction\n  }\n\n  get info() {\n    return this.level >= LogLevel.info ? this.logger.info : NoOpLogFunction\n  }\n\n  get log() {\n    return this.level >= LogLevel.log ? this.logger.log : NoOpLogFunction\n  }\n\n  get trace() {\n    return this.level >= LogLevel.trace ? this.logger.trace : NoOpLogFunction\n  }\n\n  get warn() {\n    return this.level >= LogLevel.warn ? this.logger.warn : NoOpLogFunction\n  }\n}\n","/** A log function that silently discards all arguments. */\nexport const NoOpLogFunction = (..._data: unknown[]) => void {}\n","import type { LogLevelValue } from './LevelLogger.ts'\nimport { LevelLogger, LogLevel } from './LevelLogger.ts'\n\n/** A LevelLogger that delegates to the global `console` object. */\nexport class ConsoleLogger extends LevelLogger {\n  constructor(level: LogLevelValue = LogLevel.warn) {\n    super(console, level)\n  }\n}\n","import { handleError } from '@xylabs/error'\nimport { isNumber } from '@xylabs/typeof'\n\n/**\n * Retrieves the name of the calling function by inspecting the stack trace.\n * @param depth - The stack frame depth to inspect (default: 2, the caller's caller).\n * @returns The function name, or '<unknown>' if it cannot be determined.\n */\nexport const getFunctionName = (depth = 2) => {\n  try {\n    throw new Error('Getting function name')\n  } catch (ex) {\n    return handleError(ex, (error) => {\n      let newIndex: number | undefined\n      const stackParts = error.stack?.split('\\n')[depth]?.split(' ')\n      const funcName\n        = stackParts?.find((item, index) => {\n          if (item.length > 0 && item !== 'at') {\n            // check if constructor\n            if (item === 'new') {\n              newIndex = index\n            }\n            return true\n          }\n        }) ?? '<unknown>'\n      return isNumber(newIndex) ? `${funcName} ${stackParts?.[newIndex + 1]}` : funcName\n    })\n  }\n}\n","import type { Logger } from './LevelLogger.ts'\n\n/**\n * A logger wrapper that prefixes every log message with a bracketed identifier.\n * Useful for distinguishing log output from different components or instances.\n */\nexport class IdLogger implements Logger {\n  private _id?: () => string\n  private _logger: Logger\n\n  constructor(logger: Logger, id?: () => string) {\n    this._logger = logger\n    this._id = id\n  }\n\n  set id(id: string) {\n    this._id = () => id\n  }\n\n  debug(...data: unknown[]) {\n    this._logger?.debug(this.prefix(), ...data)\n  }\n\n  error(...data: unknown[]) {\n    this._logger?.error(this.prefix(), ...data)\n  }\n\n  info(...data: unknown[]) {\n    this._logger?.info(this.prefix(), ...data)\n  }\n\n  log(...data: unknown[]) {\n    this._logger?.log(this.prefix(), ...data)\n  }\n\n  trace(...data: unknown[]) {\n    this._logger?.trace(this.prefix(), ...data)\n  }\n\n  warn(...data: unknown[]) {\n    this._logger?.warn(this.prefix(), ...data)\n  }\n\n  private prefix() {\n    return `[${this._id?.()}]`\n  }\n}\n","import type { Logger } from './LevelLogger.ts'\nimport { NoOpLogFunction } from './NoOpLogFunction.ts'\n\n/**\n * A logger that does not log anything.\n * This is useful when you want to disable logging\n * like when running unit tests or in silent mode.\n * It implements the `Logger` interface but all methods\n * are no-op functions.\n */\nexport class SilentLogger implements Logger {\n  readonly debug = NoOpLogFunction\n  readonly error = NoOpLogFunction\n  readonly info = NoOpLogFunction\n  readonly log = NoOpLogFunction\n  readonly trace = NoOpLogFunction\n  readonly warn = NoOpLogFunction\n}\n"],"mappings":"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","names":[]}