UNPKG

foop

Version:

interfaces that describe their intentions.

78 lines (67 loc) 6.97 kB
var isTrue = require('../is/true') var includes = require('../conditional/includes') var traverse = require('../traverse') var cache = require('../cache') var ENV_DEBUG = require('../env/debug') /* prettier-ignore */ /** * @desc gathers dot.prop from any value, with a prefixed/base key * @since 4.0.0 * * @param {Primitive} key prefixing key for the paths, root path/key * @param {Traversable} value traversable value to extract paths from * @param {boolean | undefined} [longest] optionally filter to keep only longest/deepest paths * @return {Array<string>} paths[] * * @see deps/traverse * @TODO should build a trie if doing this * @NOTE had `onlyLongest` & `asString` but can just .join(',') to match * * @example * * dotPropPaths('', {oh: {eh: true}}) * //=> ['oh.eh'] * * dotPropPaths('moose', {oh: {eh: true}}) * //=> ['moose.oh.eh'] * */ module.exports = function(key, value, longest) { if (cache.has(value)) { return cache.get(value) } var paths = [] /* istanbul ignore next: debug */ if (ENV_DEBUG) { console.log({value: value}) } // gather all paths in the object // filter to ensure only the longest paths are kept // // .map the paths to `dot-prop`, // `matcher` takes in an array so it will work for all traverse(value).forEach(function(x) { // const currentPath = this.paths var currentPath = this.path /* istanbul ignore next: debug */ if (ENV_DEBUG) { // run++, console.log('paths', this.path) } // @NOTE we always have paths now // ignore // if (!currentPath) return if (!currentPath.length) { return } // (currentPath.join ? currentPath.join('.') : currentPath) // dot-prop the array of paths // if we have a key, prefix it paths.push((key ? key + '.' : '') + currentPath.join('.')) }) if (isTrue(longest)) { // concat a string of all paths so we can unique each branch // @example `canada.arr.0` vs `canada.arr` paths = paths.filter(function (path) { return !paths.some(function (otherPath) { return otherPath !== path && includes(otherPath, path); } ); }) } cache.set(value, paths) return paths } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aHMuanMiLCJzb3VyY2VzIjpbInBhdGhzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGlzVHJ1ZSA9IHJlcXVpcmUoJy4uL2lzL3RydWUnKVxuY29uc3QgaW5jbHVkZXMgPSByZXF1aXJlKCcuLi9jb25kaXRpb25hbC9pbmNsdWRlcycpXG5jb25zdCB0cmF2ZXJzZSA9IHJlcXVpcmUoJy4uL3RyYXZlcnNlJylcbmNvbnN0IGNhY2hlID0gcmVxdWlyZSgnLi4vY2FjaGUnKVxuY29uc3QgRU5WX0RFQlVHID0gcmVxdWlyZSgnLi4vZW52L2RlYnVnJylcblxuLyogcHJldHRpZXItaWdub3JlICovXG4vKipcbiAqIEBkZXNjICAgZ2F0aGVycyBkb3QucHJvcCBmcm9tIGFueSB2YWx1ZSwgd2l0aCBhIHByZWZpeGVkL2Jhc2Uga2V5XG4gKiBAc2luY2UgIDQuMC4wXG4gKlxuICogQHBhcmFtICB7UHJpbWl0aXZlfSAga2V5IHByZWZpeGluZyBrZXkgZm9yIHRoZSBwYXRocywgcm9vdCBwYXRoL2tleVxuICogQHBhcmFtICB7VHJhdmVyc2FibGV9ICB2YWx1ZSB0cmF2ZXJzYWJsZSB2YWx1ZSB0byBleHRyYWN0IHBhdGhzIGZyb21cbiAqIEBwYXJhbSAge2Jvb2xlYW4gfCB1bmRlZmluZWR9IFtsb25nZXN0XSBvcHRpb25hbGx5IGZpbHRlciB0byBrZWVwIG9ubHkgbG9uZ2VzdC9kZWVwZXN0IHBhdGhzXG4gKiBAcmV0dXJuIHtBcnJheTxzdHJpbmc+fSBwYXRoc1tdXG4gKlxuICogQHNlZSAgICBkZXBzL3RyYXZlcnNlXG4gKiBAVE9ETyAgIHNob3VsZCBidWlsZCBhIHRyaWUgaWYgZG9pbmcgdGhpc1xuICogQE5PVEUgICBoYWQgYG9ubHlMb25nZXN0YCAmIGBhc1N0cmluZ2AgYnV0IGNhbiBqdXN0IC5qb2luKCcsJykgdG8gbWF0Y2hcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICBkb3RQcm9wUGF0aHMoJycsIHtvaDoge2VoOiB0cnVlfX0pXG4gKiAgLy89PiBbJ29oLmVoJ11cbiAqXG4gKiAgZG90UHJvcFBhdGhzKCdtb29zZScsIHtvaDoge2VoOiB0cnVlfX0pXG4gKiAgLy89PiBbJ21vb3NlLm9oLmVoJ11cbiAqXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSwgbG9uZ2VzdCkge1xuICBpZiAoY2FjaGUuaGFzKHZhbHVlKSkgcmV0dXJuIGNhY2hlLmdldCh2YWx1ZSlcblxuICBsZXQgcGF0aHMgPSBbXVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBkZWJ1ZyAqL1xuICBpZiAoRU5WX0RFQlVHKSB7XG4gICAgY29uc29sZS5sb2coe3ZhbHVlfSlcbiAgfVxuXG4gIC8vIGdhdGhlciBhbGwgcGF0aHMgaW4gdGhlIG9iamVjdFxuICAvLyBmaWx0ZXIgdG8gZW5zdXJlIG9ubHkgdGhlIGxvbmdlc3QgcGF0aHMgYXJlIGtlcHRcbiAgLy9cbiAgLy8gLm1hcCB0aGUgcGF0aHMgdG8gYGRvdC1wcm9wYCxcbiAgLy8gYG1hdGNoZXJgIHRha2VzIGluIGFuIGFycmF5IHNvIGl0IHdpbGwgd29yayBmb3IgYWxsXG4gIHRyYXZlcnNlKHZhbHVlKS5mb3JFYWNoKGZ1bmN0aW9uKHgpIHtcbiAgICAvLyBjb25zdCBjdXJyZW50UGF0aCA9IHRoaXMucGF0aHNcbiAgICBjb25zdCBjdXJyZW50UGF0aCA9IHRoaXMucGF0aFxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGRlYnVnICovXG4gICAgaWYgKEVOVl9ERUJVRykge1xuICAgICAgLy8gcnVuKyssXG4gICAgICBjb25zb2xlLmxvZygncGF0aHMnLCB0aGlzLnBhdGgpXG4gICAgfVxuXG4gICAgLy8gQE5PVEUgd2UgYWx3YXlzIGhhdmUgcGF0aHMgbm93XG4gICAgLy8gaWdub3JlXG4gICAgLy8gaWYgKCFjdXJyZW50UGF0aCkgcmV0dXJuXG4gICAgaWYgKCFjdXJyZW50UGF0aC5sZW5ndGgpIHJldHVyblxuXG4gICAgLy8gKGN1cnJlbnRQYXRoLmpvaW4gPyBjdXJyZW50UGF0aC5qb2luKCcuJykgOiBjdXJyZW50UGF0aClcbiAgICAvLyBkb3QtcHJvcCB0aGUgYXJyYXkgb2YgcGF0aHNcbiAgICAvLyBpZiB3ZSBoYXZlIGEga2V5LCBwcmVmaXggaXRcbiAgICBwYXRocy5wdXNoKChrZXkgPyBrZXkgKyAnLicgOiAnJykgKyBjdXJyZW50UGF0aC5qb2luKCcuJykpXG4gIH0pXG5cbiAgaWYgKGlzVHJ1ZShsb25nZXN0KSkge1xuICAgIC8vIGNvbmNhdCBhIHN0cmluZyBvZiBhbGwgcGF0aHMgc28gd2UgY2FuIHVuaXF1ZSBlYWNoIGJyYW5jaFxuICAgIC8vIEBleGFtcGxlIGBjYW5hZGEuYXJyLjBgIHZzIGBjYW5hZGEuYXJyYFxuICAgIHBhdGhzID0gcGF0aHMuZmlsdGVyKHBhdGggPT4gIXBhdGhzLnNvbWUob3RoZXJQYXRoID0+XG4gICAgICBvdGhlclBhdGggIT09IHBhdGggJiYgaW5jbHVkZXMob3RoZXJQYXRoLCBwYXRoKVxuICAgICkpXG4gIH1cblxuICBjYWNoZS5zZXQodmFsdWUsIHBhdGhzKVxuXG4gIHJldHVybiBwYXRoc1xufVxuIl0sIm5hbWVzIjpbImNvbnN0IiwibGV0Il0sIm1hcHBpbmdzIjoiQUFBQUEsR0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO0FBQ3BDQSxHQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQztBQUNuREEsR0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQ3ZDQSxHQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7QUFDakNBLEdBQUssQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlCekMsTUFBTSxDQUFDLE9BQU8sR0FBRyxTQUFTLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO0VBQzdDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFBLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBQTs7RUFFN0NDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsRUFBRTs7O0VBR2QsSUFBSSxTQUFTLEVBQUU7SUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBQSxLQUFLLENBQUMsQ0FBQztHQUNyQjs7Ozs7OztFQU9ELFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7O0lBRWxDRCxHQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJOzs7SUFHN0IsSUFBSSxTQUFTLEVBQUU7O01BRWIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztLQUNoQzs7Ozs7SUFLRCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxFQUFBLE1BQU0sRUFBQTs7Ozs7SUFLL0IsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDM0QsQ0FBQzs7RUFFRixJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTs7O0lBR25CLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUEsSUFBSSxDQUFBLENBQUMsQUFBRyxTQUFBLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFBLFNBQVMsQ0FBQSxDQUFDLEFBQ2pELFNBQUEsU0FBUyxLQUFLLElBQUksSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFBO0tBQ2hELEdBQUEsQ0FBQztHQUNIOztFQUVELEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQzs7RUFFdkIsT0FBTyxLQUFLO0NBQ2I7In0=