blob: 7da8fb5cfd0889c8e854d4a4a1d3b0c3838ee746 [file] [log] [blame]
Adrien Béraud824a7132021-04-17 17:25:27 -04001'use strict'
Adrien Béraude74741b2021-04-19 13:22:54 -04002
Adrien Béraude74741b2021-04-19 13:22:54 -04003import { fileURLToPath } from 'url';
4import { dirname } from 'path';
5const __filename = fileURLToPath(import.meta.url);
6const __dirname = dirname(__filename);
Adrien Béraud4e287b92021-04-24 16:15:56 -04007
8import dotenv from 'dotenv'
Adrien Béraud4e287b92021-04-24 16:15:56 -04009dotenv.config({ path: resolve(__dirname, '..', '.env') })
10
11import { resolve } from 'path'
12import HtmlWebpackPlugin from 'html-webpack-plugin'
13import CopyWebpackPlugin from 'copy-webpack-plugin'
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 = [
Adrien Béraude5cad982021-06-07 10:05:50 -040018 new HtmlWebpackPlugin({ template: '!!raw-loader!' + resolve(__dirname, 'src', 'index.ejs'), filename: 'index.ejs' }),
Adrien Béraud88a52442021-04-26 12:11:41 -040019 new CopyWebpackPlugin({
20 patterns: [{ from: resolve(__dirname, 'public'), to: resolve(__dirname, 'dist') }]
21 })
Adrien Béraud150b4782021-04-21 19:40:59 -040022]
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éraud88a52442021-04-26 12:11:41 -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"]
32 devtool = 'inline-source-map'
Adrien Béraud824a7132021-04-17 17:25:27 -040033}
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éraud88a52442021-04-26 12:11:41 -040037 entry,
38 output: {
idillond858c182022-09-16 13:18:26 -040039 path: resolve(__dirname, "dist"),
40 filename: "bundle.js",
41 publicPath: "/",
Adrien Béraud88a52442021-04-26 12:11:41 -040042 },
43 devtool,
44 mode,
45 module: {
46 rules: [
47 {
idillond858c182022-09-16 13:18:26 -040048 // test: /\.jsx?/,
49 test: /\.(js|jsx|ts|tsx)?$/,
Adrien Béraud88a52442021-04-26 12:11:41 -040050 resolve: {
idillond858c182022-09-16 13:18:26 -040051 fullySpecified: false,
Adrien Béraud88a52442021-04-26 12:11:41 -040052 },
53 exclude: /node_modules/,
54 use: {
idillond858c182022-09-16 13:18:26 -040055 loader: "babel-loader",
Adrien Béraud88a52442021-04-26 12:11:41 -040056 options: {
57 plugins: babelLoaderPlugins,
58 presets: [
idillond858c182022-09-16 13:18:26 -040059 [
60 "@babel/preset-env",
61 {
62 useBuiltIns: "entry",
63 corejs: { version: "3.10", proposals: true },
64 },
65 ],
66 [
67 "@babel/preset-react",
68 {
69 runtime: "automatic",
70 },
71 ],
72 ],
73 },
74 },
Adrien Béraud88a52442021-04-26 12:11:41 -040075 },
76 {
77 test: /\.s[ac]ss$/i,
idillond858c182022-09-16 13:18:26 -040078 use: ["style-loader", "css-loader", "sass-loader"],
Adrien Béraud88a52442021-04-26 12:11:41 -040079 },
80 {
81 test: /\.svg$/,
idillond858c182022-09-16 13:18:26 -040082 use: ["@svgr/webpack"],
83 },
84 {
85 // test: /\.tsx?$/,
86 test: /\.(js|jsx|ts|tsx)?$/,
87 exclude: /node_modules/,
88 loader: "ts-loader",
89 },
90 ],
Adrien Béraud88a52442021-04-26 12:11:41 -040091 },
idillond858c182022-09-16 13:18:26 -040092 resolve: {
93 modules: ["node_modules", resolve(__dirname)],
94 extensions: [".ts", ".tsx", ".js", ".jsx"],
95 },
96 plugins,
97};