const paths = require('../paths'); const webpack = require('webpack'); const CopyWebpackPlugin = require('copy-webpack-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const Dotenv = require('dotenv-webpack'); const plugins = [ '@babel/plugin-proposal-class-properties', '@babel/plugin-syntax-dynamic-import', '@babel/plugin-transform-runtime' ]; if (process.env.NODE_ENV === 'development') { plugins.push('react-refresh/babel'); } const babelLoader = { loader: 'babel-loader', options: { presets: [ // "react-app", '@babel/preset-env', '@babel/preset-react', ], plugins: plugins } }; module.exports = { entry: `${paths.src}/index.js`, output: { path: paths.build, filename: '[name].bundle.js', publicPath: '/', // publicPath: 'https://itguild.info', asyncChunks: true, clean: true, crossOriginLoading: 'anonymous', module: true, environment: { arrowFunction: true, bigIntLiteral: false, const: true, destructuring: true, dynamicImport: false, forOf: true } }, resolve: { alias: { '@': `${paths.src}/modules` }, extensions: ['.mjs', '.js', '.jsx', '.ts', '.tsx', '.json'] }, experiments: { topLevelAwait: true, outputModule: true }, module: { rules: [ // JavaScript, React { test: /\.m?jsx?$/i, exclude: /node_modules/, use: babelLoader }, // TypeScript { test: /.tsx?$/i, exclude: /node_modules/, use: [babelLoader, 'ts-loader'] }, // CSS, SASS { test: /\.(c|sa|sc)ss$/i, use: [ 'style-loader', { loader: 'css-loader', options: {importLoaders: 1} }, 'sass-loader' ] }, // MD { test: /\.md$/i, use: ['html-loader', 'markdown-loader'] }, // static files { test: /\.(jpe?g|png|gif|svg|eot|ttf|woff2|woff?)$/i, type: 'asset/resource' } ] }, plugins: [ new webpack.ProgressPlugin(), new CopyWebpackPlugin({ patterns: [ { from: `${paths.public}`, globOptions: { ignore: ["**/index.html"] } } ] }), new HtmlWebpackPlugin({ template: `${paths.public}/index.html`, // filename: 'index.html', }), new webpack.ProvidePlugin({ React: 'react' }), new Dotenv({ path: '.env' }) ] };