Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor to make the common code be a setup function #507

Merged
merged 1 commit into from Oct 11, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
40 changes: 17 additions & 23 deletions src/browser.js
@@ -1,10 +1,7 @@
/**
* This is the web browser implementation of `debug()`.
*
* Expose `debug()` as the module.
*/

exports = module.exports = require('./debug');
exports.log = log;
exports.formatArgs = formatArgs;
exports.save = save;
Expand Down Expand Up @@ -66,19 +63,6 @@ function useColors() {
(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
}

/**
* Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
*/

exports.formatters.j = function(v) {
try {
return JSON.stringify(v);
} catch (err) {
return '[UnexpectedJSONParseError]: ' + err.message;
}
};


/**
* Colorize log arguments if enabled.
*
Expand All @@ -93,7 +77,7 @@ function formatArgs(args) {
+ (useColors ? ' %c' : ' ')
+ args[0]
+ (useColors ? '%c ' : ' ')
+ '+' + exports.humanize(this.diff);
+ '+' + module.exports.humanize(this.diff);

if (!useColors) return;

Expand Down Expand Up @@ -171,12 +155,6 @@ function load() {
return r;
}

/**
* Enable namespaces listed in `localStorage.debug` initially.
*/

exports.enable(load());

/**
* Localstorage attempts to return the localstorage.
*
Expand All @@ -193,3 +171,19 @@ function localstorage() {
return window.localStorage;
} catch (e) {}
}

module.exports = require('./common')(exports);

var formatters = module.exports.formatters;

/**
* Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
*/

formatters.j = function(v) {
try {
return JSON.stringify(v);
} catch (err) {
return '[UnexpectedJSONParseError]: ' + err.message;
}
};
235 changes: 235 additions & 0 deletions src/common.js
@@ -0,0 +1,235 @@

/**
* This is the common logic for both the Node.js and web browser
* implementations of `debug()`.
*/

module.exports = function setup(env) {
createDebug.debug = createDebug['default'] = createDebug;
createDebug.coerce = coerce;
createDebug.disable = disable;
createDebug.enable = enable;
createDebug.enabled = enabled;
createDebug.humanize = require('ms');

Object.keys(env).forEach(function(key) {
createDebug[key] = env[key];
});

/**
* Active `debug` instances.
*/
createDebug.instances = [];

/**
* The currently active debug mode names, and names to skip.
*/

createDebug.names = [];
createDebug.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".
*/

createDebug.formatters = {};

/**
* 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 createDebug.colors[Math.abs(hash) % createDebug.colors.length];
}
createDebug.selectColor = selectColor;

/**
* Create a debugger with the given `namespace`.
*
* @param {String} namespace
* @return {Function}
* @api public
*/

function createDebug(namespace) {
var prevTime;

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] = createDebug.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 = createDebug.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.)
createDebug.formatArgs.call(self, args);

var logFn = self.log || createDebug.log;
logFn.apply(self, args);
}

debug.namespace = namespace;
debug.enabled = createDebug.enabled(namespace);
debug.useColors = createDebug.useColors();
debug.color = selectColor(namespace);
debug.destroy = destroy;
//debug.formatArgs = formatArgs;
//debug.rawLog = rawLog;

// env-specific initialization logic for debug instances
if ('function' === typeof createDebug.init) {
createDebug.init(debug);
}

createDebug.instances.push(debug);

return debug;
}

function destroy () {
var index = createDebug.instances.indexOf(this);
if (index !== -1) {
createDebug.instances.splice(index, 1);
return true;
} else {
return false;
}
}

/**
* Enables a debug mode by namespaces. This can include modes
* separated by a colon and wildcards.
*
* @param {String} namespaces
* @api public
*/

function enable(namespaces) {
createDebug.save(namespaces);

createDebug.names = [];
createDebug.skips = [];

var i;
var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
var len = split.length;

for (i = 0; i < len; i++) {
if (!split[i]) continue; // ignore empty strings
namespaces = split[i].replace(/\*/g, '.*?');
if (namespaces[0] === '-') {
createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
} else {
createDebug.names.push(new RegExp('^' + namespaces + '$'));
}
}

for (i = 0; i < createDebug.instances.length; i++) {
var instance = createDebug.instances[i];
instance.enabled = createDebug.enabled(instance.namespace);
}
}

/**
* Disable debug output.
*
* @api public
*/

function disable() {
createDebug.enable('');
}

/**
* Returns true if the given mode name is enabled, false otherwise.
*
* @param {String} name
* @return {Boolean}
* @api public
*/

function enabled(name) {
if (name[name.length - 1] === '*') {
return true;
}
var i, len;
for (i = 0, len = createDebug.skips.length; i < len; i++) {
if (createDebug.skips[i].test(name)) {
return false;
}
}
for (i = 0, len = createDebug.names.length; i < len; i++) {
if (createDebug.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;
}

createDebug.enable(createDebug.load());

return createDebug;
}