UNPKG

foop

Version:

interfaces that describe their intentions.

119 lines (100 loc) 10.5 kB
// @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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