UNPKG

shineout

Version:
260 lines (254 loc) • 11.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.entries = exports.deepSet = exports.deepRemove = exports.deepMerge = exports.deepHas = exports.deepGet = void 0; exports.filterProps = filterProps; exports.objectValues = void 0; exports.pathGenerator = pathGenerator; var _is = require("./is"); var _flat = require("./flat"); function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } 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; } var hasOwnProperty = Object.prototype.hasOwnProperty; var PATH_MODE = { loose: '?', strict: '!', insert: '^', append: '$' }; function filterProps(obj) { var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; if (!(0, _is.isObject)(obj)) return obj; if (typeof props === 'function') { var prediction = props; props = []; Object.keys(obj).forEach(function (k) { if (prediction(obj[k])) props.push(k); }); } var newObj = {}; props.forEach(function (k) { newObj[k] = obj[k]; }); return newObj; } // Object.values() var objectValues = exports.objectValues = function objectValues(obj) { if (!obj) return []; return Object.keys(obj).map(function (k) { return obj[k]; }); }; // object only, not handle array. var deepMerge = exports.deepMerge = function deepMerge() { var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var source = arguments.length > 1 ? arguments[1] : undefined; var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var clone = options.clone, removeUndefined = options.removeUndefined, skipUndefined = options.skipUndefined; if (!(0, _is.isMergeable)(source)) return source; var dest = {}; if ((0, _is.isMergeable)(target)) { Object.keys(target).forEach(function (k) { dest[k] = clone ? deepMerge({}, target[k], options) : target[k]; if (removeUndefined && dest[k] === undefined) delete dest[k]; }); } Object.keys(source).forEach(function (k) { if ((0, _is.isMergeable)(source[k]) && (0, _is.isMergeable)(target[k])) { dest[k] = deepMerge(target[k], source[k], options); } else { if (skipUndefined && source[k] === undefined) return; dest[k] = deepMerge({}, source[k], options); if (removeUndefined && dest[k] === undefined) delete dest[k]; } }); return dest; }; function pathGenerator(raw) { var path = (0, _flat.insertPoint)(raw); var reg = /^\[(\d+)\]$/; var pathModeValues = objectValues(PATH_MODE); var index = 0; var last = 0; var prop = ''; var results = []; while (index >= 0) { index = path.indexOf('.', last); prop = path.substring(last, index === -1 ? undefined : index); var mode = void 0; var lastChar = prop.charAt(prop.length - 1); if (pathModeValues.includes(lastChar)) { mode = lastChar; prop = prop.substring(0, prop.length - 1); } // array index var match = reg.exec(prop); // eslint-disable-next-line if (match) prop = parseInt(match[1], 10); last = index + 1; results.push([prop, index === -1 ? undefined : path.substring(last), mode]); } return results; } var deepSet = exports.deepSet = function deepSet(target, path, value) { var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; if (!(0, _is.isObject)(target)) throw new Error('Target must be an object.'); if (typeof path !== 'string') throw new Error('Path must be a string.'); var removeUndefined = options.removeUndefined, skipUndefined = options.skipUndefined; var mergeOptions = { clone: true, removeUndefined: removeUndefined, skipUndefined: skipUndefined }; // empty root if (path === '') { var dest = deepMerge(target, value, mergeOptions); Object.keys(dest).forEach(function (k) { target[k] = dest[k]; }); return target; } var current = target; var _iterator = _createForOfIteratorHelper(pathGenerator(path)), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var _step$value = _slicedToArray(_step.value, 3), _prop = _step$value[0], next = _step$value[1], mode = _step$value[2]; if (next) { var nextIsArray = /^\[\d+\]/.test(next); if (!current[_prop]) current[_prop] = nextIsArray ? [] : {}; if (nextIsArray && !Array.isArray(current[_prop])) { throw new Error("Path ".concat(path, " expect an array.")); } else if (Array.isArray(current[_prop]) && !nextIsArray) { throw new Error("Path ".concat(path, " is an array, expect an object.")); } current = current[_prop]; continue; } if (options.forceSet) { current[_prop] = value; } else if (mode === PATH_MODE.insert) { current.splice(_prop, 0, value); } else if (mode === PATH_MODE.append) { current.splice(_prop + 1, 0, value); } else { if (skipUndefined && value === undefined) break; current[_prop] = (0, _is.isMergeable)(current[_prop]) && (0, _is.isMergeable)(value) ? deepMerge(current[_prop], value, mergeOptions) : value; } if (removeUndefined && value === undefined) delete current[_prop]; } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return target; }; var deepGet = exports.deepGet = function deepGet(target, path) { var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; if (!(0, _is.isObject)(target)) throw new Error('Target must be an object.'); if (typeof path !== 'string') throw new Error('Path must be a string.'); // empty root if (path === '') return target; var defaultValue = options.defaultValue, strictMode = options.strictMode; var current = target; var _iterator2 = _createForOfIteratorHelper(pathGenerator(path)), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var _step2$value = _slicedToArray(_step2.value, 3), _prop2 = _step2$value[0], mode = _step2$value[2]; var isStrict = mode === PATH_MODE.strict || strictMode && defaultValue === undefined && mode !== PATH_MODE.loose; if (current != null && hasOwnProperty.call(current, _prop2)) { current = current[_prop2]; } else if (isStrict) { throw new Error("Path ".concat(path, " is not exist.")); } else { current = defaultValue; break; } } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } return current; }; var deepRemove = exports.deepRemove = function deepRemove(target, path) { if (!(0, _is.isObject)(target)) throw new Error('Target must be an object.'); if (typeof path !== 'string' || !path) throw new Error('Path must be a string.'); var current = target; var nextIsArray = false; var _iterator3 = _createForOfIteratorHelper(pathGenerator(path)), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var _step3$value = _slicedToArray(_step3.value, 2), _prop3 = _step3$value[0], next = _step3$value[1]; if (current == null || !hasOwnProperty.call(current, _prop3)) { break; } if (next) { current = current[_prop3]; nextIsArray = /^\[\d+\]/.test(next); } else if ((0, _is.isObject)(current)) { if (nextIsArray) throw new Error('Target is an object, expect array'); delete current[_prop3]; } else { if (!nextIsArray) { throw new Error('Target is an array, expect object'); } current.splice(_prop3, 1); } } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } return target; }; var deepHas = exports.deepHas = function deepHas(target, path) { if (!(0, _is.isObject)(target)) throw new Error('Target must be an object.'); if (typeof path !== 'string') throw new Error('Path must be a string.'); if (path === '') return true; var current = target; var _iterator4 = _createForOfIteratorHelper(pathGenerator(path)), _step4; try { for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { var _step4$value = _slicedToArray(_step4.value, 2), _prop4 = _step4$value[0]; if (!current || !hasOwnProperty.call(current, _prop4)) return false; current = current[_prop4]; } } catch (err) { _iterator4.e(err); } finally { _iterator4.f(); } return true; }; var entries = exports.entries = function entries(obj) { if (!obj) return []; var keys = Object.keys(obj); return keys.map(function (key) { return [key, obj[key]]; }); };