UNPKG

illumut

Version:

Plugin for JS logger loglevel which allows enable/disable debug output dynamically

530 lines (465 loc) 14.5 kB
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.loglevelDebug = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; var queue = []; var draining = false; var currentQueue; var queueIndex = -1; function cleanUpNextTick() { if (!draining || !currentQueue) { return; } draining = false; if (currentQueue.length) { queue = currentQueue.concat(queue); } else { queueIndex = -1; } if (queue.length) { drainQueue(); } } function drainQueue() { if (draining) { return; } var timeout = setTimeout(cleanUpNextTick); draining = true; var len = queue.length; while(len) { currentQueue = queue; queue = []; while (++queueIndex < len) { if (currentQueue) { currentQueue[queueIndex].run(); } } queueIndex = -1; len = queue.length; } currentQueue = null; draining = false; clearTimeout(timeout); } process.nextTick = function (fun) { var args = new Array(arguments.length - 1); if (arguments.length > 1) { for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { setTimeout(drainQueue, 0); } }; // v8 likes predictible objects function Item(fun, array) { this.fun = fun; this.array = array; } Item.prototype.run = function () { this.fun.apply(null, this.array); }; process.title = 'browser'; process.browser = true; process.env = {}; process.argv = []; process.version = ''; // empty string to avoid regexp issues process.versions = {}; function noop() {} process.on = noop; process.addListener = noop; process.once = noop; process.off = noop; process.removeListener = noop; process.removeAllListeners = noop; process.emit = noop; process.binding = function (name) { throw new Error('process.binding is not supported'); }; process.cwd = function () { return '/' }; process.chdir = function (dir) { throw new Error('process.chdir is not supported'); }; process.umask = function() { return 0; }; },{}],2:[function(require,module,exports){ /* * loglevel - https://github.com/pimterry/loglevel * * Copyright (c) 2013 Tim Perry * Licensed under the MIT license. */ (function (root, definition) { "use strict"; if (typeof module === 'object' && module.exports && typeof require === 'function') { module.exports = definition(); } else if (typeof define === 'function' && typeof define.amd === 'object') { define(definition); } else { root.log = definition(); } }(this, function () { "use strict"; var noop = function() {}; var undefinedType = "undefined"; function realMethod(methodName) { if (typeof console === undefinedType) { return false; // We can't build a real method without a console to log to } else if (console[methodName] !== undefined) { return bindMethod(console, methodName); } else if (console.log !== undefined) { return bindMethod(console, 'log'); } else { return noop; } } function bindMethod(obj, methodName) { var method = obj[methodName]; if (typeof method.bind === 'function') { return method.bind(obj); } else { try { return Function.prototype.bind.call(method, obj); } catch (e) { // Missing bind shim or IE8 + Modernizr, fallback to wrapping return function() { return Function.prototype.apply.apply(method, [obj, arguments]); }; } } } // these private functions always need `this` to be set properly function enableLoggingWhenConsoleArrives(methodName, level, loggerName) { return function () { if (typeof console !== undefinedType) { replaceLoggingMethods.call(this, level, loggerName); this[methodName].apply(this, arguments); } }; } function replaceLoggingMethods(level, loggerName) { /*jshint validthis:true */ for (var i = 0; i < logMethods.length; i++) { var methodName = logMethods[i]; this[methodName] = (i < level) ? noop : this.methodFactory(methodName, level, loggerName); } } function defaultMethodFactory(methodName, level, loggerName) { /*jshint validthis:true */ return realMethod(methodName) || enableLoggingWhenConsoleArrives.apply(this, arguments); } var logMethods = [ "trace", "debug", "info", "warn", "error" ]; function Logger(name, defaultLevel, factory) { var self = this; var currentLevel; var storageKey = "loglevel"; if (name) { storageKey += ":" + name; } function persistLevelIfPossible(levelNum) { var levelName = (logMethods[levelNum] || 'silent').toUpperCase(); // Use localStorage if available try { window.localStorage[storageKey] = levelName; return; } catch (ignore) {} // Use session cookie as fallback try { window.document.cookie = encodeURIComponent(storageKey) + "=" + levelName + ";"; } catch (ignore) {} } function getPersistedLevel() { var storedLevel; try { storedLevel = window.localStorage[storageKey]; } catch (ignore) {} if (typeof storedLevel === undefinedType) { try { var cookie = window.document.cookie; var location = cookie.indexOf( encodeURIComponent(storageKey) + "="); if (location) { storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1]; } } catch (ignore) {} } // If the stored level is not valid, treat it as if nothing was stored. if (self.levels[storedLevel] === undefined) { storedLevel = undefined; } return storedLevel; } /* * * Public API * */ self.levels = { "TRACE": 0, "DEBUG": 1, "INFO": 2, "WARN": 3, "ERROR": 4, "SILENT": 5}; self.methodFactory = factory || defaultMethodFactory; self.getLevel = function () { return currentLevel; }; self.setLevel = function (level, persist) { if (typeof level === "string" && self.levels[level.toUpperCase()] !== undefined) { level = self.levels[level.toUpperCase()]; } if (typeof level === "number" && level >= 0 && level <= self.levels.SILENT) { currentLevel = level; if (persist !== false) { // defaults to true persistLevelIfPossible(level); } replaceLoggingMethods.call(self, level, name); if (typeof console === undefinedType && level < self.levels.SILENT) { return "No console available for logging"; } } else { throw "log.setLevel() called with invalid level: " + level; } }; self.setDefaultLevel = function (level) { if (!getPersistedLevel()) { self.setLevel(level, false); } }; self.enableAll = function(persist) { self.setLevel(self.levels.TRACE, persist); }; self.disableAll = function(persist) { self.setLevel(self.levels.SILENT, persist); }; // Initialize with the right level var initialLevel = getPersistedLevel(); if (initialLevel == null) { initialLevel = defaultLevel == null ? "WARN" : defaultLevel; } self.setLevel(initialLevel, false); } /* * * Package-level API * */ var defaultLogger = new Logger(); var _loggersByName = {}; defaultLogger.getLogger = function getLogger(name) { if (typeof name !== "string" || name === "") { throw new TypeError("You must supply a name when creating a logger."); } var logger = _loggersByName[name]; if (!logger) { logger = _loggersByName[name] = new Logger( name, defaultLogger.getLevel(), defaultLogger.methodFactory); } return logger; }; // Grab the current global log variable in case of overwrite var _log = (typeof window !== undefinedType) ? window.log : undefined; defaultLogger.noConflict = function() { if (typeof window !== undefinedType && window.log === defaultLogger) { window.log = _log; } return defaultLogger; }; return defaultLogger; })); },{}],3:[function(require,module,exports){ (function (process,global){ var BROWSER = typeof window !== 'undefined'; /** * Exports */ module.exports = loglevelDebug; loglevelDebug.getMode = getMode; loglevelDebug.enable = enable; loglevelDebug.enabled = enabled; loglevelDebug.disable = disable; /** * Internal States */ var skips = []; var names = []; var _loggers = {}; /** * Composit a new object. * * Links all attributes of source object to * target object. * * @param {Object} src * @param {Object} target */ function composit(src, target) { var o = {}; Object.keys(src).forEach(function(k) { var attr = src[k]; target[k] = attr.bind ? attr.bind(k) : attr; }); } /** * ----------------- * Package level API * ----------------- */ /** * Read environment variable. * * @param {String} key * @param {Any} defVal default value * @returns {Any} * @throws {Error} * @api private */ function readEnv(key, defVal) { var env = BROWSER ? global : process.env; var v = env[key]; return v ? v : defVal; } /** * Set environment variable * * @param {String} key * @param {Any} val * @api private */ function setEnv(key, val) { var env = BROWSER ? global : process.env; env[key] = val; } /** To know which mode we are running. * * @return {String} debug or production * @api public */ function getMode() { return (names.length > 0 || skips.length >0) ? 'debug' : 'production'; } /** * Enables a debug mode by namespaces. This can include modes * separated by a colon and wildcards. * * @param {String} namespaces * @api public */ function enable(namespaces) { if (!readEnv('DEBUG')) setEnv('DEBUG', namespaces); 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] === '-') { skips.push(new RegExp('^' + namespaces.substr(1) + '$')); } else { names.push(new RegExp('^' + namespaces + '$')); } } for(var k in _loggers) { var logger = _loggers[k]; if (enabled(k)) { logger.setLevel(logger.levels.DEBUG); } else { logger.setLevel(logger.levels.INFO); } } } /** * Returns true if the given mode name is enabled, false otherwise. * * @param {String} name * @return {Boolean} * @api public */ function enabled(name) { if (getMode() !== 'debug') return true; var i, len; for (i = 0, len = skips.length; i < len; i++) { if (skips[i].test(name)) { return false; } } for (i = 0, len = names.length; i < len; i++) { if (names[i].test(name)) { return true; } } return false; } /** * Disable debug mode. * * @api public */ function disable() { names = []; skips = []; for(var k in _loggers) { var logger = _loggers[k]; logger.setLevel(logger.levels.INFO); } } /** Plugin itself * * Given a logger name, it returns a logger. * Given a loglevel logger, it replaced its original methodFactory. * * @param {String|Object} nameOrLogger logger name or a loglevel logger. * @return {Object} loglevel logger * @api public */ function loglevelDebug(nameOrLogger) { var DEBUG = readEnv('DEBUG'); var log; if (typeof nameOrLogger === 'string') { log = _loggers[nameOrLogger] = require('loglevel').getLogger(nameOrLogger); } else if (typeof nameOrLogger === 'object') { log = nameOrLogger; } else { log = require('loglevel'); } var originalFactory = log.methodFactory; log.methodFactory = function(methodName, logLevel, loggerName) { var rawMethod = originalFactory(methodName, logLevel, loggerName); var prefix = [ '[' + methodName.toUpperCase() + ']', new Date(), loggerName ].join(' '); return function(message) { var args = Array.prototype.slice.call(arguments); args[0] = prefix + ' ' + args[0]; return rawMethod.apply(this, args); }; }; if (DEBUG) { disable(); enable(DEBUG); } else { log.setLevel(log.levels.INFO); } var callableLogger = function() { return log.debug.apply(this, arguments); }; composit(log, callableLogger); return callableLogger; } }).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{"_process":1,"loglevel":2}]},{},[3])(3) });