blob: c8c3fcc16e654a724a3ecbb2a772f262d01ec92b [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ínez1e10d192021-12-31 16:01:13 +01005const {VueLoaderPlugin} = require('vue-loader');
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) => {
38 let entry = {
39 // Content scripts
40 communityConsoleMain: './src/contentScripts/communityConsole/main.js',
41 communityConsoleStart: './src/contentScripts/communityConsole/start.js',
42 publicForum: './src/contentScripts/publicForum.js',
43 publicThread: './src/contentScripts/publicThread.js',
44 profile: './src/contentScripts/profile.js',
45 profileIndicator: './src/contentScripts/profileIndicator.js',
46
47 // Injected JS
48 profileIndicatorInject: './src/injections/profileIndicator.js',
49 batchLockInject: './src/injections/batchLock.js',
Adrià Vilanova Martínez43ec2b92021-07-16 18:44:54 +020050 xhrInterceptorInject: './src/injections/xhrInterceptor.js',
Adrià Vilanova Martínez4f56d562022-01-26 00:23:27 +010051 extraInfoInject: './src/injections/extraInfo.js',
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +020052
53 // Options page
Adrià Vilanova Martínez09f35be2021-09-06 19:50:09 +020054 optionsCommon: './src/options/optionsCommon.js',
avm999632485a3e2021-09-08 22:18:38 +020055
56 // Common CSS
57 mdcStyles: './src/mdc/index.js',
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +020058 };
59
60 // Background script (or service worker for MV3)
Adrià Vilanova Martínez54fbad12022-01-04 03:39:04 +010061 entry.bg = './src/bg.js';
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +020062
63 let outputPath = path.join(__dirname, 'dist', env.browser_target);
64
Adrià Vilanova Martínez43d0a7b2021-08-28 01:21:17 +020065 let overridenLocalePaths =
66 localeOverrides.map(l => '**/_locales/' + l.pontoonLocale);
67
Adrià Vilanova Martíneza4dd5fd2022-01-05 04:23:44 +010068 let preprocessorLoader = {
69 loader: 'webpack-preprocessor-loader',
70 options: {
71 params: {
72 browser_target: env.browser_target,
73 production: args.mode == 'production',
Adrià Vilanova Martínez0335b512022-01-21 13:34:59 +010074 canary: !!env.canary
Adrià Vilanova Martíneza4dd5fd2022-01-05 04:23:44 +010075 },
76 },
77 };
78
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +020079 return {
80 entry,
81 output: {
82 filename: '[name].bundle.js',
83 path: outputPath,
Adrià Vilanova Martínez85424b62021-07-11 21:52:00 +020084 clean: true,
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +020085 },
86 plugins: [
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +020087 new WebpackShellPluginNext({
88 onBuildEnd: {
89 scripts:
avm99963efce2102021-03-23 23:23:26 +010090 ['genmanifest -template templates/manifest.gjson -dest ' +
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +020091 path.join(outputPath, 'manifest.json') + ' ' +
92 env.browser_target]
93 }
94 }),
95 new CopyWebpackPlugin({
96 patterns: [
97 {
Adrià Vilanova Martínez9aa29312022-01-16 02:42:46 +010098 from: path.join(
99 __dirname, 'src/icons', env.canary ? 'canary' : 'regular'),
100 to: path.join(outputPath, 'icons'),
101 },
102 ]
103 }),
104 new CopyWebpackPlugin({
105 patterns: [
106 {
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +0200107 from: path.join(__dirname, 'src/static'),
108 to: outputPath,
109 globOptions: {
Adrià Vilanova Martínez43d0a7b2021-08-28 01:21:17 +0200110 ignore: ['**/OWNERS', '**.md', ...overridenLocalePaths],
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +0200111 }
112 },
113 ]
114 }),
Adrià Vilanova Martínez1e10d192021-12-31 16:01:13 +0100115 new VueLoaderPlugin(),
Adrià Vilanova Martínez413cb442021-09-06 00:30:45 +0200116 new webpack.DefinePlugin({
117 'PRODUCTION': args.mode == 'production',
Adrià Vilanova Martínez1e10d192021-12-31 16:01:13 +0100118 '__VUE_OPTIONS_API__': true,
119 '__VUE_PROD_DEVTOOLS__': args.mode != 'production',
Adrià Vilanova Martínez413cb442021-09-06 00:30:45 +0200120 }),
Adrià Vilanova Martínez43d0a7b2021-08-28 01:21:17 +0200121 ...getCopyPluginsForOverridenLocales(outputPath),
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +0200122 ],
123 // NOTE: Change to
124 // (args.mode == 'production' ? 'source-map' : 'inline-source-map')
125 // once https://crbug.com/212374 is fixed.
126 devtool: 'inline-source-map',
127 module: {
128 rules: [
129 {
avm999632485a3e2021-09-08 22:18:38 +0200130 test: /\.json5$/i,
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +0200131 type: 'json',
132 parser: {
133 parse: json5.parse,
134 },
Adrià Vilanova Martíneza4dd5fd2022-01-05 04:23:44 +0100135 use: [
136 preprocessorLoader,
137 ],
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +0200138 },
avm999632485a3e2021-09-08 22:18:38 +0200139 {
140 test: /\.s[ac]ss$/i,
141 use: [
Adrià Vilanova Martínez1e10d192021-12-31 16:01:13 +0100142 'vue-style-loader',
avm999632485a3e2021-09-08 22:18:38 +0200143 'css-loader',
144 {
145 loader: 'sass-loader',
146 options: {
147 // Prefer `dart-sass`
148 implementation: require('sass'),
149 },
150 },
151 ],
152 },
Adrià Vilanova Martínez5120dbb2022-01-04 03:21:17 +0100153 {
Adrià Vilanova Martínez1e10d192021-12-31 16:01:13 +0100154 test: /\.css$/i,
155 use: [
156 'vue-style-loader',
157 'css-loader',
158 ],
159 },
160 {
Adrià Vilanova Martínez5120dbb2022-01-04 03:21:17 +0100161 test: /\.js$/i,
162 use: [
Adrià Vilanova Martíneza4dd5fd2022-01-05 04:23:44 +0100163 preprocessorLoader,
Adrià Vilanova Martínez5120dbb2022-01-04 03:21:17 +0100164 ],
165 },
Adrià Vilanova Martínez1e10d192021-12-31 16:01:13 +0100166 {
167 test: /\.vue$/i,
168 loader: 'vue-loader',
169 },
Adrià Vilanova Martínez3465e772021-07-11 19:18:41 +0200170 ]
171 },
172 };
173};