const path = require('path'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const ImageMinimizerPlugin = require("image-minimizer-webpack-plugin"); const {extendDefaultPlugins} = require("svgo"); const TerserPlugin = require('terser-webpack-plugin'); const dev = process.env.NODE_ENV === 'development'; const userConfig = require('./assets/config.json'); for (const b in userConfig.bundles) { if (userConfig.bundles.hasOwnProperty(b)) { userConfig.bundles[b] = `./assets/${userConfig.bundles[b]}`; } } const config = { entry: userConfig.bundles, output: { path: path.resolve(__dirname, 'public/js'), filename: '[name].js' }, devtool: dev ? 'eval-source-map' : undefined, module: { rules: [ { test: /\.js$/i, use: [ { loader: 'babel-loader', options: { presets: ['@babel/preset-env'], } } ] }, { test: /\.s[ac]ss$/i, use: [ { loader: MiniCssExtractPlugin.loader, options: { publicPath: '/', } }, 'css-loader', 'sass-loader', ] }, { test: /\.(woff2?|eot|ttf|otf)$/i, use: 'file-loader?name=../fonts/[name].[ext]', }, { test: /\.tsx?$/i, use: { loader: 'ts-loader', options: { configFile: 'tsconfig.frontend.json', } }, exclude: '/node_modules/' }, { test: /\.(png|jpe?g|gif|svg)$/i, use: [ 'file-loader?name=../img/[name].[ext]', ], type: 'asset', } ], }, resolve: { extensions: ['.tsx', '.ts', '.js'], }, plugins: [ new MiniCssExtractPlugin({ filename: '../css/[name].css', }), new ImageMinimizerPlugin({ minimizerOptions: { // Lossless optimization with custom option // Feel free to experiment with options for better result for you plugins: [ ["gifsicle", {}], ["mozjpeg", {}], ["pngquant", {}], ["webp", {quality: 90}], // Svgo configuration here https://github.com/svg/svgo#configuration [ "svgo", { plugins: extendDefaultPlugins([ { name: "removeViewBox", active: false, }, { name: "addAttributesToSVGElement", params: { attributes: [{xmlns: "http://www.w3.org/2000/svg"}], }, }, ]), }, ], ], }, }), ] }; if (!dev) { config.optimization = { minimize: true, minimizer: [ new TerserPlugin(), ] }; } module.exports = config;