blob: 66d241e4d98a1f12c19b8c58b15c6b0e02876461 [file] [log] [blame]
Adrià Vilanova Martínez413cb442021-09-06 00:30:45 +02001const webpack = require('webpack');
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +02002const path = require('path');
3const json5 = require('json5');
4const CopyWebpackPlugin = require('copy-webpack-plugin');
Adrià Vilanova Martínez6b560432022-10-23 20:26:17 +02005const TerserPlugin = require('terser-webpack-plugin');
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +02006const WebpackShellPluginNext = require('webpack-shell-plugin-next');
7
Adrià Vilanova Martínez43d0a7b2021-08-28 01:21:17 +02008// Pontoon uses their own locale set. This array lets us convert those locales
9// to the ones accepted by Chrome, Firefox, etc.
10const localeOverrides = [
11 {
12 pontoonLocale: 'pt-rBR',
Adrià Vilanova Martínez7f9540d2022-02-17 22:05:14 +010013 webExtLocale: 'pt_BR',
14 },
15 {
16 pontoonLocale: 'pt-rBR',
17 webExtLocale: 'pt_PT',
Adrià Vilanova Martínez43d0a7b2021-08-28 01:21:17 +020018 },
19];
20
21const getCopyPluginsForOverridenLocales = outputPath => {
22 return localeOverrides.map(l => {
23 return new CopyWebpackPlugin({
24 patterns: [
25 {
26 from: path.join(__dirname, 'src/static/_locales/' + l.pontoonLocale),
27 to: path.join(outputPath, '_locales/' + l.webExtLocale),
28 globOptions: {
29 ignore: ['**/OWNERS', '**.md'],
30 }
31 },
32 ]
33 });
34 });
35};
36
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +020037module.exports = (env, args) => {
Adrià Vilanova Martínez2df2f242022-03-01 22:25:27 +010038 // NOTE: When adding an entry, add the corresponding source map file to
39 // web_accessible_resources in //templates/manifest.gjson.
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +020040 let entry = {
41 // Content scripts
42 communityConsoleMain: './src/contentScripts/communityConsole/main.js',
43 communityConsoleStart: './src/contentScripts/communityConsole/start.js',
44 publicForum: './src/contentScripts/publicForum.js',
45 publicThread: './src/contentScripts/publicThread.js',
Adrià Vilanova Martíneza2f79512022-07-10 15:32:32 +020046 publicThreadStart: './src/contentScripts/publicThreadStart.js',
avm9996337601bc2022-02-21 10:36:45 +010047 publicProfile: './src/contentScripts/publicProfile.js',
48 publicProfileStart: './src/contentScripts/publicProfileStart.js',
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +020049 profileIndicator: './src/contentScripts/profileIndicator.js',
50
Adrià Vilanova Martínez5f5b3e02023-07-23 00:08:17 +020051 // Programatically injected content scripts
52 handleInstall: './src/contentScripts/communityConsole/handleInstall.js',
53 handleUpdate: './src/contentScripts/communityConsole/handleUpdate.js',
54
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +020055 // Injected JS
56 profileIndicatorInject: './src/injections/profileIndicator.js',
57 batchLockInject: './src/injections/batchLock.js',
Adrià Vilanova Martínez4757ae82022-12-28 16:41:37 +010058 xhrInterceptorInject: './src/injections/xhrProxy.js',
Adrià Vilanova Martínez4f56d562022-01-26 00:23:27 +010059 extraInfoInject: './src/injections/extraInfo.js',
Adrià Vilanova Martínez2d9be8d2022-12-28 00:50:14 +010060 litComponentsInject: './src/injections/litComponentsInject.js',
Adrià Vilanova Martínez5f5b3e02023-07-23 00:08:17 +020061 updateHandlerLitComponents:
62 './src/injections/updateHandlerLitComponents.js',
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +020063
64 // Options page
Adrià Vilanova Martínez09f35be2021-09-06 19:50:09 +020065 optionsCommon: './src/options/optionsCommon.js',
avm999632485a3e2021-09-08 22:18:38 +020066
Adrià Vilanova Martínezf276ac72022-10-13 22:16:22 +020067 // Workflow manager
68 workflowManager: './src/workflows/manager/index.js',
69
avm999632485a3e2021-09-08 22:18:38 +020070 // Common CSS
71 mdcStyles: './src/mdc/index.js',
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +020072 };
73
74 // Background script (or service worker for MV3)
Adrià Vilanova Martínez54fbad12022-01-04 03:39:04 +010075 entry.bg = './src/bg.js';
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +020076
77 let outputPath = path.join(__dirname, 'dist', env.browser_target);
78
Adrià Vilanova Martínez43d0a7b2021-08-28 01:21:17 +020079 let overridenLocalePaths =
80 localeOverrides.map(l => '**/_locales/' + l.pontoonLocale);
81
Adrià Vilanova Martíneza4dd5fd2022-01-05 04:23:44 +010082 let preprocessorLoader = {
83 loader: 'webpack-preprocessor-loader',
84 options: {
85 params: {
86 browser_target: env.browser_target,
87 production: args.mode == 'production',
Adrià Vilanova Martínez0335b512022-01-21 13:34:59 +010088 canary: !!env.canary
Adrià Vilanova Martíneza4dd5fd2022-01-05 04:23:44 +010089 },
90 },
91 };
92
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +020093 return {
94 entry,
95 output: {
96 filename: '[name].bundle.js',
97 path: outputPath,
Adrià Vilanova Martínez85424b62021-07-11 21:52:00 +020098 clean: true,
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +020099 },
100 plugins: [
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +0200101 new WebpackShellPluginNext({
Adrià Vilanova Martíneza03d03a2023-03-11 23:30:07 +0100102 onBuildStart: {
103 scripts: ['make lit_localize_build'],
104 blocking: true,
105 },
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +0200106 onBuildEnd: {
107 scripts:
avm99963efce2102021-03-23 23:23:26 +0100108 ['genmanifest -template templates/manifest.gjson -dest ' +
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +0200109 path.join(outputPath, 'manifest.json') + ' ' +
110 env.browser_target]
111 }
112 }),
113 new CopyWebpackPlugin({
114 patterns: [
115 {
Adrià Vilanova Martínez9aa29312022-01-16 02:42:46 +0100116 from: path.join(
117 __dirname, 'src/icons', env.canary ? 'canary' : 'regular'),
118 to: path.join(outputPath, 'icons'),
119 },
120 ]
121 }),
122 new CopyWebpackPlugin({
123 patterns: [
124 {
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +0200125 from: path.join(__dirname, 'src/static'),
126 to: outputPath,
127 globOptions: {
Adrià Vilanova Martínez43d0a7b2021-08-28 01:21:17 +0200128 ignore: ['**/OWNERS', '**.md', ...overridenLocalePaths],
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +0200129 }
130 },
131 ]
132 }),
Adrià Vilanova Martínez413cb442021-09-06 00:30:45 +0200133 new webpack.DefinePlugin({
134 'PRODUCTION': args.mode == 'production',
135 }),
Adrià Vilanova Martínez43d0a7b2021-08-28 01:21:17 +0200136 ...getCopyPluginsForOverridenLocales(outputPath),
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +0200137 ],
Adrià Vilanova Martínez2df2f242022-03-01 22:25:27 +0100138 devtool: (args.mode == 'production' ? 'source-map' : 'inline-source-map'),
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +0200139 module: {
140 rules: [
141 {
avm999632485a3e2021-09-08 22:18:38 +0200142 test: /\.json5$/i,
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +0200143 type: 'json',
144 parser: {
145 parse: json5.parse,
146 },
Adrià Vilanova Martíneza4dd5fd2022-01-05 04:23:44 +0100147 use: [
148 preprocessorLoader,
149 ],
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +0200150 },
avm999632485a3e2021-09-08 22:18:38 +0200151 {
152 test: /\.s[ac]ss$/i,
Adrià Vilanova Martínez5f5b3e02023-07-23 00:08:17 +0200153 oneOf: [
avm999632485a3e2021-09-08 22:18:38 +0200154 {
Adrià Vilanova Martínez5f5b3e02023-07-23 00:08:17 +0200155 resourceQuery: /string/,
156 use: [
157 'css-loader',
158 {
159 loader: 'sass-loader',
160 options: {
161 // Prefer `dart-sass`
162 implementation: require('sass'),
163 },
164 },
165 ],
166 },
167 {
168 use: [
169 'style-loader',
170 'css-loader',
171 {
172 loader: 'sass-loader',
173 options: {
174 // Prefer `dart-sass`
175 implementation: require('sass'),
176 },
177 },
178 ],
avm999632485a3e2021-09-08 22:18:38 +0200179 },
180 ],
181 },
Adrià Vilanova Martínez5120dbb2022-01-04 03:21:17 +0100182 {
183 test: /\.js$/i,
184 use: [
Adrià Vilanova Martíneza4dd5fd2022-01-05 04:23:44 +0100185 preprocessorLoader,
Adrià Vilanova Martínez5120dbb2022-01-04 03:21:17 +0100186 ],
187 },
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +0200188 ]
189 },
Adrià Vilanova Martínez6b560432022-10-23 20:26:17 +0200190 optimization: {
191 minimizer: [
192 new TerserPlugin({
193 terserOptions: {
194 format: {
Adrià Vilanova Martíneza03d03a2023-03-11 23:30:07 +0100195 ascii_only:
196 true, // Due to https://iavm.xyz/b/twpowertools/145#c1
Adrià Vilanova Martínez6b560432022-10-23 20:26:17 +0200197 },
198 },
199 }),
200 ],
201 },
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +0200202 };
203};