const merge = require('deepmerge'); const defaults = require('./config'); const utils = require('./utils'); const loaderDefaults = defaults.loader; const isomorphicSpriteModule = require.resolve('../runtime/sprite.build'); const isomorphicSymbolModule = require.resolve('svg-baker-runtime/symbol'); const isTargetBrowser = target => target === 'web' || target === 'electron-renderer'; /** * @param {Object} params * @param {Object} [params.config] Parsed loader config {@see SVGSpriteLoaderConfig} * @param {LoaderContext} context Loader context {@see https://webpack.js.org/api/loaders/#the-loader-context} * @return {Object} */ module.exports = function configurator({ config, context, target }) { const module = context._module; const compiler = context._compiler; const compilerName = compiler.name; const autoConfigured = { spriteModule: isTargetBrowser(target) ? loaderDefaults.spriteModule : isomorphicSpriteModule, symbolModule: isTargetBrowser(target) ? loaderDefaults.symbolModule : isomorphicSymbolModule, extract: utils.isModuleShouldBeExtracted(module), esModule: context.version && context.version >= 2 }; const finalConfig = merge.all([loaderDefaults, autoConfigured, config || {}]); /** * esModule should be `false` when compiles via extract-text-webpack-plugin or html-webpack-plugin. * Because this compilers executes module as usual node module so export should be always in commonjs style. * This could be dropped when Node.js will support ES modules natively :) * @see https://git.io/vS7Sn * @see https://git.io/v9w60 */ if (compilerName && ( compilerName.includes('extract-text-webpack-plugin') || compilerName.includes('html-webpack-plugin') )) { finalConfig.esModule = false; } return finalConfig; };