chain-able
Version:
interfaces that describe their intentions.
104 lines (96 loc) • 9.44 kB
JavaScript
var toS = require('../is/toS')
var ObjectAssign = require('../util/assign')
var ENV_DEVELOPMENT = require('../env/dev')
/* istanbul ignore next: dev */
var thrower = function (error) { return function () {
if (ENV_DEVELOPMENT) {
console.log(error)
}
throw error
}; }
/**
* @desc enhance an Error, enable rethrowing & better inspection
* @memberOf encase
* @category types
* @category encase
*
* @since 4.0.0-alpha.1
* @param {Primitive} method method being decorated
* @param {Type} type type to validate with
* @return {Function} function that returns a decorated TypeError with .inspect & metadata (arg, thrown, meta)
*
* @TODO js stringify if development
*
* @see MethodChain
* @see validators/schemaBuilder
* @see validators/validatorBuilder
* @see plugins/encase
*
* @example
* const badValidator = x => {
* if (x === 'bad') {
* throw new Error('bad!')
* }
* }
* const enhancer = enhanceError('eh', badValidator)
*
* // called by plugins/encase when throws or invalid
* let error
* let arg = 'bad'
* try {
* error = badValidator(arg)
* }
* catch (e) {
* error = enhancer(arg, e, {metadata: true})
* }
*
* console.log(error)
* //=> {[eh]: { type: badValidator, arg: 'bad', json, str, rethrow }}
* //=> console.log on DEVELOPMENT
*/
module.exports = function (method, type) { return function (arg, thrown, meta) {
var argToString = toS(arg)
var data = {
[method]: {
type: type,
arg: {
val: arg,
str: argToString,
json: JSON.stringify(arg),
},
},
}
var error = ObjectAssign(
new TypeError((argToString + " != " + type)),
data,
meta
)
// put it back in its place
if (thrown && thrown.message) { error.message += thrown.message }
if (thrown && thrown.stack) { error.stack = thrown.stack }
/* istanbul ignore next: dev */
if (ENV_DEVELOPMENT) {
// since we are just inspecting the metadata on dev
error.inspect = function () {
var devMsg = 'inspecting on development'
var thrownMsg = "thrown: " + thrown
var eMsg = "compare: " + (error.message)
var errorName = "name: " + (error.name)
var argMsg = "arg: " + arg + ";\nstr: " + (toS(
arg
)) + " " + (typeof arg) + ";\njson: " + (JSON.stringify(arg))
var typeMsg = "type: " + type
var stackMsg = 'stack: ' + error.stack
var dashMsg = "-----"
var msg = "\n" + dashMsg + " " + devMsg + " " + dashMsg + "\n"
if (meta) { msg += "meta: " + (JSON.stringify(meta)) + "\n" }
msg += thrownMsg + "\n" + eMsg + "\n" + errorName + "\n\n"
msg += typeMsg + "\n" + argMsg
msg += "\n\n" + stackMsg + "\n" + dashMsg + "\n"
return msg
}
}
error.reThrow = thrower(error)
return error
}; }
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuanMiLCJzb3VyY2VzIjpbImVycm9yLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHRvUyA9IHJlcXVpcmUoJy4uL2lzL3RvUycpXG5jb25zdCBPYmplY3RBc3NpZ24gPSByZXF1aXJlKCcuLi91dGlsL2Fzc2lnbicpXG5jb25zdCBFTlZfREVWRUxPUE1FTlQgPSByZXF1aXJlKCcuLi9lbnYvZGV2JylcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGRldiAqL1xuY29uc3QgdGhyb3dlciA9IGVycm9yID0+ICgpID0+IHtcbiAgaWYgKEVOVl9ERVZFTE9QTUVOVCkge1xuICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICB9XG5cbiAgdGhyb3cgZXJyb3Jcbn1cblxuLyoqXG4gKiBAZGVzYyBlbmhhbmNlIGFuIEVycm9yLCBlbmFibGUgcmV0aHJvd2luZyAmIGJldHRlciBpbnNwZWN0aW9uXG4gKiBAbWVtYmVyT2YgZW5jYXNlXG4gKiBAY2F0ZWdvcnkgdHlwZXNcbiAqIEBjYXRlZ29yeSBlbmNhc2VcbiAqXG4gKiBAc2luY2UgNC4wLjAtYWxwaGEuMVxuICogQHBhcmFtICB7UHJpbWl0aXZlfSBtZXRob2QgbWV0aG9kIGJlaW5nIGRlY29yYXRlZFxuICogQHBhcmFtICB7VHlwZX0gdHlwZSB0eXBlIHRvIHZhbGlkYXRlIHdpdGhcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBkZWNvcmF0ZWQgVHlwZUVycm9yIHdpdGggLmluc3BlY3QgJiBtZXRhZGF0YSAoYXJnLCB0aHJvd24sIG1ldGEpXG4gKlxuICogQFRPRE8ganMgc3RyaW5naWZ5IGlmIGRldmVsb3BtZW50XG4gKlxuICogQHNlZSBNZXRob2RDaGFpblxuICogQHNlZSB2YWxpZGF0b3JzL3NjaGVtYUJ1aWxkZXJcbiAqIEBzZWUgdmFsaWRhdG9ycy92YWxpZGF0b3JCdWlsZGVyXG4gKiBAc2VlIHBsdWdpbnMvZW5jYXNlXG4gKlxuICogQGV4YW1wbGVcbiAqICAgY29uc3QgYmFkVmFsaWRhdG9yID0geCA9PiB7XG4gKiAgICAgaWYgKHggPT09ICdiYWQnKSB7XG4gKiAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCEnKVxuICogICAgIH1cbiAqICAgfVxuICogICBjb25zdCBlbmhhbmNlciA9IGVuaGFuY2VFcnJvcignZWgnLCBiYWRWYWxpZGF0b3IpXG4gKlxuICogICAvLyBjYWxsZWQgYnkgcGx1Z2lucy9lbmNhc2Ugd2hlbiB0aHJvd3Mgb3IgaW52YWxpZFxuICogICBsZXQgZXJyb3JcbiAqICAgbGV0IGFyZyA9ICdiYWQnXG4gKiAgIHRyeSB7XG4gKiAgICAgZXJyb3IgPSBiYWRWYWxpZGF0b3IoYXJnKVxuICogICB9XG4gKiAgIGNhdGNoIChlKSB7XG4gKiAgICAgZXJyb3IgPSBlbmhhbmNlcihhcmcsIGUsIHttZXRhZGF0YTogdHJ1ZX0pXG4gKiAgIH1cbiAqXG4gKiAgIGNvbnNvbGUubG9nKGVycm9yKVxuICogICAvLz0+IHtbZWhdOiB7IHR5cGU6IGJhZFZhbGlkYXRvciwgYXJnOiAnYmFkJywganNvbiwgc3RyLCByZXRocm93IH19XG4gKiAgIC8vPT4gY29uc29sZS5sb2cgb24gREVWRUxPUE1FTlRcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSAobWV0aG9kLCB0eXBlKSA9PiAoYXJnLCB0aHJvd24sIG1ldGEpID0+IHtcbiAgY29uc3QgYXJnVG9TdHJpbmcgPSB0b1MoYXJnKVxuICBjb25zdCBkYXRhID0ge1xuICAgIFttZXRob2RdOiB7XG4gICAgICB0eXBlLFxuICAgICAgYXJnOiB7XG4gICAgICAgIHZhbDogYXJnLFxuICAgICAgICBzdHI6IGFyZ1RvU3RyaW5nLFxuICAgICAgICBqc29uOiBKU09OLnN0cmluZ2lmeShhcmcpLFxuICAgICAgfSxcbiAgICB9LFxuICB9XG5cbiAgY29uc3QgZXJyb3IgPSBPYmplY3RBc3NpZ24oXG4gICAgbmV3IFR5cGVFcnJvcihgJHthcmdUb1N0cmluZ30gIT0gJHt0eXBlfWApLFxuICAgIGRhdGEsXG4gICAgbWV0YVxuICApXG5cbiAgLy8gcHV0IGl0IGJhY2sgaW4gaXRzIHBsYWNlXG4gIGlmICh0aHJvd24gJiYgdGhyb3duLm1lc3NhZ2UpIGVycm9yLm1lc3NhZ2UgKz0gdGhyb3duLm1lc3NhZ2VcbiAgaWYgKHRocm93biAmJiB0aHJvd24uc3RhY2spIGVycm9yLnN0YWNrID0gdGhyb3duLnN0YWNrXG5cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGRldiAqL1xuICBpZiAoRU5WX0RFVkVMT1BNRU5UKSB7XG4gICAgLy8gc2luY2Ugd2UgYXJlIGp1c3QgaW5zcGVjdGluZyB0aGUgbWV0YWRhdGEgb24gZGV2XG4gICAgZXJyb3IuaW5zcGVjdCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGRldk1zZyA9ICdpbnNwZWN0aW5nIG9uIGRldmVsb3BtZW50J1xuICAgICAgY29uc3QgdGhyb3duTXNnID0gYHRocm93bjogJHt0aHJvd259YFxuICAgICAgY29uc3QgZU1zZyA9IGBjb21wYXJlOiAke2Vycm9yLm1lc3NhZ2V9YFxuICAgICAgY29uc3QgZXJyb3JOYW1lID0gYG5hbWU6ICR7ZXJyb3IubmFtZX1gXG4gICAgICBjb25zdCBhcmdNc2cgPSBgYXJnOiAke2FyZ307XFxuc3RyOiAke3RvUyhcbiAgICAgICAgYXJnXG4gICAgICApfSAke3R5cGVvZiBhcmd9O1xcbmpzb246ICR7SlNPTi5zdHJpbmdpZnkoYXJnKX1gXG4gICAgICBjb25zdCB0eXBlTXNnID0gYHR5cGU6ICR7dHlwZX1gXG4gICAgICBjb25zdCBzdGFja01zZyA9ICdzdGFjazogJyArIGVycm9yLnN0YWNrXG4gICAgICBjb25zdCBkYXNoTXNnID0gYC0tLS0tYFxuICAgICAgbGV0IG1zZyA9IGBcXG4ke2Rhc2hNc2d9ICR7ZGV2TXNnfSAke2Rhc2hNc2d9XFxuYFxuICAgICAgaWYgKG1ldGEpIG1zZyArPSBgbWV0YTogJHtKU09OLnN0cmluZ2lmeShtZXRhKX1cXG5gXG4gICAgICBtc2cgKz0gYCR7dGhyb3duTXNnfVxcbiR7ZU1zZ31cXG4ke2Vycm9yTmFtZX1cXG5cXG5gXG4gICAgICBtc2cgKz0gYCR7dHlwZU1zZ31cXG4ke2FyZ01zZ31gXG4gICAgICBtc2cgKz0gYFxcblxcbiR7c3RhY2tNc2d9XFxuJHtkYXNoTXNnfVxcbmBcbiAgICAgIHJldHVybiBtc2dcbiAgICB9XG4gIH1cblxuICBlcnJvci5yZVRocm93ID0gdGhyb3dlcihlcnJvcilcbiAgcmV0dXJuIGVycm9yXG59XG4iXSwibmFtZXMiOlsiY29uc3QiLCJsZXQiXSwibWFwcGluZ3MiOiJBQUFBQSxHQUFLLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFDaENBLEdBQUssQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO0FBQzlDQSxHQUFLLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7OztBQUc3Q0EsR0FBSyxDQUFDLE9BQU8sR0FBRyxVQUFBLEtBQUssQ0FBQSxDQUFDLEFBQUcsU0FBQSxTQUFBLEdBQUcsQUFBRztFQUM3QixJQUFJLGVBQWUsRUFBRTtJQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztHQUNuQjs7RUFFRCxNQUFNLEtBQUs7Q0FDWixHQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEwQ0QsTUFBTSxDQUFDLE9BQU8sR0FBRyxTQUFBLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxBQUFHLFNBQUEsU0FBQSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEFBQUc7RUFDeERBLEdBQUssQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQztFQUM1QkEsR0FBSyxDQUFDLElBQUksR0FBRztJQUNYLENBQUMsTUFBTSxHQUFHO01BQ1IsTUFBQSxJQUFJO01BQ0osR0FBRyxFQUFFO1FBQ0gsR0FBRyxFQUFFLEdBQUc7UUFDUixHQUFHLEVBQUUsV0FBVztRQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7T0FDMUI7S0FDRjtHQUNGOztFQUVEQSxHQUFLLENBQUMsS0FBSyxHQUFHLFlBQVk7SUFDeEIsSUFBSSxTQUFTLENBQUMsQ0FBQSxBQUFHLFdBQVcsU0FBSyxHQUFFLElBQUksQ0FBRSxDQUFDO0lBQzFDLElBQUk7SUFDSixJQUFJO0dBQ0w7OztFQUdELElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBQSxLQUFLLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUE7RUFDN0QsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFBLEtBQUssQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBQTs7O0VBR3RELElBQUksZUFBZSxFQUFFOztJQUVuQixLQUFLLENBQUMsT0FBTyxHQUFHLFNBQUEsR0FBRyxBQUFHO01BQ3BCQSxHQUFLLENBQUMsTUFBTSxHQUFHLDJCQUEyQjtNQUMxQ0EsR0FBSyxDQUFDLFNBQVMsR0FBRyxVQUFTLEdBQUUsTUFBTSxBQUFFO01BQ3JDQSxHQUFLLENBQUMsSUFBSSxHQUFHLFdBQVUsSUFBRSxLQUFLLENBQUMsT0FBTyxDQUFBLEFBQUU7TUFDeENBLEdBQUssQ0FBQyxTQUFTLEdBQUcsUUFBTyxJQUFFLEtBQUssQ0FBQyxJQUFJLENBQUEsQUFBRTtNQUN2Q0EsR0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFNLEdBQUUsR0FBRyxhQUFTLElBQUUsR0FBRztRQUN0QyxHQUFHO09BQ0osQ0FBQSxNQUFFLElBQUUsT0FBTyxHQUFHLENBQUEsY0FBVSxJQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUEsQUFBRTtNQUNoREEsR0FBSyxDQUFDLE9BQU8sR0FBRyxRQUFPLEdBQUUsSUFBSSxBQUFFO01BQy9CQSxHQUFLLENBQUMsUUFBUSxHQUFHLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSztNQUN4Q0EsR0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFNLEFBQUM7TUFDdkJDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBRyxHQUFFLE9BQU8sTUFBRSxHQUFFLE1BQU0sTUFBRSxHQUFFLE9BQU8sT0FBRyxBQUFDO01BQy9DLElBQUksSUFBSSxFQUFFLEVBQUEsR0FBRyxJQUFJLFFBQU8sSUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBLE9BQUcsQUFBQyxFQUFBO01BQ2xELEdBQUcsSUFBSSxBQUFHLFNBQVMsT0FBRyxHQUFFLElBQUksT0FBRyxHQUFFLFNBQVMsU0FBSyxBQUFDO01BQ2hELEdBQUcsSUFBSSxBQUFHLE9BQU8sT0FBRyxHQUFFLE1BQU0sQUFBRTtNQUM5QixHQUFHLElBQUksTUFBSyxHQUFFLFFBQVEsT0FBRyxHQUFFLE9BQU8sT0FBRyxBQUFDO01BQ3RDLE9BQU8sR0FBRztLQUNYO0dBQ0Y7O0VBRUQsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0VBQzlCLE9BQU8sS0FBSztDQUNiLEdBQUE7In0=