UNPKG

@onesy/utils

Version:
53 lines (52 loc) 2.69 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const is_1 = __importDefault(require("./is")); const cleanValue_1 = __importDefault(require("./cleanValue")); const castParam_1 = __importDefault(require("./castParam")); const optionsDefault = { valueOverride: false }; const setObjectValue = (object, keys = '', value = undefined, options_ = {}) => { const options = Object.assign(Object.assign({}, optionsDefault), options_); if (!(object || keys)) return object; if ((0, is_1.default)('string', keys)) { const keys_ = keys.split('.').filter(Boolean).map(key => (0, castParam_1.default)(key)); return setObjectValue(object, keys_, value, options); } if ((0, is_1.default)('array', keys)) { const key = keys[0]; const keyClean = (0, cleanValue_1.default)(String(key), { filters: ['.', ','], replaceWith: '' }); if (keys.length === 1) { if (((0, is_1.default)('array', object) && (0, is_1.default)('number', key)) || (0, is_1.default)('object', object)) { // Add array or object as a value of the key, if that key doesn't exist atm if (!(object === null || object === void 0 ? void 0 : object.hasOwnProperty(key)) || options.valueOverride) object[keyClean] = (0, is_1.default)('number', keys[1]) ? [] : {}; object[(0, is_1.default)('string', key) ? keyClean : key] = value; } } else { if (((0, is_1.default)('array', object) && (0, is_1.default)('number', key)) || (0, is_1.default)('object', object)) { // Add array or object as a value of the key, if that key doesn't exist atm if (!(object === null || object === void 0 ? void 0 : object.hasOwnProperty(key)) || options.valueOverride) object[keyClean] = (0, is_1.default)('number', keys[1]) ? [] : {}; } const value_ = object[keyClean]; // If we are trying to set a deeply nested value on a // simple value type, meaning if it's not an array or an object, // To override existing value use valueOverride: true option if (!((0, is_1.default)('object', value_) || (0, is_1.default)('array', value_))) return object; return setObjectValue(object[key], keys.slice(1), value, options); } } return object; }; exports.default = setObjectValue;