const path = require("path"); const glob = require("glob"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const TerserPlugin = require("terser-webpack-plugin"); const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin"); const CopyWebpackPlugin = require("copy-webpack-plugin"); module.exports = (env, options) => { const devMode = options.mode !== "production"; return { optimization: { minimizer: [ new TerserPlugin({ cache: true, parallel: true, sourceMap: devMode }), new OptimizeCSSAssetsPlugin({}), ], }, 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 ? "source-map" : undefined, module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: "babel-loader", }, }, { test: /\.(woff|woff2|ttf|eot)$/, use: "file-loader?name=fonts/[name].[ext]!static", }, { test: /\.[s]?css$/, use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"], }, ], }, plugins: [ new MiniCssExtractPlugin({ filename: "../css/app.css" }), new CopyWebpackPlugin([{ from: "static/", to: "../" }]), ], }; };