import * as webpack from 'webpack';

export function getBabelLoader({useBuiltIns, hot}: {useBuiltIns: boolean, hot?: boolean}) {
  return {
    loader: 'babel-loader',
    options: {
      babelrc: false,
      sourceType: 'unambiguous',
      presets: [
        [
          '@babel/preset-env',
          {
            useBuiltIns: useBuiltIns ? 'usage' : false,
            corejs: 3,
            exclude: ['transform-typeof-symbol'],
            targets: 'defaults',
            modules: false,
          },
        ],
        ['@babel/preset-react', { development: false, runtime: 'classic' }],
        '@babel/preset-typescript',
      ],
      plugins: [
        ['@babel/plugin-proposal-decorators', { legacy: true }],
        ['@babel/plugin-proposal-class-properties', { loose: false }],
        [
          '@babel/plugin-transform-runtime',
          {
            corejs: false,
            helpers: true,
            // eslint-disable-next-line import/no-internal-modules
            version: require('@babel/runtime/package.json').version,
            regenerator: true,
          },
        ],
        '@babel/plugin-proposal-optional-chaining',
        '@babel/plugin-proposal-nullish-coalescing-operator',
        hot ? 'react-hot-loader/babel' : undefined,
      ].filter(Boolean)
    },
  };
}

export function webpackIgnore(regexp) {
  return new webpack.NormalModuleReplacementPlugin(regexp, require.resolve('lodash/noop.js'));
}