foop
Version:
interfaces that describe their intentions.
119 lines (100 loc) • 10.5 kB
JavaScript
// @see https://github.com/mobxjs/mobx/blob/master/src/utils/decorators.ts
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZXMiOlsiZGVjb3JhdG9ycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb2J4anMvbW9ieC9ibG9iL21hc3Rlci9zcmMvdXRpbHMvZGVjb3JhdG9ycy50c1xuY29uc3QgTWV0aG9kQ2hhaW4gPSByZXF1aXJlKCcuLi9NZXRob2RDaGFpbicpXG5jb25zdCBjb21wb3NlID0gcmVxdWlyZSgnLi4vY29tcG9zZScpXG5cbmNvbnN0IGNoYWluTWV0aG9kcyA9IHBhcmVudCA9PiBuZXcgTWV0aG9kQ2hhaW4ocGFyZW50KVxuXG5jb25zdCBkZWNvcmF0b3IgPSBpbnN0cnVjdGlvbnMgPT4gdGFyZ2V0ID0+IHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gY2xhc3MgQ2hhaW5hYmxlRGVjb3JhdGlvbiBleHRlbmRzIGNvbXBvc2UodGFyZ2V0KSB7fVxuICAvLyBsb2cudmVyYm9zZSgxMDApLmRhdGEoZXh0ZW5zaW9uKS5lY2hvKClcbiAgY29uc3QgZGVjb3JhdGVkID0gaW5zdHJ1Y3Rpb25zKGNoYWluTWV0aG9kcyhleHRlbnNpb24ucHJvdG90eXBlKSlcbiAgcmV0dXJuIGRlY29yYXRlZC5idWlsZChleHRlbnNpb24pXG59XG5cbi8vIC0tLS0gQFRPRE8gLS0tXG4vLyBjYW4gZG8gdGhlc2UgMyB3aXRob3V0IGV4dGVuZGluZyBjb25zdHJ1Y3RvciwganVzdCBieSB1c2luZyBwcm90b1xuLy8gLS0tICAgICAgICAtLS1cbmNvbnN0IG9ic2VydmUgPSAoa2V5cywgZm4pID0+IHRhcmdldCA9PiB7XG4gIHJldHVybiBjbGFzcyBDaGFpbmFibGVPYnNlcnZlckRlY29yYXRvciBleHRlbmRzIHRhcmdldCB7XG4gICAgY29uc3RydWN0b3IocGFyZW50KSB7XG4gICAgICBzdXBlcihwYXJlbnQpXG4gICAgICByZXR1cm4gdGhpcy5vYnNlcnZlKGtleXMsIGZuLmJpbmQodGhpcykpXG4gICAgfVxuICB9XG59XG5jb25zdCB0cmFuc2Zvcm0gPSAoa2V5cywgdmFsdWUpID0+IHRhcmdldCA9PiB7XG4gIHJldHVybiBjbGFzcyBDaGFpbmFibGVUcmFuc2Zvcm1EZWNvcmF0b3IgZXh0ZW5kcyB0YXJnZXQge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCkge1xuICAgICAgc3VwZXIocGFyZW50KVxuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtKGtleXMsIHZhbHVlLmJpbmQodGhpcykpXG4gICAgfVxuICB9XG59XG5jb25zdCByZW1hcCA9IChmcm9tLCB0bykgPT4gdGFyZ2V0ID0+IHtcbiAgcmV0dXJuIGNsYXNzIENoYWluYWJsZVRyYW5zZm9ybURlY29yYXRvciBleHRlbmRzIHRhcmdldCB7XG4gICAgY29uc3RydWN0b3IocGFyZW50KSB7XG4gICAgICBzdXBlcihwYXJlbnQpXG4gICAgICByZXR1cm4gdGhpcy5yZW1hcChmcm9tLCB0bylcbiAgICB9XG4gIH1cbn1cbi8vIC0tLS1cblxuLy8gZm9yIGV4cGVyaW1lbnRpbmdcbi8vIGNvbnN0IG9uVmFsaWQgPSAoa2V5LCBhcmcpID0+IHtcbi8vICAgbG9nLmJvbGQoJ3ZhbGlkIDotKScpLmRhdGEoe2FyZywga2V5fSkuZWNobygpXG4vLyAgIGNvbnNvbGUubG9nKCdcXG4nKVxuLy8gfVxuLy8gY29uc3Qgb25JbnZhbGlkID0gKGVycm9yLCBhcmcsIGluc3RhbmNlKSA9PiB7XG4vLyAgIGxvZy5yZWQoJ2ludmFsaWQnKS5kYXRhKHtlcnJvciwgYXJnLCBpbnN0YW5jZX0pLmV4aXQoKVxuLy8gICBjb25zb2xlLmxvZygnXFxuJylcbi8vIH1cblxuLy8gQE5PVEU6IG5lZWQgdG8gbWFuYWdlIG9uSW52YWxpZCBvblZhbGlkLi4uIGNvdWxkIGNoZWNrIGZvciBtZXRob2RzIDozXG4vKiBwcmV0dGllci1pZ25vcmUgKi9cbmNvbnN0IHNjaGVtYSA9IG9iaiA9PiB0YXJnZXQgPT4gZGVjb3JhdG9yKGJ1aWxkZXIgPT5cbiAgYnVpbGRlclxuICAgIC5vblZhbGlkKHRhcmdldC5wcm90b3R5cGUub25WYWxpZClcbiAgICAub25JbnZhbGlkKHRhcmdldC5wcm90b3R5cGUub25JbnZhbGlkKVxuICAgIC5zY2hlbWEob2JqKVxuKSh0YXJnZXQpXG5cbi8qIHByZXR0aWVyLWlnbm9yZSAqL1xuY29uc3Qgc2NoZW1hMiA9IG9iaiA9PiB0YXJnZXQgPT4gIHtcbiAgcmV0dXJuIGNsYXNzIENoYWluYWJsZVNjaGVtYURlY29yYXRpb24gZXh0ZW5kcyB0YXJnZXQge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCkge1xuICAgICAgc3VwZXIocGFyZW50KVxuICAgICAgY2hhaW5NZXRob2RzKHRoaXMpXG4gICAgICAgIC5vblZhbGlkKHRoaXMub25WYWxpZClcbiAgICAgICAgLm9uSW52YWxpZCh0aGlzLm9uSW52YWxpZClcbiAgICAgICAgLnNjaGVtYShvYmopXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnRzLmNoYWluTWV0aG9kcyA9IGNoYWluTWV0aG9kc1xuZXhwb3J0cy5tZXRob2REZWNvcmF0b3IgPSBkZWNvcmF0b3JcbmV4cG9ydHMuZGVjb3JhdG9yID0gZGVjb3JhdG9yXG5leHBvcnRzLm9ic2VydmUgPSBvYnNlcnZlXG5leHBvcnRzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybVxuZXhwb3J0cy5yZW1hcCA9IHJlbWFwXG5leHBvcnRzLnNjaGVtYSA9IHNjaGVtYVxuZXhwb3J0cy5zY2hlbWEyID0gc2NoZW1hMlxuZXhwb3J0cy5jb21wb3NlID0gY29tcG9zZVxuIl0sIm5hbWVzIjpbImNvbnN0Iiwic3VwZXIiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0FBLEdBQUssQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO0FBQzdDQSxHQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7O0FBRXJDQSxHQUFLLENBQUMsWUFBWSxHQUFHLFVBQUEsTUFBTSxDQUFBLENBQUMsQUFBRyxTQUFBLElBQUksV0FBVyxDQUFD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