const path = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin') const MiniCssExtractPlugin = require('mini-css-extract-plugin') const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin') const {CleanWebpackPlugin} = require('clean-webpack-plugin') const webpack = require('webpack') const { GIT_SHA, STATIC_DIRECTORY, BASE_PATH, API_BASE_PATH, } = require('./src/utils/env') module.exports = { context: __dirname, output: { path: path.resolve(__dirname, 'build'), publicPath: BASE_PATH, webassemblyModuleFilename: `${STATIC_DIRECTORY}[modulehash:10].wasm`, sourceMapFilename: `${STATIC_DIRECTORY}[file].map[query]`, }, entry: { app: './src/bootstrap.ts', }, resolve: { alias: { src: path.resolve(__dirname, 'src'), react: path.resolve('./node_modules/react'), }, extensions: ['.tsx', '.ts', '.js', '.wasm'], }, node: { fs: 'empty', global: true, crypto: 'empty', tls: 'empty', net: 'empty', process: true, module: false, clearImmediate: false, setImmediate: true, }, module: { rules: [ { test: /flux_parser_bg.wasm$/, type: 'webassembly/experimental', }, { test: /^((?!flux_parser_bg|flux-lsp-browser_bg).)*.wasm$/, loader: 'file-loader', type: 'javascript/auto', }, { test: /\.tsx?$/, use: [ { loader: 'ts-loader', options: { transpileOnly: true, }, }, ], }, { test: /\.s?css$/i, use: [ MiniCssExtractPlugin.loader, 'css-loader', { loader: 'sass-loader', options: { implementation: require('sass'), hmr: true, }, }, ], }, { test: /\.(png|svg|jpg|gif)$/, use: [ { loader: 'file-loader', options: { name: `${STATIC_DIRECTORY}[contenthash:10].[ext]`, }, }, ], }, { test: /\.(woff|woff2|eot|ttf|otf)$/, use: [ { loader: 'file-loader', options: { name: `${STATIC_DIRECTORY}[contenthash:10].[ext]`, }, }, ], }, ], }, plugins: [ new CleanWebpackPlugin(), new HtmlWebpackPlugin({ filename: 'index.html', template: './assets/index.html', favicon: './assets/images/favicon.ico', inject: 'body', minify: { collapseWhitespace: true, removeComments: true, removeRedundantAttributes: true, removeScriptTypeAttributes: true, removeStyleLinkTypeAttributes: true, useShortDoctype: true, }, base: BASE_PATH.slice(0, -1), header: process.env.INJECT_HEADER || '', body: process.env.INJECT_BODY || '', }), new MiniCssExtractPlugin({ filename: `${STATIC_DIRECTORY}[contenthash:10].css`, chunkFilename: `${STATIC_DIRECTORY}[id].[contenthash:10].css`, }), new ForkTsCheckerWebpackPlugin(), new webpack.ProgressPlugin(), new webpack.EnvironmentPlugin({ ...process.env, GIT_SHA, API_PREFIX: API_BASE_PATH, STATIC_PREFIX: BASE_PATH, }), new MonacoWebpackPlugin({ languages: [], features: ['!gotoSymbol'], }), ], stats: { colors: true, children: false, modules: false, version: false, assetsSort: '!size', warningsFilter: [/export .* was not found in/, /'.\/locale' in/], excludeAssets: [/\.(hot-update|woff|eot|ttf|svg|ico|png)/], }, performance: {hints: false}, }