const path = require('path'); const { merge } = require('webpack-merge'); const CopyWebpackPlugin = require('copy-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const CssMinimizerPlugin = require('css-minimizer-webpack-plugin'); const TerserPlugin = require('terser-webpack-plugin'); const devMode = process.env.NODE_ENV !== 'production'; const baseConfig = { context: path.resolve(__dirname, 'src'), entry: { app: './index.tsx' }, output: { path: path.resolve(__dirname, 'dist'), filename: devMode ? '[name].js' : '[name].[contenthash].js', }, module: { rules: [ { test: /\.ts$/, enforce: 'pre', use: 'tslint-loader', }, { test: /\.tsx?$/, use: 'ts-loader', exclude: /node_modules/ }, { test: /\.s?[ac]ss$/, use: [ devMode ? 'style-loader' : MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader', ], }, { test: /xterm-addon-image-worker/, type: 'asset/inline', generator: { dataUrl: content => { return content.toString(); } } }, ] }, resolve: { extensions: [ '.tsx', '.ts', '.js' ] }, plugins: [ new CopyWebpackPlugin({ patterns:[ { from: './favicon.png', to: '.' } ], }), new MiniCssExtractPlugin({ filename: devMode ? '[name].css' : '[name].[contenthash].css', chunkFilename: devMode ? '[id].css' : '[id].[contenthash].css', }), new HtmlWebpackPlugin({ inject: false, minify: { removeComments: true, collapseWhitespace: true, }, title: 'ttyd - Terminal', template: './template.html' }) ], performance : { hints : false }, }; const devConfig = { mode: 'development', devServer: { contentBase: path.join(__dirname, 'dist'), compress: true, port: 9000, proxy: [{ context: ['/token', '/ws'], target: 'http://localhost:7681', ws: true }] }, devtool: 'inline-source-map', }; const prodConfig = { mode: 'production', optimization: { minimizer: [ new TerserPlugin(), new CssMinimizerPlugin(), ] }, devtool: 'source-map', }; module.exports = merge(baseConfig, devMode ? devConfig : prodConfig);