const path = require('path');
const fs = require('fs');

const plugins = require('./plugins');
const paths = require('./paths');

const {
  ROOT,
  MODULES,
  FRONTEND,
  UI,
  STATIC
} = paths;

module.exports = {
  context: ROOT,
  entry: `./${path.relative(ROOT, path.join(FRONTEND, 'index.js'))}`,
  resolve: {
    modules: MODULES,
    alias: fs.readdirSync(FRONTEND)
      .map((name) => path.join(FRONTEND, name))
      .filter((fullpath) => fs.statSync(fullpath).isDirectory())
      .reduce((aliases, fullpath) => Object.assign(aliases, {
        [`@${path.basename(fullpath)}`]: fullpath
      }), {
        '@root': FRONTEND,
        '@ui': UI
      })
  },
  resolveLoader: {
    modules: MODULES
  },
  output: {
    pathinfo: true,
    path: STATIC,
    publicPath: '/static/',
    filename: '[name].js'
  },
  plugins: [
    plugins['no-errors'],
    plugins['define'],
    plugins['shell']
  ],
  module: {
    rules: [{
      test: /js?$/,
      enforce: 'pre',
      use: [{
        loader: 'eslint-loader',
        options: {
          presets: [
            'react-app'
          ]
        }
      }],
      include: [
        FRONTEND,
        UI
      ]
    }, {
      exclude: [
        /\.html$/,
        /\.(js|jsx)$/,
        /\.css$/,
        /\.json$/,
        /\.svg$/,
        /\.(eot|svg|ttf|woff|woff2)$/
      ],
      loader: 'url-loader',
      include: [
        FRONTEND,
        UI
      ],
      options: {
        limit: 10000
      }
    }, {
      test: /js?$/,
      exclude: /node_modules/,
      include: [
        FRONTEND,
        UI
      ],
      loaders: [
        'babel-loader'
      ]
    }, {
      test: /\.svg/,
      exclude: [
        /node_modules/,
        path.join(UI, 'shared', 'fonts'),
      ],
      include: [
        FRONTEND,
        UI
      ],
      loader: [
        'file-loader'
      ]
    }, {
      test: /\.(eot|svg|ttf|woff|woff2)$/,
      loader: 'file-loader',
      // XXX: By commenting this out, production "BUILD=production make compile"
      //      will break.
      //
      // exclude: /node_modules/,
      include: [
        path.join(UI, 'shared', 'fonts')
      ],
    }, {
      test: /\.css$/,
      loader: 'style-loader!css-loader'
      // XXX: Commenting out breaks node_modules that use css
      //        i.e react-select.

      // exclude: /node_modules/,
      // include: [
      //   FRONTEND,
      //   UI
      // ]
    }]
  }
};

@@ -853,16 +853,18 @@
 errors'%5D
+()
 ,%0A    pl
@@ -878,16 +878,18 @@
 define'%5D
+()
 ,%0A    pl
@@ -902,16 +902,18 @@
 'shell'%5D
+()
 %0A  %5D,%0A  

fix missing plugins instantiation