text: 'use strict';
  
  const webpack = require('webpack');
  const merge = require('webpack-merge');
  const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
  const MiniCSSExtractPlugin = require('mini-css-extract-plugin');
  const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
  const CompressionPlugin = require('compression-webpack-plugin');
  const HtmlWebpackPlugin = require('html-webpack-plugin')
  const helpers = require('./helpers');
  const commonConfig = require('./webpack.config.common');
  const isProd = process.env.NODE_ENV === 'production';
  const environment = isProd ? require('../config/env.prod') : require('../config/env.staging');
  
  const webpackConfig = merge(commonConfig, {
      mode: 'production',
      output: {
          filename: helpers.assetsPath('js/[hash].js'),
          chunkFilename: helpers.assetsPath('js/[id].[hash].chunk.js')
      },
      optimization: {
          runtimeChunk: 'single',
          minimizer: [
              new OptimizeCSSAssetsPlugin({
                  cssProcessorPluginOptions: {
                      preset: ['default', { discardComments: { removeAll: true } }],
                  }
              }),
              new UglifyJSPlugin({
                  cache: true,
                  parallel: true,
                  sourceMap: !isProd
              })
          ],
          splitChunks: {
              chunks: 'all',
              maxInitialRequests: Infinity,
              minSize: 0,
              cacheGroups: {
                  vendor: {
                      test: /[\\/]node_modules[\\/]/,
                      name(module) {
                          const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1];
                          return `npm.${packageName.replace('@', '')}`;
                      }
                  },
                  styles: {
                      test: /\.css$/,
                      name: 'styles',
                      chunks: 'all',
                      enforce: true
                  }
              }
          }
      },
      plugins: [
          new webpack.EnvironmentPlugin(environment),
  
          new MiniCSSExtractPlugin({
              filename: helpers.assetsPath('css/[name].[hash].css'),
              chunkFilename: helpers.assetsPath('css/[id].[hash].css')
          }),
  
          new CompressionPlugin({
              filename: '[path].gz[query]',
              algorithm: 'gzip',
              test: new RegExp('\\.(js|css)$'),
              threshold: 10240,
              minRatio: 0.8
          }),
  
          new HtmlWebpackPlugin({
              filename: 'index.html',
              template: 'index.html',
              inject: true,
              minify: {
                  removeComments: true,
                  collapseWhitespace: true,
                  removeAttributeQuotes: true
              },
              chunksSortMode: 'dependency'
          }),
  
          new webpack.HashedModuleIdsPlugin()
      ]
  });
  
  if (!isProd) {
      webpackConfig.devtool = 'source-map';
  
      if (process.env.npm_config_report) {
          const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
          webpackConfig.plugins.push(new BundleAnalyzerPlugin());
      }
  }
  
  module.exports = webpackConfig;
  