diff options
Diffstat (limited to 'node_modules/gulp-util/lib/PluginError.js')
-rw-r--r-- | node_modules/gulp-util/lib/PluginError.js | 114 |
1 files changed, 24 insertions, 90 deletions
diff --git a/node_modules/gulp-util/lib/PluginError.js b/node_modules/gulp-util/lib/PluginError.js index d60159ab1..6640346ed 100644 --- a/node_modules/gulp-util/lib/PluginError.js +++ b/node_modules/gulp-util/lib/PluginError.js @@ -1,32 +1,22 @@ var util = require('util'); -var arrayDiffer = require('array-differ'); -var arrayUniq = require('array-uniq'); -var chalk = require('chalk'); -var objectAssign = require('object-assign'); - -var nonEnumberableProperties = ['name', 'message', 'stack']; -var propertiesNotToDisplay = nonEnumberableProperties.concat(['plugin', 'showStack', 'showProperties', '__safety', '_stack']); +var colors = require('./colors'); // wow what a clusterfuck var parseOptions = function(plugin, message, opt) { - opt = opt || {}; + if (!opt) opt = {}; if (typeof plugin === 'object') { opt = plugin; - } else { - if (message instanceof Error) { - opt.error = message; - } else if (typeof message === 'object') { - opt = message; - } else { - opt.message = message; - } + } else if (message instanceof Error) { + opt.error = message; + opt.plugin = plugin; + } else if (typeof message === 'object') { + opt = message; + opt.plugin = plugin; + } else if (typeof opt === 'object') { opt.plugin = plugin; + opt.message = message; } - - return objectAssign({ - showStack: false, - showProperties: true - }, opt); + return opt; }; function PluginError(plugin, message, opt) { @@ -35,19 +25,19 @@ function PluginError(plugin, message, opt) { Error.call(this); var options = parseOptions(plugin, message, opt); - var self = this; + + this.plugin = options.plugin; + this.showStack = options.showStack === true; + + var properties = ['name', 'message', 'fileName', 'lineNumber', 'stack']; // if options has an error, grab details from it if (options.error) { - // These properties are not enumerable, so we have to add them explicitly. - arrayUniq(Object.keys(options.error).concat(nonEnumberableProperties)) - .forEach(function(prop) { - self[prop] = options.error[prop]; - }); + properties.forEach(function(prop) { + if (prop in options.error) this[prop] = options.error[prop]; + }, this); } - var properties = ['name', 'message', 'fileName', 'lineNumber', 'stack', 'showStack', 'showProperties', 'plugin']; - // options object can override properties.forEach(function(prop) { if (prop in options) this[prop] = options[prop]; @@ -56,18 +46,8 @@ function PluginError(plugin, message, opt) { // defaults if (!this.name) this.name = 'Error'; - if (!this.stack) { - // Error.captureStackTrace appends a stack property which relies on the toString method of the object it is applied to. - // Since we are using our own toString method which controls when to display the stack trace if we don't go through this - // safety object, then we'll get stack overflow problems. - var safety = { - toString: function() { - return this._messageWithDetails() + '\nStack:'; - }.bind(this) - }; - Error.captureStackTrace(safety, arguments.callee || this.constructor); - this.__safety = safety; - } + // TODO: figure out why this explodes mocha + if (!this.stack) Error.captureStackTrace(this, arguments.callee || this.constructor); if (!this.plugin) throw new Error('Missing plugin name'); if (!this.message) throw new Error('Missing error message'); @@ -75,56 +55,10 @@ function PluginError(plugin, message, opt) { util.inherits(PluginError, Error); -PluginError.prototype._messageWithDetails = function() { - var messageWithDetails = 'Message:\n ' + this.message; - var details = this._messageDetails(); - - if (details !== '') { - messageWithDetails += '\n' + details; - } - - return messageWithDetails; -}; - -PluginError.prototype._messageDetails = function() { - if (!this.showProperties) { - return ''; - } - - var properties = arrayDiffer(Object.keys(this), propertiesNotToDisplay); - - if (properties.length === 0) { - return ''; - } - - var self = this; - properties = properties.map(function stringifyProperty(prop) { - return ' ' + prop + ': ' + self[prop]; - }); - - return 'Details:\n' + properties.join('\n'); -}; - PluginError.prototype.toString = function () { - var sig = chalk.red(this.name) + ' in plugin \'' + chalk.cyan(this.plugin) + '\''; - var detailsWithStack = function(stack) { - return this._messageWithDetails() + '\nStack:\n' + stack; - }.bind(this); - - var msg; - if (this.showStack) { - if (this.__safety) { // There is no wrapped error, use the stack captured in the PluginError ctor - msg = this.__safety.stack; - } else if (this._stack) { - msg = detailsWithStack(this._stack); - } else { // Stack from wrapped error - msg = detailsWithStack(this.stack); - } - } else { - msg = this._messageWithDetails(); - } - - return sig + '\n' + msg; + var sig = this.name+' in plugin \''+colors.cyan(this.plugin)+'\''; + var msg = this.showStack ? (this._stack || this.stack) : this.message; + return sig+'\n'+msg; }; module.exports = PluginError; |