"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = set; exports.merge = merge; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray")); var _get = _interopRequireDefault(require("./get")); function internalSet(entity, paths, value, removeIfUndefined) { if (!paths.length) { return value; } var _paths = (0, _toArray2.default)(paths), path = _paths[0], restPath = _paths.slice(1); var clone; if (!entity && typeof path === 'number') { clone = []; } else if (Array.isArray(entity)) { clone = (0, _toConsumableArray2.default)(entity); } else { clone = (0, _objectSpread2.default)({}, entity); } // Delete prop if `removeIfUndefined` and value is undefined if (removeIfUndefined && value === undefined && restPath.length === 1) { delete clone[path][restPath[0]]; } else { clone[path] = internalSet(clone[path], restPath, value, removeIfUndefined); } return clone; } function set(entity, paths, value) { var removeIfUndefined = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; // Do nothing if `removeIfUndefined` and parent object not exist if (paths.length && removeIfUndefined && value === undefined && !(0, _get.default)(entity, paths.slice(0, -1))) { return entity; } return internalSet(entity, paths, value, removeIfUndefined); } function isObject(obj) { return (0, _typeof2.default)(obj) === 'object' && obj !== null && Object.getPrototypeOf(obj) === Object.prototype; } function createEmpty(source) { return Array.isArray(source) ? [] : {}; } var keys = typeof Reflect === 'undefined' ? Object.keys : Reflect.ownKeys; /** * Merge objects which will create */ function merge() { for (var _len = arguments.length, sources = new Array(_len), _key = 0; _key < _len; _key++) { sources[_key] = arguments[_key]; } var clone = createEmpty(sources[0]); sources.forEach(function (src) { function internalMerge(path, parentLoopSet) { var loopSet = new Set(parentLoopSet); var value = (0, _get.default)(src, path); var isArr = Array.isArray(value); if (isArr || isObject(value)) { // Only add not loop obj if (!loopSet.has(value)) { loopSet.add(value); var originValue = (0, _get.default)(clone, path); if (isArr) { // Array will always be override clone = set(clone, path, []); } else if (!originValue || (0, _typeof2.default)(originValue) !== 'object') { // Init container if not exist clone = set(clone, path, createEmpty(value)); } keys(value).forEach(function (key) { internalMerge([].concat((0, _toConsumableArray2.default)(path), [key]), loopSet); }); } } else { clone = set(clone, path, value); } } internalMerge([]); }); return clone; }