foop
Version:
interfaces that describe their intentions.
115 lines (104 loc) • 9.64 kB
JavaScript
var typeError = require('../deps/validators/error')
var encase = require('../deps/encase')
var ERROR_META = {m: 1}
/**
* 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
*
* @name methodEncasingFactory
* @func methodEncasingFactory
* @symb ⛑🏭
* @types encase
*
* @example
*
* methodEncasingFactory('eh', {}, {onSet: console.log})
* //=> Function
*
*/
function methodEncasingFactory(name, parent, built) {
/**
* @name scopedEncase
* @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
* @name typedOnCall
* @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jYXNlLmpzIiwic291cmNlcyI6WyJlbmNhc2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgdHlwZUVycm9yID0gcmVxdWlyZSgnLi4vZGVwcy92YWxpZGF0b3JzL2Vycm9yJylcbmNvbnN0IGVuY2FzZSA9IHJlcXVpcmUoJy4uL2RlcHMvZW5jYXNlJylcblxuY29uc3QgRVJST1JfTUVUQSA9IHttOiAxfVxuXG4vKipcbiAqIDMgc3RlcHNcbiAqIDAuIGVuaGFuY2UgZXJyb3JcbiAqIDEuIGVuY2FzZSBmdW5jdGlvbiB3aXRoIGEgc3BlY2lmaWNhdGlvblxuICogMi4gYnVpbGQgYSBmdW5jdGlvbiB0byBjYWxsIG9uSW52YWxpZCBvciBvbkludmFsaWQgZGVwZW5kaW5nXG4gKlxuICogQHNpbmNlIDQuMC4wXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBuYW1lIG5hbWUgb2YgdGhlIG1ldGhvZFxuICogQHBhcmFtICB7T2JqZWN0IHwgRnVuY3Rpb259IHBhcmVudCBvYmplY3QgYmVpbmcgZGVjb3JhdGVkIGJ5IE1ldGhvZENoYWluXG4gKiBAcGFyYW0gIHtPYmplY3R9IGJ1aWx0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkZWNvcmF0aW9uXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gY3VycmllZCBmaW5pc2hlciwgZm9yIHNwZWNpZmljYXRpb25cbiAqXG4gKiBAbmFtZSBtZXRob2RFbmNhc2luZ0ZhY3RvcnlcbiAqIEBmdW5jIG1ldGhvZEVuY2FzaW5nRmFjdG9yeVxuICogQHN5bWIg4puR8J+PrVxuICogQHR5cGVzIGVuY2FzZVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogIG1ldGhvZEVuY2FzaW5nRmFjdG9yeSgnZWgnLCB7fSwge29uU2V0OiBjb25zb2xlLmxvZ30pXG4gKiAgLy89PiBGdW5jdGlvblxuICpcbiAqL1xuZnVuY3Rpb24gbWV0aG9kRW5jYXNpbmdGYWN0b3J5KG5hbWUsIHBhcmVudCwgYnVpbHQpIHtcbiAgLyoqXG4gICAqIEBuYW1lIHNjb3BlZEVuY2FzZVxuICAgKiBAZnVuYyBzY29wZWRFbmNhc2VcbiAgICogQGNhdGVnb3J5IHR5cGVcbiAgICogQHNpbmNlIDQuMC4wLWJldGEuMVxuICAgKlxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gZm5Ub0VuY2FzZSBkZXBlbmRpbmcgb24gdGhlIHJlc3VsdCBvZiB0aGlzLCBjYWxsXG4gICAqIEBwYXJhbSAge3N0cmluZyB8IEZ1bmN0aW9uIHwgdW5kZWZpbmVkfSBbdHlwZT11bmRlZmluZWRdIFR5cGVcbiAgICogQHBhcmFtICB7RnVuY3Rpb24gfCB1bmRlZmluZWR9IFtzcGVjaWZpY2F0aW9uPXVuZGVmaW5lZF0gU3BlY2lmaWNhdGlvblxuICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gdGhlIG1ldGhvZC4uLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgICBjb25zdCBmblRvRW5jYXNlID0gYXJnID0+IGFyZyA9PT0gdHJ1ZVxuICAgKiAgICBjb25zdCBvbkludmFsaWQgPSAoZXJyb3IsIGtleSwgYXJnLCBpbnN0YW5jZSkgPT4gY29uc29sZS5sb2coYXJndW1lbnRzKVxuICAgKiAgICBjb25zdCBvblZhbGlkID0gKGtleSwgYXJnLCBpbnN0YW5jZSkgPT4gY29uc29sZS5sb2coYXJndW1lbnRzKVxuICAgKiAgICBjb25zdCBlbmNhc2VkID0gc2NvcGVkRW5jYXNlKGZuVG9FbmNhc2UpXG4gICAqICAgICAgLm9uVmFsaWQob25WYWxpZClcbiAgICogICAgICAub25JbnZhbGlkKG9uSW52YWxpZClcbiAgICogICAgLy89PiB0eXBlZE9uQ2FsbFxuICAgKlxuICAgKi9cbiAgcmV0dXJuIGZ1bmN0aW9uIHNjb3BlZEVuY2FzZShmblRvRW5jYXNlLCB0eXBlLCBzcGVjaWZpY2F0aW9uKSB7XG4gICAgLy8gQEBkZWJ1Z2dlclxuICAgIGNvbnN0IGVuaGFuY2VFcnJvciA9IHR5cGVFcnJvcihuYW1lLCB0eXBlLCBmblRvRW5jYXNlLCBwYXJlbnQpXG5cbiAgICAvLyBpZiBzcGVjaWZpY2F0aW9uIGlzIG5vdCBwYXNzZWQgaW4sIHVuZGVmaW5lZCBkZWZhdWx0cyB0byB0cnlDYXRjaFxuICAgIGNvbnN0IGVuY2FzZWQgPSBlbmNhc2UoZm5Ub0VuY2FzZSwgc3BlY2lmaWNhdGlvbilcblxuICAgIC8vIG91ciBjb25maWd1cmVkIGZ1bmN0aW9ucywgd2l0aCBmYWxsYmFjayBkZWZhdWx0c1xuICAgIGNvbnN0IG9uU2V0ID0gYnVpbHQub25DYWxsIHx8IGJ1aWx0Lm9uU2V0XG4gICAgY29uc3Qgb25WYWxpZCA9IGJ1aWx0Lm9uVmFsaWQgfHwgb25TZXRcblxuICAgIC8vIGRlZmF1bHQgdG8gcmUtdGhyb3dcbiAgICBjb25zdCBvbkludmFsaWQgPVxuICAgICAgYnVpbHQub25JbnZhbGlkIHx8XG4gICAgICAoKGFyZywgZXJyb3IpID0+IGVuaGFuY2VFcnJvcihhcmcsIGVycm9yLCBFUlJPUl9NRVRBKS5yZVRocm93KCkpXG5cbiAgICAvKipcbiAgICAgKiBAZGVzYyB0aGlzIGlzIHRoZSBhY3R1YWwgYnVpbHQgZnVuY3Rpb25cbiAgICAgKiBAbmFtZSB0eXBlZE9uQ2FsbFxuICAgICAqIEBmdW5jIHR5cGVkT25DYWxsXG4gICAgICogQGNhdGVnb3J5IHR5cGVcbiAgICAgKiBAc2luY2UgNC4wLjAtYmV0YS4xXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHthbnl9IGFyZyBhcmcgdG8gdmFsaWRhdGVcbiAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gdHlwZWRPbkNhbGwoYXJnVG9WYWxpZGF0ZTogYW55KVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqICAgIGNvbnN0IGVuY2FzZWQgPSBlbmNhc2UoZm5Ub0VuY2FzZSlcbiAgICAgKiAgICAgIC5vblZhbGlkKClcbiAgICAgKiAgICAgIC5vbkludmFsaWQoZnVuY3Rpb24pXG4gICAgICogICAgICAuY2FsbCgpXG4gICAgICpcbiAgICAgKi9cbiAgICByZXR1cm4gZnVuY3Rpb24gdHlwZWRPbkNhbGwoYXJnKSB7XG4gICAgICAvLyBub2RlanMgd2F5IC0gZXJyb3IgZmlyc3QsIGRhdGEgc2Vjb25kLCBpbnN0YW5jZSBsYXN0XG4gICAgICBjb25zdCBjYWxsSW52YWxpZCA9IGVycm9yID0+IHtcbiAgICAgICAgLy8gQEBkZWJ1Z2dlclxuICAgICAgICBvbkludmFsaWQuY2FsbCh0aGlzLCBlbmhhbmNlRXJyb3IoYXJnLCBlcnJvciksIGFyZywgbmFtZSwgdGhpcylcbiAgICAgIH1cblxuICAgICAgLy8gQFRPRE86IGVuc3VyZSBpdCBpc24ndCBhIHN5bnRheCBlcnJvciBhbmQgaXMgYSB0eXBlIGVycm9yXG4gICAgICAvLyBpZiBpdCBpcyBhbHJlYWR5IGFuIGVycm9yLCB3ZSBzaG91bGQgb25seSBlbmhhbmNlIGl0XG4gICAgICAvLyBAZXhhbXBsZSBgVHlwZUVycm9yOiBDYW5ub3QgcmVhZCBwcm9wZXJ0eSAnY2FsbCcgb2YgdW5kZWZpbmVkYFxuICAgICAgZW5jYXNlZFxuICAgICAgICAub25JbnZhbGlkKGNhbGxJbnZhbGlkKVxuICAgICAgICAvLyBATk9URTogb25WYWxpZCBkZWZhdWx0cyB0byBgdGhpcy5zZXQobmFtZSwgYXJnKWBcbiAgICAgICAgLm9uVmFsaWQocmVzdWx0ID0+IHtcbiAgICAgICAgICAvLyBAQGRlYnVnZ2VyXG4gICAgICAgICAgb25WYWxpZC5jYWxsKHRoaXMsIGFyZywgbmFtZSwgdGhpcylcbiAgICAgICAgfSlcbiAgICAgICAgLmNhbGwodGhpcywgYXJnKVxuXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1ldGhvZEVuY2FzaW5nRmFjdG9yeVxuIl0sIm5hbWVzIjpbImNvbnN0IiwidGhpcyJdLCJtYXBwaW5ncyI6IkFBQUFBLEdBQUssQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLDBCQUEwQixDQUFDO0FBQ3JEQSxHQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQzs7QUFFeENBLEdBQUssQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBCekIsU0FBUyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF1QmxELE9BQU8sU0FBUyxZQUFZLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUU7O0lBRTVEQSxHQUFLLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUM7OztJQUc5REEsR0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQzs7O0lBR2pEQSxHQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLEtBQUs7SUFDekNBLEdBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLOzs7SUFHdENBLEdBQUssQ0FBQyxTQUFTO01BQ2IsS0FBSyxDQUFDLFNBQVM7TUFDZixDQUFDLFNBQUEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEFBQUcsU0FBQSxZQUFZLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBQSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQW9CbEUsT0FBTyxTQUFTLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7QUFBQTs7TUFFaENBLEdBQUssQ0FBQyxXQUFXLEdBQUcsVUFBQSxLQUFLLENBQUEsQ0FBQyxBQUFHOztRQUUzQixTQUFTLENBQUMsSUFBSSxDQUFDQyxNQUFJLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFQSxNQUFJLENBQUM7T0FDaEU7Ozs7O01BS0QsT0FBTztTQUNKLFNBQVMsQ0FBQyxXQUFXLENBQUM7O1NBRXRCLE9BQU8sQ0FBQyxVQUFBLE1BQU0sQ0FBQSxDQUFDLEFBQUc7O1VBRWpCLE9BQU8sQ0FBQyxJQUFJLENBQUNBLE1BQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFQSxNQUFJLENBQUM7U0FDcEMsQ0FBQztTQUNELElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDOztNQUVsQixPQUFPLElBQUk7S0FDWjtHQUNGO0NBQ0Y7O0FBRUQsTUFBTSxDQUFDLE9BQU8sR0FBRyxxQkFBcUI7In0=