Source: core/base-service/trace.js

import chalk from 'chalk'
import config from 'config'
const objectConfig = config.util.toObject()

// Config is loaded globally but it would be better to inject it. To do that,
// there needs to be one instance of the service created at registration time,
// which gets the config injected into it, instead of one instance per request.
// That way most of the current static methods could become instance methods,
// thereby gaining access to the injected config.
const {
  services: { trace: enableTraceLogging },
} = objectConfig.public

/**
 * Formats a stage label with a coloured background for console output.
 *
 * @param {'inbound'|'fetch'|'validate'|'unhandledError'|'outbound'} stage - Pipeline stage name.
 * @param {string} label - Text to display inside the coloured badge.
 * @returns {string} ANSI-coloured label string.
 */
function _formatLabelForStage(stage, label) {
  const colorFn = {
    inbound: chalk.black.bgBlue,
    fetch: chalk.black.bgYellow,
    validate: chalk.black.bgGreen,
    unhandledError: chalk.white.bgRed,
    outbound: chalk.black.bgBlue,
  }[stage]
  return colorFn(` ${label} `)
}

/**
 * Logs a trace message to the console when trace logging is enabled in config.
 *
 * @param {'inbound'|'fetch'|'validate'|'unhandledError'|'outbound'} stage - Pipeline stage used to colour the label.
 * @param {string} symbol - Short symbol or emoji prefixed to the log line.
 * @param {string} label - Descriptive label shown alongside the symbol.
 * @param {*} content - Data to print; logged with `console.dir` when `deep` is true.
 * @param {object} [options={}] - Optional logging configuration.
 * @param {boolean} [options.deep=false] - When `true`, uses `console.dir` for full-depth output.
 * @returns {boolean} `true` if the message was logged, `false` when trace logging is disabled.
 */
function logTrace(stage, symbol, label, content, { deep = false } = {}) {
  if (enableTraceLogging) {
    if (deep) {
      console.log(_formatLabelForStage(stage, label), symbol)
      console.dir(content, { depth: null })
    } else {
      console.log(_formatLabelForStage(stage, label), symbol, '\n', content)
    }
    return true
  } else {
    return false
  }
}

export default {
  logTrace,
}