UNPKG

@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
"use strict"; 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;