@rsuite/webpack-multiple-themes-compile
Version:
Overwrite webpack config to output multiple themes css.
71 lines (62 loc) • 1.98 kB
JavaScript
const _ = require('lodash');
const path = require('path');
const fs = require('fs-extra');
const defaultConfigs = require('./defaultConfigs');
const write = function (pathLike, content) {
const dirname = path.dirname(pathLike);
fs.ensureDirSync(dirname);
fs.writeFileSync(pathLike, content, 'utf-8');
};
const getImportLines = config => {
const imports = config.import || [];
return _.map(imports, path => `@import '${path}';`);
};
const getModifyVariablesContent = variableConfig => {
const declaredContent = _.map(
_.entries(variableConfig).filter(([key]) => key !== 'import'),
([key, value]) => `@${key}:${value};`
);
return declaredContent.join('\r');
};
/**
* 生成主题文件
* @param themesConfig
* @param configs
*/
const generateThemes = (themesConfig = {}, configs = {}) => {
const { cacheDir, lessContent, preHeader, cwd = __dirname } = { ...defaultConfigs, ...configs };
const resolve = _.partial(path.resolve, cwd);
_.forEach(_.entries(themesConfig), ([theme, config]) => {
const lessFileName = `${theme}.less`;
const jsFileName = `${theme}.js`;
const importLines = getImportLines(config);
const modifyVariablesContent = getModifyVariablesContent(config);
const content = `${
typeof lessContent === 'function'
? lessContent(theme, config)
: [...importLines, lessContent].join('\n')
}
${preHeader}
${modifyVariablesContent}`;
const outPutLessFilePath = resolve(cacheDir, lessFileName);
const outPutJsFilePath = resolve(cacheDir, jsFileName);
let flag = true;
try {
write(outPutLessFilePath, content);
write(
outPutJsFilePath,
`${preHeader}
import './${lessFileName}';`
);
} catch (e) {
console.log(e.message);
flag = false;
}
console.log(
`webpack-multiple-themes-compile: Generate ${outPutLessFilePath} ${
flag ? 'Succeed' : 'Failed'
}.`
);
});
};
module.exports = generateThemes;