aboutsummaryrefslogtreecommitdiffstats
path: root/webpack.config.js
blob: d2bf5aace9b0908814efd0f4538eb52e49163006 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
const path = require("path")
const HtmlWebpackPlugin = require("html-webpack-plugin");
const CopyPlugin = require('copy-webpack-plugin');
const webpack = require("webpack")

module.exports = (env) => {
  return {
    entry: "./src/index.tsx",
    mode: env,
    output: {
      path: path.resolve(__dirname, "build"),
      filename: "[name].[contenthash].bundle.js",
      publicPath: "/",
      devtoolModuleFilenameTemplate: "file:///" + path.resolve(__dirname, "[resource-path]?[loaders]")
    },
    optimization: {
      splitChunks: {
        chunks: 'all',
        maxSize: 204800,
      }
    },
    resolve: {
      extensions: ['.js', '.jsx', '.ts', '.tsx']
    },
    module: {
      rules: [
        {
          test: /\.m?js$/,
          exclude: /(node_modules|bower_components)/,
          use: {
            loader: "swc-loader",
            options: {
              jsc: {
                parser: {
                  syntax: "ecmascript",
                  jsx: true,
                  dynamicImport: true
                },
                transform: {
                  react: {
                    pragma: "React.createElement",
                    pragmaFrag: "React.Fragment",
                    throwIfNamespace: true,
                    development: false,
                    useBuiltins: false
                  }
                }
              }
            }
          }
        },
        {
          test: /\.tsx?$/,
          exclude: /(node_modules|bower_components)/,
          use: {
            loader: "swc-loader",
            options: {
              jsc: {
                parser: {
                  syntax: "typescript",
                  tsx: true,
                  dynamicImport: true
                }
              }
            }
          }
        },
        {
          test: /\.svg$/,
          loader: '@svgr/webpack'
        }
      ]
    },
    devServer: {
      contentBase: path.join(__dirname, 'public'),
      compress: true,
      port: 3000,
      historyApiFallback: true,
    },
    plugins: [
      new CopyPlugin({
        patterns: [
          { from: 'public', to: '.' },
        ],
      }),
      new webpack.EnvironmentPlugin({
        NODE_ENV: "production",
        REACT_APP_SHA: "development",
        REACT_APP_SENTRY_DSN: "https://[email protected]/1234",
        REACT_APP_BRANCH: "development",
        REACT_APP_OAUTH2_CLIENT_ID: "0",
        BACKEND_URL: "https://forms-api.pythondiscord.com/"
      }),
      new HtmlWebpackPlugin({
        inject: true,
        template: 'public/index.html'
      })
    ]
  }
}