const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const StyleLintPlugin = require('stylelint-webpack-plugin'); const TerserPlugin = require('terser-webpack-plugin'); const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); module.exports = (env, argv) => { const dev = argv.mode !== 'production'; const config = { devtool: dev ? 'source-map' : false, entry: { 'scripts': [ 'core-js/modules/es6.array.map', 'core-js/modules/es6.object.create', 'core-js/modules/es6.object.define-property', 'core-js/modules/es6.object.set-prototype-of', 'core-js/modules/es6.promise', 'core-js/modules/es6.symbol', 'core-js/modules/web.dom.iterable', 'whatwg-fetch', __dirname + '/src/main/assets/scripts.js', require.resolve('evil-icons/assets/evil-icons.js') ], 'style': [ __dirname + '/src/main/assets/style.css', require.resolve('evil-icons/assets/evil-icons.css') ] }, output: { path: __dirname + '/src/main/resources/static', filename: '[name].js' }, module: { rules: [ { test: /\.jsx?$/, loader: 'eslint-loader', enforce: 'pre', exclude: /node_modules/, options: { failOnWarning: false, failOnError: true, fix: true } }, { test: /\.js$/, loader: 'babel-loader' }, { test: /\.css$/, use: [ dev? 'style-loader' : MiniCssExtractPlugin.loader, { loader: 'css-loader' }, { loader: 'postcss-loader', options: { plugins: () => [ require('postcss-preset-env')() ] } } ] }, { test: /\.png$/, loader: 'url-loader?limit=10000000000' }, { test: /\.svg$/, loader: 'url-loader?limit=10000000000' } ] }, plugins: [ new StyleLintPlugin({ configFile: '.stylelintrc.json', context: 'src/main/assets', files: ['**/*.css'], emitErrors: false }), new MiniCssExtractPlugin({ filename: 'style.css', allChunks: true }) ], }; if (!dev) { config.optimization = { minimizer: [ new TerserPlugin({ cache: true, parallel: true, sourceMap: dev, terserOptions: { output: { comments: /@license/i } }, extractComments: true }), new OptimizeCSSAssetsPlugin({}) ] }; } return config; };