All files logger.ts

100% Statements 27/27
100% Branches 12/12
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                              7x   7x         54x   54x 27x 27x 14x 13x 8x     54x     7x 7x                   7x           46x 46x       1x       247x   247x 194x     53x       196x       28x       14x       7x       7x 26x    
export type LogLevel = "fatal" | "error" | "warn" | "info" | "debug";
 
export type LogMessage = string;
 
export interface LogDetails {
  [key: string]: any;
}
 
export type LogHandler = (level: LogLevel, message: LogMessage, details?: LogDetails) => void;
 
export interface CreateLoggerOptions {
  level?: LogLevel;
  handler?: LogHandler;
}
 
export const loggerPrefix = "[Featurevisor]";
 
export const defaultLogHandler: LogHandler = function defaultLogHandler(
  level,
  message,
  details = {},
) {
  let method = "log";
 
  if (level === "info") {
    method = "info";
  } else if (level === "warn") {
    method = "warn";
  } else if (level === "error") {
    method = "error";
  }
 
  console[method](loggerPrefix, message, details);
};
 
export class Logger {
  static allLevels: LogLevel[] = [
    "fatal",
    "error",
    "warn",
    "info",
 
    // not enabled by default
    "debug",
  ];
 
  static defaultLevel: LogLevel = "info";
 
  private level: LogLevel;
  private handle: LogHandler;
 
  constructor(options: CreateLoggerOptions) {
    this.level = options.level || Logger.defaultLevel;
    this.handle = options.handler || defaultLogHandler;
  }
 
  setLevel(level: LogLevel) {
    this.level = level;
  }
 
  log(level: LogLevel, message: LogMessage, details?: LogDetails) {
    const shouldHandle = Logger.allLevels.indexOf(this.level) >= Logger.allLevels.indexOf(level);
 
    if (!shouldHandle) {
      return;
    }
 
    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 {
  return new Logger(options);
}