UNPKG

chain-able

Version:

interfaces that describe their intentions.

104 lines (96 loc) 9.44 kB
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=