diff --git a/README.md b/README.md index c9b933b..bccc09e 100644 --- a/README.md +++ b/README.md @@ -149,6 +149,8 @@ v0.5.0 - Fix for Modernizr+IE8 issues, improved setLevel error handling, support v0.6.0 - Handle logging in Safari private browsing mode (#33), fix TRACE level persistence bug (#35), plus various minor tweaks +v1.0.0 - Official stable release. Fixed a bug with localStorage in Android webviews, improved CommonJS detection, and added noConflict(). + ## License Copyright (c) 2013 Tim Perry Licensed under the MIT license. diff --git a/bower.json b/bower.json index c2cdfe8..418645c 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "loglevel", - "version": "0.6.0", + "version": "1.0.0", "main": "dist/loglevel.min.js", "dependencies": {}, "ignore": [ @@ -8,4 +8,4 @@ "node_modules", "components" ] -} \ No newline at end of file +} diff --git a/dist/loglevel.js b/dist/loglevel.js index bf71730..1fc520b 100644 --- a/dist/loglevel.js +++ b/dist/loglevel.js @@ -1,191 +1,203 @@ -/*! loglevel - v0.6.0 - https://github.com/pimterry/loglevel - (c) 2014 Tim Perry - licensed MIT */ -;(function (undefined) { - var undefinedType = "undefined"; - - (function (name, definition) { - if (typeof module !== 'undefined') { - module.exports = definition(); - } else if (typeof define === 'function' && typeof define.amd === 'object') { - define(definition); - } else { - this[name] = definition(); - } - }('log', function () { - var self = {}; - var noop = function() {}; - - function realMethod(methodName) { - if (typeof console === undefinedType) { - return noop; - } else if (console[methodName] === undefined) { - if (console.log !== undefined) { - return boundToConsole(console, 'log'); - } else { - return noop; - } - } else { - return boundToConsole(console, methodName); - } - } - - function boundToConsole(console, methodName) { - var method = console[methodName]; - if (method.bind === undefined) { - if (Function.prototype.bind === undefined) { - return functionBindingWrapper(method, console); - } else { - try { - return Function.prototype.bind.call(console[methodName], console); - } catch (e) { - // In IE8 + Modernizr, the bind shim will reject the above, so we fall back to wrapping - return functionBindingWrapper(method, console); - } - } - } else { - return console[methodName].bind(console); - } - } - - function functionBindingWrapper(f, context) { - return function() { - Function.prototype.apply.apply(f, [context, arguments]); - }; - } - - var logMethods = [ - "trace", - "debug", - "info", - "warn", - "error" - ]; - - function replaceLoggingMethods(methodFactory) { - for (var ii = 0; ii < logMethods.length; ii++) { - self[logMethods[ii]] = methodFactory(logMethods[ii]); - } - } - - function cookiesAvailable() { - return (typeof window !== undefinedType && - window.document !== undefined && - window.document.cookie !== undefined); - } - - function localStorageAvailable() { - try { - return (typeof window !== undefinedType && - window.localStorage !== undefined); - } catch (e) { - return false; - } - } - - function persistLevelIfPossible(levelNum) { - var localStorageFail = false, - levelName; - - for (var key in self.levels) { - if (self.levels.hasOwnProperty(key) && self.levels[key] === levelNum) { - levelName = key; - break; - } - } - - if (localStorageAvailable()) { - /* - * Setting localStorage can create a DOM 22 Exception if running in Private mode - * in Safari, so even if it is available we need to catch any errors when trying - * to write to it - */ - try { - window.localStorage['loglevel'] = levelName; - } catch (e) { - localStorageFail = true; - } - } else { - localStorageFail = true; - } - - if (localStorageFail && cookiesAvailable()) { - window.document.cookie = "loglevel=" + levelName + ";"; - } - } - - var cookieRegex = /loglevel=([^;]+)/; - - function loadPersistedLevel() { - var storedLevel; - - if (localStorageAvailable()) { - storedLevel = window.localStorage['loglevel']; - } - - if (storedLevel === undefined && cookiesAvailable()) { - var cookieMatch = cookieRegex.exec(window.document.cookie) || []; - storedLevel = cookieMatch[1]; - } - - if (self.levels[storedLevel] === undefined) { - storedLevel = "WARN"; - } - - self.setLevel(self.levels[storedLevel]); - } - - /* - * - * Public API - * - */ - - self.levels = { "TRACE": 0, "DEBUG": 1, "INFO": 2, "WARN": 3, - "ERROR": 4, "SILENT": 5}; - - self.setLevel = function (level) { - if (typeof level === "number" && level >= 0 && level <= self.levels.SILENT) { - persistLevelIfPossible(level); - - if (level === self.levels.SILENT) { - replaceLoggingMethods(function () { - return noop; - }); - return; - } else if (typeof console === undefinedType) { - replaceLoggingMethods(function (methodName) { - return function () { - if (typeof console !== undefinedType) { - self.setLevel(level); - self[methodName].apply(self, arguments); - } - }; - }); - return "No console available for logging"; - } else { - replaceLoggingMethods(function (methodName) { - if (level <= self.levels[methodName.toUpperCase()]) { - return realMethod(methodName); - } else { - return noop; - } - }); - } - } else if (typeof level === "string" && self.levels[level.toUpperCase()] !== undefined) { - self.setLevel(self.levels[level.toUpperCase()]); - } else { - throw "log.setLevel() called with invalid level: " + level; - } - }; - - self.enableAll = function() { - self.setLevel(self.levels.TRACE); - }; - - self.disableAll = function() { - self.setLevel(self.levels.SILENT); - }; - - loadPersistedLevel(); - return self; - })); -})(); +/*! loglevel - v1.0.0 - https://github.com/pimterry/loglevel - (c) 2014 Tim Perry - licensed MIT */ +;(function (undefined) { + var undefinedType = "undefined"; + + (function (name, definition) { + if (typeof module === 'object' && module.exports && typeof require === 'function') { + module.exports = definition(); + } else if (typeof define === 'function' && typeof define.amd === 'object') { + define(definition); + } else { + this[name] = definition(); + } + }('log', function () { + var self = {}; + var noop = function() {}; + + function realMethod(methodName) { + if (typeof console === undefinedType) { + return noop; + } else if (console[methodName] === undefined) { + if (console.log !== undefined) { + return boundToConsole(console, 'log'); + } else { + return noop; + } + } else { + return boundToConsole(console, methodName); + } + } + + function boundToConsole(console, methodName) { + var method = console[methodName]; + if (method.bind === undefined) { + if (Function.prototype.bind === undefined) { + return functionBindingWrapper(method, console); + } else { + try { + return Function.prototype.bind.call(console[methodName], console); + } catch (e) { + // In IE8 + Modernizr, the bind shim will reject the above, so we fall back to wrapping + return functionBindingWrapper(method, console); + } + } + } else { + return console[methodName].bind(console); + } + } + + function functionBindingWrapper(f, context) { + return function() { + Function.prototype.apply.apply(f, [context, arguments]); + }; + } + + var logMethods = [ + "trace", + "debug", + "info", + "warn", + "error" + ]; + + function replaceLoggingMethods(methodFactory) { + for (var ii = 0; ii < logMethods.length; ii++) { + self[logMethods[ii]] = methodFactory(logMethods[ii]); + } + } + + function cookiesAvailable() { + return (typeof window !== undefinedType && + window.document !== undefined && + window.document.cookie !== undefined); + } + + function localStorageAvailable() { + try { + return (typeof window !== undefinedType && + window.localStorage !== undefined && + window.localStorage !== null); + } catch (e) { + return false; + } + } + + function persistLevelIfPossible(levelNum) { + var localStorageFail = false, + levelName; + + for (var key in self.levels) { + if (self.levels.hasOwnProperty(key) && self.levels[key] === levelNum) { + levelName = key; + break; + } + } + + if (localStorageAvailable()) { + /* + * Setting localStorage can create a DOM 22 Exception if running in Private mode + * in Safari, so even if it is available we need to catch any errors when trying + * to write to it + */ + try { + window.localStorage['loglevel'] = levelName; + } catch (e) { + localStorageFail = true; + } + } else { + localStorageFail = true; + } + + if (localStorageFail && cookiesAvailable()) { + window.document.cookie = "loglevel=" + levelName + ";"; + } + } + + var cookieRegex = /loglevel=([^;]+)/; + + function loadPersistedLevel() { + var storedLevel; + + if (localStorageAvailable()) { + storedLevel = window.localStorage['loglevel']; + } + + if (storedLevel === undefined && cookiesAvailable()) { + var cookieMatch = cookieRegex.exec(window.document.cookie) || []; + storedLevel = cookieMatch[1]; + } + + if (self.levels[storedLevel] === undefined) { + storedLevel = "WARN"; + } + + self.setLevel(self.levels[storedLevel]); + } + + /* + * + * Public API + * + */ + + self.levels = { "TRACE": 0, "DEBUG": 1, "INFO": 2, "WARN": 3, + "ERROR": 4, "SILENT": 5}; + + self.setLevel = function (level) { + if (typeof level === "number" && level >= 0 && level <= self.levels.SILENT) { + persistLevelIfPossible(level); + + if (level === self.levels.SILENT) { + replaceLoggingMethods(function () { + return noop; + }); + return; + } else if (typeof console === undefinedType) { + replaceLoggingMethods(function (methodName) { + return function () { + if (typeof console !== undefinedType) { + self.setLevel(level); + self[methodName].apply(self, arguments); + } + }; + }); + return "No console available for logging"; + } else { + replaceLoggingMethods(function (methodName) { + if (level <= self.levels[methodName.toUpperCase()]) { + return realMethod(methodName); + } else { + return noop; + } + }); + } + } else if (typeof level === "string" && self.levels[level.toUpperCase()] !== undefined) { + self.setLevel(self.levels[level.toUpperCase()]); + } else { + throw "log.setLevel() called with invalid level: " + level; + } + }; + + self.enableAll = function() { + self.setLevel(self.levels.TRACE); + }; + + self.disableAll = function() { + self.setLevel(self.levels.SILENT); + }; + + // Grab the current global log variable in case of overwrite + var _log = (typeof window !== undefinedType) ? window.log : undefined; + self.noConflict = function() { + if (typeof window !== undefinedType && + window.log === self) { + window.log = _log; + } + + return self; + }; + + loadPersistedLevel(); + return self; + })); +})(); diff --git a/dist/loglevel.min.js b/dist/loglevel.min.js index fdc4437..fb76bc7 100644 --- a/dist/loglevel.min.js +++ b/dist/loglevel.min.js @@ -1,2 +1,2 @@ -/*! loglevel - v0.6.0 - https://github.com/pimterry/loglevel - (c) 2014 Tim Perry - licensed MIT */ -!function(a){var b="undefined";!function(a,b){"undefined"!=typeof module?module.exports=b():"function"==typeof define&&"object"==typeof define.amd?define(b):this[a]=b()}("log",function(){function c(c){return typeof console===b?l:console[c]===a?console.log!==a?d(console,"log"):l:d(console,c)}function d(b,c){var d=b[c];if(d.bind!==a)return b[c].bind(b);if(Function.prototype.bind===a)return e(d,b);try{return Function.prototype.bind.call(b[c],b)}catch(f){return e(d,b)}}function e(a,b){return function(){Function.prototype.apply.apply(a,[b,arguments])}}function f(a){for(var b=0;b=0&&d<=k.levels.SILENT){if(i(d),d===k.levels.SILENT)return void f(function(){return l});if(typeof console===b)return f(function(a){return function(){typeof console!==b&&(k.setLevel(d),k[a].apply(k,arguments))}}),"No console available for logging";f(function(a){return d<=k.levels[a.toUpperCase()]?c(a):l})}else{if("string"!=typeof d||k.levels[d.toUpperCase()]===a)throw"log.setLevel() called with invalid level: "+d;k.setLevel(k.levels[d.toUpperCase()])}},k.enableAll=function(){k.setLevel(k.levels.TRACE)},k.disableAll=function(){k.setLevel(k.levels.SILENT)},j(),k})}(); \ No newline at end of file +/*! loglevel - v1.0.0 - https://github.com/pimterry/loglevel - (c) 2014 Tim Perry - licensed MIT */ +!function(a){var b="undefined";!function(a,b){"object"==typeof module&&module.exports&&"function"==typeof require?module.exports=b():"function"==typeof define&&"object"==typeof define.amd?define(b):this[a]=b()}("log",function(){function c(c){return typeof console===b?l:console[c]===a?console.log!==a?d(console,"log"):l:d(console,c)}function d(b,c){var d=b[c];if(d.bind!==a)return b[c].bind(b);if(Function.prototype.bind===a)return e(d,b);try{return Function.prototype.bind.call(b[c],b)}catch(f){return e(d,b)}}function e(a,b){return function(){Function.prototype.apply.apply(a,[b,arguments])}}function f(a){for(var b=0;b=0&&d<=k.levels.SILENT){if(i(d),d===k.levels.SILENT)return void f(function(){return l});if(typeof console===b)return f(function(a){return function(){typeof console!==b&&(k.setLevel(d),k[a].apply(k,arguments))}}),"No console available for logging";f(function(a){return d<=k.levels[a.toUpperCase()]?c(a):l})}else{if("string"!=typeof d||k.levels[d.toUpperCase()]===a)throw"log.setLevel() called with invalid level: "+d;k.setLevel(k.levels[d.toUpperCase()])}},k.enableAll=function(){k.setLevel(k.levels.TRACE)},k.disableAll=function(){k.setLevel(k.levels.SILENT)};var o=typeof window!==b?window.log:a;return k.noConflict=function(){return typeof window!==b&&window.log===k&&(window.log=o),k},j(),k})}(); \ No newline at end of file diff --git a/package.json b/package.json index 9872a25..3b07efc 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "loglevel", "description": "Minimal lightweight logging for JavaScript, adding reliable log level methods to any available console.log methods", - "version": "0.6.0", + "version": "1.0.0", "homepage": "https://github.com/pimterry/loglevel", "author": { "name": "Tim Perry",