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.
141 lines
2.8 KiB
141 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;
|
|
|