const path = require('path');
const { merge } = require('webpack-merge');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const nodeExternals = require('webpack-node-externals');
const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');

const NODE_ENV = process.env.NODE_ENV == null ? 'development' : process.env.NODE_ENV;

const common = {
    module: {
        rules: [
            {
                test: /\.ts$/,
                enforce: 'pre',
                loader: 'tslint-loader',
            },
            {
                test: /\.tsx?$/,
                use: 'ts-loader',
                exclude: /node_modules\/(?!(@bitwarden)\/).*/,
            },
        ],
    },
    plugins: [],
    resolve: {
        extensions: ['.tsx', '.ts', '.js'],
        plugins: [new TsconfigPathsPlugin({ configFile: './tsconfig.json' })]
    },
};

const prod = {
    output: {
        filename: '[name].js',
        path: path.resolve(__dirname, 'build'),
    },
};

const dev = {
    output: {
        filename: '[name].js',
        path: path.resolve(__dirname, 'build'),
        devtoolModuleFilenameTemplate: '[absolute-resource-path]',
    },
    devtool: 'cheap-source-map'
}

const main = {
    mode: NODE_ENV,
    target: 'electron-main',
    node: {
        __dirname: false,
        __filename: false,
    },
    entry: {
        'main': './src/entry.ts',
    },
    optimization: {
        minimize: false,
    },
    module: {
        rules: [
            {
                test: /\.node$/,
                loader: 'node-loader',
            },
        ],
    },
    plugins: [
        new CleanWebpackPlugin(),
        new CopyWebpackPlugin({
            patterns: [
                './src/package.json',
                { from: './src/images', to: 'images' },
                { from: './src/locales', to: 'locales' },
            ]
        }),
    ],
    externals: [nodeExternals()],
};

module.exports = merge(common, NODE_ENV === 'development' ? dev : prod, main);