object-hierarchy-access
Version:
Get/Set value from/to JS object hierarchy properties
41 lines (40 loc) • 1.58 kB
JavaScript
import { normalizeDescriptor } from 'utility/setup';
import { getPropName } from 'utility/common';
function generate(target, hierarchies, forceOverride) {
var current = target;
hierarchies.forEach(function (info) {
var descriptor = normalizeDescriptor(info);
var value = descriptor.value, type = descriptor.type, create = descriptor.create, override = descriptor.override, created = descriptor.created, skipped = descriptor.skipped, got = descriptor.got;
var name = getPropName(current, descriptor);
if (forceOverride || override || !current[name] || typeof current[name] !== 'object') {
var obj = value ? value :
type ? new type() :
create ? create.call(current, current, name) :
{};
current[name] = obj;
if (created) {
created.call(current, current, name, obj);
}
}
else {
if (skipped) {
skipped.call(current, current, name, current[name]);
}
}
var parent = current;
current = current[name];
if (got) {
got.call(parent, parent, name, current);
}
});
return current;
}
function setupIfUndef(target, hierarchies) {
return generate(target, hierarchies);
}
function setup(target, hierarchies) {
var current = generate(target, hierarchies.slice(0, -1));
var last = generate(current, hierarchies.slice(-1), true);
return { current: current, last: last };
}
export { setupIfUndef, setup };