const path = require('path'); const fs = require('fs'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const TerserPlugin = require('terser-webpack-plugin'); const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); const ProgressBarPlugin = require('progress-bar-webpack-plugin'); const { readdirSync } = require('fs'); // const tailPkgs = readdirSync(path.join(__dirname, 'packages')).filter( // (pkg) => pkg.charAt(0) !== '.', // ); const tailPkgs = ['base-components', 'extend-components'] .map((dir) => { const list = readdirSync(path.join(__dirname, 'packages', dir)).map((item) => `${item}!${dir}`); return list.filter((pkg) => pkg.charAt(0) !== '.'); }) .flat(); const isCI = process.env.PRO_COMPONENTS_CI === 'CI'; const externals = isCI ? tailPkgs.reduce((pre, value) => { const [name] = value.split('!'); return { ...pre, [`@ant-design/pro-${name}`]: `Pro${name .toLowerCase() .replace(/( |^)[a-z]/g, (L) => L.toUpperCase())}`, }; }, {}) : {}; const webPackConfigList = []; // eslint-disable-next-line consistent-return tailPkgs.forEach((pkg) => { const [name, p] = pkg.split('!'); if (name === 'ParseForm') return false; const entry = {}; entry[`${name}`] = `./packages/${p}/${name}/src/index.js`; entry[`${name}.min`] = `./packages/${p}/${name}/src/index.js`; const config = { entry, output: { filename: '[name].js', library: `WisDOM${name.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase())}`, libraryExport: 'default', path: path.resolve(__dirname, 'packages', p, name, 'dist'), globalObject: 'this', }, mode: 'production', resolve: { extensions: ['.json', '.css', '.js', '.less'], }, optimization: isCI ? { minimize: true, minimizer: [ new TerserPlugin({ include: /\.min\.js$/, }), new OptimizeCSSAssetsPlugin({ include: /\.min\.js$/, }), ], } : undefined, module: { rules: [ { test: /\.(png|jpg|gif|svg)$/i, use: [ { loader: 'url-loader', options: { limit: 8192, }, }, ], }, { test: /\.jsx?$/, use: { loader: 'babel-loader', options: { presets: ['@babel/typescript', '@babel/env', '@babel/react'], plugins: [ ['@babel/plugin-proposal-decorators', { legacy: true }], ['@babel/plugin-proposal-class-properties', { loose: true }], '@babel/proposal-object-rest-spread', ], }, }, }, { test: /\.jsx?$/, exclude: /(node_modules|bower_components)/, use: { loader: 'babel-loader', options: { presets: [ '@babel/typescript', [ '@babel/env', { loose: true, modules: false, }, ], '@babel/react', ], plugins: [ ['@babel/plugin-proposal-decorators', { legacy: true }], ['@babel/plugin-proposal-class-properties', { loose: true }], '@babel/proposal-object-rest-spread', ], }, }, }, { test: /\.css$/, use: [ { loader: 'style-loader', // creates style nodes from JS strings }, { loader: 'css-loader', // translates CSS into CommonJS }, ], }, { test: /\.less$/, use: [ { loader: MiniCssExtractPlugin.loader, options: { publicPath: (resourcePath, context) => `${path.relative(path.dirname(resourcePath), context)}/`, }, }, { loader: 'css-loader', // translates CSS into CommonJS }, { loader: 'less-loader', options: { lessOptions: { javascriptEnabled: true, }, }, }, ], }, ], }, externals: [ { react: 'React', 'react-dom': 'ReactDOM', antd: 'antd', moment: 'moment', ...externals, }, ], plugins: [ new ProgressBarPlugin(), new MiniCssExtractPlugin({ filename: '[name].css', chunkFilename: '[id].css', }), ], }; webPackConfigList.push(config); }); module.exports = webPackConfigList;