--- /dev/null
+/**
+ * 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;
+}