process.env.NODE_ENV = 'production';

const path = require('path');
const merge = require('webpack-merge');
const common = require('./webpack.common.js');

//const CompressionPlugin = require("compression-webpack-plugin");
const WebpackOnBuildPlugin = require('on-build-webpack');
//const TerserJSPlugin = require('terser-webpack-plugin');
//const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const fs = require('fs');

const buildDir = __dirname + '/public/';

module.exports = merge(common, {
  mode: 'production',

  devtool: 'source-map',

  optimization: {
    //minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})],
    //runtimeChunk: 'single',
    splitChunks: {
      chunks: 'all',
      maxInitialRequests: Infinity,
      //minSize: 0,
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          name(module) {
            // get the name. E.g. node_modules/packageName/not/this/part.js
            // or node_modules/packageName
            const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1];

            // npm package names are URL-safe, but some servers don't like @ symbols
            return `npm.${packageName.replace('@', '')}`;
          },
        },
      },
    }
  },

  plugins: [
    /* new CompressionPlugin({
      filename: '[path].gz[query]',
      algorithm: 'gzip',
      test: /\.(js|css|html|svg)$/,
      threshold: 10240,
      minRatio: 0.8,
    }), */
    /* new CompressionPlugin({
      filename: '[path].br[query]',
      algorithm: 'brotliCompress',
      test: /\.(js|css|html|svg)$/,
      compressionOptions: { level: 11 },
      threshold: 10240,
      minRatio: 0.8,
      deleteOriginalAssets: false,
    }), */

    new WebpackOnBuildPlugin(function(stats) {
      const newlyCreatedAssets = stats.compilation.assets;

      const unlinked = [];
      fs.readdir(path.resolve(buildDir), (err, files) => {
        files.forEach(file => {
          //console.log('to unlink 1:', file);

          if(file.includes('.xml') 
            || file.includes('.webmanifest') 
            || file.includes('.wasm')
            || file.includes('rlottie')
            || file.includes('Worker.min.js')
            || file.includes('recorder.min.js')
            || file.includes('.hbs')) return;

          let p = path.resolve(buildDir + file);
          if(!newlyCreatedAssets[file] && ['.gz', '.js', '.ts', '.map', '.css', '.txt'].find(ext => file.endsWith(ext)) !== undefined) {

            //console.log('to unlink 2:', file);
            
            fs.unlinkSync(p);
            unlinked.push(file);
          }
        });

        if(unlinked.length > 0) {
          console.log('Removed old assets: ', unlinked);
        }
      });
    })
  ]
});