overmind
Version:
Frictionless state management
61 lines • 2.63 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.merge = void 0;
const tslib_1 = require("tslib");
const is_plain_obj_1 = tslib_1.__importDefault(require("is-plain-obj"));
function copy(target, source) {
return Object.keys(source).reduce((aggr, key) => {
if (key === '__esModule') {
return aggr;
}
if ((0, is_plain_obj_1.default)(source[key])) {
aggr[key] = copy(target[key] || {}, source[key]);
}
else if (Array.isArray(source[key])) {
aggr[key] = source[key];
}
else {
const originalDescriptor = Object.getOwnPropertyDescriptor(source, key);
const isAGetter = originalDescriptor && 'get' in originalDescriptor;
const value = source[key];
if (isAGetter) {
Object.defineProperty(aggr, key, originalDescriptor);
}
else {
aggr[key] = value;
}
}
return aggr;
}, target);
}
function merge(...configurations) {
const rootConfiguration = configurations.shift();
const reducedConfigurations = configurations.reduce((aggr, config) => {
const stateDuplicates = aggr.state
? Object.keys(aggr.state).some((key) => config.state ? Object.keys(config.state).includes(key) : false)
: false;
const actionsDuplicates = aggr.actions
? Object.keys(aggr.actions).some((key) => config.actions ? Object.keys(config.actions).includes(key) : false)
: false;
const effectsDuplicates = aggr.effects
? Object.keys(aggr.effects).some((key) => config.effects ? Object.keys(config.effects).includes(key) : false)
: false;
if (stateDuplicates) {
throw new Error('Merge conflict: at least one state definition contains a duplicate key');
}
if (actionsDuplicates) {
throw new Error('Merge conflict: at least one actions definition contains a duplicate key');
}
if (effectsDuplicates) {
throw new Error('Merge conflict: at least one effects definition contains a duplicate key');
}
return {
state: copy(aggr.state, config.state || {}),
effects: Object.assign(Object.assign({}, aggr.effects), config.effects),
actions: Object.assign(Object.assign({}, aggr.actions), config.actions),
};
}, Object.assign({ state: {}, actions: {}, effects: {} }, rootConfiguration));
return reducedConfigurations;
}
exports.merge = merge;
//# sourceMappingURL=merge.js.map
;