overmind
Version:
Frictionless state management
49 lines (47 loc) • 1.96 kB
JavaScript
import isPlainObject from "is-plain-obj";
//#region src/config/merge.ts
function copy(target, source) {
return Object.keys(source).reduce((aggr, key) => {
if (key === "__esModule") return aggr;
if (isPlainObject(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();
return 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: {
...aggr.effects,
...config.effects
},
actions: {
...aggr.actions,
...config.actions
}
};
}, {
state: {},
actions: {},
effects: {},
...rootConfiguration
});
}
//#endregion
export { merge };
//# sourceMappingURL=merge.js.map