3 * Expose `debug()` as the module.
6 module.exports = debug;
9 * Create a debugger with the given `name`.
11 * @param {String} name
16 function debug(name) {
17 if (!debug.enabled(name)) return function(){};
23 var ms = curr - (debug[name] || curr);
29 + ' +' + debug.humanize(ms);
31 // This hackery is required for IE8
32 // where `console.log` doesn't have 'apply'
35 && Function.prototype.apply.call(console.log, console, arguments);
40 * The currently active debug mode names.
47 * Enables a debug mode by name. This can include modes
48 * separated by a colon and wildcards.
50 * @param {String} name
54 debug.enable = function(name) {
56 localStorage.debug = name;
59 var split = (name || '').split(/[\s,]+/)
62 for (var i = 0; i < len; i++) {
63 name = split[i].replace('*', '.*?');
64 if (name[0] === '-') {
65 debug.skips.push(new RegExp('^' + name.substr(1) + '$'));
68 debug.names.push(new RegExp('^' + name + '$'));
74 * Disable debug output.
79 debug.disable = function(){
84 * Humanize the given `ms`.
91 debug.humanize = function(ms) {
96 if (ms >= hour) return (ms / hour).toFixed(1) + 'h';
97 if (ms >= min) return (ms / min).toFixed(1) + 'm';
98 if (ms >= sec) return (ms / sec | 0) + 's';
103 * Returns true if the given mode name is enabled, false otherwise.
105 * @param {String} name
110 debug.enabled = function(name) {
111 for (var i = 0, len = debug.skips.length; i < len; i++) {
112 if (debug.skips[i].test(name)) {
116 for (var i = 0, len = debug.names.length; i < len; i++) {
117 if (debug.names[i].test(name)) {
128 function coerce(val) {
129 if (val instanceof Error) return val.stack || val.message;
136 if (window.localStorage) debug.enable(localStorage.debug);