You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							142 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
	
	
							142 lines
						
					
					
						
							2.8 KiB
						
					
					
				'use strict';
 | 
						|
 | 
						|
var util = require('util');
 | 
						|
var isArrayish = require('is-arrayish');
 | 
						|
 | 
						|
var errorEx = function errorEx(name, properties) {
 | 
						|
	if (!name || name.constructor !== String) {
 | 
						|
		properties = name || {};
 | 
						|
		name = Error.name;
 | 
						|
	}
 | 
						|
 | 
						|
	var errorExError = function ErrorEXError(message) {
 | 
						|
		if (!this) {
 | 
						|
			return new ErrorEXError(message);
 | 
						|
		}
 | 
						|
 | 
						|
		message = message instanceof Error
 | 
						|
			? message.message
 | 
						|
			: (message || this.message);
 | 
						|
 | 
						|
		Error.call(this, message);
 | 
						|
		Error.captureStackTrace(this, errorExError);
 | 
						|
 | 
						|
		this.name = name;
 | 
						|
 | 
						|
		Object.defineProperty(this, 'message', {
 | 
						|
			configurable: true,
 | 
						|
			enumerable: false,
 | 
						|
			get: function () {
 | 
						|
				var newMessage = message.split(/\r?\n/g);
 | 
						|
 | 
						|
				for (var key in properties) {
 | 
						|
					if (!properties.hasOwnProperty(key)) {
 | 
						|
						continue;
 | 
						|
					}
 | 
						|
 | 
						|
					var modifier = properties[key];
 | 
						|
 | 
						|
					if ('message' in modifier) {
 | 
						|
						newMessage = modifier.message(this[key], newMessage) || newMessage;
 | 
						|
						if (!isArrayish(newMessage)) {
 | 
						|
							newMessage = [newMessage];
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
 | 
						|
				return newMessage.join('\n');
 | 
						|
			},
 | 
						|
			set: function (v) {
 | 
						|
				message = v;
 | 
						|
			}
 | 
						|
		});
 | 
						|
 | 
						|
		var overwrittenStack = null;
 | 
						|
 | 
						|
		var stackDescriptor = Object.getOwnPropertyDescriptor(this, 'stack');
 | 
						|
		var stackGetter = stackDescriptor.get;
 | 
						|
		var stackValue = stackDescriptor.value;
 | 
						|
		delete stackDescriptor.value;
 | 
						|
		delete stackDescriptor.writable;
 | 
						|
 | 
						|
		stackDescriptor.set = function (newstack) {
 | 
						|
			overwrittenStack = newstack;
 | 
						|
		};
 | 
						|
 | 
						|
		stackDescriptor.get = function () {
 | 
						|
			var stack = (overwrittenStack || ((stackGetter)
 | 
						|
				? stackGetter.call(this)
 | 
						|
				: stackValue)).split(/\r?\n+/g);
 | 
						|
 | 
						|
			// starting in Node 7, the stack builder caches the message.
 | 
						|
			// just replace it.
 | 
						|
			if (!overwrittenStack) {
 | 
						|
				stack[0] = this.name + ': ' + this.message;
 | 
						|
			}
 | 
						|
 | 
						|
			var lineCount = 1;
 | 
						|
			for (var key in properties) {
 | 
						|
				if (!properties.hasOwnProperty(key)) {
 | 
						|
					continue;
 | 
						|
				}
 | 
						|
 | 
						|
				var modifier = properties[key];
 | 
						|
 | 
						|
				if ('line' in modifier) {
 | 
						|
					var line = modifier.line(this[key]);
 | 
						|
					if (line) {
 | 
						|
						stack.splice(lineCount++, 0, '    ' + line);
 | 
						|
					}
 | 
						|
				}
 | 
						|
 | 
						|
				if ('stack' in modifier) {
 | 
						|
					modifier.stack(this[key], stack);
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			return stack.join('\n');
 | 
						|
		};
 | 
						|
 | 
						|
		Object.defineProperty(this, 'stack', stackDescriptor);
 | 
						|
	};
 | 
						|
 | 
						|
	if (Object.setPrototypeOf) {
 | 
						|
		Object.setPrototypeOf(errorExError.prototype, Error.prototype);
 | 
						|
		Object.setPrototypeOf(errorExError, Error);
 | 
						|
	} else {
 | 
						|
		util.inherits(errorExError, Error);
 | 
						|
	}
 | 
						|
 | 
						|
	return errorExError;
 | 
						|
};
 | 
						|
 | 
						|
errorEx.append = function (str, def) {
 | 
						|
	return {
 | 
						|
		message: function (v, message) {
 | 
						|
			v = v || def;
 | 
						|
 | 
						|
			if (v) {
 | 
						|
				message[0] += ' ' + str.replace('%s', v.toString());
 | 
						|
			}
 | 
						|
 | 
						|
			return message;
 | 
						|
		}
 | 
						|
	};
 | 
						|
};
 | 
						|
 | 
						|
errorEx.line = function (str, def) {
 | 
						|
	return {
 | 
						|
		line: function (v) {
 | 
						|
			v = v || def;
 | 
						|
 | 
						|
			if (v) {
 | 
						|
				return str.replace('%s', v.toString());
 | 
						|
			}
 | 
						|
 | 
						|
			return null;
 | 
						|
		}
 | 
						|
	};
 | 
						|
};
 | 
						|
 | 
						|
module.exports = errorEx;
 |