Permalink
Cannot retrieve contributors at this time
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
202 lines (164 sloc)
4.26 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * 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 = (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; | |
| } |