siegel
Version:
Web application development ecosystem
67 lines (66 loc) • 3.21 kB
JavaScript
const mergeOptions = (defaultOptions, userOptions, rewrite) => (typeof userOptions == 'function'
? userOptions(defaultOptions)
: !rewrite && typeof defaultOptions == 'object' && !Array.isArray(defaultOptions)
? { ...defaultOptions, ...userOptions }
: userOptions);
function addWithoutMerge(result, pluginConfig) {
const { instances, plugin, options } = pluginConfig;
if (instances) {
Object.values(instances)
.forEach(pluginInstance => {
const { options, enabled = true } = pluginInstance;
enabled && result.push(new plugin(options));
});
}
else
result.push(new plugin(options));
}
const isEnabledByUserPlugin = (plugin) => plugin.enabled !== false;
function merge(defaultPlugins, userPlugins = {}) {
const result = [];
Object.entries(defaultPlugins)
.forEach(([defaultPluginKey, defaultPluginConfig]) => {
const { plugin, options, instances, enabled = true } = defaultPluginConfig;
const userPluginConfig = userPlugins[defaultPluginKey];
if (!userPluginConfig || isEnabledByUserPlugin(userPluginConfig)) {
if (userPluginConfig?.plugin) {
const { rewrite, plugin: userPlugin = plugin, options: userOptions, instances: userInstances } = userPluginConfig;
if (userInstances) {
Object.entries(userInstances)
.forEach(([userPluginInstanceKey, userInstance]) => {
if (userInstance) {
const { rewrite, options: userInstanceOptions } = userInstance;
let finalPluginInstanceOptions = userInstanceOptions;
if (instances) {
const defaultInstance = instances[userPluginInstanceKey];
if (defaultInstance) {
finalPluginInstanceOptions = mergeOptions(defaultInstance.options, userInstanceOptions, rewrite);
}
}
result.push(new userPlugin(finalPluginInstanceOptions));
}
});
}
else {
const finalPluginOptions = mergeOptions(options, userOptions, rewrite);
result.push(new userPlugin(finalPluginOptions));
}
}
else if (enabled)
addWithoutMerge(result, defaultPluginConfig);
}
});
Object.entries(userPlugins)
.forEach(([userPluginKey, userCustomPluginConfig]) => {
if (userCustomPluginConfig.plugin) {
const userCustomPluginConfigObject = userCustomPluginConfig;
if (!defaultPlugins[userPluginKey] && isEnabledByUserPlugin(userCustomPluginConfigObject)) {
userCustomPluginConfigObject.plugin
? addWithoutMerge(result, userCustomPluginConfigObject)
: console.error(`[config.build.plugins.${userPluginKey}] ->> property 'plugin' is missed.`);
}
}
});
return result;
}
export default merge;