chain-able
Version:
interfaces that describe their intentions.
196 lines (178 loc) • 15.9 kB
JavaScript
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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