process.env.NODE_ENV = 'production';

const path = require('path');
const {merge} = require('webpack-merge');
const common = require('./webpack.common.js');
const keepAsset = require('./keepAsset.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(keepAsset(file)) {
    //         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);
    //     }
    //   });
    // })
  ]
});
