const path = require('path'); const TerserPlugin = require('terser-webpack-plugin'); const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); module.exports = ({ config, mode }) => { const isProductionBuild = mode === 'PRODUCTION'; config.module.rules = [ ...(config.module.rules || []), { test: /\.tsx?$/, use: [ { loader: require.resolve('ts-loader'), options: { // transpileOnly: true, configFile: path.resolve(__dirname, 'tsconfig.json'), }, }, { loader: require.resolve('react-docgen-typescript-loader'), options: { tsconfigPath: path.resolve(__dirname, 'tsconfig.json'), // https://github.com/styleguidist/react-docgen-typescript#parseroptions // @ts-ignore propFilter: prop => { if (prop.parent) { return !prop.parent.fileName.includes('node_modules/@types/react/'); } return true; }, }, }, ], }, ]; config.module.rules.push({ test: /\.scss$/, use: [ { loader: 'style-loader', options: { injectType: 'lazyStyleTag' }, }, { loader: 'css-loader', options: { importLoaders: 2, }, }, { loader: 'postcss-loader', options: { sourceMap: false, config: { path: __dirname + '../../../../scripts/webpack/postcss.config.js' }, }, }, { loader: 'sass-loader', options: { sourceMap: false, }, }, ], }); config.module.rules.push({ test: require.resolve('jquery'), use: [ { loader: 'expose-loader', query: 'jQuery', }, { loader: 'expose-loader', query: '$', }, ], }); config.optimization = { nodeEnv: 'production', moduleIds: 'hashed', runtimeChunk: 'single', splitChunks: { chunks: 'all', minChunks: 1, cacheGroups: { vendors: { test: /[\\/]node_modules[\\/].*[jt]sx?$/, chunks: 'initial', priority: -10, reuseExistingChunk: true, enforce: true, }, default: { priority: -20, chunks: 'all', test: /.*[jt]sx?$/, reuseExistingChunk: true, }, }, }, minimize: isProductionBuild, minimizer: isProductionBuild ? [ new TerserPlugin({ cache: false, parallel: false, sourceMap: false, exclude: /monaco/ }), new OptimizeCSSAssetsPlugin({}), ] : [], }; config.resolve.extensions.push('.ts', '.tsx', '.mdx'); config.stats = { warningsFilter: /export .* was not found in/, }; return config; };