fbredius/storybook

View on GitHub
lib/core-common/src/utils/merge-webpack-config.ts

Summary

Maintainability
B
4 hrs
Test Coverage
import { Configuration } from 'webpack';

function plugins(
  { plugins: defaultPlugins = [] }: Configuration,
  { plugins: customPlugins = [] }: Configuration
): Configuration['plugins'] {
  return [...defaultPlugins, ...customPlugins];
}

function rules(
  { rules: defaultRules = [] }: Configuration['module'],
  { rules: customRules = [] }: Configuration['module']
): Configuration['module']['rules'] {
  return [...defaultRules, ...customRules];
}

function extensions(
  { extensions: defaultExtensions = [] }: Configuration['resolve'],
  { extensions: customExtensions = [] }: Configuration['resolve']
): Configuration['resolve']['extensions'] {
  return [...defaultExtensions, ...customExtensions];
}

function alias(
  { alias: defaultAlias = {} }: Configuration['resolve'],
  { alias: customAlias = {} }: Configuration['resolve']
): Configuration['resolve']['alias'] {
  return {
    ...defaultAlias,
    ...customAlias,
  };
}

function module(
  { module: defaultModule = { rules: [] } }: Configuration,
  { module: customModule = { rules: [] } }: Configuration
): Configuration['module'] {
  return {
    ...defaultModule,
    ...customModule,
    rules: rules(defaultModule, customModule),
  };
}

function resolve(
  { resolve: defaultResolve = {} }: Configuration,
  { resolve: customResolve = {} }: Configuration
): Configuration['resolve'] {
  return {
    ...defaultResolve,
    ...customResolve,
    alias: alias(defaultResolve, customResolve),
    extensions: extensions(defaultResolve, customResolve),
  };
}

function optimization(
  { optimization: defaultOptimization = {} }: Configuration,
  { optimization: customOptimization = {} }: Configuration
): Configuration['optimization'] {
  return {
    ...defaultOptimization,
    ...customOptimization,
  };
}

export function mergeConfigs(config: Configuration, customConfig: Configuration): Configuration {
  return {
    // We'll always load our configurations after the custom config.
    // So, we'll always load the stuff we need.
    ...customConfig,
    ...config,
    devtool: customConfig.devtool || config.devtool,
    plugins: plugins(config, customConfig),
    module: module(config, customConfig),
    resolve: resolve(config, customConfig),
    optimization: optimization(config, customConfig),
  };
}