chain-able
Version:
interfaces that describe their intentions.
118 lines (99 loc) • 10.4 kB
JavaScript
var MethodChain = require('../MethodChain')
var compose = require('../compose')
var chainMethods = function (parent) { return new MethodChain(parent); }
var decorator = function (instructions) { return function (target) {
var extension = (function (superclass) {
function ChainableDecoration () {
superclass.apply(this, arguments);
}if ( superclass ) ChainableDecoration.__proto__ = superclass;
ChainableDecoration.prototype = Object.create( superclass && superclass.prototype );
ChainableDecoration.prototype.constructor = ChainableDecoration;
return ChainableDecoration;
}(compose(target)))
// log.verbose(100).data(extension).echo()
var decorated = instructions(chainMethods(extension.prototype))
return decorated.build(extension)
}; }
// ---- @TODO ---
// can do these 3 without extending constructor, just by using proto
// --- ---
var observe = function (keys, fn) { return function (target) {
return (function (target) {
function ChainableObserverDecorator(parent) {
target.call(this, parent)
return this.observe(keys, fn.bind(this))
}
if ( target ) ChainableObserverDecorator.__proto__ = target;
ChainableObserverDecorator.prototype = Object.create( target && target.prototype );
ChainableObserverDecorator.prototype.constructor = ChainableObserverDecorator;
return ChainableObserverDecorator;
}(target))
}; }
var transform = function (keys, value) { return function (target) {
return (function (target) {
function ChainableTransformDecorator(parent) {
target.call(this, parent)
return this.transform(keys, value.bind(this))
}
if ( target ) ChainableTransformDecorator.__proto__ = target;
ChainableTransformDecorator.prototype = Object.create( target && target.prototype );
ChainableTransformDecorator.prototype.constructor = ChainableTransformDecorator;
return ChainableTransformDecorator;
}(target))
}; }
var remap = function (from, to) { return function (target) {
return (function (target) {
function ChainableTransformDecorator(parent) {
target.call(this, parent)
return this.remap(from, to)
}
if ( target ) ChainableTransformDecorator.__proto__ = target;
ChainableTransformDecorator.prototype = Object.create( target && target.prototype );
ChainableTransformDecorator.prototype.constructor = ChainableTransformDecorator;
return ChainableTransformDecorator;
}(target))
}; }
// ----
// for experimenting
// const onValid = (key, arg) => {
// log.bold('valid :-)').data({arg, key}).echo()
// console.log('\n')
// }
// const onInvalid = (error, arg, instance) => {
// log.red('invalid').data({error, arg, instance}).exit()
// console.log('\n')
// }
// @NOTE: need to manage onInvalid onValid... could check for methods :3
/* prettier-ignore */
var schema = function (obj) { return function (target) { return decorator(function (builder) { return builder
.onValid(target.prototype.onValid)
.onInvalid(target.prototype.onInvalid)
.schema(obj); }
)(target); }; }
/* prettier-ignore */
var schema2 = function (obj) { return function (target) {
return (function (target) {
function ChainableSchemaDecoration(parent) {
target.call(this, parent)
chainMethods(this)
.onValid(this.onValid)
.onInvalid(this.onInvalid)
.schema(obj)
return this
}
if ( target ) ChainableSchemaDecoration.__proto__ = target;
ChainableSchemaDecoration.prototype = Object.create( target && target.prototype );
ChainableSchemaDecoration.prototype.constructor = ChainableSchemaDecoration;
return ChainableSchemaDecoration;
}(target))
}; }
exports.chainMethods = chainMethods
exports.methodDecorator = decorator
exports.decorator = decorator
exports.observe = observe
exports.transform = transform
exports.remap = remap
exports.schema = schema
exports.schema2 = schema2
exports.compose = compose
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZXMiOlsiZGVjb3JhdG9ycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBNZXRob2RDaGFpbiA9IHJlcXVpcmUoJy4uL01ldGhvZENoYWluJylcbmNvbnN0IGNvbXBvc2UgPSByZXF1aXJlKCcuLi9jb21wb3NlJylcblxuY29uc3QgY2hhaW5NZXRob2RzID0gcGFyZW50ID0+IG5ldyBNZXRob2RDaGFpbihwYXJlbnQpXG5cbmNvbnN0IGRlY29yYXRvciA9IGluc3RydWN0aW9ucyA9PiB0YXJnZXQgPT4ge1xuICBjb25zdCBleHRlbnNpb24gPSBjbGFzcyBDaGFpbmFibGVEZWNvcmF0aW9uIGV4dGVuZHMgY29tcG9zZSh0YXJnZXQpIHt9XG4gIC8vIGxvZy52ZXJib3NlKDEwMCkuZGF0YShleHRlbnNpb24pLmVjaG8oKVxuICBjb25zdCBkZWNvcmF0ZWQgPSBpbnN0cnVjdGlvbnMoY2hhaW5NZXRob2RzKGV4dGVuc2lvbi5wcm90b3R5cGUpKVxuICByZXR1cm4gZGVjb3JhdGVkLmJ1aWxkKGV4dGVuc2lvbilcbn1cblxuLy8gLS0tLSBAVE9ETyAtLS1cbi8vIGNhbiBkbyB0aGVzZSAzIHdpdGhvdXQgZXh0ZW5kaW5nIGNvbnN0cnVjdG9yLCBqdXN0IGJ5IHVzaW5nIHByb3RvXG4vLyAtLS0gICAgICAgIC0tLVxuY29uc3Qgb2JzZXJ2ZSA9IChrZXlzLCBmbikgPT4gdGFyZ2V0ID0+IHtcbiAgcmV0dXJuIGNsYXNzIENoYWluYWJsZU9ic2VydmVyRGVjb3JhdG9yIGV4dGVuZHMgdGFyZ2V0IHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQpIHtcbiAgICAgIHN1cGVyKHBhcmVudClcbiAgICAgIHJldHVybiB0aGlzLm9ic2VydmUoa2V5cywgZm4uYmluZCh0aGlzKSlcbiAgICB9XG4gIH1cbn1cbmNvbnN0IHRyYW5zZm9ybSA9IChrZXlzLCB2YWx1ZSkgPT4gdGFyZ2V0ID0+IHtcbiAgcmV0dXJuIGNsYXNzIENoYWluYWJsZVRyYW5zZm9ybURlY29yYXRvciBleHRlbmRzIHRhcmdldCB7XG4gICAgY29uc3RydWN0b3IocGFyZW50KSB7XG4gICAgICBzdXBlcihwYXJlbnQpXG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0oa2V5cywgdmFsdWUuYmluZCh0aGlzKSlcbiAgICB9XG4gIH1cbn1cbmNvbnN0IHJlbWFwID0gKGZyb20sIHRvKSA9PiB0YXJnZXQgPT4ge1xuICByZXR1cm4gY2xhc3MgQ2hhaW5hYmxlVHJhbnNmb3JtRGVjb3JhdG9yIGV4dGVuZHMgdGFyZ2V0IHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQpIHtcbiAgICAgIHN1cGVyKHBhcmVudClcbiAgICAgIHJldHVybiB0aGlzLnJlbWFwKGZyb20sIHRvKVxuICAgIH1cbiAgfVxufVxuLy8gLS0tLVxuXG4vLyBmb3IgZXhwZXJpbWVudGluZ1xuLy8gY29uc3Qgb25WYWxpZCA9IChrZXksIGFyZykgPT4ge1xuLy8gICBsb2cuYm9sZCgndmFsaWQgOi0pJykuZGF0YSh7YXJnLCBrZXl9KS5lY2hvKClcbi8vICAgY29uc29sZS5sb2coJ1xcbicpXG4vLyB9XG4vLyBjb25zdCBvbkludmFsaWQgPSAoZXJyb3IsIGFyZywgaW5zdGFuY2UpID0+IHtcbi8vICAgbG9nLnJlZCgnaW52YWxpZCcpLmRhdGEoe2Vycm9yLCBhcmcsIGluc3RhbmNlfSkuZXhpdCgpXG4vLyAgIGNvbnNvbGUubG9nKCdcXG4nKVxuLy8gfVxuXG4vLyBATk9URTogbmVlZCB0byBtYW5hZ2Ugb25JbnZhbGlkIG9uVmFsaWQuLi4gY291bGQgY2hlY2sgZm9yIG1ldGhvZHMgOjNcbi8qIHByZXR0aWVyLWlnbm9yZSAqL1xuY29uc3Qgc2NoZW1hID0gb2JqID0+IHRhcmdldCA9PiBkZWNvcmF0b3IoYnVpbGRlciA9PlxuICBidWlsZGVyXG4gICAgLm9uVmFsaWQodGFyZ2V0LnByb3RvdHlwZS5vblZhbGlkKVxuICAgIC5vbkludmFsaWQodGFyZ2V0LnByb3RvdHlwZS5vbkludmFsaWQpXG4gICAgLnNjaGVtYShvYmopXG4pKHRhcmdldClcblxuLyogcHJldHRpZXItaWdub3JlICovXG5jb25zdCBzY2hlbWEyID0gb2JqID0+IHRhcmdldCA9PiAge1xuICByZXR1cm4gY2xhc3MgQ2hhaW5hYmxlU2NoZW1hRGVjb3JhdGlvbiBleHRlbmRzIHRhcmdldCB7XG4gICAgY29uc3RydWN0b3IocGFyZW50KSB7XG4gICAgICBzdXBlcihwYXJlbnQpXG4gICAgICBjaGFpbk1ldGhvZHModGhpcylcbiAgICAgICAgLm9uVmFsaWQodGhpcy5vblZhbGlkKVxuICAgICAgICAub25JbnZhbGlkKHRoaXMub25JbnZhbGlkKVxuICAgICAgICAuc2NoZW1hKG9iailcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydHMuY2hhaW5NZXRob2RzID0gY2hhaW5NZXRob2RzXG5leHBvcnRzLm1ldGhvZERlY29yYXRvciA9IGRlY29yYXRvclxuZXhwb3J0cy5kZWNvcmF0b3IgPSBkZWNvcmF0b3JcbmV4cG9ydHMub2JzZXJ2ZSA9IG9ic2VydmVcbmV4cG9ydHMudHJhbnNmb3JtID0gdHJhbnNmb3JtXG5leHBvcnRzLnJlbWFwID0gcmVtYXBcbmV4cG9ydHMuc2NoZW1hID0gc2NoZW1hXG5leHBvcnRzLnNjaGVtYTIgPSBzY2hlbWEyXG5leHBvcnRzLmNvbXBvc2UgPSBjb21wb3NlXG4iXSwibmFtZXMiOlsiY29uc3QiLCJzdXBlciJdLCJtYXBwaW5ncyI6IkFBQUFBLEdBQUssQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO0FBQzdDQSxHQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7O0FBRXJDQSxHQUFLLENBQUMsWUFBWSxHQUFHLFVBQUEsTUFBTSxDQUFBLENBQUMsQUFBRyxTQUFBLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFBOztBQUV0REEsR0FBSyxDQUFDLFNBQVMsR0FBRyxVQUFBLFlBQVksQ0FBQSxDQUFDLEFBQUcsU0FBQSxVQUFBLE1B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