/**
 * Webpack configuration for building unit tests
 */
 /* eslint-disable @typescript-eslint/no-var-requires */
var path = require('path');
var webpack = require('webpack');

module.exports = () => {
    const statsConfig = {
        builtAt: true,
        children: false,
        chunks: false,
        chunkGroups: false,
        chunkModules: false,
        chunkOrigins: false,
        colors: true,
        entrypoints: true,
    }

    return {
        plugins: [
            new webpack.DefinePlugin({
                'process.env.NODE_ENV': "\"development\"",
            }),
            new webpack.ProvidePlugin({
                // Automtically detect jQuery and $ as free var in modules
                // and inject the jquery library
                // This is required by many jquery plugins
                // http://stackoverflow.com/questions/29080148/expose-jquery-to-real-window-object-with-webpack
                jquery: "jquery",
                jQuery: "jquery",
                $: "jquery",
            }),
        ],
        entry: "./test/index.js",
        target: "web",
        devtool: "source-map",
        output: {
            path: path.resolve(__dirname, "./"),
            filename: "test/test.bundle.js",
        },
        module: {
            rules: [
                {
                    test: /\.tsx?$/,
                    loader: 'ts-loader',
                    exclude: /node_modules/,
                },
                {
                    test: /\.(jsx)$/,
                    exclude: /node_modules/,
                    use: {
                      loader: "babel-loader",
                    },
                },
                {
                    test: /\.s?css$/,
                    loader: 'null-loader',
                },
            ],
        },
        optimization: {
            removeAvailableModules: true,
            removeEmptyChunks: true,
            mergeDuplicateChunks: true,
            flagIncludedChunks: true,
            occurrenceOrder: true,
            sideEffects: true,
            providedExports: true,
            usedExports: true,
            concatenateModules: false,
            namedModules: false,
            namedChunks: false,
            minimize: false,
            portableRecords: true,
            splitChunks: {
                cacheGroups: {
                    vendor: {
                        test: /[\\/]node_modules[\\/]/,
                        name: `tests/vendor`,
                        chunks: 'all',
                    },
                },
            },
        },
        resolve: {
            extensions: [
                ".tsx",
                ".ts",
                ".js",
                ".jsx",
            ],
        },
        stats: statsConfig,
    };
};