UNPKG

overmind

Version:
61 lines 2.63 kB
"use strict"; 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