Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@skava/modules / ___dist / chain-able / src / compose / decorators.js
Size: Mime:
"use strict";

// @see https://github.com/mobxjs/mobx/blob/master/src/utils/decorators.ts
const MethodChain = require("../MethodChain");

const compose = require("../compose");

const chainMethods = parent => new MethodChain(parent);

const decorator = instructions => target => {
  const extension = class ChainableDecoration extends compose(target) {}; // log.verbose(100).data(extension).echo()

  const decorated = instructions(chainMethods(extension.prototype));
  return decorated.build(extension);
}; // ---- @TODO ---
// can do these 3 without extending constructor, just by using proto
// ---        ---


const observe = (keys, fn) => target => {
  return class ChainableObserverDecorator extends target {
    constructor(parent) {
      super(parent);
      return this.observe(keys, fn.bind(this));
    }

  };
};

const transform = (keys, value) => target => {
  return class ChainableTransformDecorator extends target {
    constructor(parent) {
      super(parent);
      return this.transform(keys, value.bind(this));
    }

  };
};

const remap = (from, to) => target => {
  return class ChainableTransformDecorator extends target {
    constructor(parent) {
      super(parent);
      return this.remap(from, to);
    }

  };
}; // ----
// 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 */


const schema = obj => target => decorator(builder => builder.onValid(target.prototype.onValid).onInvalid(target.prototype.onInvalid).schema(obj))(target);
/* prettier-ignore */


const schema2 = obj => target => {
  return class ChainableSchemaDecoration extends target {
    constructor(parent) {
      super(parent);
      chainMethods(this).onValid(this.onValid).onInvalid(this.onInvalid).schema(obj);
      return this;
    }

  };
};

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;