const path = require('path');

const chokidar = require('chokidar');
const {
  addWebpackPlugin,
  addWebpackResolve,
  babelInclude,
  override,
  overrideDevServer,
} = require('customize-cra');
const { IgnorePlugin } = require('webpack');
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');

if (process.env.CI) {
  process.env.DISABLE_ESLINT_PLUGIN = 'true';
}

// Forward Netlify env variables
if (process.env.REVIEW_ID) {
  process.env.REACT_APP_REVIEW_ID = process.env.REVIEW_ID;
}

module.exports = {
  webpack: override(
    babelInclude([path.resolve('src'), path.resolve('../loot-core')]),
    addWebpackResolve({
      extensions: [
        ...(process.env.IS_GENERIC_BROWSER
          ? ['.browser.js', '.browser.ts', '.browser.tsx']
          : []),
        '.web.js',
        '.web.ts',
        '.web.tsx',
        '.js',
        '.ts',
        '.tsx',
      ],
    }),
    addWebpackPlugin(
      new BundleAnalyzerPlugin({
        analyzerMode: 'disabled',
        generateStatsFile: true,
      }),
    ),
    // Pikaday throws a warning if Moment.js is not installed however it doesn't
    // actually require it to be installed. As we don't use Moment.js ourselves
    // then we can just silence this warning.
    addWebpackPlugin(
      new IgnorePlugin({
        contextRegExp: /pikaday$/,
        resourceRegExp: /moment$/,
      }),
    ),
  ),
  devServer: overrideDevServer(config => {
    return {
      ...config,
      onBeforeSetupMiddleware(server) {
        chokidar
          .watch([
            path.resolve('../loot-core/lib-dist/*.js'),
            path.resolve('../loot-core/lib-dist/browser/*.js'),
          ])
          .on('all', function () {
            for (const ws of server.webSocketServer.clients) {
              ws.send(JSON.stringify({ type: 'static-changed' }));
            }
          });
      },
      headers: {
        ...config.headers,
        'Cross-Origin-Opener-Policy': 'same-origin',
        'Cross-Origin-Embedder-Policy': 'require-corp',
      },
    };
  }),
};