UNPKG

overmind

Version:
49 lines (47 loc) 1.96 kB
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