const path = require('path')
const ip = require('ip')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsWebpackPlugin = require('friendly-errors-webpack-plugin')
const config = require('../config')
const clientOptions = '?path=/__what&timeout=5000&reload=true&quiet=true'
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin')

module.exports = {
  mode: 'development',
  entry: [
    `webpack-hot-middleware/client${clientOptions}`,
    path.resolve(__dirname, '../../src/index.js'),
  ],
  output: {
    filename: 'bundle.js',
    publicPath: config.dev.publicPath,
  },
  module: {
    rules: [
      {
        test: /\.css$/i,
        use: [
          'style-loader',
          {
            loader: 'css-loader',
            options: {
              importLoaders: 1,
            },
          },
          'postcss-loader',
        ],
      },
      {
        test: /\.s[ac]ss$/i,
        use: [
          'style-loader',
          {
            loader: 'css-loader',
            options: {
              importLoaders: 2,
            },
          },
          'postcss-loader',
          'sass-loader',
        ],
      },
      {
        test: /\.(png|jpe?g|gif|svg)$/i,
        loader: 'file-loader',
      },
      {
        test: /\.(ttf|otf|woff2?|eot)$/i,
        loader: 'file-loader',
      },
      {
        test: /\.(html)$/i,
        loader: 'html-loader',
      },
      {
        test: /\.js$/,
        enforce: 'pre',
        exclude: /node_modules/,
        loader: 'eslint-loader',
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
      },
      {
        test: /\.vue$/,
        loader: 'vue-loader',
      },
    ],
  },
  externals: {
    vue: 'Vue',
  },
  resolve: {
    extensions: [
      '.js',
      '.vue',
    ],
    alias: {
      '@': path.resolve(__dirname, '../../src'),
    },
  },
  devtool: 'inline-source-map',
  plugins: [
    new HtmlWebpackPlugin({
      template: config.template,
    }),
    new VueLoaderPlugin(),
    new webpack.DefinePlugin({
      'process.env': config.dev.env,
    }),
    new CaseSensitivePathsPlugin(),
    new webpack.HotModuleReplacementPlugin(),
    new FriendlyErrorsWebpackPlugin({
      compilationSuccessInfo: {
        messages: [
          `http://localhost:${config.port} or http://${ip.address()}:${config.port}`,
        ],
      },
    }),
  ],
}