UNPKG

chain-able

Version:

interfaces that describe their intentions.

196 lines (178 loc) 15.9 kB
var TraverseChain = require('../TraverseChain') var isObj = require('../deps/is/obj') var isTrue = require('../deps/is/true') var isFalse = require('../deps/is/false') var isUndefined = require('../deps/is/undefined') var ObjectKeys = require('../deps/util/keys') var dotPropPaths = require('../deps/dot/paths') var TRANSFORMERS_KEY = require('../deps/meta/transformers') var OBSERVERS_KEY = require('../deps/meta/observers') /** * @param {Class | Composable} SuperClass composable class * @return {TransformChain} class * @example * compose(class {}) * //=> TransformChain */ module.exports = function (SuperClass) { /** * @class TransformChain * @member TransformChain * @extends {ChainedMap} * @memberOf compose * @category Chainable * * @tests TransformChain * @types TransformChain * * @symb 🤖 * @type {Map} * * @see deps/traverse * @see TraverseChain * * {@link https://github.com/iluwatar/java-design-patterns/tree/master/state state-pattern} * {@link https://github.com/iluwatar/java-design-patterns/tree/master/strategy strategy-pattern} */ return (function (SuperClass) { function Transform () { SuperClass.apply(this, arguments); } if ( SuperClass ) Transform.__proto__ = SuperClass; Transform.prototype = Object.create( SuperClass && SuperClass.prototype ); Transform.prototype.constructor = Transform; Transform.prototype.traverse = function traverse (useThis) { if ( useThis === void 0 ) useThis = false; /* prettier-ignore */ return new TraverseChain(this) .obj(isFalse(useThis) ? this.entries(true) : isTrue(useThis) ? this : useThis ) }; /** * @since 1.0.2 * @memberOf TransformChain * * @param {string | Function} key currently just string * @param {Function} value callback accepting the value as only arg to transform with * @return {TransformChain} @chainable * * @TODO dot-prop here * * @example * * // coerce values with .id into the value they hold * chain * .transform('dis', val => (typeof val === 'string' ? val : val.id)) * * chain.set('dis', 'eh') * chain.get('dis') * //=> 'eh' * * chain.set('dis', {id: 'eh'}) * chain.get('dis') * //=> 'eh' * * * @example * * import {format} from 'date-fns/esm' * import {Chain} from 'chain-able' * * const chain = new Chain() * chain.transform('created_at', date => format(date, 'MM/DD/YYYY')) * chain.set('created_at', new Date()) * * // is formatted human-readable pretty! * const {created_at} = chain.entries() * //=> '02/11/2014' * */ Transform.prototype.transform = function transform (key, value) { return this.meta(TRANSFORMERS_KEY, key, value) }; /** * @memberOf TransformChain * * @override * @inheritdoc * @since 1.0.0 * * @param {Primitive} key key to set with * @param {any} val value to set for key * @param {undefined | string | Array<string>} dotPropKey special key used for initializing dot prop values in an optimized way to keep reference * @return {Chainable} @chainable * * @see this.observe, this.transform */ Transform.prototype.set = function set (key, val, dotPropKey) { var this$1 = this; var value = val // get var transformers = this.meta(TRANSFORMERS_KEY, key) for (var t = 0; t < transformers.length; t++) { value = transformers[t].call(this$1, value, this$1) } SuperClass.prototype.set.call(this, key, value) var data = {key: dotPropKey, value: value} if (isUndefined(dotPropKey)) { data.key = isObj(value) ? dotPropPaths(key, value) : key } // get var observers = this.meta(OBSERVERS_KEY) for (var o = 0; o < observers.length; o++) { observers[o](data) } return this }; // --- remap --- /** * @desc remap properties from 1 to another, for example, apis with inconsistent naming * @memberOf TransformChain * @since 1.0.0 * @symb 🗺 * * @param {string | Object} from property name string, or {[from]: to} * @param {string} [to=undefined] property name to change key to * @return {Chain} @chainable * * @see TransformChain.transform * @IDEA could also be a function, but then might as well use .transform * * @example * * chain * .remap('dis', 'dat') * .from({dis: true}) * * chain.entries() * //=> {dat: true} * * @example * * chain * .remap({dis: 'dat'}) * .from({dis: 1, other: true}} * * chain.entries() * //=> {dist: 1, other: true} * */ Transform.prototype.remap = function remap (from, to) { var this$1 = this; var remap = from if (!isObj(from)) { remap = {[from]: to} } /* prettier-ignore */ ObjectKeys(remap).forEach(function (key) { return this$1.transform(key, function (val) { this$1.set(remap[key], val) return val }); }) return this }; return Transform; }(SuperClass)) } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNmb3JtLmpzIiwic291cmNlcyI6WyJUcmFuc2Zvcm0uanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgVHJhdmVyc2VDaGFpbiA9IHJlcXVpcmUoJy4uL1RyYXZlcnNlQ2hhaW4nKVxuY29uc3QgaXNPYmogPSByZXF1aXJlKCcuLi9kZXBzL2lzL29iaicpXG5jb25zdCBpc1RydWUgPSByZXF1aXJlKCcuLi9kZXBzL2lzL3RydWUnKVxuY29uc3QgaXNGYWxzZSA9IHJlcXVpcmUoJy4uL2RlcHMvaXMvZmFsc2UnKVxuY29uc3QgaXNVbmRlZmluZWQgPSByZXF1aXJlKCcuLi9kZXBzL2lzL3VuZGVmaW5lZCcpXG5jb25zdCBPYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vZGVwcy91dGlsL2tleXMnKVxuY29uc3QgZG90UHJvcFBhdGhzID0gcmVxdWlyZSgnLi4vZGVwcy9kb3QvcGF0aHMnKVxuY29uc3QgVFJBTlNGT1JNRVJTX0tFWSA9IHJlcXVpcmUoJy4uL2RlcHMvbWV0YS90cmFuc2Zvcm1lcnMnKVxuY29uc3QgT0JTRVJWRVJTX0tFWSA9IHJlcXVpcmUoJy4uL2RlcHMvbWV0YS9vYnNlcnZlcnMnKVxuXG4vKipcbiAqIEBwYXJhbSAge0NsYXNzIHwgQ29tcG9zYWJsZX0gU3VwZXJDbGFzcyBjb21wb3NhYmxlIGNsYXNzXG4gKiBAcmV0dXJuIHtUcmFuc2Zvcm1DaGFpbn0gY2xhc3NcbiAqIEBleGFtcGxlXG4gKiAgICBjb21wb3NlKGNsYXNzIHt9KVxuICogICAgLy89PiBUcmFuc2Zvcm1DaGFpblxuICovXG5tb2R1bGUuZXhwb3J0cyA9IFN1cGVyQ2xhc3MgPT4ge1xuICAvKipcbiAgICogQGNsYXNzIFRyYW5zZm9ybUNoYWluXG4gICAqIEBtZW1iZXIgVHJhbnNmb3JtQ2hhaW5cbiAgICogQGV4dGVuZHMge0NoYWluZWRNYXB9XG4gICAqIEBtZW1iZXJPZiBjb21wb3NlXG4gICAqIEBjYXRlZ29yeSBDaGFpbmFibGVcbiAgICpcbiAgICogQHRlc3RzIFRyYW5zZm9ybUNoYWluXG4gICAqIEB0eXBlcyBUcmFuc2Zvcm1DaGFpblxuICAgKlxuICAgKiBAc3ltYiDwn6SWXG4gICAqIEB0eXBlIHtNYXB9XG4gICAqXG4gICAqIEBzZWUgZGVwcy90cmF2ZXJzZVxuICAgKiBAc2VlIFRyYXZlcnNlQ2hhaW5cbiAgICpcbiAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9pbHV3YXRhci9qYXZhLWRlc2lnbi1wYXR0ZXJucy90cmVlL21hc3Rlci9zdGF0ZSBzdGF0ZS1wYXR0ZXJufVxuICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2lsdXdhdGFyL2phdmEtZGVzaWduLXBhdHRlcm5zL3RyZWUvbWFzdGVyL3N0cmF0ZWd5IHN0cmF0ZWd5LXBhdHRlcm59XG4gICAqL1xuICByZXR1cm4gY2xhc3MgVHJhbnNmb3JtIGV4dGVuZHMgU3VwZXJDbGFzcyB7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgLyoqXG4gICAgICogQGRlc2MgdHJhdmVyc2UgYHRoaXNgLCBvciBgdGhpcy5lbnRyaWVzYFxuICAgICAqIEBzaW5jZSAxLjAuMlxuICAgICAqXG4gICAgICogQHBhcmFtICB7Ym9vbGVhbiB8IHRyYXZlcnNhYmxlfSBbdXNlVGhpcz1mYWxzZV0gdXNlIHRoZSBpbnN0YW5jZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIGBtYXBpc2hgIGFzIHdlbGxcbiAgICAgKiBAcmV0dXJuIHtUcmF2ZXJzZUNoYWlufSBAY2hhaW5hYmxlXG4gICAgICpcbiAgICAgKiBAc2VlIFRyYXZlcnNlQ2hhaW5cbiAgICAgKiBAc2VlIGpzLXRyYXZlcnNlXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICBUQUtFIEZST00gVFJBVkVSU0VDSEFJTlxuICAgICAqL1xuICAgIHRyYXZlcnNlKHVzZVRoaXMgPSBmYWxzZSkge1xuICAgICAgLyogcHJldHRpZXItaWdub3JlICovXG4gICAgICByZXR1cm4gbmV3IFRyYXZlcnNlQ2hhaW4odGhpcylcbiAgICAgICAgLm9iaihpc0ZhbHNlKHVzZVRoaXMpXG4gICAgICAgICAgPyB0aGlzLmVudHJpZXModHJ1ZSlcbiAgICAgICAgICA6IGlzVHJ1ZSh1c2VUaGlzKVxuICAgICAgICAgICAgPyB0aGlzXG4gICAgICAgICAgICA6IHVzZVRoaXNcbiAgICAgICAgKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBzaW5jZSAxLjAuMlxuICAgICAqIEBtZW1iZXJPZiBUcmFuc2Zvcm1DaGFpblxuICAgICAqXG4gICAgICogQHBhcmFtICB7c3RyaW5nIHwgRnVuY3Rpb259IGtleSBjdXJyZW50bHkganVzdCBzdHJpbmdcbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gdmFsdWUgY2FsbGJhY2sgYWNjZXB0aW5nIHRoZSB2YWx1ZSBhcyBvbmx5IGFyZyB0byB0cmFuc2Zvcm0gd2l0aFxuICAgICAqIEByZXR1cm4ge1RyYW5zZm9ybUNoYWlufSBAY2hhaW5hYmxlXG4gICAgICpcbiAgICAgKiBAVE9ETyBkb3QtcHJvcCBoZXJlXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogICAvLyBjb2VyY2UgdmFsdWVzIHdpdGggLmlkIGludG8gdGhlIHZhbHVlIHRoZXkgaG9sZFxuICAgICAqICAgY2hhaW5cbiAgICAgKiAgICAgLnRyYW5zZm9ybSgnZGlzJywgdmFsID0+ICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyA/IHZhbCA6IHZhbC5pZCkpXG4gICAgICpcbiAgICAgKiAgIGNoYWluLnNldCgnZGlzJywgJ2VoJylcbiAgICAgKiAgIGNoYWluLmdldCgnZGlzJylcbiAgICAgKiAgIC8vPT4gJ2VoJ1xuICAgICAqXG4gICAgICogICBjaGFpbi5zZXQoJ2RpcycsIHtpZDogJ2VoJ30pXG4gICAgICogICBjaGFpbi5nZXQoJ2RpcycpXG4gICAgICogICAvLz0+ICdlaCdcbiAgICAgKlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqICAgIGltcG9ydCB7Zm9ybWF0fSBmcm9tICdkYXRlLWZucy9lc20nXG4gICAgICogICAgaW1wb3J0IHtDaGFpbn0gZnJvbSAnY2hhaW4tYWJsZSdcbiAgICAgKlxuICAgICAqICAgIGNvbnN0IGNoYWluID0gbmV3IENoYWluKClcbiAgICAgKiAgICBjaGFpbi50cmFuc2Zvcm0oJ2NyZWF0ZWRfYXQnLCBkYXRlID0+IGZvcm1hdChkYXRlLCAnTU0vREQvWVlZWScpKVxuICAgICAqICAgIGNoYWluLnNldCgnY3JlYXRlZF9hdCcsIG5ldyBEYXRlKCkpXG4gICAgICpcbiAgICAgKiAgICAvLyBpcyBmb3JtYXR0ZWQgaHVtYW4tcmVhZGFibGUgcHJldHR5IVxuICAgICAqICAgIGNvbnN0IHtjcmVhdGVkX2F0fSA9IGNoYWluLmVudHJpZXMoKVxuICAgICAqICAgIC8vPT4gJzAyLzExLzIwMTQnXG4gICAgICpcbiAgICAgKi9cbiAgICB0cmFuc2Zvcm0oa2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubWV0YShUUkFOU0ZPUk1FUlNfS0VZLCBrZXksIHZhbHVlKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBtZW1iZXJPZiBUcmFuc2Zvcm1DaGFpblxuICAgICAqXG4gICAgICogQG92ZXJyaWRlXG4gICAgICogQGluaGVyaXRkb2NcbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJpbWl0aXZlfSBrZXkga2V5IHRvIHNldCB3aXRoXG4gICAgICogQHBhcmFtIHthbnl9IHZhbCB2YWx1ZSB0byBzZXQgZm9yIGtleVxuICAgICAqIEBwYXJhbSB7dW5kZWZpbmVkIHwgc3RyaW5nIHwgQXJyYXk8c3RyaW5nPn0gZG90UHJvcEtleSBzcGVjaWFsIGtleSB1c2VkIGZvciBpbml0aWFsaXppbmcgZG90IHByb3AgdmFsdWVzIGluIGFuIG9wdGltaXplZCB3YXkgdG8ga2VlcCByZWZlcmVuY2VcbiAgICAgKiBAcmV0dXJuIHtDaGFpbmFibGV9IEBjaGFpbmFibGVcbiAgICAgKlxuICAgICAqIEBzZWUgdGhpcy5vYnNlcnZlLCB0aGlzLnRyYW5zZm9ybVxuICAgICAqL1xuICAgIHNldChrZXksIHZhbCwgZG90UHJvcEtleSkge1xuICAgICAgbGV0IHZhbHVlID0gdmFsXG5cbiAgICAgIC8vIGdldFxuICAgICAgY29uc3QgdHJhbnNmb3JtZXJzID0gdGhpcy5tZXRhKFRSQU5TRk9STUVSU19LRVksIGtleSlcbiAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgdHJhbnNmb3JtZXJzLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgIHZhbHVlID0gdHJhbnNmb3JtZXJzW3RdLmNhbGwodGhpcywgdmFsdWUsIHRoaXMpXG4gICAgICB9XG5cbiAgICAgIHN1cGVyLnNldChrZXksIHZhbHVlKVxuXG4gICAgICBjb25zdCBkYXRhID0ge2tleTogZG90UHJvcEtleSwgdmFsdWV9XG4gICAgICBpZiAoaXNVbmRlZmluZWQoZG90UHJvcEtleSkpIHtcbiAgICAgICAgZGF0YS5rZXkgPSBpc09iaih2YWx1ZSkgPyBkb3RQcm9wUGF0aHMoa2V5LCB2YWx1ZSkgOiBrZXlcbiAgICAgIH1cblxuICAgICAgLy8gZ2V0XG4gICAgICBjb25zdCBvYnNlcnZlcnMgPSB0aGlzLm1ldGEoT0JTRVJWRVJTX0tFWSlcbiAgICAgIGZvciAobGV0IG8gPSAwOyBvIDwgb2JzZXJ2ZXJzLmxlbmd0aDsgbysrKSB7XG4gICAgICAgIG9ic2VydmVyc1tvXShkYXRhKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8vIC0tLSByZW1hcCAtLS1cbiAgICAvKipcbiAgICAgKiBAZGVzYyByZW1hcCBwcm9wZXJ0aWVzIGZyb20gMSB0byBhbm90aGVyLCBmb3IgZXhhbXBsZSwgYXBpcyB3aXRoIGluY29uc2lzdGVudCBuYW1pbmdcbiAgICAgKiBAbWVtYmVyT2YgVHJhbnNmb3JtQ2hhaW5cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAc3ltYiDwn5e6XG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmcgfCBPYmplY3R9IGZyb20gcHJvcGVydHkgbmFtZSBzdHJpbmcsIG9yIHtbZnJvbV06IHRvfVxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gW3RvPXVuZGVmaW5lZF0gcHJvcGVydHkgbmFtZSB0byBjaGFuZ2Uga2V5IHRvXG4gICAgICogQHJldHVybiB7Q2hhaW59IEBjaGFpbmFibGVcbiAgICAgKlxuICAgICAqIEBzZWUgVHJhbnNmb3JtQ2hhaW4udHJhbnNmb3JtXG4gICAgICogQElERUEgY291bGQgYWxzbyBiZSBhIGZ1bmN0aW9uLCBidXQgdGhlbiBtaWdodCBhcyB3ZWxsIHVzZSAudHJhbnNmb3JtXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogIGNoYWluXG4gICAgICogICAgLnJlbWFwKCdkaXMnLCAnZGF0JylcbiAgICAgKiAgICAuZnJvbSh7ZGlzOiB0cnVlfSlcbiAgICAgKlxuICAgICAqICBjaGFpbi5lbnRyaWVzKClcbiAgICAgKiAgLy89PiB7ZGF0OiB0cnVlfVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqICBjaGFpblxuICAgICAqICAgIC5yZW1hcCh7ZGlzOiAnZGF0J30pXG4gICAgICogICAgLmZyb20oe2RpczogMSwgb3RoZXI6IHRydWV9fVxuICAgICAqXG4gICAgICogIGNoYWluLmVudHJpZXMoKVxuICAgICAqICAvLz0+IHtkaXN0OiAxLCBvdGhlcjogdHJ1ZX1cbiAgICAgKlxuICAgICAqL1xuICAgIHJlbWFwKGZyb20sIHRvKSB7XG4gICAgICBsZXQgcmVtYXAgPSBmcm9tXG4gICAgICBpZiAoIWlzT2JqKGZyb20pKSByZW1hcCA9IHtbZnJvbV06IHRvfVxuXG4gICAgICAvKiBwcmV0dGllci1pZ25vcmUgKi9cbiAgICAgIE9iamVjdEtleXMocmVtYXApLmZvckVhY2goa2V5ID0+IHRoaXMudHJhbnNmb3JtKGtleSwgdmFsID0+IHtcbiAgICAgICAgdGhpcy5zZXQocmVtYXBba2V5XSwgdmFsKVxuICAgICAgICByZXR1cm4gdmFsXG4gICAgICB9KSlcblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJjb25zdCIsImxldCIsInRoaXMiLCJzdXBlciJdLCJtYXBwaW5ncyI6IkFBQUFBLEdBQUssQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDO0FBQ2pEQSxHQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztBQUN2Q0EsR0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7QUFDekNBLEdBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDO0FBQzNDQSxHQUFLLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztBQUNuREEsR0FBSyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUM7QUFDL0NBLEdBQUssQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDO0FBQ2pEQSxHQUFLLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixDQUFDO0FBQzdEQSxHQUFLLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQzs7Ozs7Ozs7O0FBU3ZELE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBQSxVQUFVLENBQUEsQ0FBQyxBQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQW9CN0IsT0FBTztJQUFBLEFBQWtDLEFBQUM7Ozs7Ozs7O0lBQUEsQUFnQnhDLG9CQUFBLFFBQVEscUJBQUEsQ0FBQyxPQUFlLEVBQUUsQ0FBVjt1Q0FBQSxHQUFHLEtBQUs7QUFBRzs7TUFFekIsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUM7U0FDM0IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDbEIsTUFBTSxDQUFDLE9BQU8sQ0FBQztjQUNiLElBQUk7Y0FDSixPQUFP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