'use strict'
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const { VueLoaderPlugin } = require('vue-loader')
const ESLintPlugin = require('eslint-webpack-plugin');
const ExtraneousFileCleanupPlugin = require('webpack-extraneous-file-cleanup-plugin');
const CompressionPlugin = require("compression-webpack-plugin");
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

const utils = require('./utils')

const themePath = 'web/themes/custom/materiotheme'
const langPath = 'web/sites/default/files/lang'

const isDev = process.env.NODE_ENV === 'development';

module.exports = {
  resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      // 'vue': 'vue/dist/vue.js',
      'vue' : isDev ? 'vue/dist/vue.js' : 'vue/dist/vue.min.js',
      'theme': utils.resolve(themePath),
      'vuejs': utils.resolve(themePath+'/vuejs'),
      'assets': utils.resolve(themePath+'/assets'),
      // locales are exported by strings_i18n_json_export from drupal
      'locales': utils.resolve(langPath)
    }
  },
  entry: {
    'main': utils.resolve(themePath + '/assets/scripts/main.js'),
    // 'lang-en': utils.resolve(langPath + '/en.json'),
    'print': utils.resolve(themePath + '/assets/styles/print.scss')
    // 'mdi': utils.resolve(themePath + '/assets/styles/mdi/scss/materialdesignicons.scss')
  },
  output: {
    publicPath: '/themes/custom/materiotheme/assets/dist/',
    path: utils.resolve(themePath + '/assets/dist/'),
    filename: '[name].js',
    chunkFilename: '[name].bundle.js'
  },
  module: {
    rules: [
      // {
      //   test: /\.(js|vue)$/,
      //   loader: 'eslint-loader',
      //   enforce: 'pre',
      //   exclude: /node_modules/,
      //   options: {
      //     emitError: true,
      //     emitWarning: true
      //   }
      // },
      {
        test: /\.vue$/,
        use: 'vue-loader'
      },
      // {
      //   resourceQuery: /blockType=i18n/,
      //   type: 'javascript/auto',
      //   loader: '@kazupon/vue-i18n-loader'
      // },
      // {
      //   test: /\.js$/,
      //   use: {
      //     loader: 'babel-loader',
      //   }
      // },
      {
        test: /\.(graphql|gql)$/,
        exclude: /node_modules/,
        loader: 'graphql-tag/loader'
      },
      {
        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
        use: {
          loader: 'url-loader',
          options: {
            limit: 10000,
            name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
          }
        }
      }
      // {
      //   test: /\.graphql?$/,
      //   use: [
      //     {
      //       loader: 'webpack-graphql-loader',
      //       options: {
      //         // validate: true,
      //         // schema: "./path/to/schema.json",
      //         // removeUnusedFragments: true
      //         // etc. See "Loader Options" below
      //       }
      //     }
      //   ]
      // }
      // , {
      //   test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
      //   use: {
      //     loader: 'url-loader',
      //     options: {
      //       limit: 10000,
      //       name: utils.assetsPath('img/[name].[hash:7].[ext]')
      //     }
      //   }
      // }, {
      //   test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
      //   use: {
      //     loader: 'url-loader',
      //     options: {
      //       limit: 10000,
      //       name: utils.assetsPath('media/[name].[hash:7].[ext]')
      //     }
      //   }
      // }
      // {
      //   test: /\.css$/,
      //   use: [MiniCssExtractPlugin.loader, 'css-loader'],
      // },
    ]
  },
  optimization: {
    splitChunks: {
      cacheGroups: {
        // vsa: {
        //   test: /[\\/]node_modules[\\/](vue-simple-accordion)[\\/]/,
        //   name: 'vsa',
        //   chunks: 'all',
        //   usedExports: true
        // },
        vclb: {
          test: /[\\/]node_modules[\\/](vue-cool-lightbox)[\\/]/,
          name: 'vclb',
          chunks: 'all',
          usedExports: true
        },
        // vue_page_article: {
        //   test: /[\\/]web[\\/]themes[\\/]custom[\\/]materiotheme[\\/]vuejs[\\/]components[\\/]Pages[\\/]Article.vue/,
        //   name: 'vue_page_article',
        //   chunks: 'all'
        // }
      },
    },
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: '[name].css'
    }),
    new VueLoaderPlugin(),
    new ESLintPlugin({
      // fix: true
      // exclude: ['web/.eslintrc.json']
      // cache: false,
      // ignore: true,
      // useEslintrc: false,
    }),
    new ExtraneousFileCleanupPlugin({
      extensions: ['.js'],
      paths: [utils.resolve(themePath + '/assets/dist/')],
      minBytes: 4096
    }),
    new CompressionPlugin(),
    /**
     * All files inside webpack's output.path directory will be removed once, but the
     * directory itself will not be. If using webpack 4+'s default configuration,
     * everything under <PROJECT_DIR>/dist/ will be removed.
     * Use cleanOnceBeforeBuildPatterns to override this behavior.
     *
     * During rebuilds, all webpack assets that are not used anymore
     * will be removed automatically.
     *
     * See `Options and Defaults` for information
     */
     new CleanWebpackPlugin(),
  ]
}
