| var webpack = require('webpack'), |
| path = require('path'), |
| fileSystem = require('fs-extra'), |
| env = require('./utils/env'), |
| CopyWebpackPlugin = require('copy-webpack-plugin'), |
| HtmlWebpackPlugin = require('html-webpack-plugin'), |
| TerserPlugin = require('terser-webpack-plugin'); |
| var { CleanWebpackPlugin } = require('clean-webpack-plugin'); |
| var ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin'); |
| var ReactRefreshTypeScript = require('react-refresh-typescript'); |
|
|
| const ASSET_PATH = process.env.ASSET_PATH || '/'; |
|
|
| var alias = {}; |
|
|
| |
| var secretsPath = path.join(__dirname, 'secrets.' + env.NODE_ENV + '.js'); |
|
|
| var fileExtensions = [ |
| 'jpg', |
| 'jpeg', |
| 'png', |
| 'gif', |
| 'eot', |
| 'otf', |
| 'svg', |
| 'ttf', |
| 'woff', |
| 'woff2', |
| ]; |
|
|
| if (fileSystem.existsSync(secretsPath)) { |
| alias['secrets'] = secretsPath; |
| } |
|
|
| const isDevelopment = process.env.NODE_ENV !== 'production'; |
|
|
| var options = { |
| mode: process.env.NODE_ENV || 'development', |
| entry: { |
| newtab: path.join(__dirname, 'src', 'pages', 'Newtab', 'index.jsx'), |
| options: path.join(__dirname, 'src', 'pages', 'Options', 'index.jsx'), |
| popup: path.join(__dirname, 'src', 'pages', 'Popup', 'index.jsx'), |
| background: path.join(__dirname, 'src', 'pages', 'Background', 'index.js'), |
| contentScript: path.join(__dirname, 'src', 'pages', 'Content', 'index.js'), |
| devtools: path.join(__dirname, 'src', 'pages', 'Devtools', 'index.js'), |
| panel: path.join(__dirname, 'src', 'pages', 'Panel', 'index.jsx'), |
| }, |
| chromeExtensionBoilerplate: { |
| notHotReload: ['background', 'contentScript', 'devtools'], |
| }, |
| output: { |
| filename: '[name].bundle.js', |
| path: path.resolve(__dirname, 'build'), |
| clean: true, |
| publicPath: ASSET_PATH, |
| }, |
| module: { |
| rules: [ |
| { |
| |
| test: /\.(css|scss)$/, |
| |
| use: [ |
| { |
| loader: 'style-loader', |
| }, |
| { |
| loader: 'css-loader', |
| }, |
| { |
| loader: 'sass-loader', |
| options: { |
| sourceMap: true, |
| }, |
| }, |
| ], |
| }, |
| { |
| test: new RegExp('.(' + fileExtensions.join('|') + ')$'), |
| type: 'asset/resource', |
| exclude: /node_modules/, |
| |
| |
| |
| |
| }, |
| { |
| test: /\.html$/, |
| loader: 'html-loader', |
| exclude: /node_modules/, |
| }, |
| { |
| test: /\.(ts|tsx)$/, |
| exclude: /node_modules/, |
| use: [ |
| { |
| loader: require.resolve('ts-loader'), |
| options: { |
| getCustomTransformers: () => ({ |
| before: [isDevelopment && ReactRefreshTypeScript()].filter( |
| Boolean |
| ), |
| }), |
| transpileOnly: isDevelopment, |
| }, |
| }, |
| ], |
| }, |
| { |
| test: /\.(js|jsx)$/, |
| use: [ |
| { |
| loader: 'source-map-loader', |
| }, |
| { |
| loader: require.resolve('babel-loader'), |
| options: { |
| plugins: [ |
| isDevelopment && require.resolve('react-refresh/babel'), |
| ].filter(Boolean), |
| }, |
| }, |
| ], |
| exclude: /node_modules/, |
| }, |
| ], |
| }, |
| resolve: { |
| alias: alias, |
| extensions: fileExtensions |
| .map((extension) => '.' + extension) |
| .concat(['.js', '.jsx', '.ts', '.tsx', '.css']), |
| }, |
| plugins: [ |
| isDevelopment && new ReactRefreshWebpackPlugin(), |
| new CleanWebpackPlugin({ verbose: false }), |
| new webpack.ProgressPlugin(), |
| |
| new webpack.EnvironmentPlugin(['NODE_ENV']), |
| new CopyWebpackPlugin({ |
| patterns: [ |
| { |
| from: 'src/manifest.json', |
| to: path.join(__dirname, 'build'), |
| force: true, |
| transform: function (content) { |
| |
| return Buffer.from( |
| JSON.stringify({ |
| description: process.env.npm_package_description, |
| version: process.env.npm_package_version, |
| ...JSON.parse(content.toString()), |
| }) |
| ); |
| }, |
| }, |
| ], |
| }), |
| new CopyWebpackPlugin({ |
| patterns: [ |
| { |
| from: 'src/pages/Content/content.styles.css', |
| to: path.join(__dirname, 'build'), |
| force: true, |
| }, |
| ], |
| }), |
| new CopyWebpackPlugin({ |
| patterns: [ |
| { |
| from: 'src/assets/img/icon-128.png', |
| to: path.join(__dirname, 'build'), |
| force: true, |
| }, |
| ], |
| }), |
| new CopyWebpackPlugin({ |
| patterns: [ |
| { |
| from: 'src/assets/img/icon-34.png', |
| to: path.join(__dirname, 'build'), |
| force: true, |
| }, |
| ], |
| }), |
| new CopyWebpackPlugin({ |
| patterns: [ |
| { |
| from: 'src/assets/img/logo_panel.png', |
| to: path.join(__dirname, 'build'), |
| force: true, |
| }, |
| ], |
| }), |
| new CopyWebpackPlugin({ |
| patterns: [ |
| { |
| from: 'src/assets/img/logo.png', |
| to: path.join(__dirname, 'build'), |
| force: true, |
| }, |
| ], |
| }), |
| new HtmlWebpackPlugin({ |
| template: path.join(__dirname, 'src', 'pages', 'Newtab', 'index.html'), |
| filename: 'newtab.html', |
| chunks: ['newtab'], |
| cache: false, |
| }), |
| new HtmlWebpackPlugin({ |
| template: path.join(__dirname, 'src', 'pages', 'Options', 'index.html'), |
| filename: 'options.html', |
| chunks: ['options'], |
| cache: false, |
| }), |
| new HtmlWebpackPlugin({ |
| template: path.join(__dirname, 'src', 'pages', 'Popup', 'index.html'), |
| filename: 'popup.html', |
| chunks: ['popup'], |
| cache: false, |
| }), |
| new HtmlWebpackPlugin({ |
| template: path.join(__dirname, 'src', 'pages', 'Devtools', 'index.html'), |
| filename: 'devtools.html', |
| chunks: ['devtools'], |
| cache: false, |
| }), |
| new HtmlWebpackPlugin({ |
| template: path.join(__dirname, 'src', 'pages', 'Panel', 'index.html'), |
| filename: 'panel.html', |
| chunks: ['panel'], |
| cache: false, |
| }), |
| ].filter(Boolean), |
| infrastructureLogging: { |
| level: 'info', |
| }, |
| }; |
|
|
| if (env.NODE_ENV === 'development') { |
| options.devtool = 'cheap-module-source-map'; |
| } else { |
| options.optimization = { |
| minimize: true, |
| minimizer: [ |
| new TerserPlugin({ |
| extractComments: false, |
| }), |
| ], |
| }; |
| } |
|
|
| module.exports = options; |
|
|