object-hierarchy-access
Version:
Get/Set value from/to JS object hierarchy properties
327 lines (315 loc) • 11 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(global = global || self, factory(global.ObjectHierarchyAccess = {}));
}(this, function (exports) { 'use strict';
function normalizeDescriptor(info) {
if (info && typeof info === 'object') {
return info;
}
else if (typeof info === 'function') {
return {
getName: info,
value: {}
};
}
else {
return {
name: info,
value: {}
};
}
}
function getPropName(current, descriptor) {
var name = descriptor.name, getName = descriptor.getName;
if (typeof name !== 'undefined') {
return name;
}
return getName && getName.call(current, current) || 'undefined';
}
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 };
}
function _parseArgs(others) {
var value = others[others.length - 1];
var rest = Array.prototype.concat.apply([], others.slice(0, -1)); // exclude `value`
var hierarchies = rest.slice(0, -1);
var prop = rest[rest.length - 1];
return { hierarchies: hierarchies, prop: prop, value: value };
}
function set(optionalTarget) {
var others = [];
for (var _i = 1; _i < arguments.length; _i++) {
others[_i - 1] = arguments[_i];
}
var _a = _parseArgs(others), hierarchies = _a.hierarchies, prop = _a.prop, value = _a.value;
var target = optionalTarget || {};
var current = setupIfUndef(target, hierarchies);
current[prop] = value;
return target;
}
function assign(target) {
var others = [];
for (var _i = 1; _i < arguments.length; _i++) {
others[_i - 1] = arguments[_i];
}
var _a = _parseArgs(others), hierarchies = _a.hierarchies, prop = _a.prop, value = _a.value;
var current = setupIfUndef(target, hierarchies);
current[prop] = value;
return current;
}
function put(target) {
var others = [];
for (var _i = 1; _i < arguments.length; _i++) {
others[_i - 1] = arguments[_i];
}
var _a = _parseArgs(others), hierarchies = _a.hierarchies, prop = _a.prop, value = _a.value;
var current = setupIfUndef(target, hierarchies);
current[prop] = value;
return value;
}
function setIfUndef(optionalTarget) {
var others = [];
for (var _i = 1; _i < arguments.length; _i++) {
others[_i - 1] = arguments[_i];
}
var _a = _parseArgs(others), hierarchies = _a.hierarchies, prop = _a.prop, value = _a.value;
var target = optionalTarget || {};
var current = setupIfUndef(target, hierarchies);
if (current[prop] === undefined) {
current[prop] = value;
}
return target;
}
function assignIfUndef(target) {
var others = [];
for (var _i = 1; _i < arguments.length; _i++) {
others[_i - 1] = arguments[_i];
}
var _a = _parseArgs(others), hierarchies = _a.hierarchies, prop = _a.prop, value = _a.value;
var current = setupIfUndef(target, hierarchies);
if (current[prop] === undefined) {
current[prop] = value;
}
return current;
}
function putIfUndef(target) {
var others = [];
for (var _i = 1; _i < arguments.length; _i++) {
others[_i - 1] = arguments[_i];
}
var _a = _parseArgs(others), hierarchies = _a.hierarchies, prop = _a.prop, value = _a.value;
var current = setupIfUndef(target, hierarchies);
if (current[prop] === undefined) {
current[prop] = value;
}
return current[prop];
}
function _parseHierarchies(hierarchies) {
return Array.prototype.concat.apply([], hierarchies);
}
function setProp(optionalTarget) {
var hierarchies = [];
for (var _i = 1; _i < arguments.length; _i++) {
hierarchies[_i - 1] = arguments[_i];
}
var arrHierarchies = _parseHierarchies(hierarchies);
var target = optionalTarget || {};
setup(target, arrHierarchies);
return target;
}
function assignProp(target) {
var hierarchies = [];
for (var _i = 1; _i < arguments.length; _i++) {
hierarchies[_i - 1] = arguments[_i];
}
var arrHierarchies = _parseHierarchies(hierarchies);
var current = setup(target, arrHierarchies).current;
return current;
}
function putProp(target) {
var hierarchies = [];
for (var _i = 1; _i < arguments.length; _i++) {
hierarchies[_i - 1] = arguments[_i];
}
var arrHierarchies = _parseHierarchies(hierarchies);
var last = setup(target, arrHierarchies).last;
return last;
}
function setPropIfUndef(optionalTarget) {
var hierarchies = [];
for (var _i = 1; _i < arguments.length; _i++) {
hierarchies[_i - 1] = arguments[_i];
}
var arrHierarchies = _parseHierarchies(hierarchies);
var target = optionalTarget || {};
setupIfUndef(target, arrHierarchies);
return target;
}
function assignPropIfUndef(target) {
var hierarchies = [];
for (var _i = 1; _i < arguments.length; _i++) {
hierarchies[_i - 1] = arguments[_i];
}
var arrHierarchies = _parseHierarchies(hierarchies);
var current = setupIfUndef(target, arrHierarchies.slice(0, -1));
setupIfUndef(current, arrHierarchies.slice(-1));
return current;
}
function putPropIfUndef(target) {
var hierarchies = [];
for (var _i = 1; _i < arguments.length; _i++) {
hierarchies[_i - 1] = arguments[_i];
}
var arrHierarchies = _parseHierarchies(hierarchies);
return setupIfUndef(target, arrHierarchies);
}
function normalizeDescriptor$1(info) {
if (typeof info === 'object') {
return info;
}
else if (typeof info === 'function') {
return {
getName: info
};
}
else {
return {
name: info
};
}
}
function get(target) {
var rest = [];
for (var _i = 1; _i < arguments.length; _i++) {
rest[_i - 1] = arguments[_i];
}
var hierarchies = Array.prototype.concat.apply([], rest);
var current = target;
if (current !== undefined && current !== null) {
hierarchies.every(function (info) {
var descriptor = normalizeDescriptor$1(info);
var got = descriptor.got;
var name = getPropName(current, descriptor);
var parent = current;
current = current[name];
if (got) {
got.call(parent, parent, name, current);
}
return current;
});
}
return current;
}
function _parseArgs$1(others) {
var callback = others[others.length - 1];
var hierarchies = Array.prototype.concat.apply([], others.slice(0, -1)); // exclude `callback`
return { hierarchies: hierarchies, callback: callback };
}
function traverse(target) {
var others = [];
for (var _i = 1; _i < arguments.length; _i++) {
others[_i - 1] = arguments[_i];
}
var args = _parseArgs$1(others);
var hierarchies = args.hierarchies;
var callback = args.callback;
var current = target;
if (current !== undefined && current !== null) {
hierarchies.every(function (info) {
var descriptor = normalizeDescriptor$1(info);
var got = descriptor.got;
var name = getPropName(current, descriptor);
var parent = current;
current = current[name];
if (got) {
got.call(parent, parent, name, current);
}
var result = callback.call(parent, parent, name, current);
return result !== false;
});
}
}
function traverseReverse(target) {
var others = [];
for (var _i = 1; _i < arguments.length; _i++) {
others[_i - 1] = arguments[_i];
}
var args = _parseArgs$1(others);
var hierarchies = args.hierarchies;
var callback = args.callback;
var current = target;
if (current !== undefined && current !== null) {
var params_1 = [];
hierarchies.every(function (info) {
var descriptor = normalizeDescriptor$1(info);
var got = descriptor.got;
var name = getPropName(current, descriptor);
var parent = current;
current = current[name];
if (got) {
got.call(parent, parent, name, current);
}
params_1.push({ parent: parent, name: name, current: current });
return current;
});
for (var i = params_1.length - 1; i >= 0; i--) {
var item = params_1[i];
var result = callback.call(item.parent, item.parent, item.name, item.current);
if (result === false) {
break;
}
}
}
}
exports.set = set;
exports.assign = assign;
exports.put = put;
exports.setIfUndef = setIfUndef;
exports.assignIfUndef = assignIfUndef;
exports.putIfUndef = putIfUndef;
exports.setProp = setProp;
exports.assignProp = assignProp;
exports.putProp = putProp;
exports.setPropIfUndef = setPropIfUndef;
exports.assignPropIfUndef = assignPropIfUndef;
exports.putPropIfUndef = putPropIfUndef;
exports.get = get;
exports.traverse = traverse;
exports.traverseReverse = traverseReverse;
Object.defineProperty(exports, '__esModule', { value: true });
}));