const path = require('path') const glob = require('glob') const MiniCssExtractPlugin = require('mini-css-extract-plugin') const TerserPlugin = require('terser-webpack-plugin') const CssMinimizerPlugin = require('css-minimizer-webpack-plugin') const CopyWebpackPlugin = require('copy-webpack-plugin') module.exports = (env, options) => { const devMode = options.mode !== 'production' return { optimization: { minimizer: [ new TerserPlugin({ parallel: true, extractComments: true }), new CssMinimizerPlugin({}) ] }, entry: { app: glob.sync('./vendor/**/*.js').concat(['./js/app.js']) }, output: { filename: '[name].js', path: path.resolve(__dirname, '../priv/static/js'), publicPath: '/js/' }, devtool: devMode ? 'eval-cheap-module-source-map' : undefined, module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader' } }, { test: /\.s?css$/, use: [ MiniCssExtractPlugin.loader, 'css-loader', 'postcss-loader', 'sass-loader' ] }, { test: /\.(woff(2)?|ttf|eot|svg|otf)(\?v=[0-9]\.[0-9]\.[0-9])?$/, type: 'asset/resource', generator: { filename: 'fonts/[name].[ext]' } } ] }, plugins: [ new MiniCssExtractPlugin({ filename: '../css/app.css' }), new CopyWebpackPlugin({ patterns: [{ from: 'static/', to: '../' }] }) ] } }