siegel
Version:
Web application development ecosystem
87 lines (86 loc) • 4.64 kB
JavaScript
import isExists from '../../../common/is/exists/index.js';
const INSTANCES_KEY = 'instances';
const OPTIONS_KEY = 'options';
function merge(innerDefaultPlugins, pluginsConfig = {}) {
const { defaultPlugins = {}, userPlugins = {} } = pluginsConfig;
const innerDefaultPluginsKeys = Object.keys(innerDefaultPlugins);
const result = [];
function addPlugin(pluginConfig) {
const { plugin, options, instances } = pluginConfig;
instances
? Object.keys(instances).forEach(instanceKey => {
const { enabled = true, options } = instances[instanceKey];
enabled && result.push({ plugin, options });
})
: result.push({ plugin, options });
}
innerDefaultPluginsKeys.forEach(key => {
const innerDefaultPluginKey = key;
if (!(innerDefaultPluginKey in pluginsConfig)) {
const innerDefaultPluginConfig = innerDefaultPlugins[innerDefaultPluginKey];
const { enabled, plugin } = innerDefaultPluginConfig;
const userDefaultPluginRewrite = defaultPlugins[innerDefaultPluginKey];
if (isExists(userDefaultPluginRewrite)) {
const isRewriteWithObjConfig = typeof userDefaultPluginRewrite != 'boolean';
const isEnabled = isRewriteWithObjConfig
? userDefaultPluginRewrite.enabled
: userDefaultPluginRewrite;
if (isEnabled) {
if (isRewriteWithObjConfig) {
if (INSTANCES_KEY in userDefaultPluginRewrite
&& INSTANCES_KEY in innerDefaultPluginConfig) {
const { instances } = userDefaultPluginRewrite;
instances && Object.keys(instances).forEach(key => {
const userRewriteInstanceKey = key;
const userDefaultPluginInstanceRewrite = instances[userRewriteInstanceKey];
if (isExists(userDefaultPluginInstanceRewrite)) {
const isRewriteWithObjConfig = typeof userDefaultPluginInstanceRewrite != 'boolean';
const isEnabled = isRewriteWithObjConfig
? userDefaultPluginInstanceRewrite.enabled
: userDefaultPluginInstanceRewrite;
if (isEnabled) {
const { options } = innerDefaultPluginConfig.instances[userRewriteInstanceKey];
result.push({
plugin,
options: isRewriteWithObjConfig
? userDefaultPluginInstanceRewrite.options?.(options) || options
: innerDefaultPluginConfig
});
}
}
else {
result.push({
plugin,
options: innerDefaultPluginConfig.instances[userRewriteInstanceKey].options
});
}
});
}
else {
result.push({
plugin,
options: OPTIONS_KEY in innerDefaultPluginConfig
? OPTIONS_KEY in userDefaultPluginRewrite && typeof userDefaultPluginRewrite.options == 'function'
? userDefaultPluginRewrite.options(innerDefaultPluginConfig
.options)
: innerDefaultPluginConfig.options
: undefined
});
}
}
else
addPlugin(innerDefaultPluginConfig);
}
}
else if (enabled)
addPlugin(innerDefaultPluginConfig);
}
});
Object.keys(userPlugins).forEach(userNewPluginKey => {
const userNewPlugin = userPlugins[userNewPluginKey];
const { enabled = true } = userNewPlugin;
enabled && addPlugin(userNewPlugin);
});
return result;
}
export default merge;