/** * Debug utility for consistent logging across the application */ // Default to enabling logs in development, disabling in production const isDevelopment = process.env.NODE_ENV === 'development'; // Debug configuration - can be modified at runtime export const debugConfig = { // Master switch to enable/disable all logs enabled: isDevelopment, // Enable/disable logs by category categories: { api: true, // API calls and responses data: true, // Data transformations and state ui: true, // UI interactions and events perf: false, // Performance measurements auth: true, // Authentication related system: true, // System level operations } }; // Log levels export enum LogLevel { DEBUG = 'debug', INFO = 'info', WARN = 'warn', ERROR = 'error' } /** * Log a message if debugging is enabled * * @param category - The category this log belongs to * @param message - The message to log * @param data - Optional data to include with the log * @param level - Log level (default: INFO) */ export function log( category: keyof typeof debugConfig.categories, message: string, data?: any, level: LogLevel = LogLevel.INFO ): void { // Skip logging if master switch is off or category is disabled if (!debugConfig.enabled || !debugConfig.categories[category]) { return; } const prefix = `[${category.toUpperCase()}]`; switch (level) { case LogLevel.DEBUG: console.debug(prefix, message, data !== undefined ? data : ''); break; case LogLevel.INFO: console.log(prefix, message, data !== undefined ? data : ''); break; case LogLevel.WARN: console.warn(prefix, message, data !== undefined ? data : ''); break; case LogLevel.ERROR: console.error(prefix, message, data !== undefined ? data : ''); break; } } // Convenience methods for different log levels export const debug = { api: (message: string, data?: any) => log('api', message, data, LogLevel.DEBUG), data: (message: string, data?: any) => log('data', message, data, LogLevel.DEBUG), ui: (message: string, data?: any) => log('ui', message, data, LogLevel.DEBUG), perf: (message: string, data?: any) => log('perf', message, data, LogLevel.DEBUG), auth: (message: string, data?: any) => log('auth', message, data, LogLevel.DEBUG), system: (message: string, data?: any) => log('system', message, data, LogLevel.DEBUG), }; export const info = { api: (message: string, data?: any) => log('api', message, data, LogLevel.INFO), data: (message: string, data?: any) => log('data', message, data, LogLevel.INFO), ui: (message: string, data?: any) => log('ui', message, data, LogLevel.INFO), perf: (message: string, data?: any) => log('perf', message, data, LogLevel.INFO), auth: (message: string, data?: any) => log('auth', message, data, LogLevel.INFO), system: (message: string, data?: any) => log('system', message, data, LogLevel.INFO), }; export const warn = { api: (message: string, data?: any) => log('api', message, data, LogLevel.WARN), data: (message: string, data?: any) => log('data', message, data, LogLevel.WARN), ui: (message: string, data?: any) => log('ui', message, data, LogLevel.WARN), perf: (message: string, data?: any) => log('perf', message, data, LogLevel.WARN), auth: (message: string, data?: any) => log('auth', message, data, LogLevel.WARN), system: (message: string, data?: any) => log('system', message, data, LogLevel.WARN), }; export const error = { api: (message: string, data?: any) => log('api', message, data, LogLevel.ERROR), data: (message: string, data?: any) => log('data', message, data, LogLevel.ERROR), ui: (message: string, data?: any) => log('ui', message, data, LogLevel.ERROR), perf: (message: string, data?: any) => log('perf', message, data, LogLevel.ERROR), auth: (message: string, data?: any) => log('auth', message, data, LogLevel.ERROR), system: (message: string, data?: any) => log('system', message, data, LogLevel.ERROR), }; export default { debugConfig, log, debug, info, warn, error, LogLevel };