react-formal
Version:
Classy HTML form management for React
37 lines (36 loc) • 1.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = update;
var _propertyExpr = _interopRequireDefault(require("property-expr"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const IS_ARRAY = /^\d+$/;
function isQuoted(str) {
return !!(typeof str === 'string' && str && (str[0] === '"' || str[0] === "'"));
}
function copy(value) {
return Array.isArray(value) ? value.concat() : value !== null && typeof value === 'object' ?
//
// @ts-ignore
Object.assign(new value.constructor(), value) : value;
}
function clean(part) {
return isQuoted(part) ? part.substr(1, part.length - 2) : part;
}
function update(model, path, value) {
let parts = _propertyExpr.default.split(path);
let newModel = copy(model);
let part;
let islast;
if (newModel == null) newModel = IS_ARRAY.test(parts[0]) ? [] : {};
let current = newModel;
for (let idx = 0; idx < parts.length; idx++) {
islast = idx === parts.length - 1;
part = clean(parts[idx]);
if (islast) current[part] = value;else {
current = current[part] = current[part] == null ? IS_ARRAY.test(parts[idx + 1]) ? [] : {} : copy(current[part]);
}
}
return newModel;
}