UNPKG

foop

Version:

interfaces that describe their intentions.

139 lines (126 loc) 12.7 kB
var ChainedMapBase = require('./ChainedMapBase') var traverse = require('./deps/traverse') var isTrue = require('./deps/is/true') var matchFactory = require('./deps/matcher/testKeysVals') var ENV_DEBUG = require('./deps/env/debug') var TRAVERSED_KEY = 1 var EXTENSION_KEYS = ['obj', 'keys', 'vals', 'onNonMatch', 'onMatch', 'clone'] /** * @since 1.0.0 * @type {Map} * @extends {ChainedMapBase} * * @memberOf Chainable * @memberOf Traverse * @see deps/traverse * @category traverse * @types TraverseChain * @tests TraverseChain * @symb 👣 * * @prop {Object} obj * @prop {Array<Matcher>} [keys] * @prop {Array<Matcher>} [vals] * @prop {Function} [onMatch] * @prop {Function} [onNonMatch] * @prop {boolean} [clone] */ module.exports = (function (ChainedMapBase) { function Traverser(parent) { ChainedMapBase.call(this, parent) this.call = this.traverse.bind(this) /* prettier-ignore */ this .extend(EXTENSION_KEYS) .keys([]) .vals([]) // key, .onMatch(function (arg, traverser) { // no return needed traverser.remove() }) } if ( ChainedMapBase ) Traverser.__proto__ = ChainedMapBase; Traverser.prototype = Object.create( ChainedMapBase && ChainedMapBase.prototype ); Traverser.prototype.constructor = Traverser; /** * @desc runs traverser, checks the tests, calls the onMatch * @modifies this.cleaned * * @memberOf TraverseChain * @alias call * @since 1.0.0 * * @param {boolean} [shouldReturn=false] returns traversed object * @return {any} this.obj/data cleaned * * @example * * const traversed = new Chain() * .merge({flat: 0, one: {two: true}}) * .traverse(false) * .vals([/true/]) * .onMatch((current, traverser) => { * traverser.path.join('.') * //=> 'one.two' * * current * //=> true * * typeof traverser.update === typeof traverser.remove * typeof traverser.update === 'function' * //=> true * * traverser.remove() * //=> void * }) * .onNonMatch(val => { * // ignore * }) * .call(true) * * traversed * //=> {flat: 0} * */ Traverser.prototype.traverse = function traverse$1 (shouldReturn) { var ref = this.entries(); var obj = ref.obj; var keys = ref.keys; var vals = ref.vals; var onMatch = ref.onMatch; var onNonMatch = ref.onNonMatch; var clone = ref.clone; var result = clone ? traverse(obj).clone() : obj // diff between keys and val is order of arg in ^ tester var matcher = matchFactory(keys, vals) /* istanbul ignore next: debug */ if (ENV_DEBUG) { console.log('matcher for traverse...', keys, vals) } // bound to the traverser traverse(result).forEach(function(key, x, traverser) { if (traverser.isRoot) { // nothing } else if (matcher(key, x)) { /* istanbul ignore next: debug */ if (ENV_DEBUG) { console.log('------- match ------- ', key, x) } onMatch(x, traverser) } else if (onNonMatch) { /* istanbul ignore next: debug */ if (ENV_DEBUG) { console.log('------- NONmatch ------- ', key, x) } onNonMatch(x, traverser) } }) this.set(TRAVERSED_KEY, result) return isTrue(shouldReturn) ? result : this }; return Traverser; }(ChainedMapBase)) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhdmVyc2VDaGFpbi5qcyIsInNvdXJjZXMiOlsiVHJhdmVyc2VDaGFpbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBDaGFpbmVkTWFwQmFzZSA9IHJlcXVpcmUoJy4vQ2hhaW5lZE1hcEJhc2UnKVxuY29uc3QgdHJhdmVyc2UgPSByZXF1aXJlKCcuL2RlcHMvdHJhdmVyc2UnKVxuY29uc3QgaXNUcnVlID0gcmVxdWlyZSgnLi9kZXBzL2lzL3RydWUnKVxuY29uc3QgbWF0Y2hGYWN0b3J5ID0gcmVxdWlyZSgnLi9kZXBzL21hdGNoZXIvdGVzdEtleXNWYWxzJylcbmNvbnN0IEVOVl9ERUJVRyA9IHJlcXVpcmUoJy4vZGVwcy9lbnYvZGVidWcnKVxuXG5jb25zdCBUUkFWRVJTRURfS0VZID0gMVxuY29uc3QgRVhURU5TSU9OX0tFWVMgPSBbJ29iaicsICdrZXlzJywgJ3ZhbHMnLCAnb25Ob25NYXRjaCcsICdvbk1hdGNoJywgJ2Nsb25lJ11cblxuLyoqXG4gKiBAc2luY2UgMS4wLjBcbiAqIEB0eXBlIHtNYXB9XG4gKiBAZXh0ZW5kcyB7Q2hhaW5lZE1hcEJhc2V9XG4gKlxuICogQG1lbWJlck9mIENoYWluYWJsZVxuICogQG1lbWJlck9mIFRyYXZlcnNlXG4gKiBAc2VlIGRlcHMvdHJhdmVyc2VcbiAqIEBjYXRlZ29yeSB0cmF2ZXJzZVxuICogQHR5cGVzIFRyYXZlcnNlQ2hhaW5cbiAqIEB0ZXN0cyBUcmF2ZXJzZUNoYWluXG4gKiBAc3ltYiDwn5GjXG4gKlxuICogQHByb3Age09iamVjdH0gb2JqXG4gKiBAcHJvcCB7QXJyYXk8TWF0Y2hlcj59IFtrZXlzXVxuICogQHByb3Age0FycmF5PE1hdGNoZXI+fSBbdmFsc11cbiAqIEBwcm9wIHtGdW5jdGlvbn0gW29uTWF0Y2hdXG4gKiBAcHJvcCB7RnVuY3Rpb259IFtvbk5vbk1hdGNoXVxuICogQHByb3Age2Jvb2xlYW59IFtjbG9uZV1cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBUcmF2ZXJzZXIgZXh0ZW5kcyBDaGFpbmVkTWFwQmFzZSB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKiBAbW9kaWZpZXMgdGhpcy5jYWxsXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIG5ldyBUcmF2ZXJzZXIoe30pXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQpIHtcbiAgICBzdXBlcihwYXJlbnQpXG4gICAgdGhpcy5jYWxsID0gdGhpcy50cmF2ZXJzZS5iaW5kKHRoaXMpXG5cbiAgICAvKiBwcmV0dGllci1pZ25vcmUgKi9cbiAgICB0aGlzXG4gICAgICAuZXh0ZW5kKEVYVEVOU0lPTl9LRVlTKVxuICAgICAgLmtleXMoW10pXG4gICAgICAudmFscyhbXSlcbiAgICAgIC8vIGtleSxcbiAgICAgIC5vbk1hdGNoKChhcmcsIHRyYXZlcnNlcikgPT4ge1xuICAgICAgICAvLyBubyByZXR1cm4gbmVlZGVkXG4gICAgICAgIHRyYXZlcnNlci5yZW1vdmUoKVxuICAgICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBydW5zIHRyYXZlcnNlciwgY2hlY2tzIHRoZSB0ZXN0cywgY2FsbHMgdGhlIG9uTWF0Y2hcbiAgICogICAgICAgQG1vZGlmaWVzIHRoaXMuY2xlYW5lZFxuICAgKlxuICAgKiBAbWVtYmVyT2YgVHJhdmVyc2VDaGFpblxuICAgKiBAYWxpYXMgY2FsbFxuICAgKiBAc2luY2UgMS4wLjBcbiAgICpcbiAgICogQHBhcmFtICB7Ym9vbGVhbn0gW3Nob3VsZFJldHVybj1mYWxzZV0gcmV0dXJucyB0cmF2ZXJzZWQgb2JqZWN0XG4gICAqIEByZXR1cm4ge2FueX0gdGhpcy5vYmovZGF0YSBjbGVhbmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgY29uc3QgdHJhdmVyc2VkID0gbmV3IENoYWluKClcbiAgICogICAgIC5tZXJnZSh7ZmxhdDogMCwgb25lOiB7dHdvOiB0cnVlfX0pXG4gICAqICAgICAudHJhdmVyc2UoZmFsc2UpXG4gICAqICAgICAudmFscyhbL3RydWUvXSlcbiAgICogICAgIC5vbk1hdGNoKChjdXJyZW50LCB0cmF2ZXJzZXIpID0+IHtcbiAgICogICAgICAgdHJhdmVyc2VyLnBhdGguam9pbignLicpXG4gICAqICAgICAgIC8vPT4gJ29uZS50d28nXG4gICAqXG4gICAqICAgICAgIGN1cnJlbnRcbiAgICogICAgICAgLy89PiB0cnVlXG4gICAqXG4gICAqICAgICAgIHR5cGVvZiB0cmF2ZXJzZXIudXBkYXRlID09PSB0eXBlb2YgdHJhdmVyc2VyLnJlbW92ZVxuICAgKiAgICAgICB0eXBlb2YgdHJhdmVyc2VyLnVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgKiAgICAgICAvLz0+IHRydWVcbiAgICpcbiAgICogICAgICAgdHJhdmVyc2VyLnJlbW92ZSgpXG4gICAqICAgICAgIC8vPT4gdm9pZFxuICAgKiAgICAgfSlcbiAgICogICAgIC5vbk5vbk1hdGNoKHZhbCA9PiB7XG4gICAqICAgICAgIC8vIGlnbm9yZVxuICAgKiAgICAgfSlcbiAgICogICAgIC5jYWxsKHRydWUpXG4gICAqXG4gICAqICAgdHJhdmVyc2VkXG4gICAqICAgLy89PiB7ZmxhdDogMH1cbiAgICpcbiAgICovXG4gIHRyYXZlcnNlKHNob3VsZFJldHVybikge1xuICAgIGNvbnN0IHtvYmosIGtleXMsIHZhbHMsIG9uTWF0Y2gsIG9uTm9uTWF0Y2gsIGNsb25lfSA9IHRoaXMuZW50cmllcygpXG4gICAgbGV0IHJlc3VsdCA9IGNsb25lID8gdHJhdmVyc2Uob2JqKS5jbG9uZSgpIDogb2JqXG5cbiAgICAvLyBkaWZmIGJldHdlZW4ga2V5cyBhbmQgdmFsIGlzIG9yZGVyIG9mIGFyZyBpbiBeIHRlc3RlclxuICAgIGNvbnN0IG1hdGNoZXIgPSBtYXRjaEZhY3Rvcnkoa2V5cywgdmFscylcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBkZWJ1ZyAqL1xuICAgIGlmIChFTlZfREVCVUcpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdtYXRjaGVyIGZvciB0cmF2ZXJzZS4uLicsIGtleXMsIHZhbHMpXG4gICAgfVxuXG4gICAgLy8gYm91bmQgdG8gdGhlIHRyYXZlcnNlclxuICAgIHRyYXZlcnNlKHJlc3VsdCkuZm9yRWFjaChmdW5jdGlvbihrZXksIHgsIHRyYXZlcnNlcikge1xuICAgICAgaWYgKHRyYXZlcnNlci5pc1Jvb3QpIHtcbiAgICAgICAgLy8gbm90aGluZ1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAobWF0Y2hlcihrZXksIHgpKSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBkZWJ1ZyAqL1xuICAgICAgICBpZiAoRU5WX0RFQlVHKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0gbWF0Y2ggLS0tLS0tLSAnLCBrZXksIHgpXG4gICAgICAgIH1cblxuICAgICAgICBvbk1hdGNoKHgsIHRyYXZlcnNlcilcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9uTm9uTWF0Y2gpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGRlYnVnICovXG4gICAgICAgIGlmIChFTlZfREVCVUcpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLSBOT05tYXRjaCAtLS0tLS0tICcsIGtleSwgeClcbiAgICAgICAgfVxuXG4gICAgICAgIG9uTm9uTWF0Y2goeCwgdHJhdmVyc2VyKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLnNldChUUkFWRVJTRURfS0VZLCByZXN1bHQpXG4gICAgcmV0dXJuIGlzVHJ1ZShzaG91bGRSZXR1cm4pID8gcmVzdWx0IDogdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICogQHZlcnNpb24gNS4wLjAtYmV0YS41IEBkZXByZWNpYXRlZFxuICAgKiB2YWx1ZSB0cmF2ZXJzZWQgaW4gdHJhdmVyc2VcbiAgICogQHNpbmNlIDEuMC4wXG4gICAqIEBzZWUgVHJhdmVyc2VDaGFpbi50cmF2ZXJzZVxuICAgKiBAcmV0dXJuIHtPYmplY3QgfCBBcnJheSB8IGFueX0gdHJhdmVyc2VkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgY29uc3QgdHJhdmVyc2VyID0gbmV3IFRyYXZlcnNlcigpXG4gICAqICAgdHJhdmVyc2VyLm9iaihbJ2R1Y2snLCAnZHVjaycsICdnb29zZSddKVxuICAgKiAgIHRyYXZlcnNlci52YWxzKFsnZyoqc2UnXSlcbiAgICogICB0cmF2ZXJzZXIudHJhdmVyc2UoKVxuICAgKlxuICAgKiAgIHRyYXZlcnNlci50cmF2ZXJzZWQoKVxuICAgKiAgIC8vPT4gWydnb29zZSddXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGNvbnN0IGVoID0ge1xuICAgKiAgICAgIG1lOiB0cnVlLFxuICAgKiAgICAgIG5lc3RlZDoge1xuICAgKiAgICAgICAgcmVhbGx5OiB7XG4gICAqICAgICAgICAgIGRlZXA6IHtcbiAgICogICAgICAgICAgICBzdXBlcjogZmFsc2UsXG4gICAqICAgICAgICAgICAgbm90OiAnZWgnLFxuICAgKiAgICAgICAgICAgIGNhbmFkYTogdHJ1ZSxcbiAgICogICAgICAgICAgICBtb2R1bGVzOiBbe3BhcnNlcjogJ2hpJ31dLFxuICAgKiAgICAgICAgICB9LFxuICAgKiAgICAgICAgICBtYXRjaG1lOiAnbWluaW1lJyxcbiAgICogICAgICAgICAgbm90bWU6ICdlaCcsXG4gICAqICAgICAgICB9LFxuICAgKiAgICAgIH0sXG4gICAqICAgIH1cbiAgICpcbiAgICogICAgY29uc3QgY2hhaW4gPSBuZXcgQ2hhaW4oKVxuICAgKiAgICBPYmplY3QuYXNzaWduKGNoYWluLCBlaClcbiAgICpcbiAgICogICAgY29uc3QgdHJhdmVyc2VyID0gY2hhaW5cbiAgICogICAgICAubWVyZ2UoZWgpXG4gICAqICAgICAgLnRyYXZlcnNlKHRydWUpXG4gICAqICAgICAgLmtleXMoWy9zdXBlci8sIC9wYXJzZXIvLCAvc3RvcmUvLCAvbWV0YS9dKVxuICAgKiAgICAgIC52YWxzKFsvbWluaW1lL10pXG4gICAqICAgICAgLmNhbGwoZmFsc2UpXG4gICAqXG4gICAqICAgIHRyYXZlcnNlci50cmF2ZXJzZWQoKVxuICAgKiAgICAvLz0+IHtcbiAgICogICAgICBjbGFzc05hbWU6ICdEb3RQcm9wJyxcbiAgICogICAgICBtZTogdHJ1ZSxcbiAgICogICAgICBuZXN0ZWQ6IHtcbiAgICogICAgICAgIHJlYWxseToge1xuICAgKiAgICAgICAgICBkZWVwOiB7XG4gICAqICAgICAgICAgICAgbm90OiAnZWgnLFxuICAgKiAgICAgICAgICAgIGNhbmFkYTogdHJ1ZSxcbiAgICogICAgICAgICAgICBtb2R1bGVzOiBbe31dLFxuICAgKiAgICAgICAgICB9LFxuICAgKiAgICAgICAgICBub3RtZTogJ2VoJyxcbiAgICogICAgICAgIH0sXG4gICAqICAgICAgfSxcbiAgICogICAgfVxuICAgKlxuICAgKi9cbiAgLy8gdHJhdmVyc2VkKCkge1xuICAvLyAgIHJldHVybiB0aGlzLmdldChUUkFWRVJTRURfS0VZKVxuICAvLyB9XG59XG4iXSwibmFtZXMiOlsiY29uc3QiLCJzdXBlciIsImxldCJdLCJtYXBwaW5ncyI6IkFBQUFBLEdBQUssQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDO0FBQ2xEQSxHQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztBQUMzQ0EsR0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7QUFDeENBLEdBQUssQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLDZCQUE2QixDQUFDO0FBQzNEQSxHQUFLLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQzs7QUFFN0NBLEdBQUssQ0FBQyxhQUFhLEdBQUcsQ0FBQztBQUN2QkEsR0FBSyxDQUFDLGNBQWMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JoRixNQUFNLENBQUMsT0FBTyxHQUFHO0VBQUEsQUFBc0MsQUFBQyxBQVV0RCxrQkFBVyxDQUFDLE1BQU0sRUFBRTtJQUNsQkMsY0FBSyxLQUFBLENBQUMsTUFBQSxNQUFNLENBQUM7SUFDYixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQzs7O0lBR3BDLElBQUk7T0FDRCxNQUFNLENBQUMsY0FBYyxDQUFDO09BQ3RCLElBQUksQ0FBQyxFQUFFLENBQUM7T0FDUixJQUFJLENBQUMsRUFBRSxDQUFDOztPQUVSLE9BQU8sQ0FBQyxTQUFBLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxBQUFHOztRQUUzQixTQUFTLENBQUMsTUFBTSxFQUFFO09BQ25CLENBQUM7R0FDTDs7Ozs4Q0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBMENELG9CQUFBLFFBQVEsdUJBQUEsQ0FBQyxZQUFZLEVBQUU7SUFDckIsQUFBSyxBQUE4QyxPQUFBLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTtJQUE3RCxJQUFBLEdBQUc7SUFBRSxJQUFBLElBQUk7SUFBRSxJQUFBLElBQUk7SUFBRSxJQUFBLE9BQU87SUFBRSxJQUFBLFVBQVU7SUFBRSxJQUFBLEtBQUssYUFBNUMsQUFBSSxBQUFNLEFBQU0sQUFBUyxBQUFZLEFBQU8sQUFBa0I7SUFDcEVDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxHQUFHOzs7SUFHaERGLEdBQUssQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7OztJQUd4QyxJQUFJLFNBQVMsRUFBRTtNQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztLQUNuRDs7O0lBR0QsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO01BQ25ELElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRTs7T0FFckI7V0FDSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUU7O1FBRXhCLElBQUksU0FBUyxFQUFFO1VBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQzlDOztRQUVELE9BQU8sQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDO09BQ3RCO1dBQ0ksSUFBSSxVQUFVLEVBQUU7O1FBRW5CLElBQUksU0FBUyxFQUFFO1VBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQ2pEOztRQUVELFVBQVUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDO09BQ3pCO0tBQ0YsQ0FBQzs7SUFFRixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUM7SUFDL0IsT0FBTyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUk7R0FDNUMsQ0FBQSxBQW9FRjs7O0VBM0t3QyxjQTJLeEMsRUFBQTsifQ==