packages/logger/index.js
function addWrapper(wrapper, { passInitialArguments = false, plugins = [] } = {}) {
  const opts = {
    passInitialArguments,
    plugins: normalizeArray(plugins)
  };
  if (
    typeof wrapper === 'object' && !Array.isArray(wrapper)
    &&
    (
      typeof wrapper.log === 'function' ||
      Object.keys(LEVELS).some((lvl) => typeof wrapper[lvl.toLowerCase()] === 'function')
    )
  ) {
    // if wrapper is instance of some class or pure object, it must include at least one method with level name
    wrapper[WRAPPER_OPTS_SYMBOL] = opts;
    wrappers.push(wrapper);
    return;
  }
  if (typeof wrapper === 'function') {
    const wrapperObject = {
      log: wrapper,
      [WRAPPER_OPTS_SYMBOL]: opts
    };
    wrappers.push(wrapperObject);
    return;
  }
  throw new Error('Wrapper did not implemented a minimum methods required');
}
function addWrapper(wrapper, { passInitialArguments = false, plugins = [] } = {}) {
  const opts = {
    passInitialArguments,
    plugins: normalizeArray(plugins)
  };
  if (
    typeof wrapper === 'object' && !Array.isArray(wrapper)
    &&
    (
      typeof wrapper.log === 'function' ||
      Object.keys(LEVELS).some((lvl) => typeof wrapper[lvl.toLowerCase()] === 'function')
    )
  ) {
    // if wrapper is instance of some class or pure object, it must include at least one method with level name
    wrapper[WRAPPER_OPTS_SYMBOL] = opts;
    wrappers.push(wrapper);
    return;
  }
  if (typeof wrapper === 'function') {
    const wrapperObject = {
      log: wrapper,
      [WRAPPER_OPTS_SYMBOL]: opts
    };
    wrappers.push(wrapperObject);
    return;
  }
  throw new Error('Wrapper did not implemented a minimum methods required');
}
Add new wrapper. Can handle any object with one of methods from array:
['log', 'silly', 'debug', 'info', 'warn', 'error']

@param {{log?: Function, silly?: Function, debug?: Function, info?: Function, warn?: Function, error?: Function}|Function} wrapper
@param {{}} opts