const HtmlWebpackPlugin = require('html-webpack-plugin');
const pkg = require('./package.json');
const webpack = require('webpack');
const path = require('path');
const fs = require('fs');
const rootDir = path.resolve(__dirname);
let plugins = [];

module.exports = env => {
  const name = 'grapesjs';
  const isProd = env === 'prod';
  const output = {
    path: path.join(__dirname),
    filename: 'dist/grapes.min.js',
    library: name,
    libraryExport: 'default',
    libraryTarget: 'umd',
  };

  if (isProd) {
    plugins = [
      new webpack.optimize.ModuleConcatenationPlugin(),
      new webpack.BannerPlugin(`${name} - ${pkg.version}`),
    ];
  } else if (env === 'dev') {
    output.filename = 'dist/grapes.js';
  } else {
    const index = 'index.html';
    const indexDev = `_${index}`;
    const template = fs.existsSync(indexDev) ? indexDev : index;
    plugins.push(new HtmlWebpackPlugin({ template, inject: false }));
  }

  return {
    entry: './src',
    output: output,
    plugins: plugins,
    mode: isProd ? 'production' : 'development',
    devtool: isProd ? 'source-map' : (!env ? 'cheap-module-eval-source-map' : false),
    devServer: {
      headers: { 'Access-Control-Allow-Origin': '*' },
      disableHostCheck: true,
    },
    module: {
      rules: [{
        test: /\/index\.js$/,
        loader: 'string-replace-loader',
        query: {
          search: '<# VERSION #>',
          replace: pkg.version
        }
      }, {
        test: /\.js$/,
        loader: 'babel-loader',
        include: /src/,
        options: { cacheDirectory: true },
      }],
    },
    resolve: {
      modules: ['src', 'node_modules'],
      alias: {
        jquery: 'cash-dom',
        backbone: `${rootDir}/node_modules/backbone`,
        underscore: `${rootDir}/node_modules/underscore`,
      }
    }
  };
}
