@lyra/form-builder
Version:
Lyra form builder
69 lines (49 loc) • 2.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _isObject2 = require('lodash/isObject');
var _isObject3 = _interopRequireDefault(_isObject2);
var _clone2 = require('lodash/clone');
var _clone3 = _interopRequireDefault(_clone2);
var _omit2 = require('lodash/omit');
var _omit3 = _interopRequireDefault(_omit2);
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
exports.default = apply;
var _applyPatch = require('./applyPatch');
var _applyPatch2 = _interopRequireDefault(_applyPatch);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); }
function apply(value, patch) {
const nextValue = (0, _clone3.default)(value);
if (patch.path.length === 0) {
// its directed to me
if (patch.type === 'set') {
if (!(0, _isObject3.default)(patch.value)) {
// eslint-disable-line max-depth
throw new Error('Cannot set value of an object to a non-object');
}
return patch.value;
} else if (patch.type === 'unset') {
return undefined;
} else if (patch.type === 'setIfMissing') {
// console.log('IS IT missing?', value)
return value === undefined ? patch.value : value;
}
throw new Error(`Invalid object operation: ${patch.type}`);
}
// The patch is not directed to me
var _patch$path = _toArray(patch.path);
const head = _patch$path[0],
tail = _patch$path.slice(1);
if (typeof head !== 'string') {
throw new Error(`Expected field name to be a string, instad got: ${head}`);
}
if (tail.length === 0 && patch.type === 'unset') {
return (0, _omit3.default)(nextValue, head);
}
nextValue[head] = (0, _applyPatch2.default)(nextValue[head], _extends({}, patch, {
path: tail
}));
return nextValue;
}