148 lines
2.3 KiB
JavaScript
148 lines
2.3 KiB
JavaScript
/**
|
|
* Module dependencies.
|
|
*/
|
|
|
|
var tty = require('tty');
|
|
|
|
/**
|
|
* Expose `debug()` as the module.
|
|
*/
|
|
|
|
module.exports = debug;
|
|
|
|
/**
|
|
* Enabled debuggers.
|
|
*/
|
|
|
|
var names = []
|
|
, skips = [];
|
|
|
|
(process.env.DEBUG || '')
|
|
.split(/[\s,]+/)
|
|
.forEach(function(name){
|
|
name = name.replace('*', '.*?');
|
|
if (name[0] === '-') {
|
|
skips.push(new RegExp('^' + name.substr(1) + '$'));
|
|
} else {
|
|
names.push(new RegExp('^' + name + '$'));
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Colors.
|
|
*/
|
|
|
|
var colors = [6, 2, 3, 4, 5, 1];
|
|
|
|
/**
|
|
* Previous debug() call.
|
|
*/
|
|
|
|
var prev = {};
|
|
|
|
/**
|
|
* Previously assigned color.
|
|
*/
|
|
|
|
var prevColor = 0;
|
|
|
|
/**
|
|
* Is stdout a TTY? Colored output is disabled when `true`.
|
|
*/
|
|
|
|
var isatty = tty.isatty(2);
|
|
|
|
/**
|
|
* Select a color.
|
|
*
|
|
* @return {Number}
|
|
* @api private
|
|
*/
|
|
|
|
function color() {
|
|
return colors[prevColor++ % colors.length];
|
|
}
|
|
|
|
/**
|
|
* Humanize the given `ms`.
|
|
*
|
|
* @param {Number} m
|
|
* @return {String}
|
|
* @api private
|
|
*/
|
|
|
|
function humanize(ms) {
|
|
var sec = 1000
|
|
, min = 60 * 1000
|
|
, hour = 60 * min;
|
|
|
|
if (ms >= hour) return (ms / hour).toFixed(1) + 'h';
|
|
if (ms >= min) return (ms / min).toFixed(1) + 'm';
|
|
if (ms >= sec) return (ms / sec | 0) + 's';
|
|
return ms + 'ms';
|
|
}
|
|
|
|
/**
|
|
* Create a debugger with the given `name`.
|
|
*
|
|
* @param {String} name
|
|
* @return {Type}
|
|
* @api public
|
|
*/
|
|
|
|
function debug(name) {
|
|
function disabled(){}
|
|
disabled.enabled = false;
|
|
|
|
var match = skips.some(function(re){
|
|
return re.test(name);
|
|
});
|
|
|
|
if (match) return disabled;
|
|
|
|
match = names.some(function(re){
|
|
return re.test(name);
|
|
});
|
|
|
|
if (!match) return disabled;
|
|
var c = color();
|
|
|
|
function colored(fmt) {
|
|
fmt = coerce(fmt);
|
|
|
|
var curr = new Date;
|
|
var ms = curr - (prev[name] || curr);
|
|
prev[name] = curr;
|
|
|
|
fmt = ' \u001b[9' + c + 'm' + name + ' '
|
|
+ '\u001b[3' + c + 'm\u001b[90m'
|
|
+ fmt + '\u001b[3' + c + 'm'
|
|
+ ' +' + humanize(ms) + '\u001b[0m';
|
|
|
|
console.error.apply(this, arguments);
|
|
}
|
|
|
|
function plain(fmt) {
|
|
fmt = coerce(fmt);
|
|
|
|
fmt = new Date().toUTCString()
|
|
+ ' ' + name + ' ' + fmt;
|
|
console.error.apply(this, arguments);
|
|
}
|
|
|
|
colored.enabled = plain.enabled = true;
|
|
|
|
return isatty || process.env.DEBUG_COLORS
|
|
? colored
|
|
: plain;
|
|
}
|
|
|
|
/**
|
|
* Coerce `val`.
|
|
*/
|
|
|
|
function coerce(val) {
|
|
if (val instanceof Error) return val.stack || val.message;
|
|
return val;
|
|
}
|