All files logger.ts

100% Statements 27/27
100% Branches 11/11
100% Functions 9/9
100% Lines 26/26

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91                              4x   4x                   4x         12x   1x 1x   1x 1x   9x 9x   1x 1x       4x         30x 30x       1x       153x 25x         128x       6x       14x       5x       4x 30x 30x   30x    
export type LogLevel = "debug" | "info" | "warn" | "error";
 
export type LogMessage = string;
 
export interface LogDetails {
  [key: string]: any;
}
 
export type LogHandler = (level: LogLevel, message: LogMessage, details?: LogDetails) => void;
 
export interface CreateLoggerOptions {
  levels?: LogLevel[];
  handler?: LogHandler;
}
 
export const loggerPrefix = "[Featurevisor]";
 
export const defaultLogLevels: LogLevel[] = [
  // supported, but not enabled by default
  // "debug",
  // "info",
 
  // enabled by default
  "warn",
  "error",
];
 
export const defaultLogHandler: LogHandler = function defaultLogHandler(
  level,
  message,
  details = {},
) {
  switch (level) {
    case "debug":
      console.log(loggerPrefix, message, details);
      break;
    case "info":
      console.info(loggerPrefix, message, details);
      break;
    case "warn":
      console.warn(loggerPrefix, message, details);
      break;
    case "error":
      console.error(loggerPrefix, message, details);
      break;
  }
};
 
export class Logger {
  private levels: LogLevel[];
  private handle: LogHandler;
 
  constructor(options: CreateLoggerOptions) {
    this.levels = options.levels as LogLevel[];
    this.handle = options.handler as LogHandler;
  }
 
  setLevels(levels: LogLevel[]) {
    this.levels = levels;
  }
 
  log(level: LogLevel, message: LogMessage, details?: LogDetails) {
    if (this.levels.indexOf(level) !== -1) {
      this.handle(level, message, details);
    }
  }
 
  debug(message: LogMessage, details?: LogDetails) {
    this.log("debug", message, details);
  }
 
  info(message: LogMessage, details?: LogDetails) {
    this.log("info", message, details);
  }
 
  warn(message: LogMessage, details?: LogDetails) {
    this.log("warn", message, details);
  }
 
  error(message: LogMessage, details?: LogDetails) {
    this.log("error", message, details);
  }
}
 
export function createLogger(options: CreateLoggerOptions = {}): Logger {
  const levels = options.levels || defaultLogLevels;
  const logHandler = options.handler || defaultLogHandler;
 
  return new Logger({ levels, handler: logHandler });
}