webpack.config.js 3.37 KiB
Newer Older
Andrei Eres's avatar
Andrei Eres committed
/* eslint-disable @typescript-eslint/no-var-requires */
Andrei Eres's avatar
Andrei Eres committed
const path = require('path')
const webpack = require('webpack')
const CopyPlugin = require('copy-webpack-plugin')
const ManifestPlugin = require('webpack-extension-manifest-plugin')
const pkgJson = require('./package.json')
const manifest = require('./manifest.json')

module.exports = (env, argv) => ({
  context: __dirname,
  devtool: false,
  entry: {
    background: './src/background.ts',
    content: './src/content.ts',
    extension: './src/extension.ts',
    page: './src/page.ts',
  },
  module: {
    rules: [
      {
        exclude: /(node_modules)/,
        test: /\.(js|mjs|ts|tsx)$/,
        use: [
          {
            loader: require.resolve('babel-loader'),
Andrei Eres's avatar
Andrei Eres committed
            options: {
              presets: [
                '@babel/preset-env',
                '@babel/preset-typescript',
                '@babel/preset-react',
              ],
              plugins: [
                '@babel/plugin-transform-runtime',
                'babel-plugin-styled-components',
              ],
            },
Andrei Eres's avatar
Andrei Eres committed
          },
        ],
      },
      {
        test: /\.css$/i,
        use: [
          'style-loader',
          {
            loader: 'css-loader',
            options: {
              importLoaders: 1,
              modules: {
                localIdentName:
                  argv.mode === 'production'
                    ? '[hash:base64]'
                    : '[name]__[local]__[hash:base64]',
              },
            },
          },
          {
            loader: 'postcss-loader',
            options: {
              postcssOptions: {
                plugins: ['postcss-preset-env'],
              },
            },
          },
        ],
      },
Andrei Eres's avatar
Andrei Eres committed
      {
        test: [/\.svg$/, /\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/, /\.woff2?$/],
        use: [
          {
            loader: require.resolve('url-loader'),
            options: {
              esModule: false,
              limit: 10000,
              name: 'static/[name].[ext]',
            },
          },
        ],
      },
    ],
  },
  output: {
    chunkFilename: '[name].js',
    filename: '[name].js',
    globalObject: "(typeof self !== 'undefined' ? self : this)",
    path: path.join(__dirname, 'build'),
  },
  performance: {
    hints: false,
  },
  plugins: [
    new webpack.ProvidePlugin({
Andrei Eres's avatar
Andrei Eres committed
      Buffer: ['buffer', 'Buffer'],
Andrei Eres's avatar
Andrei Eres committed
      process: 'process/browser.js',
    }),
Andrei Eres's avatar
Andrei Eres committed
    new webpack.IgnorePlugin({
      resourceRegExp: /^\.\/locale$/,
      contextRegExp: /moment$/,
    }),
Andrei Eres's avatar
Andrei Eres committed
    new webpack.DefinePlugin({
      'process.env': {
        NODE_ENV: JSON.stringify(argv.mode || 'production'),
        PKG_NAME: JSON.stringify(pkgJson.name),
        PKG_VERSION: JSON.stringify(pkgJson.version),
Andrei Eres's avatar
Andrei Eres committed
        EXTENSION_PREFIX: JSON.stringify(pkgJson.name + '-'),
Andrei Eres's avatar
Andrei Eres committed
      },
    }),
    new CopyPlugin({ patterns: [{ from: 'public' }] }),
    new ManifestPlugin({
      config: {
        base: manifest,
        extend: {
          version: pkgJson.version.split('-')[0], // remove possible -beta.xx
        },
      },
    }),
  ],
  resolve: {
    alias: {
      'react/jsx-runtime': require.resolve('react/jsx-runtime'),
    },
    extensions: ['.js', '.jsx', '.ts', '.tsx'],
    fallback: {
      crypto: require.resolve('crypto-browserify'),
      path: require.resolve('path-browserify'),
      stream: require.resolve('stream-browserify'),
    },
  },
  watch: false,
Andrei Eres's avatar
Andrei Eres committed
})