Source

tools/logger.js

// @ts-check


 /**
  *   @category Tools
  *   @classdesc
  *     A simple and customizable logger class for JavaScript applications.
  *     It allows enabling/disabling specific log levels independently.
  *     Supports debug, info, warn, and error logging with console output.
  * 
  *   * @example
 * // Basic usage with defaults (all levels enabled)
 * const logger = new Logger();
 * logger.debug('This is a debug message');
 * logger.info('This is an info message');
 * logger.warn('This is a warning');
 * logger.error('This is an error');
 * 
 * @example
 * // Customizing levels (e.g., hide debug and info for production-like behavior)
 * const logger = new Logger({ debug: false, info: false });
 * logger.debug('This won\'t show');
 * logger.info('This won\'t show');
 * logger.warn('This will show');
 * logger.error('This will show');
 * 
 * @example
 * // Environment-based instantiation
 * const isDev = process.env.NODE_ENV !== 'production';
 * const logger = new Logger({
 *   debug: isDev,
 *   info: isDev,
 *   warn: true,
 *   error: true
 * });
 * 
 * @example
 * // Dynamic level changes
 * const logger = new Logger();
 * logger.setLevels({ warn: false });
 * logger.warn('This won\'t show now');
 * 
  *   @since 11.2025, aab
  * 
  */
export class Logger {
    /**
     * Constructor for the Logger class.
     * @param {Object} [options={}] - Customize which levels to show (true/false for each).
     *   Defaults: { debug: true, info: true, warn: true, error: true }
     *   Example: { debug: false, info: false } to hide debug and info.
     * @param {boolean} [options.debug=true] - Enable debug logs.
     * @param {boolean} [options.info=true] - Enable info logs.
     * @param {boolean} [options.warn=true] - Enable warn logs.
     * @param {boolean} [options.error=true] - Enable error logs.
     */
    constructor(options = {}) {
      /** @type {{ debug: boolean, info: boolean, warn: boolean, error: boolean }} */
      this.levels = {
        debug: options.debug !== false,  // Default true, but customizable
        info: options.info !== false,    // Default true
        warn: options.warn !== false,    // Default true
        error: options.error !== false   // Default true
      };
    }
  
    /**
     * Logs debug information (if enabled).
     * @param {...any} args - Arguments to log.
     */
    debug(...args) {
      if (this.levels.debug) {
        console.log('[DEBUG]', ...args);
      }
    }
  
    /**
     * Logs general information (if enabled).
     * @param {...any} args - Arguments to log.
     */
    info(...args) {
      if (this.levels.info) {
        console.log('[INFO]', ...args);
      }
    }
  
    /**
     * Logs warnings (if enabled, with warn in console).
     * @param {...any} args - Arguments to log.
     */
    warn(...args) {
      if (this.levels.warn) {
        console.warn('[WARN]', ...args);
      }
    }
  
    /**
     * Logs errors (if enabled, with error in console).
     * @param {...any} args - Arguments to log.
     */
    error(...args) {
      if (this.levels.error) {
        console.error('[ERROR]', ...args);
      }
    }
  
    /**
     * Update levels dynamically.
     * @param {Object} newOptions - Same as constructor options.
     * @param {boolean} [newOptions.debug] - Update debug level.
     * @param {boolean} [newOptions.info] - Update info level.
     * @param {boolean} [newOptions.warn] - Update warn level.
     * @param {boolean} [newOptions.error] - Update error level.
     */
    setLevels(newOptions) {
      Object.assign(this.levels, {
        debug: newOptions.debug !== false,
        info: newOptions.info !== false,
        warn: newOptions.warn !== false,
        error: newOptions.error !== false
      });
    }
  }