const path = require('path'); const fs = require('fs'); const babel = require('@babel/core'); function getImportedAntCptNamesByDirPath(dirPath) { function union(a, b) { return Array.from(new Set([...a, ...b])); } function kebabCase(str) { return str.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/\s+/g, '-').toLowerCase(); } function getImportedAntCptNamesByFilePath(filePath) { const fileContent = fs.readFileSync(filePath, { encoding: 'utf8', }); const importedAntCptNames = []; babel.transformSync(fileContent, { sourceType: 'module', presets: [ require.resolve('@babel/preset-react'), ], plugins: [ '@babel/plugin-proposal-class-properties', { visitor: { ImportDeclaration(path) { const { node } = path; if (!node) return; const { value } = node.source; node.specifiers.forEach((spec) => { if (value === 'antd') { importedAntCptNames.push(spec.local.name); } }); }, }, }, ], }); return importedAntCptNames; } function getFilesPathByDirPath(dirPath) { const filesPath = []; function make(dirPath) { const files = fs.readdirSync(dirPath, { withFileTypes: true, }); files.forEach((fileDirent) => { if (fileDirent.isFile() && /\.(js|jsx)$/.test(fileDirent.name)) { const filePath = path.join(dirPath, fileDirent.name); filesPath.push(filePath); } if (fileDirent.isDirectory()) { make(path.join(dirPath, fileDirent.name)); } }); } make(dirPath); return filesPath; } const filesPath = getFilesPathByDirPath(dirPath); let importedAntCptNames = []; filesPath.forEach((filePath) => { const cptNames = getImportedAntCptNamesByFilePath(filePath); importedAntCptNames = union(importedAntCptNames, cptNames); }); importedAntCptNames = importedAntCptNames.map((item) => { return `antd/lib/${kebabCase(item)}`; }); return importedAntCptNames; } const importedAntCptNames = getImportedAntCptNamesByDirPath('./src/'); module.exports = function getWebpackConfig(webpackConfig) { webpackConfig.entry = { lib: [ 'react', 'react-dom', '@hot-loader/react-dom', 'react-router-dom', 'react-sortable-hoc', 'react-dnd', 'react-dnd-html5-backend', 'd3', 'jquery', 'lodash', 'moment', 'xlsx', 'highlight.js', 'react-highlight', ...importedAntCptNames, ], }; return webpackConfig; };