173 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
var util = require('util')
 | 
						|
var _ = require('lodash')
 | 
						|
 | 
						|
var loggerInstance
 | 
						|
 | 
						|
var defaultProvider = {
 | 
						|
  log: console.log,
 | 
						|
  debug: console.log, // use .log(); since console does not have .debug()
 | 
						|
  info: console.info,
 | 
						|
  warn: console.warn,
 | 
						|
  error: console.error
 | 
						|
}
 | 
						|
 | 
						|
// log level 'weight'
 | 
						|
var LEVELS = {
 | 
						|
  debug: 10,
 | 
						|
  info: 20,
 | 
						|
  warn: 30,
 | 
						|
  error: 50,
 | 
						|
  silent: 80
 | 
						|
}
 | 
						|
 | 
						|
module.exports = {
 | 
						|
  // singleton
 | 
						|
  getInstance: function() {
 | 
						|
    if (!loggerInstance) {
 | 
						|
      loggerInstance = new Logger()
 | 
						|
    }
 | 
						|
 | 
						|
    return loggerInstance
 | 
						|
  },
 | 
						|
  getArrow: getArrow
 | 
						|
}
 | 
						|
 | 
						|
function Logger() {
 | 
						|
  var logLevel
 | 
						|
  var provider
 | 
						|
 | 
						|
  var api = {
 | 
						|
    log: log,
 | 
						|
    debug: debug,
 | 
						|
    info: info,
 | 
						|
    warn: warn,
 | 
						|
    error: error,
 | 
						|
    setLevel: function(v) {
 | 
						|
      if (isValidLevel(v)) {
 | 
						|
        logLevel = v
 | 
						|
      }
 | 
						|
    },
 | 
						|
    setProvider: function(fn) {
 | 
						|
      if (fn && isValidProvider(fn)) {
 | 
						|
        provider = fn(defaultProvider)
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  init()
 | 
						|
 | 
						|
  return api
 | 
						|
 | 
						|
  function init() {
 | 
						|
    api.setLevel('info')
 | 
						|
    api.setProvider(function() {
 | 
						|
      return defaultProvider
 | 
						|
    })
 | 
						|
  }
 | 
						|
 | 
						|
  // log will log messages, regardless of logLevels
 | 
						|
  function log() {
 | 
						|
    provider.log(_interpolate.apply(null, arguments))
 | 
						|
  }
 | 
						|
 | 
						|
  function debug() {
 | 
						|
    if (_showLevel('debug')) {
 | 
						|
      provider.debug(_interpolate.apply(null, arguments))
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  function info() {
 | 
						|
    if (_showLevel('info')) {
 | 
						|
      provider.info(_interpolate.apply(null, arguments))
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  function warn() {
 | 
						|
    if (_showLevel('warn')) {
 | 
						|
      provider.warn(_interpolate.apply(null, arguments))
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  function error() {
 | 
						|
    if (_showLevel('error')) {
 | 
						|
      provider.error(_interpolate.apply(null, arguments))
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Decide to log or not to log, based on the log levels 'weight'
 | 
						|
   * @param  {String}  showLevel [debug, info, warn, error, silent]
 | 
						|
   * @return {Boolean}
 | 
						|
   */
 | 
						|
  function _showLevel(showLevel) {
 | 
						|
    var result = false
 | 
						|
    var currentLogLevel = LEVELS[logLevel]
 | 
						|
 | 
						|
    if (currentLogLevel && currentLogLevel <= LEVELS[showLevel]) {
 | 
						|
      result = true
 | 
						|
    }
 | 
						|
 | 
						|
    return result
 | 
						|
  }
 | 
						|
 | 
						|
  // make sure logged messages and its data are return interpolated
 | 
						|
  // make it possible for additional log data, such date/time or custom prefix.
 | 
						|
  function _interpolate() {
 | 
						|
    var fn = _.spread(util.format)
 | 
						|
    var result = fn(_.slice(arguments))
 | 
						|
 | 
						|
    return result
 | 
						|
  }
 | 
						|
 | 
						|
  function isValidProvider(fnProvider) {
 | 
						|
    var result = true
 | 
						|
 | 
						|
    if (fnProvider && !_.isFunction(fnProvider)) {
 | 
						|
      throw new Error('[HPM] Log provider config error. Expecting a function.')
 | 
						|
    }
 | 
						|
 | 
						|
    return result
 | 
						|
  }
 | 
						|
 | 
						|
  function isValidLevel(levelName) {
 | 
						|
    var validLevels = _.keys(LEVELS)
 | 
						|
    var isValid = _.includes(validLevels, levelName)
 | 
						|
 | 
						|
    if (!isValid) {
 | 
						|
      throw new Error('[HPM] Log level error. Invalid logLevel.')
 | 
						|
    }
 | 
						|
 | 
						|
    return isValid
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * -> normal proxy
 | 
						|
 * => router
 | 
						|
 * ~> pathRewrite
 | 
						|
 * ≈> router + pathRewrite
 | 
						|
 *
 | 
						|
 * @param  {String} originalPath
 | 
						|
 * @param  {String} newPath
 | 
						|
 * @param  {String} originalTarget
 | 
						|
 * @param  {String} newTarget
 | 
						|
 * @return {String}
 | 
						|
 */
 | 
						|
function getArrow(originalPath, newPath, originalTarget, newTarget) {
 | 
						|
  var arrow = ['>']
 | 
						|
  var isNewTarget = originalTarget !== newTarget // router
 | 
						|
  var isNewPath = originalPath !== newPath // pathRewrite
 | 
						|
 | 
						|
  if (isNewPath && !isNewTarget) {
 | 
						|
    arrow.unshift('~')
 | 
						|
  } else if (!isNewPath && isNewTarget) {
 | 
						|
    arrow.unshift('=')
 | 
						|
  } else if (isNewPath && isNewTarget) {
 | 
						|
    arrow.unshift('≈')
 | 
						|
  } else {
 | 
						|
    arrow.unshift('-')
 | 
						|
  }
 | 
						|
 | 
						|
  return arrow.join('')
 | 
						|
}
 |