blob: 23781a2e4aa47a73801d5a166de53e022c9daf66 [file] [log] [blame]
'use strict';
import CopyWebpackPlugin from 'copy-webpack-plugin';
import dotenv from 'dotenv';
import HtmlWebpackPlugin from 'html-webpack-plugin';
import { dirname, resolve } from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
dotenv.config({ path: resolve(__dirname, '..', '.env') });
const mode = process.env.NODE_ENV || 'development';
let entry = [resolve(__dirname, 'src', 'index.tsx')];
let plugins = [
new HtmlWebpackPlugin({
template: '!!raw-loader!' + resolve(__dirname, 'src', 'index.ejs'),
filename: 'index.ejs',
}),
new CopyWebpackPlugin({
patterns: [
{
from: resolve(__dirname, 'public'),
to: resolve(__dirname, 'dist'),
},
],
}),
];
let devtool = undefined;
let babelLoaderPlugins = ['@babel/plugin-transform-runtime'];
if (mode === 'development') {
const webpack = (await import('webpack')).default;
const ReactRefreshWebpackPlugin = (await import('@pmmmwh/react-refresh-webpack-plugin')).default;
entry = ['webpack-hot-middleware/client', ...entry];
plugins = [new webpack.HotModuleReplacementPlugin(), new ReactRefreshWebpackPlugin(), ...plugins];
babelLoaderPlugins = [...babelLoaderPlugins, 'react-refresh/babel'];
devtool = 'inline-source-map';
}
console.log(`Webpack configured for ${mode}`);
export default {
entry,
output: {
path: resolve(__dirname, 'dist'),
filename: 'bundle.js',
publicPath: '/',
},
devtool,
mode,
module: {
rules: [
{
test: /\.[tj]sx?$/,
resolve: {
fullySpecified: false,
extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
},
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
plugins: babelLoaderPlugins,
presets: [
[
'@babel/preset-env',
{
useBuiltIns: 'entry',
corejs: { version: '3.10', proposals: true },
},
],
[
'@babel/preset-react',
{
runtime: 'automatic',
},
],
['@babel/preset-typescript'],
],
},
},
},
{
test: /\.s[ac]ss$/i,
use: ['style-loader', 'css-loader', 'sass-loader'],
},
{
test: /\.svg$/,
use: ['@svgr/webpack'],
},
{
// test: /\.tsx?$/,
test: /\.(js|jsx|ts|tsx)?$/,
exclude: /node_modules/,
loader: 'ts-loader',
},
],
},
resolve: {
modules: ['node_modules', resolve(__dirname)],
extensions: ['.ts', '.tsx', '.js', '.jsx'],
},
plugins,
};