const path = require('path');
const webpack = require('webpack');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const nodeExternals = require('webpack-node-externals');

if (process.env.NODE_ENV == null) {
    process.env.NODE_ENV = 'development';
}
const ENV = process.env.ENV = process.env.NODE_ENV;

const moduleRules = [
    {
        test: /\.ts$/,
        enforce: 'pre',
        loader: 'tslint-loader',
    },
    {
        test: /\.ts$/,
        loaders: ['ts-loader'],
        exclude: path.resolve(__dirname, 'node_modules'),
    },
];

const plugins = [
    new CleanWebpackPlugin([
        path.resolve(__dirname, 'build/*'),
    ]),
    new CopyWebpackPlugin([
        { from: './src/locales', to: 'locales' },
    ]),
    new webpack.DefinePlugin({
        'process.env.BWCLI_ENV': JSON.stringify(ENV),
    }),
    new webpack.BannerPlugin({
        banner: '#!/usr/bin/env node',
        raw: true
    }),
    new webpack.IgnorePlugin(/^encoding$/, /node-fetch/),
];

const config = {
    mode: ENV,
    target: 'node',
    devtool: ENV === 'development' ? 'eval-source-map' : 'source-map',
    node: {
        __dirname: false,
        __filename: false,
    },
    entry: {
        'bw': './src/bw.ts',
    },
    optimization: {
        minimize: false,
    },
    resolve: {
        extensions: ['.ts', '.js'],
        alias: {
            jslib: path.join(__dirname, 'jslib/src'),
            // ref: https://github.com/bitinn/node-fetch/issues/493
            'node-fetch$': 'node-fetch/lib/index.js',
        },
        symlinks: false,
        modules: [path.resolve('node_modules')],
    },
    output: {
        filename: '[name].js',
        path: path.resolve(__dirname, 'build'),
    },
    module: { rules: moduleRules },
    plugins: plugins,
    externals: [nodeExternals()],
};

module.exports = config;