All files / packages/logger/src/format format.ts

0% Statements 0/25
100% Branches 1/1
100% Functions 1/1
0% Lines 0/25

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                                                                                                                       
import type { format as FormatFunc, TransformFunction } from './type'
 
/*
 * Displays a helpful message and the source of
 * the format when it is invalid.
 */
class InvalidFormatError extends Error {
  // eslint-disable-next-line ts/no-unsafe-function-type
  constructor(formatFn: Function) {
    super(`Format functions must be synchronous taking two arguments: (info, opts)
Found: ${formatFn.toString().split('\n')[0]}\n`)
    Error.captureStackTrace(this, InvalidFormatError)
  }
}
 
/*
 * function format (formatFn)
 * Returns a create function for the `formatFn`.
 */
const format = function<T extends Record<any, any>>(formatFn: TransformFunction<T>) {
  if (formatFn.length > 2) {
    throw new InvalidFormatError(formatFn)
  }
 
  /*
   * function Format (options)
   * Base prototype which calls a `_format`
   * function and pushes the result.
   */
  class Format {
    options?: T
 
    constructor(options: T = {} as T) {
      this.options = options
    }
 
    transform = formatFn
  }
 
  //
  // Create a function which returns new instances of
  // Format for simple syntax like:
  //
  // require('winston').formats.json();
  //
  function createFormatWrap(opts?: T) {
    return new Format(opts)
  }
 
  //
  // Expose the Format through the create function
  // for testability.
  //
  createFormatWrap.Format = Format
 
  return createFormatWrap
}
 
export default format as unknown as FormatFunc