foop
Version:
interfaces that describe their intentions.
139 lines (126 loc) • 12.7 kB
JavaScript
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==