import type { AnyString, Dictionary, Highlighter } from '../typings.js'; /** Interface for ORM logging, supporting namespaced log levels and query logging. */ export interface Logger { /** * Logs a message inside given namespace. */ log(namespace: LoggerNamespace | AnyString, message: string, context?: LogContext): void; /** * Logs error message inside given namespace. */ error(namespace: LoggerNamespace | AnyString, message: string, context?: LogContext): void; /** * Logs warning message inside given namespace. */ warn(namespace: LoggerNamespace | AnyString, message: string, context?: LogContext): void; /** * Logs a message inside given namespace. */ logQuery(context: LogContext): void; /** * Sets active namespaces. Pass `true` to enable all logging. */ setDebugMode(debugMode: boolean | LoggerNamespace[]): void; /** Checks whether logging is enabled for the given namespace. */ isEnabled(namespace: LoggerNamespace, context?: LogContext): boolean; } /** Available logging namespaces that can be individually enabled or disabled. */ export type LoggerNamespace = 'query' | 'query-params' | 'schema' | 'discovery' | 'info' | 'deprecated' | 'slow-query'; /** Contextual metadata passed alongside log messages, including query details and timing. */ export interface LogContext extends Dictionary { query?: string; label?: string; namespace?: LoggerNamespace; params?: readonly unknown[]; took?: number; results?: number; affected?: number; level?: 'info' | 'warning' | 'error'; enabled?: boolean; debugMode?: LoggerNamespace[]; connection?: { type?: string; name?: string; }; } /** Options for constructing a Logger instance. */ export interface LoggerOptions { writer: (message: string) => void; debugMode?: boolean | LoggerNamespace[]; ignoreDeprecations?: boolean | string[]; highlighter?: Highlighter; usesReplicas?: boolean; } /** * Logger options to modify format output and overrides, including a label and additional properties that can be accessed by custom loggers. * * Differs from {@apilink LoggerOptions} in terms of how they are used; this type is primarily a public type meant to be used within methods like `em.find()`. * * @example * await em.findOne(User, 1, { logger: { label: 'user middleware' } }; * // [query] (user middleware) select * from user where id = 1; */ export type LoggingOptions = Pick;