const path = require('path'); const packagejson = require('./package.json'); const dashLibraryName = packagejson.name.replace('@plotly/','').replace(/-/g, '_'); const WebpackDashDynamicImport = require('@plotly/webpack-dash-dynamic-import'); module.exports = (env, argv) => { let mode; const overrides = module.exports || {}; // if user specified mode flag take that value if (argv && argv.mode) { mode = argv.mode; } // else if configuration object is already set (module.exports) use that value else if (overrides.mode) { mode = overrides.mode; } // else take webpack default (production) else { mode = 'production'; } let filename = (overrides.output || {}).filename; if(!filename) { const modeSuffix = mode === 'development' ? 'dev' : 'min'; filename = `${dashLibraryName}.${modeSuffix}.js`; } const entry = overrides.entry || {main: './src/lib/index.js'}; const devtool = overrides.devtool || 'source-map'; const externals = ('externals' in overrides) ? overrides.externals : ({ react: 'React', 'react-dom': 'ReactDOM', 'plotly.js': 'Plotly', }); return { mode, entry, output: { path: path.resolve(__dirname, dashLibraryName), chunkFilename: '[name].js', filename, library: dashLibraryName, libraryTarget: 'window', }, externals, module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader', }, }, { test: /\.css$/, use: [ { loader: 'style-loader', }, { loader: 'css-loader', }, ], }, ], }, devtool, optimization: { splitChunks: { name: '[name].js', cacheGroups: { async: { chunks: 'async', minSize: 0, name(module, chunks, cacheGroupKey) { return `${cacheGroupKey}-${chunks[0].name}`; } } } } }, plugins: [ new WebpackDashDynamicImport() ] } };