summaryrefslogtreecommitdiff
path: root/webpack.config.ts
blob: 1f7058623bf1e0b8e99585a13f9aca270fb6037a (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
101
102
103
104
105
106
107
108
109
110
111
112
113
/// <reference types="./source/globals.js" />

import path from 'node:path';
import TerserPlugin from 'terser-webpack-plugin';
import CopyWebpackPlugin from 'copy-webpack-plugin';
import webpack, {Configuration} from 'webpack';
import MiniCssExtractPlugin from 'mini-css-extract-plugin';

const config: Configuration = {
	devtool: false, // Only inline source maps work in extensions, but they would slow down the extension for everyone
	stats: {
		preset: 'errors-warnings',
		entrypoints: true,
		timings: true,
	},
	performance: {
		hints: false,
	},
	entry: Object.fromEntries([
		'refined-github',
		'background',
		'options',
		'resolve-conflicts',
	].map(name => [name, `./${name}.js`])),
	context: path.resolve('source'),
	output: {
		path: path.resolve('distribution/assets'),
	},
	module: {
		rules: [
			{
				test: /\.gql/,
				type: 'asset/source',
			},
			{
				test: /[/\\]readme\.md$/,
				loader: '../build/readme.loader.ts',
			},
			{
				test: /\.tsx?$/,
				loader: 'esbuild-loader',
				options: {
					loader: 'tsx',
					target: 'es2022',
				},
			},
			{
				test: /\.css$/,
				use: [
					MiniCssExtractPlugin.loader,
					'css-loader',
				],
			},
		],
	},
	plugins: [
		new MiniCssExtractPlugin(),
		new webpack.ProvidePlugin({
			browser: 'webextension-polyfill',
		}),
		new CopyWebpackPlugin({
			patterns: [{
				// Keep only the manifest in the root
				from: 'manifest.json',
				to: '..',
			}, {
				from: '*.+(html|png)',
			}],
		}),
	],
	resolve: {
		alias: {
			react: 'dom-chef',
		},
		extensions: [
			'.js',
		],
		extensionAlias: {
			// Explanation: https://www.npmjs.com/package/resolve-typescript-plugin
			'.js': ['.ts', '.tsx', '.js'],
		},
	},
	optimization: {
		// Keeps it somewhat readable
		minimizer: [
			new TerserPlugin({
				parallel: false, // https://github.com/esbuild-kit/tsx/issues/87#issuecomment-1226117760
				terserOptions: {
					mangle: false,
					compress: {
						sequences: false,
						conditionals: false,
					},
					output: {
						beautify: true,
						indent_level: 2,
					},
				},
			}),
		],
	},
};

if (process.env.CI) {
	config.stats = {
		assets: true,
		entrypoints: true,
		chunks: true,
		modules: true,
	};
}

export default config;