| 'use strict'; |
| |
| const webpack = require('webpack'); |
| const createDomain = require('./createDomain'); |
| |
| function addEntries(config, options, server) { |
| if (options.inline !== false) { |
| // we're stubbing the app in this method as it's static and doesn't require |
| // a server to be supplied. createDomain requires an app with the |
| // address() signature. |
| |
| const app = server || { |
| address() { |
| return { port: options.port }; |
| }, |
| }; |
| |
| const domain = createDomain(options, app); |
| const sockHost = options.sockHost ? `&sockHost=${options.sockHost}` : ''; |
| const sockPath = options.sockPath ? `&sockPath=${options.sockPath}` : ''; |
| const sockPort = options.sockPort ? `&sockPort=${options.sockPort}` : ''; |
| const clientEntry = `${require.resolve( |
| '../../client/' |
| )}?${domain}${sockHost}${sockPath}${sockPort}`; |
| let hotEntry; |
| |
| if (options.hotOnly) { |
| hotEntry = require.resolve('webpack/hot/only-dev-server'); |
| } else if (options.hot) { |
| hotEntry = require.resolve('webpack/hot/dev-server'); |
| } |
| |
| const prependEntry = (originalEntry, additionalEntries) => { |
| if (typeof originalEntry === 'function') { |
| return () => |
| Promise.resolve(originalEntry()).then((entry) => |
| prependEntry(entry, additionalEntries) |
| ); |
| } |
| |
| if (typeof originalEntry === 'object' && !Array.isArray(originalEntry)) { |
| const clone = {}; |
| |
| Object.keys(originalEntry).forEach((key) => { |
| // entry[key] should be a string here |
| clone[key] = prependEntry(originalEntry[key], additionalEntries); |
| }); |
| |
| return clone; |
| } |
| |
| // in this case, entry is a string or an array. |
| // make sure that we do not add duplicates. |
| const entriesClone = additionalEntries.slice(0); |
| [].concat(originalEntry).forEach((newEntry) => { |
| if (!entriesClone.includes(newEntry)) { |
| entriesClone.push(newEntry); |
| } |
| }); |
| return entriesClone; |
| }; |
| |
| // eslint-disable-next-line no-shadow |
| const checkInject = (option, config, defaultValue) => { |
| if (typeof option === 'boolean') return option; |
| if (typeof option === 'function') return option(config); |
| return defaultValue; |
| }; |
| |
| // eslint-disable-next-line no-shadow |
| [].concat(config).forEach((config) => { |
| const webTarget = |
| config.target === 'web' || |
| config.target === 'webworker' || |
| config.target === 'electron-renderer' || |
| config.target === 'node-webkit' || |
| config.target == null; |
| const additionalEntries = checkInject( |
| options.injectClient, |
| config, |
| webTarget |
| ) |
| ? [clientEntry] |
| : []; |
| |
| if (hotEntry && checkInject(options.injectHot, config, true)) { |
| additionalEntries.push(hotEntry); |
| } |
| |
| config.entry = prependEntry(config.entry || './src', additionalEntries); |
| |
| if (options.hot || options.hotOnly) { |
| config.plugins = config.plugins || []; |
| if ( |
| !config.plugins.find( |
| (plugin) => |
| plugin.constructor === webpack.HotModuleReplacementPlugin |
| ) |
| ) { |
| config.plugins.push(new webpack.HotModuleReplacementPlugin()); |
| } |
| } |
| }); |
| } |
| } |
| |
| module.exports = addEntries; |