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