chain-able
Version:
interfaces that describe their intentions.
53 lines (48 loc) • 4.27 kB
JavaScript
var isObj = require('../deps/is/obj')
var DECORATED_KEY = require('../deps/meta/decorated')
var meta = require('../deps/meta')
/**
* decorates a parent when the argument is provided
* BUT THE FUNCTIONS WILL STILL BE SCOPED TO CURRENT PARENT
* for easy factory chaining
*
* @since 4.0.0-alpha.1
* @memberOf MethodChain
* @param {Object} parentToDecorate object to put the method on instead
* @return {MethodChain} @chainable
*
* @see MethodChain
*
* @TODO this is more like a preset since it *adds* plugins?
* more of methodFactory now
*
* @example
*
* const chain = new Chain()
* const obj = {}
* chain.method('ehOh').decorate(obj).build()
* typeof obj.ehOh
* //=> 'function'
*
*/
module.exports = function(parentToDecorate) {
// @TODO is objStrict?
// if (parentToDecorate) {
this.target(parentToDecorate)
// can use this to "undecorate"
// if (!parentToDecorate.meta) <- checks already inside of meta()
parentToDecorate.meta = meta(parentToDecorate)
// default returns result of calling function,
// else .parentToDecorate
return this.plugin(function(name, parent) {
parentToDecorate.meta(DECORATED_KEY, name)
// @NOTE: so we can return...
/* prettier-ignore */
return this
.returns(function returnsFunction(result) {
return result || parentToDecorate
})
.callReturns(true)
})
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdGUuanMiLCJzb3VyY2VzIjpbImRlY29yYXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGlzT2JqID0gcmVxdWlyZSgnLi4vZGVwcy9pcy9vYmonKVxuY29uc3QgREVDT1JBVEVEX0tFWSA9IHJlcXVpcmUoJy4uL2RlcHMvbWV0YS9kZWNvcmF0ZWQnKVxuY29uc3QgbWV0YSA9IHJlcXVpcmUoJy4uL2RlcHMvbWV0YScpXG5cbi8qKlxuICogZGVjb3JhdGVzIGEgcGFyZW50IHdoZW4gdGhlIGFyZ3VtZW50IGlzIHByb3ZpZGVkXG4gKiBCVVQgVEhFIEZVTkNUSU9OUyBXSUxMIFNUSUxMIEJFIFNDT1BFRCBUTyBDVVJSRU5UIFBBUkVOVFxuICogZm9yIGVhc3kgZmFjdG9yeSBjaGFpbmluZ1xuICpcbiAqIEBzaW5jZSA0LjAuMC1hbHBoYS4xXG4gKiBAbWVtYmVyT2YgTWV0aG9kQ2hhaW5cbiAqIEBwYXJhbSAge09iamVjdH0gcGFyZW50VG9EZWNvcmF0ZSBvYmplY3QgdG8gcHV0IHRoZSBtZXRob2Qgb24gaW5zdGVhZFxuICogQHJldHVybiB7TWV0aG9kQ2hhaW59IEBjaGFpbmFibGVcbiAqXG4gKiBAc2VlIE1ldGhvZENoYWluXG4gKlxuICogQFRPRE8gdGhpcyBpcyBtb3JlIGxpa2UgYSBwcmVzZXQgc2luY2UgaXQgKmFkZHMqIHBsdWdpbnM/XG4gKiAgICAgICBtb3JlIG9mIG1ldGhvZEZhY3Rvcnkgbm93XG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiAgIGNvbnN0IGNoYWluID0gbmV3IENoYWluKClcbiAqICAgY29uc3Qgb2JqID0ge31cbiAqICAgY2hhaW4ubWV0aG9kKCdlaE9oJykuZGVjb3JhdGUob2JqKS5idWlsZCgpXG4gKiAgIHR5cGVvZiBvYmouZWhPaFxuICogICAvLz0+ICdmdW5jdGlvbidcbiAqXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ocGFyZW50VG9EZWNvcmF0ZSkge1xuICAvLyBAVE9ETyBpcyBvYmpTdHJpY3Q/XG4gIC8vIGlmIChwYXJlbnRUb0RlY29yYXRlKSB7XG4gIHRoaXMudGFyZ2V0KHBhcmVudFRvRGVjb3JhdGUpXG5cbiAgLy8gY2FuIHVzZSB0aGlzIHRvIFwidW5kZWNvcmF0ZVwiXG4gIC8vIGlmICghcGFyZW50VG9EZWNvcmF0ZS5tZXRhKSA8LSBjaGVja3MgYWxyZWFkeSBpbnNpZGUgb2YgbWV0YSgpXG4gIHBhcmVudFRvRGVjb3JhdGUubWV0YSA9IG1ldGEocGFyZW50VG9EZWNvcmF0ZSlcblxuICAvLyBkZWZhdWx0IHJldHVybnMgcmVzdWx0IG9mIGNhbGxpbmcgZnVuY3Rpb24sXG4gIC8vIGVsc2UgLnBhcmVudFRvRGVjb3JhdGVcbiAgcmV0dXJuIHRoaXMucGx1Z2luKGZ1bmN0aW9uKG5hbWUsIHBhcmVudCkge1xuICAgIHBhcmVudFRvRGVjb3JhdGUubWV0YShERUNPUkFURURfS0VZLCBuYW1lKVxuXG4gICAgLy8gQE5PVEU6IHNvIHdlIGNhbiByZXR1cm4uLi5cbiAgICAvKiBwcmV0dGllci1pZ25vcmUgKi9cbiAgICByZXR1cm4gdGhpc1xuICAgICAgLnJldHVybnMoZnVuY3Rpb24gcmV0dXJuc0Z1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0IHx8IHBhcmVudFRvRGVjb3JhdGVcbiAgICAgIH0pXG4gICAgICAuY2FsbFJldHVybnModHJ1ZSlcbiAgfSlcbn1cbiJdLCJuYW1lcyI6WyJjb25zdCJdLCJtYXBwaW5ncyI6IkFBQUFBLEdBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO0FBQ3ZDQSxHQUFLLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztBQUN2REEsR0FBSyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBCcEMsTUFBTSxDQUFDLE9BQU8sR0FBRyxTQUFTLGdCQUFnQixFQUFFOzs7RUFHMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQzs7OztFQUk3QixnQkFBZ0IsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDOzs7O0VBSTlDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksRUFBRSxNQUFNLEVBQUU7SUFDeEMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUM7Ozs7SUFJMUMsT0FBTyxJQUFJO09BQ1IsT0FBTyxDQUFDLFNBQVMsZUFBZSxDQUFDLE1BQU0sRUFBRTtRQUN4QyxPQUFPLE1BQU0sSUFBSSxnQkFBZ0I7T0FDbEMsQ0FBQztPQUNELFdBQVcsQ0FBQyxJQUFJLENBQUM7R0FDckIsQ0FBQztDQUNIOyJ9