UNPKG

1.83 kBJavaScriptView Raw
1var assign = require('lodash.assign');
2var flatten = require('lodash.flatten');
3
4/**
5 * Creates configuration variants.
6 *
7 * @param {Object} [baseConfig={}] The base configuration
8 * @param {Object} variants The variants
9 * @param {Function} [configCallback] A callback executed for each configuration to
10 * transform the variant into a webpack configuration
11 * @returns {*|Array}
12 */
13module.exports = function createVariants(baseConfig, variants, configCallback) {
14 if(arguments.length < 3) {
15 if(arguments.length === 2) {
16 if(typeof variants === 'function') {
17 // createVariants(variants: Object, configCallback: Function)
18 configCallback = variants;
19 variants = baseConfig;
20 baseConfig = {};
21 }
22 // createVariants(baseConfig: Object, variants: Object)
23 // => don't do anything
24 } else {
25 // createVariants(variants: Object)
26 variants = baseConfig;
27 baseConfig = {};
28 }
29 }
30
31 // Okay, so this looks a little bit messy but it really does make some sense.
32 // Essentially, for each base configuration, we want to create every
33 // possible combination of the configuration variants specified above.
34 var transforms = Object.keys(variants).map(function(key) {
35 return function(config) {
36 return variants[key].map(function(value) {
37 var result = assign({}, config);
38 result[key] = value;
39 return result;
40 });
41 };
42 }),
43 configs = transforms.reduce(function(options, transform) {
44 return flatten(options.map(transform));
45 }, [baseConfig]);
46
47
48 return configCallback && configs.map(configCallback) || configs;
49};