packages/plugin-antd/src/index.ts (68 lines of code) (raw):
import { createRequire } from 'module';
import type { Plugin } from '@ice/app/types';
import styleImportPlugin from '@ice/style-import';
interface PluginOptions {
theme?: Record<string, string>;
dark?: Boolean;
compact?: Boolean;
importStyle?: Boolean;
}
const require = createRequire(import.meta.url);
const plugin: Plugin<PluginOptions> = ({ theme, dark, compact, importStyle }) => ({
name: '@ice/plugin-antd',
setup: ({ onGetConfig }) => {
if (importStyle) {
onGetConfig((config) => {
config.transformPlugins = [...(config.transformPlugins || []), styleImportPlugin({
libraryName: 'antd',
style: (name) => `antd/es/${name.toLocaleLowerCase()}/style`,
})];
});
}
if (theme || dark || compact) {
onGetConfig((config) => {
// Modify webpack config of less rule for antd theme.
config.configureWebpack ??= [];
config.configureWebpack.push((webpackConfig) => {
const { rules } = webpackConfig.module;
let lessLoader = null;
rules.some((rule) => {
if (typeof rule === 'object' &&
rule.test instanceof RegExp &&
rule?.test?.source?.match(/less/)) {
lessLoader = Array.isArray(rule?.use) &&
rule.use.find((use) => typeof use === 'object' && use.loader.includes('less-loader'));
return true;
}
return false;
});
if (lessLoader) {
let themeConfig = theme || {};
if (dark || compact) {
// Try to get theme config for antd.
const { getThemeVariables } = require('antd/dist/theme');
themeConfig = {
...(getThemeVariables({
dark,
compact,
})),
...themeConfig,
};
}
const loaderOptions = lessLoader.options || {};
lessLoader.options = {
...loaderOptions,
lessOptions: {
...(loaderOptions?.lessOptions || {}),
modifyVars: {
...(loaderOptions?.lessOptions?.modifyVars || {}),
...themeConfig,
},
},
};
}
return webpackConfig;
});
});
}
},
});
export default plugin;