blob: 0b67ce923af740a84e49ece6c9834ccd62ed8aef [file] [log] [blame]
Adrien Béraud824a7132021-04-17 17:25:27 -04001'use strict'
Adrien Béraude74741b2021-04-19 13:22:54 -04002
3import dotenv from 'dotenv'
4dotenv.config({ path: resolve(import.meta.url, '..', '.env') })
5
6import { resolve } from 'path'
7import HtmlWebpackPlugin from 'html-webpack-plugin'
Adrien Béraud150b4782021-04-21 19:40:59 -04008import CopyWebpackPlugin from 'copy-webpack-plugin'
Adrien Béraude74741b2021-04-19 13:22:54 -04009
10import { fileURLToPath } from 'url';
11import { dirname } from 'path';
12const __filename = fileURLToPath(import.meta.url);
13const __dirname = dirname(__filename);
Adrien Béraud824a7132021-04-17 17:25:27 -040014const mode = process.env.NODE_ENV || 'development'
15
Adrien Béraude74741b2021-04-19 13:22:54 -040016let entry = [resolve(__dirname, 'src', 'index.js')]
Adrien Béraud150b4782021-04-21 19:40:59 -040017let plugins = [
18 new HtmlWebpackPlugin({template: resolve(__dirname, 'src', 'index.ejs')}),
19 new CopyWebpackPlugin({
20 patterns: [{ from: resolve(__dirname, 'public'), to: resolve(__dirname, 'dist') }]
21 })
22]
Adrien Béraud824a7132021-04-17 17:25:27 -040023let devtool = undefined
Adrien Béraude74741b2021-04-19 13:22:54 -040024let babelLoaderPlugins = ["@babel/plugin-transform-runtime"]
Adrien Béraud824a7132021-04-17 17:25:27 -040025
26if (mode === 'development') {
Adrien Béraude74741b2021-04-19 13:22:54 -040027 const webpack = (await import('webpack')).default
28 const ReactRefreshWebpackPlugin = (await import('@pmmmwh/react-refresh-webpack-plugin')).default
29 entry = ['webpack-hot-middleware/client', ...entry]
30 plugins = [new webpack.HotModuleReplacementPlugin(), new ReactRefreshWebpackPlugin(), ...plugins]
31 babelLoaderPlugins = [...babelLoaderPlugins, "react-refresh/babel"]
Adrien Béraud824a7132021-04-17 17:25:27 -040032 devtool = 'inline-source-map'
33}
34console.log(`Webpack configured for ${mode}`)
Adrien Béraudc4dd44a2021-04-08 01:05:24 -040035
Adrien Béraude74741b2021-04-19 13:22:54 -040036export default {
Adrien Béraud824a7132021-04-17 17:25:27 -040037 entry,
Adrien Béraudc4dd44a2021-04-08 01:05:24 -040038 output: {
Adrien Béraude74741b2021-04-19 13:22:54 -040039 path: resolve(__dirname, 'dist'),
Adrien Béraudc4dd44a2021-04-08 01:05:24 -040040 filename: 'bundle.js',
41 publicPath: '/'
42 },
Adrien Béraud824a7132021-04-17 17:25:27 -040043 devtool,
44 mode,
Adrien Béraudc4dd44a2021-04-08 01:05:24 -040045 module: {
46 rules: [
47 {
48 test: /\.jsx?/,
Adrien Béraude74741b2021-04-19 13:22:54 -040049 resolve: {
50 fullySpecified: false
51 },
Adrien Béraudc4dd44a2021-04-08 01:05:24 -040052 exclude: /node_modules/,
53 use: {
54 loader: 'babel-loader',
55 options: {
Adrien Béraude74741b2021-04-19 13:22:54 -040056 plugins: babelLoaderPlugins,
57 presets: [
58 ['@babel/preset-env', {
59 useBuiltIns: 'entry',
60 corejs:{ version: "3.10", proposals: true },
61 }],
62 '@babel/preset-react']
Adrien Béraudc4dd44a2021-04-08 01:05:24 -040063 }
64 }
65 },
66 {
Adrien Béraudfe56ba32021-04-08 00:32:11 -040067 test: /\.s[ac]ss$/i,
68 use: ['style-loader', 'css-loader', 'sass-loader'],
Adrien Béraudc4dd44a2021-04-08 01:05:24 -040069 }
70 ]
71 },
Adrien Béraud824a7132021-04-17 17:25:27 -040072 plugins
Adrien Béraudc4dd44a2021-04-08 01:05:24 -040073}