winston
Advanced tools
Comparing version 3.2.0 to 3.2.1
# CHANGELOG | ||
## v3.2.1 / 2018-01-29 | ||
### UNBOUND PROTOTYPE AD INFINITUM EDITION | ||
- #[1579], (@indexzero) Fallback to the "root" instance **always** created by | ||
`createLogger` for level convenience methods (e.g. `.info()`, `.silly()`). | ||
(Fixes [#1577]). | ||
- [#1539], (@indexzero) Assume message is the empty string when level-helper | ||
methods are invoked with no arguments (Fixed [#1501]). | ||
- [#1583], (@kibertoad) Add typings for defaultMeta (Fixes [#1582]) | ||
- [#1586], (@kibertoad) Update dependencies. | ||
## v3.2.0 / 2018-01-26 | ||
@@ -4,0 +15,0 @@ ### SORRY IT TOO SO LONG EDITION |
@@ -13,6 +13,2 @@ /** | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } | ||
@@ -36,107 +32,108 @@ | ||
var debug = require('diagnostics')('winston:create-logger'); | ||
function isLevelEnabledFunctionName(level) { | ||
return 'is' + level.charAt(0).toUpperCase() + level.slice(1) + 'Enabled'; | ||
} | ||
/** | ||
* DerivedLogger to attach the logs level methods. | ||
* @type {DerivedLogger} | ||
* @extends {Logger} | ||
* Create a new instance of a winston Logger. Creates a new | ||
* prototype for each instance. | ||
* @param {!Object} opts - Options for the created logger. | ||
* @returns {Logger} - A newly created logger instance. | ||
*/ | ||
var DerivedLogger = | ||
/*#__PURE__*/ | ||
function (_Logger) { | ||
_inherits(DerivedLogger, _Logger); | ||
module.exports = function () { | ||
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
// | ||
// Default levels: npm | ||
// | ||
opts.levels = opts.levels || config.npm.levels; | ||
/** | ||
* Create a new class derived logger for which the levels can be attached to | ||
* the prototype of. This is a V8 optimization that is well know to increase | ||
* performance of prototype functions. | ||
* @param {!Object} options - Options for the created logger. | ||
* DerivedLogger to attach the logs level methods. | ||
* @type {DerivedLogger} | ||
* @extends {Logger} | ||
*/ | ||
function DerivedLogger(options) { | ||
var _this; | ||
_classCallCheck(this, DerivedLogger); | ||
var DerivedLogger = | ||
/*#__PURE__*/ | ||
function (_Logger) { | ||
_inherits(DerivedLogger, _Logger); | ||
_this = _possibleConstructorReturn(this, _getPrototypeOf(DerivedLogger).call(this, options)); | ||
/** | ||
* Create a new class derived logger for which the levels can be attached to | ||
* the prototype of. This is a V8 optimization that is well know to increase | ||
* performance of prototype functions. | ||
* @param {!Object} options - Options for the created logger. | ||
*/ | ||
function DerivedLogger(options) { | ||
_classCallCheck(this, DerivedLogger); | ||
_this._setupLevels(); | ||
return _possibleConstructorReturn(this, _getPrototypeOf(DerivedLogger).call(this, options)); | ||
} | ||
return _this; | ||
} | ||
/** | ||
* Create the log level methods for the derived logger. | ||
* @returns {undefined} | ||
* @private | ||
*/ | ||
return DerivedLogger; | ||
}(Logger); | ||
var logger = new DerivedLogger(opts); // | ||
// Create the log level methods for the derived logger. | ||
// | ||
_createClass(DerivedLogger, [{ | ||
key: "_setupLevels", | ||
value: function _setupLevels() { | ||
var _this2 = this; | ||
Object.keys(opts.levels).forEach(function (level) { | ||
debug('Define prototype method for "%s"', level); | ||
Object.keys(this.levels).forEach(function (level) { | ||
debug('Define prototype method for "%s"', level); | ||
if (level === 'log') { | ||
// eslint-disable-next-line no-console | ||
console.warn('Level "log" not defined: conflicts with the method "log". Use a different level name.'); | ||
return; | ||
} // | ||
// Define prototype methods for each log level e.g.: | ||
// logger.log('info', msg) implies these methods are defined: | ||
// - logger.info(msg) | ||
// - logger.isInfoEnabled() | ||
// | ||
// Remark: to support logger.child this **MUST** be a function | ||
// so it'll always be called on the instance instead of a fixed | ||
// place in the prototype chain. | ||
// | ||
if (level === 'log') { | ||
// eslint-disable-next-line no-console | ||
console.warn('Level "log" not defined: conflicts with the method "log". Use a different level name.'); | ||
return; | ||
} // Define prototype methods for each log level | ||
// e.g. logger.log('info', msg) <––> logger.info(msg) & logger.isInfoEnabled() | ||
// this is not an arrow function so it'll always be called on the instance instead of a fixed place in the prototype chain. | ||
DerivedLogger.prototype[level] = function () { | ||
// Prefer any instance scope, but default to "root" logger | ||
var self = this || logger; // Optimize the hot-path which is the single object. | ||
_this2[level] = function () { | ||
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { | ||
args[_key] = arguments[_key]; | ||
} | ||
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { | ||
args[_key] = arguments[_key]; | ||
} | ||
// Optimize the hot-path which is the single object. | ||
if (args.length === 1) { | ||
var msg = args[0]; | ||
var info = msg && msg.message && msg || { | ||
message: msg | ||
}; | ||
info.level = info[LEVEL] = level; | ||
if (args.length === 1) { | ||
var msg = args[0]; | ||
var info = msg && msg.message && msg || { | ||
message: msg | ||
}; | ||
info.level = info[LEVEL] = level; | ||
this._addDefaultMeta(info); | ||
self._addDefaultMeta(info); | ||
this.write(info); | ||
return this; | ||
} // Otherwise build argument list which could potentially conform to | ||
// either: | ||
// . v3 API: log(obj) | ||
// 2. v1/v2 API: log(level, msg, ... [string interpolate], [{metadata}], [callback]) | ||
self.write(info); | ||
return this || logger; | ||
} // When provided nothing assume the empty string | ||
return this.log.apply(this, [level].concat(args)); | ||
}; | ||
if (args.length === 0) { | ||
self.log(level, ''); | ||
return self; | ||
} // Otherwise build argument list which could potentially conform to | ||
// either: | ||
// . v3 API: log(obj) | ||
// 2. v1/v2 API: log(level, msg, ... [string interpolate], [{metadata}], [callback]) | ||
_this2[isLevelEnabledFunctionName(level)] = function () { | ||
return _this2.isLevelEnabled(level); | ||
}; | ||
}); | ||
} | ||
}]); | ||
return DerivedLogger; | ||
}(Logger); | ||
return self.log.apply(self, [level].concat(args)); | ||
}; | ||
function isLevelEnabledFunctionName(level) { | ||
return 'is' + level.charAt(0).toUpperCase() + level.slice(1) + 'Enabled'; | ||
} | ||
/** | ||
* Create a new instance of a winston Logger. Creates a new | ||
* prototype for each instance. | ||
* @param {!Object} opts - Options for the created logger. | ||
* @returns {Logger} - A newly created logger instance. | ||
*/ | ||
module.exports = function () { | ||
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { | ||
levels: config.npm.levels | ||
}; | ||
return new DerivedLogger(opts); | ||
DerivedLogger.prototype[isLevelEnabledFunctionName(level)] = function () { | ||
return (this || logger).isLevelEnabled(level); | ||
}; | ||
}); | ||
return logger; | ||
}; |
@@ -79,2 +79,3 @@ // Type definitions for winston 3.0 | ||
exitOnError?: Function | boolean; | ||
defaultMeta?: any; | ||
transports?: Transport[] | Transport; | ||
@@ -81,0 +82,0 @@ exceptionHandlers?: any; |
@@ -15,71 +15,91 @@ /** | ||
function isLevelEnabledFunctionName(level) { | ||
return 'is' + level.charAt(0).toUpperCase() + level.slice(1) + 'Enabled'; | ||
} | ||
/** | ||
* DerivedLogger to attach the logs level methods. | ||
* @type {DerivedLogger} | ||
* @extends {Logger} | ||
* Create a new instance of a winston Logger. Creates a new | ||
* prototype for each instance. | ||
* @param {!Object} opts - Options for the created logger. | ||
* @returns {Logger} - A newly created logger instance. | ||
*/ | ||
class DerivedLogger extends Logger { | ||
module.exports = function (opts = {}) { | ||
// | ||
// Default levels: npm | ||
// | ||
opts.levels = opts.levels || config.npm.levels; | ||
/** | ||
* Create a new class derived logger for which the levels can be attached to | ||
* the prototype of. This is a V8 optimization that is well know to increase | ||
* performance of prototype functions. | ||
* @param {!Object} options - Options for the created logger. | ||
* DerivedLogger to attach the logs level methods. | ||
* @type {DerivedLogger} | ||
* @extends {Logger} | ||
*/ | ||
constructor(options) { | ||
super(options); | ||
this._setupLevels(); | ||
class DerivedLogger extends Logger { | ||
/** | ||
* Create a new class derived logger for which the levels can be attached to | ||
* the prototype of. This is a V8 optimization that is well know to increase | ||
* performance of prototype functions. | ||
* @param {!Object} options - Options for the created logger. | ||
*/ | ||
constructor(options) { | ||
super(options); | ||
} | ||
} | ||
/** | ||
* Create the log level methods for the derived logger. | ||
* @returns {undefined} | ||
* @private | ||
*/ | ||
_setupLevels() { | ||
Object.keys(this.levels).forEach(level => { | ||
debug('Define prototype method for "%s"', level); | ||
if (level === 'log') { | ||
// eslint-disable-next-line no-console | ||
console.warn('Level "log" not defined: conflicts with the method "log". Use a different level name.'); | ||
return; | ||
const logger = new DerivedLogger(opts); | ||
// | ||
// Create the log level methods for the derived logger. | ||
// | ||
Object.keys(opts.levels).forEach(function (level) { | ||
debug('Define prototype method for "%s"', level); | ||
if (level === 'log') { | ||
// eslint-disable-next-line no-console | ||
console.warn('Level "log" not defined: conflicts with the method "log". Use a different level name.'); | ||
return; | ||
} | ||
// | ||
// Define prototype methods for each log level e.g.: | ||
// logger.log('info', msg) implies these methods are defined: | ||
// - logger.info(msg) | ||
// - logger.isInfoEnabled() | ||
// | ||
// Remark: to support logger.child this **MUST** be a function | ||
// so it'll always be called on the instance instead of a fixed | ||
// place in the prototype chain. | ||
// | ||
DerivedLogger.prototype[level] = function (...args) { | ||
// Prefer any instance scope, but default to "root" logger | ||
const self = this || logger; | ||
// Optimize the hot-path which is the single object. | ||
if (args.length === 1) { | ||
const [msg] = args; | ||
const info = msg && msg.message && msg || { message: msg }; | ||
info.level = info[LEVEL] = level; | ||
self._addDefaultMeta(info); | ||
self.write(info); | ||
return (this || logger); | ||
} | ||
// Define prototype methods for each log level | ||
// e.g. logger.log('info', msg) <––> logger.info(msg) & logger.isInfoEnabled() | ||
// this is not an arrow function so it'll always be called on the instance instead of a fixed place in the prototype chain. | ||
this[level] = function (...args) { | ||
// Optimize the hot-path which is the single object. | ||
if (args.length === 1) { | ||
const [msg] = args; | ||
const info = msg && msg.message && msg || { message: msg }; | ||
info.level = info[LEVEL] = level; | ||
this._addDefaultMeta(info); | ||
this.write(info); | ||
return this; | ||
} | ||
// When provided nothing assume the empty string | ||
if (args.length === 0) { | ||
self.log(level, ''); | ||
return self; | ||
} | ||
// Otherwise build argument list which could potentially conform to | ||
// either: | ||
// . v3 API: log(obj) | ||
// 2. v1/v2 API: log(level, msg, ... [string interpolate], [{metadata}], [callback]) | ||
return this.log(level, ...args); | ||
}; | ||
// Otherwise build argument list which could potentially conform to | ||
// either: | ||
// . v3 API: log(obj) | ||
// 2. v1/v2 API: log(level, msg, ... [string interpolate], [{metadata}], [callback]) | ||
return self.log(level, ...args); | ||
}; | ||
this[isLevelEnabledFunctionName(level)] = () => this.isLevelEnabled(level); | ||
}); | ||
} | ||
} | ||
DerivedLogger.prototype[isLevelEnabledFunctionName(level)] = function () { | ||
return (this || logger).isLevelEnabled(level); | ||
}; | ||
}); | ||
function isLevelEnabledFunctionName(level) { | ||
return 'is' + level.charAt(0).toUpperCase() + level.slice(1) + 'Enabled'; | ||
} | ||
/** | ||
* Create a new instance of a winston Logger. Creates a new | ||
* prototype for each instance. | ||
* @param {!Object} opts - Options for the created logger. | ||
* @returns {Logger} - A newly created logger instance. | ||
*/ | ||
module.exports = (opts = { levels: config.npm.levels }) => ( | ||
new DerivedLogger(opts) | ||
); | ||
return logger; | ||
}; |
{ | ||
"name": "winston", | ||
"description": "A logger for just about everything.", | ||
"version": "3.2.0", | ||
"version": "3.2.1", | ||
"author": "Charlie Robbins <charlie.robbins@gmail.com>", | ||
@@ -32,3 +32,3 @@ "maintainers": [ | ||
"is-stream": "^1.1.0", | ||
"logform": "^2.1.0", | ||
"logform": "^2.1.1", | ||
"one-time": "0.0.4", | ||
@@ -43,4 +43,4 @@ "readable-stream": "^3.1.1", | ||
"@babel/core": "^7.2.2", | ||
"@babel/preset-env": "^7.2.3", | ||
"@types/node": "^10.12.18", | ||
"@babel/preset-env": "^7.3.1", | ||
"@types/node": "^10.12.19", | ||
"abstract-winston-transport": ">= 0.5.1", | ||
@@ -50,3 +50,3 @@ "assume": "^2.1.0", | ||
"cross-spawn-async": "^2.2.5", | ||
"eslint-config-populist": "^4.1.0", | ||
"eslint-config-populist": "^4.2.0", | ||
"hock": "^1.3.3", | ||
@@ -53,0 +53,0 @@ "mocha": "^5.2.0", |
305100
6806
Updatedlogform@^2.1.1