1 | var assign = require('lodash.assign');
|
2 | var 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 | */
|
13 | module.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 | };
|