@webkrafters/get-property
Version:
Get property - gets an object containing value and search feedback info matching a property path. Recognizes negative array indexing.
95 lines (94 loc) • 4.12 kB
JavaScript
;
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
Object.defineProperty(exports, "__esModule", {
value: true
});
var DEFAULT_VAL = {};
var RE_DELIMITER = /[\[\]|\.]+/g;
var RE_BEG_BRACKET_LAST_CHAR = /^\[/;
var RE_END_BRACKET_LAST_CHAR = /\]$/;
var RE_TYPE = /.*\s(\w+)\]$/;
var toString = Object.prototype.toString;
function getProperty(source, path, defaultValue) {
var _defaultValue, _path, _value2;
(_defaultValue = defaultValue) !== null && _defaultValue !== void 0 ? _defaultValue : defaultValue = DEFAULT_VAL;
switch (getTypeName(path)) {
case 'String':
{
path = path.replace(RE_BEG_BRACKET_LAST_CHAR, '').replace(RE_END_BRACKET_LAST_CHAR, '').split(RE_DELIMITER);
break;
}
case 'Array':
break;
case 'Undefined':
path = [];
break;
default:
path = [path];
}
var _value;
{
var t = getTypeName(source);
_value = t === 'Object' || t === 'Array' ? source : {};
}
var exists = true;
var index = NaN;
var trail = [];
var _iterator = _createForOfIteratorHelper(path),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var _source;
var p = _step.value;
index = NaN;
if (Array.isArray(_value)) {
var _index = +p;
if (Number.isInteger(_index)) {
if (_index < 0) {
_index = _value.length + _index;
}
index = _index;
if (index in _value) {
source = _value, _value = _value[index];
trail.push(index);
continue;
}
}
}
source = _value;
_value = (_source = source) === null || _source === void 0 ? void 0 : _source[p];
if (_value === undefined && !hasEntry(p, source)) {
exists = false;
break;
}
trail.push(p);
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return {
_value: _value,
exists: exists,
index: index,
isSelf: !path.length,
key: (_path = path) === null || _path === void 0 ? void 0 : _path[path.length - 1],
source: path.length && path.length - trail.length < 2 ? source : undefined,
trail: trail,
value: (_value2 = _value) !== null && _value2 !== void 0 ? _value2 : defaultValue === DEFAULT_VAL ? _value : defaultValue
};
}
function getTypeName(value) {
return toString.call(value).replace(RE_TYPE, '$1');
}
function hasEntry(key, object) {
try {
return key in object;
} catch (e) {
return false;
}
}
exports["default"] = getProperty;