/* global __dirname */ const process = require('process'); const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer'); const analyzeBundle = process.argv.indexOf('--analyze-bundle') !== -1; const minimize = process.argv.indexOf('-p') !== -1 || process.argv.indexOf('--optimize-minimize') !== -1; /** * Build a Performance configuration object for the given size. * See: https://webpack.js.org/configuration/performance/ */ function getPerformanceHints(size) { return { hints: minimize ? 'error' : false, maxAssetSize: size, maxEntrypointSize: size }; } // The base Webpack configuration to bundle the JavaScript artifacts of // jitsi-meet such as app.bundle.js and external_api.js. const config = { devtool: 'source-map', mode: minimize ? 'production' : 'development', module: { rules: [ { // Transpile ES2015 (aka ES6) to ES5. Accept the JSX syntax by React // as well. exclude: [ new RegExp(`${__dirname}/node_modules/(?!js-utils)`) ], loader: 'babel-loader', options: { // XXX The require.resolve bellow solves failures to locate the // presets when lib-jitsi-meet, for example, is npm linked in // jitsi-meet. plugins: [ require.resolve('@babel/plugin-transform-flow-strip-types'), require.resolve('@babel/plugin-proposal-class-properties'), require.resolve('@babel/plugin-proposal-export-default-from'), require.resolve('@babel/plugin-proposal-export-namespace-from'), require.resolve('@babel/plugin-proposal-nullish-coalescing-operator'), require.resolve('@babel/plugin-proposal-optional-chaining') ], presets: [ [ require.resolve('@babel/preset-env'), // Tell babel to avoid compiling imports into CommonJS // so that webpack may do tree shaking. { modules: false, // Specify our target browsers so no transpiling is // done unnecessarily. For browsers not specified // here, the ES2015+ profile will be used. targets: { chrome: 58, electron: 2, firefox: 54, safari: 11 } } ], require.resolve('@babel/preset-flow'), require.resolve('@babel/preset-react') ] }, test: /\.jsx?$/ }, { // Expose jquery as the globals $ and jQuery because it is expected // to be available in such a form by multiple jitsi-meet // dependencies including lib-jitsi-meet. loader: 'expose-loader?$!expose-loader?jQuery', test: /\/node_modules\/jquery\/.*\.js$/ } ] }, node: { // Allow the use of the real filename of the module being executed. By // default Webpack does not leak path-related information and provides a // value that is a mock (/index.js). __filename: true }, optimization: { concatenateModules: minimize, minimize }, output: { filename: `[name]${minimize ? '.min' : ''}.js`, path: `${__dirname}/libs`, publicPath: 'load-test/libs/', sourceMapFilename: `[name].${minimize ? 'min' : 'js'}.map` }, plugins: [ analyzeBundle && new BundleAnalyzerPlugin({ analyzerMode: 'disabled', generateStatsFile: true }) ].filter(Boolean), resolve: { alias: { jquery: `jquery/dist/jquery${minimize ? '.min' : ''}.js` }, aliasFields: [ 'browser' ], extensions: [ '.web.js', // Webpack defaults: '.js', '.json' ] } }; module.exports = [ Object.assign({}, config, { entry: { 'load-test-participant': './load-test-participant.js' }, performance: getPerformanceHints(3 * 1024 * 1024) }) ];