| 
/** 
 | 
 * This is the common logic for both the Node.js and web browser 
 | 
 * implementations of `debug()`. 
 | 
 * 
 | 
 * Expose `debug()` as the module. 
 | 
 */ 
 | 
  
 | 
exports = module.exports = createDebug.debug = createDebug['default'] = createDebug; 
 | 
exports.coerce = coerce; 
 | 
exports.disable = disable; 
 | 
exports.enable = enable; 
 | 
exports.enabled = enabled; 
 | 
exports.humanize = require('ms'); 
 | 
  
 | 
/** 
 | 
 * The currently active debug mode names, and names to skip. 
 | 
 */ 
 | 
  
 | 
exports.names = []; 
 | 
exports.skips = []; 
 | 
  
 | 
/** 
 | 
 * Map of special "%n" handling functions, for the debug "format" argument. 
 | 
 * 
 | 
 * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". 
 | 
 */ 
 | 
  
 | 
exports.formatters = {}; 
 | 
  
 | 
/** 
 | 
 * Previous log timestamp. 
 | 
 */ 
 | 
  
 | 
var prevTime; 
 | 
  
 | 
/** 
 | 
 * Select a color. 
 | 
 * @param {String} namespace 
 | 
 * @return {Number} 
 | 
 * @api private 
 | 
 */ 
 | 
  
 | 
function selectColor(namespace) { 
 | 
  var hash = 0, i; 
 | 
  
 | 
  for (i in namespace) { 
 | 
    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i); 
 | 
    hash |= 0; // Convert to 32bit integer 
 | 
  } 
 | 
  
 | 
  return exports.colors[Math.abs(hash) % exports.colors.length]; 
 | 
} 
 | 
  
 | 
/** 
 | 
 * Create a debugger with the given `namespace`. 
 | 
 * 
 | 
 * @param {String} namespace 
 | 
 * @return {Function} 
 | 
 * @api public 
 | 
 */ 
 | 
  
 | 
function createDebug(namespace) { 
 | 
  
 | 
  function debug() { 
 | 
    // disabled? 
 | 
    if (!debug.enabled) return; 
 | 
  
 | 
    var self = debug; 
 | 
  
 | 
    // set `diff` timestamp 
 | 
    var curr = +new Date(); 
 | 
    var ms = curr - (prevTime || curr); 
 | 
    self.diff = ms; 
 | 
    self.prev = prevTime; 
 | 
    self.curr = curr; 
 | 
    prevTime = curr; 
 | 
  
 | 
    // turn the `arguments` into a proper Array 
 | 
    var args = new Array(arguments.length); 
 | 
    for (var i = 0; i < args.length; i++) { 
 | 
      args[i] = arguments[i]; 
 | 
    } 
 | 
  
 | 
    args[0] = exports.coerce(args[0]); 
 | 
  
 | 
    if ('string' !== typeof args[0]) { 
 | 
      // anything else let's inspect with %O 
 | 
      args.unshift('%O'); 
 | 
    } 
 | 
  
 | 
    // apply any `formatters` transformations 
 | 
    var index = 0; 
 | 
    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) { 
 | 
      // if we encounter an escaped % then don't increase the array index 
 | 
      if (match === '%%') return match; 
 | 
      index++; 
 | 
      var formatter = exports.formatters[format]; 
 | 
      if ('function' === typeof formatter) { 
 | 
        var val = args[index]; 
 | 
        match = formatter.call(self, val); 
 | 
  
 | 
        // now we need to remove `args[index]` since it's inlined in the `format` 
 | 
        args.splice(index, 1); 
 | 
        index--; 
 | 
      } 
 | 
      return match; 
 | 
    }); 
 | 
  
 | 
    // apply env-specific formatting (colors, etc.) 
 | 
    exports.formatArgs.call(self, args); 
 | 
  
 | 
    var logFn = debug.log || exports.log || console.log.bind(console); 
 | 
    logFn.apply(self, args); 
 | 
  } 
 | 
  
 | 
  debug.namespace = namespace; 
 | 
  debug.enabled = exports.enabled(namespace); 
 | 
  debug.useColors = exports.useColors(); 
 | 
  debug.color = selectColor(namespace); 
 | 
  
 | 
  // env-specific initialization logic for debug instances 
 | 
  if ('function' === typeof exports.init) { 
 | 
    exports.init(debug); 
 | 
  } 
 | 
  
 | 
  return debug; 
 | 
} 
 | 
  
 | 
/** 
 | 
 * Enables a debug mode by namespaces. This can include modes 
 | 
 * separated by a colon and wildcards. 
 | 
 * 
 | 
 * @param {String} namespaces 
 | 
 * @api public 
 | 
 */ 
 | 
  
 | 
function enable(namespaces) { 
 | 
  exports.save(namespaces); 
 | 
  
 | 
  exports.names = []; 
 | 
  exports.skips = []; 
 | 
  
 | 
  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); 
 | 
  var len = split.length; 
 | 
  
 | 
  for (var i = 0; i < len; i++) { 
 | 
    if (!split[i]) continue; // ignore empty strings 
 | 
    namespaces = split[i].replace(/\*/g, '.*?'); 
 | 
    if (namespaces[0] === '-') { 
 | 
      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); 
 | 
    } else { 
 | 
      exports.names.push(new RegExp('^' + namespaces + '$')); 
 | 
    } 
 | 
  } 
 | 
} 
 | 
  
 | 
/** 
 | 
 * Disable debug output. 
 | 
 * 
 | 
 * @api public 
 | 
 */ 
 | 
  
 | 
function disable() { 
 | 
  exports.enable(''); 
 | 
} 
 | 
  
 | 
/** 
 | 
 * Returns true if the given mode name is enabled, false otherwise. 
 | 
 * 
 | 
 * @param {String} name 
 | 
 * @return {Boolean} 
 | 
 * @api public 
 | 
 */ 
 | 
  
 | 
function enabled(name) { 
 | 
  var i, len; 
 | 
  for (i = 0, len = exports.skips.length; i < len; i++) { 
 | 
    if (exports.skips[i].test(name)) { 
 | 
      return false; 
 | 
    } 
 | 
  } 
 | 
  for (i = 0, len = exports.names.length; i < len; i++) { 
 | 
    if (exports.names[i].test(name)) { 
 | 
      return true; 
 | 
    } 
 | 
  } 
 | 
  return false; 
 | 
} 
 | 
  
 | 
/** 
 | 
 * Coerce `val`. 
 | 
 * 
 | 
 * @param {Mixed} val 
 | 
 * @return {Mixed} 
 | 
 * @api private 
 | 
 */ 
 | 
  
 | 
function coerce(val) { 
 | 
  if (val instanceof Error) return val.stack || val.message; 
 | 
  return val; 
 | 
} 
 |