chain-able
Version:
interfaces that describe their intentions.
52 lines (43 loc) • 5.01 kB
JavaScript
var isTrue = require('../is/true')
var includes = require('../conditional/includes')
var traverse = require('../traverse')
var cache = require('../cache')
/* prettier-ignore */
/**
* @since 4.0.0
* @NOTE had `onlyLongest` & `asString` but can just .join(',') to match
* @desc gathers dot.prop from any value, with a prefixed/base key
* @param {Primitive} key
* @param {Traversable} value
* @param {boolean | undefined} longest
* @return {Array<string>} paths
*/
module.exports = function(key, value, longest) {
if (cache.has(value)) { return cache.get(value) }
var paths = []
// 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) {
var currentPath = this.path
// ignore
if (!currentPath || !currentPath.length) { return }
// dot-prop the array of paths
// if we have a key, prefix it
paths.push(
(key ? key + '.' : '') +
(currentPath.join ? currentPath.join('.') : currentPath)
)
})
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aHMuanMiLCJzb3VyY2VzIjpbInBhdGhzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGlzVHJ1ZSA9IHJlcXVpcmUoJy4uL2lzL3RydWUnKVxuY29uc3QgaW5jbHVkZXMgPSByZXF1aXJlKCcuLi9jb25kaXRpb25hbC9pbmNsdWRlcycpXG5jb25zdCB0cmF2ZXJzZSA9IHJlcXVpcmUoJy4uL3RyYXZlcnNlJylcbmNvbnN0IGNhY2hlID0gcmVxdWlyZSgnLi4vY2FjaGUnKVxuXG4vKiBwcmV0dGllci1pZ25vcmUgKi9cbi8qKlxuICogQHNpbmNlIDQuMC4wXG4gKiBATk9URSBoYWQgYG9ubHlMb25nZXN0YCAmIGBhc1N0cmluZ2AgYnV0IGNhbiBqdXN0IC5qb2luKCcsJykgdG8gbWF0Y2hcbiAqIEBkZXNjIGdhdGhlcnMgZG90LnByb3AgZnJvbSBhbnkgdmFsdWUsIHdpdGggYSBwcmVmaXhlZC9iYXNlIGtleVxuICogQHBhcmFtICB7UHJpbWl0aXZlfSAga2V5XG4gKiBAcGFyYW0gIHtUcmF2ZXJzYWJsZX0gIHZhbHVlXG4gKiBAcGFyYW0gIHtib29sZWFuIHwgdW5kZWZpbmVkfSBsb25nZXN0XG4gKiBAcmV0dXJuIHtBcnJheTxzdHJpbmc+fSBwYXRoc1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSwgdmFsdWUsIGxvbmdlc3QpIHtcbiAgaWYgKGNhY2hlLmhhcyh2YWx1ZSkpIHJldHVybiBjYWNoZS5nZXQodmFsdWUpXG5cbiAgbGV0IHBhdGhzID0gW11cblxuICAvLyBnYXRoZXIgYWxsIHBhdGhzIGluIHRoZSBvYmplY3RcbiAgLy8gZmlsdGVyIHRvIGVuc3VyZSBvbmx5IHRoZSBsb25nZXN0IHBhdGhzIGFyZSBrZXB0XG4gIC8vXG4gIC8vIC5tYXAgdGhlIHBhdGhzIHRvIGBkb3QtcHJvcGAsXG4gIC8vIGBtYXRjaGVyYCB0YWtlcyBpbiBhbiBhcnJheSBzbyBpdCB3aWxsIHdvcmsgZm9yIGFsbFxuICB0cmF2ZXJzZSh2YWx1ZSkuZm9yRWFjaChmdW5jdGlvbih4KSB7XG4gICAgY29uc3QgY3VycmVudFBhdGggPSB0aGlzLnBhdGhcblxuICAgIC8vIGlnbm9yZVxuICAgIGlmICghY3VycmVudFBhdGggfHwgIWN1cnJlbnRQYXRoLmxlbmd0aCkgcmV0dXJuXG5cbiAgICAvLyBkb3QtcHJvcCB0aGUgYXJyYXkgb2YgcGF0aHNcbiAgICAvLyBpZiB3ZSBoYXZlIGEga2V5LCBwcmVmaXggaXRcbiAgICBwYXRocy5wdXNoKFxuICAgICAgKGtleSA/IGtleSArICcuJyA6ICcnKSArXG4gICAgICAoY3VycmVudFBhdGguam9pbiA/IGN1cnJlbnRQYXRoLmpvaW4oJy4nKSA6IGN1cnJlbnRQYXRoKVxuICAgIClcbiAgfSlcblxuICBpZiAoaXNUcnVlKGxvbmdlc3QpKSB7XG4gICAgLy8gY29uY2F0IGEgc3RyaW5nIG9mIGFsbCBwYXRocyBzbyB3ZSBjYW4gdW5pcXVlIGVhY2ggYnJhbmNoXG4gICAgLy8gQGV4YW1wbGUgYGNhbmFkYS5hcnIuMGAgdnMgYGNhbmFkYS5hcnJgXG4gICAgcGF0aHMgPSBwYXRocy5maWx0ZXIocGF0aCA9PiAhcGF0aHMuc29tZShvdGhlclBhdGggPT5cbiAgICAgIG90aGVyUGF0aCAhPT0gcGF0aCAmJiBpbmNsdWRlcyhvdGhlclBhdGgsIHBhdGgpXG4gICAgKSlcbiAgfVxuXG4gIGNhY2hlLnNldCh2YWx1ZSwgcGF0aHMpXG5cbiAgcmV0dXJuIHBhdGhzXG59XG4iXSwibmFtZXMiOlsiY29uc3QiLCJsZXQiXSwibWFwcGluZ3MiOiJBQUFBQSxHQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7QUFDcENBLEdBQUssQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLHlCQUF5QixDQUFDO0FBQ25EQSxHQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDdkNBLEdBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQzs7Ozs7Ozs7Ozs7O0FBWWpDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsU0FBUyxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRTtFQUM3QyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBQSxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUE7O0VBRTdDQyxHQUFHLENBQUMsS0FBSyxHQUFHLEVBQUU7Ozs7Ozs7RUFPZCxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFO0lBQ2xDRCxHQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJOzs7SUFHN0IsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBQSxNQUFNLEVBQUE7Ozs7SUFJL0MsS0FBSyxDQUFDLElBQUk7TUFDUixDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztNQUN0QixDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUM7S0FDekQ7R0FDRixDQUFDOztFQUVGLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFOzs7SUFHbkIsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQSxJQUFJLENBQUEsQ0FBQyxBQUFHLFNBQUEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsU0FBUyxDQUFBLENBQUMsQUFDakQsU0FBQSxTQUFTLEtBQUssSUFBSSxJQUFJLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUE7S0FDaEQsR0FBQSxDQUFDO0dBQ0g7O0VBRUQsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDOztFQUV2QixPQUFPLEtBQUs7Q0FDYjsifQ==