UNPKG

2.52 kBJavaScriptView Raw
1'use strict'
2
3const merge = require('webpack-merge')
4
5const decorateOptions = require('./decorate-options')
6const commonConfigs = require('./common-configs')
7const electronConfigs = require('./electron-configs')
8const developmentConfigs = require('./development-configs')
9const productionConfigs = require('./production-configs')
10const generateLoaders = require('./generate-loaders')
11const generatePlugins = require('./generate-plugins')
12
13/**
14 * Crystal ball projects' base webpack configs include configurations for loader
15 * definitions, dev server, build indicators, stats, etc. The configurations are
16 * specific to environment and can be overriden as needed for custom build
17 * requirements.
18 * @param {Object} options
19 * @param {Object} options.devServer
20 * @param {Object} options.envVars
21 * @param {Object} options.paths
22 * @param {?string} options.target
23 */
24module.exports = function webpackBase(options = {}) {
25 const decoratedOptions = decorateOptions(options)
26 const loaders = generateLoaders(decoratedOptions)
27 const plugins = generatePlugins(decoratedOptions)
28
29 const { development, production, electron } = decoratedOptions.flags
30
31 // 1. Generate common configs
32 // Merge common configs with dev vs prod specific configs to return complete
33 // webpack configuration object
34 let configs = commonConfigs(decoratedOptions)
35
36 // 2. Merge target specific configs
37 if (electron) configs = merge(configs, electronConfigs())
38 if (production) configs = merge(configs, productionConfigs(decoratedOptions))
39 if (development) configs = merge(configs, developmentConfigs(decoratedOptions))
40
41 // 3. Map loader and plugin names to instances with options
42 const configuredLoaders = {}
43 const configuredPlugins = {}
44
45 const loadersSet = configs.module.rules
46 configs.module.rules = []
47 loadersSet.forEach((loaderName) => {
48 if (options[loaderName] === false) return
49
50 let loader
51 if (typeof options[loaderName] === 'function') {
52 loader = options[loaderName](loaders[loaderName]())
53 } else {
54 loader = loaders[loaderName](options[loaderName])
55 }
56 configs.module.rules.push(loader)
57 configuredLoaders[loaderName] = loader
58 })
59
60 const pluginsSet = configs.plugins
61 configs.plugins = []
62 pluginsSet.forEach((pluginName) => {
63 if (options[pluginName] === false) return
64
65 const plugin = plugins[pluginName]
66 configs.plugins.push(plugin)
67 configuredPlugins[pluginName] = plugin
68 })
69
70 return { configs, loaders: configuredLoaders, plugins: configuredPlugins }
71}