UNPKG

chain-able

Version:

interfaces that describe their intentions.

108 lines (97 loc) 9.41 kB
var typeError = require('../deps/validators/error') var encase = require('../deps/encase') var ERROR_META = {m: 1} /** * @desc 3 steps * 0. enhance error * 1. encase function with a specification * 2. build a function to call onInvalid or onInvalid depending * * @since 4.0.0 * * @param {string} name name of the method * @param {Object | Function} parent object being decorated by MethodChain * @param {Object} built the current state of the decoration * @return {Function} curried finisher, for specification * * @func methodEncasingFactory * @symb * @types encase * * @example * * methodEncasingFactory('eh', {}, {onSet: console.log}) * // => Function * */ function methodEncasingFactory(name, parent, built) { /** * @func scopedEncase * @category type * @since 4.0.0-beta.1 * * @param {Function} fnToEncase depending on the result of this, call * @param {string | Function | undefined} [type=undefined] Type * @param {Function | undefined} [specification=undefined] Specification * @return {Function} the method... * * @example * const fnToEncase = arg => arg === true * const onInvalid = (error, key, arg, instance) => console.log(arguments) * const onValid = (key, arg, instance) => console.log(arguments) * const encased = scopedEncase(fnToEncase) * .onValid(onValid) * .onInvalid(onInvalid) * //=> typedOnCall */ return function scopedEncase(fnToEncase, type, specification) { // @@debugger var enhanceError = typeError(name, type, fnToEncase, parent) // if specification is not passed in, undefined defaults to tryCatch var encased = encase(fnToEncase, specification) // our configured functions, with fallback defaults var onSet = built.onCall || built.onSet var onValid = built.onValid || onSet // default to re-throw var onInvalid = built.onInvalid || (function (arg, error) { return enhanceError(arg, error, ERROR_META).reThrow(); }) /** * @desc this is the actual built function * @func typedOnCall * @category type * @since 4.0.0-beta.1 * * @param {any} arg arg to validate * @return {Function} typedOnCall(argToValidate: any) * * @example * const encased = encase(fnToEncase) * .onValid() * .onInvalid(function) * .call() */ return function typedOnCall(arg) { var this$1 = this; // nodejs way - error first, data second, instance last var callInvalid = function (error) { // @@debugger onInvalid.call(this$1, enhanceError(arg, error), arg, name, this$1) } // @TODO: ensure it isn't a syntax error and is a type error // if it is already an error, we should only enhance it // @example `TypeError: Cannot read property 'call' of undefined` encased .onInvalid(callInvalid) // @NOTE: onValid defaults to `this.set(name, arg)` .onValid(function (result) { // @@debugger onValid.call(this$1, arg, name, this$1) }) .call(this, arg) return this } } } module.exports = methodEncasingFactory //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jYXNlLmpzIiwic291cmNlcyI6WyJlbmNhc2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgdHlwZUVycm9yID0gcmVxdWlyZSgnLi4vZGVwcy92YWxpZGF0b3JzL2Vycm9yJylcbmNvbnN0IGVuY2FzZSA9IHJlcXVpcmUoJy4uL2RlcHMvZW5jYXNlJylcblxuY29uc3QgRVJST1JfTUVUQSA9IHttOiAxfVxuXG4vKipcbiAqIEBkZXNjIDMgc3RlcHNcbiAqICAgICAgIDAuIGVuaGFuY2UgZXJyb3JcbiAqICAgICAgIDEuIGVuY2FzZSBmdW5jdGlvbiB3aXRoIGEgc3BlY2lmaWNhdGlvblxuICogICAgICAgMi4gYnVpbGQgYSBmdW5jdGlvbiB0byBjYWxsIG9uSW52YWxpZCBvciBvbkludmFsaWQgZGVwZW5kaW5nXG4gKlxuICogQHNpbmNlIDQuMC4wXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBuYW1lIG5hbWUgb2YgdGhlIG1ldGhvZFxuICogQHBhcmFtICB7T2JqZWN0IHwgRnVuY3Rpb259IHBhcmVudCBvYmplY3QgYmVpbmcgZGVjb3JhdGVkIGJ5IE1ldGhvZENoYWluXG4gKiBAcGFyYW0gIHtPYmplY3R9IGJ1aWx0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkZWNvcmF0aW9uXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gY3VycmllZCBmaW5pc2hlciwgZm9yIHNwZWNpZmljYXRpb25cbiAqXG4gKiBAZnVuYyBtZXRob2RFbmNhc2luZ0ZhY3RvcnlcbiAqIEBzeW1iXG4gKiBAdHlwZXMgZW5jYXNlXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgbWV0aG9kRW5jYXNpbmdGYWN0b3J5KCdlaCcsIHt9LCB7b25TZXQ6IGNvbnNvbGUubG9nfSlcbiAqICAvLyA9PiBGdW5jdGlvblxuICpcbiAqL1xuZnVuY3Rpb24gbWV0aG9kRW5jYXNpbmdGYWN0b3J5KG5hbWUsIHBhcmVudCwgYnVpbHQpIHtcbiAgLyoqXG4gICAqIEBmdW5jIHNjb3BlZEVuY2FzZVxuICAgKiBAY2F0ZWdvcnkgdHlwZVxuICAgKiBAc2luY2UgNC4wLjAtYmV0YS4xXG4gICAqXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmblRvRW5jYXNlIGRlcGVuZGluZyBvbiB0aGUgcmVzdWx0IG9mIHRoaXMsIGNhbGxcbiAgICogQHBhcmFtICB7c3RyaW5nIHwgRnVuY3Rpb24gfCB1bmRlZmluZWR9IFt0eXBlPXVuZGVmaW5lZF0gVHlwZVxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbiB8IHVuZGVmaW5lZH0gW3NwZWNpZmljYXRpb249dW5kZWZpbmVkXSBTcGVjaWZpY2F0aW9uXG4gICAqIEByZXR1cm4ge0Z1bmN0aW9ufSB0aGUgbWV0aG9kLi4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqICAgIGNvbnN0IGZuVG9FbmNhc2UgPSBhcmcgPT4gYXJnID09PSB0cnVlXG4gICAqICAgIGNvbnN0IG9uSW52YWxpZCA9IChlcnJvciwga2V5LCBhcmcsIGluc3RhbmNlKSA9PiBjb25zb2xlLmxvZyhhcmd1bWVudHMpXG4gICAqICAgIGNvbnN0IG9uVmFsaWQgPSAoa2V5LCBhcmcsIGluc3RhbmNlKSA9PiBjb25zb2xlLmxvZyhhcmd1bWVudHMpXG4gICAqICAgIGNvbnN0IGVuY2FzZWQgPSBzY29wZWRFbmNhc2UoZm5Ub0VuY2FzZSlcbiAgICogICAgICAub25WYWxpZChvblZhbGlkKVxuICAgKiAgICAgIC5vbkludmFsaWQob25JbnZhbGlkKVxuICAgKiAgICAvLz0+IHR5cGVkT25DYWxsXG4gICAqL1xuICByZXR1cm4gZnVuY3Rpb24gc2NvcGVkRW5jYXNlKGZuVG9FbmNhc2UsIHR5cGUsIHNwZWNpZmljYXRpb24pIHtcbiAgICAvLyBAQGRlYnVnZ2VyXG4gICAgY29uc3QgZW5oYW5jZUVycm9yID0gdHlwZUVycm9yKG5hbWUsIHR5cGUsIGZuVG9FbmNhc2UsIHBhcmVudClcblxuICAgIC8vIGlmIHNwZWNpZmljYXRpb24gaXMgbm90IHBhc3NlZCBpbiwgdW5kZWZpbmVkIGRlZmF1bHRzIHRvIHRyeUNhdGNoXG4gICAgY29uc3QgZW5jYXNlZCA9IGVuY2FzZShmblRvRW5jYXNlLCBzcGVjaWZpY2F0aW9uKVxuXG4gICAgLy8gb3VyIGNvbmZpZ3VyZWQgZnVuY3Rpb25zLCB3aXRoIGZhbGxiYWNrIGRlZmF1bHRzXG4gICAgY29uc3Qgb25TZXQgPSBidWlsdC5vbkNhbGwgfHwgYnVpbHQub25TZXRcbiAgICBjb25zdCBvblZhbGlkID0gYnVpbHQub25WYWxpZCB8fCBvblNldFxuXG4gICAgLy8gZGVmYXVsdCB0byByZS10aHJvd1xuICAgIGNvbnN0IG9uSW52YWxpZCA9XG4gICAgICBidWlsdC5vbkludmFsaWQgfHxcbiAgICAgICgoYXJnLCBlcnJvcikgPT4gZW5oYW5jZUVycm9yKGFyZywgZXJyb3IsIEVSUk9SX01FVEEpLnJlVGhyb3coKSlcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIHRoaXMgaXMgdGhlIGFjdHVhbCBidWlsdCBmdW5jdGlvblxuICAgICAqIEBmdW5jIHR5cGVkT25DYWxsXG4gICAgICogQGNhdGVnb3J5IHR5cGVcbiAgICAgKiBAc2luY2UgNC4wLjAtYmV0YS4xXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHthbnl9IGFyZyBhcmcgdG8gdmFsaWRhdGVcbiAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gdHlwZWRPbkNhbGwoYXJnVG9WYWxpZGF0ZTogYW55KVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiAgICBjb25zdCBlbmNhc2VkID0gZW5jYXNlKGZuVG9FbmNhc2UpXG4gICAgICogICAgICAub25WYWxpZCgpXG4gICAgICogICAgICAub25JbnZhbGlkKGZ1bmN0aW9uKVxuICAgICAqICAgICAgLmNhbGwoKVxuICAgICAqL1xuICAgIHJldHVybiBmdW5jdGlvbiB0eXBlZE9uQ2FsbChhcmcpIHtcbiAgICAgIC8vIG5vZGVqcyB3YXkgLSBlcnJvciBmaXJzdCwgZGF0YSBzZWNvbmQsIGluc3RhbmNlIGxhc3RcbiAgICAgIGNvbnN0IGNhbGxJbnZhbGlkID0gZXJyb3IgPT4ge1xuICAgICAgICAvLyBAQGRlYnVnZ2VyXG4gICAgICAgIG9uSW52YWxpZC5jYWxsKHRoaXMsIGVuaGFuY2VFcnJvcihhcmcsIGVycm9yKSwgYXJnLCBuYW1lLCB0aGlzKVxuICAgICAgfVxuXG4gICAgICAvLyBAVE9ETzogZW5zdXJlIGl0IGlzbid0IGEgc3ludGF4IGVycm9yIGFuZCBpcyBhIHR5cGUgZXJyb3JcbiAgICAgIC8vIGlmIGl0IGlzIGFscmVhZHkgYW4gZXJyb3IsIHdlIHNob3VsZCBvbmx5IGVuaGFuY2UgaXRcbiAgICAgIC8vIEBleGFtcGxlIGBUeXBlRXJyb3I6IENhbm5vdCByZWFkIHByb3BlcnR5ICdjYWxsJyBvZiB1bmRlZmluZWRgXG4gICAgICBlbmNhc2VkXG4gICAgICAgIC5vbkludmFsaWQoY2FsbEludmFsaWQpXG4gICAgICAgIC8vIEBOT1RFOiBvblZhbGlkIGRlZmF1bHRzIHRvIGB0aGlzLnNldChuYW1lLCBhcmcpYFxuICAgICAgICAub25WYWxpZChyZXN1bHQgPT4ge1xuICAgICAgICAgIC8vIEBAZGVidWdnZXJcbiAgICAgICAgICBvblZhbGlkLmNhbGwodGhpcywgYXJnLCBuYW1lLCB0aGlzKVxuICAgICAgICB9KVxuICAgICAgICAuY2FsbCh0aGlzLCBhcmcpXG5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbWV0aG9kRW5jYXNpbmdGYWN0b3J5XG4iXSwibmFtZXMiOlsiY29uc3QiLCJ0aGlzIl0sIm1hcHBpbmdzIjoiQUFBQUEsR0FBSyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsMEJBQTBCLENBQUM7QUFDckRBLEdBQUssQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDOztBQUV4Q0EsR0FBSyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5QnpCLFNBQVMscUJBQXFCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBb0JsRCxPQUFPLFNBQVMsWUFBWSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFOztJQUU1REEsR0FBSyxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDOzs7SUFHOURBLEdBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUM7OztJQUdqREEsR0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLO0lBQ3pDQSxHQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSzs7O0lBR3RDQSxHQUFLLENBQUMsU0FBUztNQUNiLEtBQUssQ0FBQyxTQUFTO01BQ2YsQ0FBQyxTQUFBLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxBQUFHLFNBQUEsWUFBWSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUEsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFpQmxFLE9BQU8sU0FBUyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7O0FBQUE7O01BRWhDQSxHQUFLLENBQUMsV0FBVyxHQUFHLFVBQUEsS0FBSyxDQUFBLENBQUMsQUFBRzs7UUFFM0IsU0FBUyxDQUFDLElBQUksQ0FBQ0MsTUFBSSxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRUEsTUFBSSxDQUFDO09BQ2hFOzs7OztNQUtELE9BQU87U0FDSixTQUFTLENBQUMsV0FBVyxDQUFDOztTQUV0QixPQUFPLENBQUMsVUFBQSxNQUFNLENBQUEsQ0FBQyxBQUFHOztVQUVqQixPQUFPLENBQUMsSUFBSSxDQUFDQSxNQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRUEsTUFBSSxDQUFDO1NBQ3BDLENBQUM7U0FDRCxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQzs7TUFFbEIsT0FBTyxJQUFJO0tBQ1o7R0FDRjtDQUNGOztBQUVELE1BQU0sQ0FBQyxPQUFPLEdBQUcscUJBQXFCOyJ9