@blakek/deep
Version:
🐡 Get, set, remove, and test for deeply nested properties
139 lines (129 loc) • 4.06 kB
JavaScript
import { parse } from 'pathington';
export { parse as parsePath } from 'pathington';
function clone(value) {
if (value instanceof Date) {
return new Date(value.getTime());
}
if (value instanceof Map) {
var result_1 = new Map();
value.forEach(function (nestedValue, key) {
result_1.set(key, clone(nestedValue));
});
return result_1;
}
if (value instanceof RegExp) {
return new RegExp(value.source, value.flags);
}
if (value instanceof Set) {
var result_2 = new Set();
value.forEach(function (x) {
result_2.add(clone(x));
});
return result_2;
}
if (typeof value === 'object') {
if (value === null) {
return null;
}
var result = (Array.isArray(value) ? [] : {});
for (var key in value) {
result[key] = clone(value[key]);
}
return result;
}
return value;
}
var NotFound = Symbol('value was not found');
function isObject(object) {
if (object === null) {
return false;
}
var type = typeof object;
return type === 'object' || type === 'function';
}
function traverseObject(object, path) {
// If the path has been exhausted, return the current object
if (path.length === 0) {
return object;
}
// If the value could not be found, return `defaultValue`
if (!isObject(object)) {
return NotFound;
}
var key = path[0], keys = path.slice(1);
// Search deeper in the object
if (key in object) {
return traverseObject(object[key], keys);
}
// The key was not found in the object.
return NotFound;
}
function get(path, object, fallbackValue) {
var parsedPath = parse(path);
var value = traverseObject(object, parsedPath);
if (value === NotFound || value === undefined) {
return fallbackValue;
}
return value;
}
function createGetter(path, fallbackValue) {
return function (object) { return get(path, object, fallbackValue); };
}
function has(path, object) {
var value = traverseObject(object, parse(path));
return value !== NotFound;
}
function createHas(path) {
return function (object) { return has(path, object); };
}
function remove(path, object) {
if (path === undefined) {
return object;
}
var parsedPath = parse(path);
var referencePath = parsedPath.slice(0, -1);
var finalPath = parsedPath[parsedPath.length - 1];
var reference = traverseObject(object, parse(referencePath));
if (isObject(reference)) {
delete reference[finalPath];
}
return object;
}
function createRemove(path) {
return function (object) { return remove(path, object); };
}
function omit(properties, object) {
var cloned = clone(object);
properties.forEach(function (property) { return remove(property, cloned); });
return cloned;
}
function createOmit(properties) {
return function (object) { return omit(properties, object); };
}
function set(value, path, object) {
var parsedPath = parse(path);
var reference = object;
parsedPath.forEach(function (key, index) {
var isLastElement = index === parsedPath.length - 1;
if (isLastElement) {
reference[key] = value;
return;
}
if (!isObject(reference[key])) {
reference[key] = {};
}
reference = reference[key];
});
return object;
}
function createSetter(path, object) {
return function (value) { return set(value, path, object); };
}
function pluck(properties, object) {
return properties.reduce(function (subset, property) { return set(get(property, object), property, subset); }, {});
}
function createPluck(properties) {
return function (object) { return pluck(properties, object); };
}
export { NotFound, clone, createGetter, createHas, createOmit, createPluck, createRemove, createSetter, get, has, isObject, omit, pluck, remove, set, traverseObject };
//# sourceMappingURL=index.esm.js.map