176 lines
4.1 KiB
JavaScript
176 lines
4.1 KiB
JavaScript
|
/* eslint-disable @typescript-eslint/no-var-requires */
|
||
|
// shared config (dev and prod)
|
||
|
const { resolve } = require('path');
|
||
|
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
||
|
const { sentryWebpackPlugin } = require('@sentry/webpack-plugin');
|
||
|
const portFinderSync = require('portfinder-sync');
|
||
|
const dotenv = require('dotenv');
|
||
|
const webpack = require('webpack');
|
||
|
const TsconfigPathsPlugin = require('tsconfig-paths-webpack-plugin');
|
||
|
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
|
||
|
|
||
|
dotenv.config();
|
||
|
|
||
|
console.log(resolve(__dirname, './src/'));
|
||
|
|
||
|
const cssLoader = 'css-loader';
|
||
|
const sassLoader = 'sass-loader';
|
||
|
const styleLoader = 'style-loader';
|
||
|
|
||
|
const plugins = [
|
||
|
new HtmlWebpackPlugin({
|
||
|
template: 'src/index.html.ejs',
|
||
|
INTERCOM_APP_ID: process.env.INTERCOM_APP_ID,
|
||
|
SEGMENT_ID: process.env.SEGMENT_ID,
|
||
|
POSTHOG_KEY: process.env.POSTHOG_KEY,
|
||
|
CLARITY_PROJECT_ID: process.env.CLARITY_PROJECT_ID,
|
||
|
SENTRY_AUTH_TOKEN: process.env.SENTRY_AUTH_TOKEN,
|
||
|
SENTRY_ORG: process.env.SENTRY_ORG,
|
||
|
SENTRY_PROJECT_ID: process.env.SENTRY_PROJECT_ID,
|
||
|
SENTRY_DSN: process.env.SENTRY_DSN,
|
||
|
TUNNEL_URL: process.env.TUNNEL_URL,
|
||
|
TUNNEL_DOMAIN: process.env.TUNNEL_DOMAIN,
|
||
|
}),
|
||
|
new webpack.ProvidePlugin({
|
||
|
process: 'process/browser',
|
||
|
}),
|
||
|
new webpack.DefinePlugin({
|
||
|
'process.env': JSON.stringify({
|
||
|
NODE_ENV: process.env.NODE_ENV,
|
||
|
FRONTEND_API_ENDPOINT: process.env.FRONTEND_API_ENDPOINT,
|
||
|
INTERCOM_APP_ID: process.env.INTERCOM_APP_ID,
|
||
|
SEGMENT_ID: process.env.SEGMENT_ID,
|
||
|
POSTHOG_KEY: process.env.POSTHOG_KEY,
|
||
|
CLARITY_PROJECT_ID: process.env.CLARITY_PROJECT_ID,
|
||
|
SENTRY_AUTH_TOKEN: process.env.SENTRY_AUTH_TOKEN,
|
||
|
SENTRY_ORG: process.env.SENTRY_ORG,
|
||
|
SENTRY_PROJECT_ID: process.env.SENTRY_PROJECT_ID,
|
||
|
SENTRY_DSN: process.env.SENTRY_DSN,
|
||
|
TUNNEL_URL: process.env.TUNNEL_URL,
|
||
|
TUNNEL_DOMAIN: process.env.TUNNEL_DOMAIN,
|
||
|
}),
|
||
|
}),
|
||
|
sentryWebpackPlugin({
|
||
|
authToken: process.env.SENTRY_AUTH_TOKEN,
|
||
|
org: process.env.SENTRY_ORG,
|
||
|
project: process.env.SENTRY_PROJECT_ID,
|
||
|
}),
|
||
|
];
|
||
|
|
||
|
if (process.env.BUNDLE_ANALYSER === 'true') {
|
||
|
plugins.push(new BundleAnalyzerPlugin({ analyzerMode: 'server' }));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @type {import('webpack').Configuration}
|
||
|
*/
|
||
|
const config = {
|
||
|
mode: 'development',
|
||
|
devtool: 'source-map',
|
||
|
entry: resolve(__dirname, './src/index.tsx'),
|
||
|
devServer: {
|
||
|
historyApiFallback: {
|
||
|
disableDotRule: true,
|
||
|
},
|
||
|
open: true,
|
||
|
hot: true,
|
||
|
liveReload: true,
|
||
|
port: portFinderSync.getPort(3301),
|
||
|
static: {
|
||
|
directory: resolve(__dirname, 'public'),
|
||
|
publicPath: '/',
|
||
|
watch: true,
|
||
|
},
|
||
|
allowedHosts: 'all',
|
||
|
},
|
||
|
target: 'web',
|
||
|
output: {
|
||
|
path: resolve(__dirname, './build'),
|
||
|
publicPath: '/',
|
||
|
},
|
||
|
resolve: {
|
||
|
extensions: ['.ts', '.tsx', '.js', '.jsx'],
|
||
|
plugins: [new TsconfigPathsPlugin({})],
|
||
|
fallback: { 'process/browser': require.resolve('process/browser') },
|
||
|
},
|
||
|
module: {
|
||
|
rules: [
|
||
|
{
|
||
|
test: [/\.jsx?$/, /\.tsx?$/],
|
||
|
use: ['babel-loader'],
|
||
|
exclude: /node_modules/,
|
||
|
},
|
||
|
// Add a rule for Markdown files using raw-loader
|
||
|
{
|
||
|
test: /\.md$/,
|
||
|
use: 'raw-loader',
|
||
|
},
|
||
|
{
|
||
|
test: /\.css$/,
|
||
|
use: [
|
||
|
styleLoader,
|
||
|
{
|
||
|
loader: cssLoader,
|
||
|
options: {
|
||
|
modules: true,
|
||
|
},
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
{
|
||
|
test: /\.(jpe?g|png|gif|svg)$/i,
|
||
|
use: [
|
||
|
'file-loader?hash=sha512&digest=hex&name=img/[chunkhash].[ext]',
|
||
|
'image-webpack-loader?bypassOnDebug&optipng.optimizationLevel=7&gifsicle.interlaced=false',
|
||
|
],
|
||
|
},
|
||
|
{
|
||
|
test: /\.(ttf|eot|woff|woff2)$/,
|
||
|
use: ['file-loader'],
|
||
|
},
|
||
|
{
|
||
|
test: /\.less$/i,
|
||
|
use: [
|
||
|
{
|
||
|
loader: styleLoader,
|
||
|
},
|
||
|
{
|
||
|
loader: cssLoader,
|
||
|
options: {
|
||
|
modules: true,
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
loader: 'less-loader',
|
||
|
options: {
|
||
|
lessOptions: {
|
||
|
javascriptEnabled: true,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
{
|
||
|
test: /\.s[ac]ss$/i,
|
||
|
use: [
|
||
|
// Creates `style` nodes from JS strings
|
||
|
styleLoader,
|
||
|
// Translates CSS into CommonJS
|
||
|
cssLoader,
|
||
|
// Compiles Sass to CSS
|
||
|
sassLoader,
|
||
|
],
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
plugins,
|
||
|
performance: {
|
||
|
hints: false,
|
||
|
},
|
||
|
optimization: {
|
||
|
minimize: false,
|
||
|
},
|
||
|
};
|
||
|
|
||
|
module.exports = config;
|