jc-biz-components
Version:
jc component library based on Antd
93 lines (82 loc) • 2.9 kB
JavaScript
const fs = require('fs')
const path = require('path')
const glob = require('glob')
const postcss = require('postcss')
const less = require('less')
const COLOR_MAP = {
'#e6f7ff': 'color(~`colorPalette("@{primary-color}", 1)`)', // @primary-1
'#bae7ff': 'color(~`colorPalette("@{primary-color}", 2)`)', // @primary-2
'#40a9ff': 'color(~`colorPalette("@{primary-color}", 5)`)', // @primary-5
'#1890ff': '@primary-color',
'#096dd9': 'color(~`colorPalette("@{primary-color}", 7)`)', // @primary-7
'#46a6ff': 'tint(@primary-color, 20%)',
'#8cc8ff': 'tint(@primary-color, 50%)',
'rgba\\(24, 144, 255, 0.2\\)': 'fade(@primary-color, 20%)',
}
const reducePlugin = postcss.plugin('reducePlugin', () => {
const cleanRule = (rule) => {
if (rule.selector.startsWith('.main-color .palatte-')) {
rule.remove()
return
}
let removeRule = true
rule.walkDecls((decl) => {
if (
!decl.prop.includes('color') &&
!decl.prop.includes('background') &&
!decl.prop.includes('border') &&
!decl.prop.includes('box-shadow')
) {
decl.remove()
} else {
removeRule = false
}
})
if (removeRule) {
rule.remove()
}
}
return (css) => {
css.walkAtRules((atRule) => {
atRule.remove()
})
css.walkRules(cleanRule)
css.walkComments(c => c.remove())
}
})
const antd = path.resolve(__dirname, '../')
const entry = path.join(antd, 'components/style/index.less')
let content = fs.readFileSync(entry).toString()
const styles = glob.sync(path.join(antd, 'components/*/style/index.less'))
content += '\n'
styles.forEach((style) => {
content += `@import "${style}";\n`
})
content += `@import "${path.join(antd, 'site/theme/static/index.less')}";\n`
less.render.call(less, content, { // eslint-disable-line
paths: [path.join(antd, 'components/style')],
}).then(({ css }) => {
return postcss([
reducePlugin,
]).process(css, { parser: less.parser, from: entry })
}).then(({ css }) => {
Object.keys(COLOR_MAP).forEach((key) => {
css = css.replace(new RegExp(key, 'g'), COLOR_MAP[key])
})
const bezierEasing = fs.readFileSync(path.join(antd, 'components/style/color/bezierEasing.less')).toString()
const tinyColor = fs.readFileSync(path.join(antd, 'components/style/color/tinyColor.less')).toString()
const colorPalette = fs.readFileSync(path.join(antd, 'components/style/color/colorPalette.less'))
.toString()
.replace('@import "bezierEasing";', '')
.replace('@import "tinyColor";', '')
css = `${colorPalette}\n${css}`
css = `${tinyColor}\n${css}`
css = `${bezierEasing}\n${css}`
css = `@primary-color: #1890ff;\n${css}`
const siteDir = path.resolve(__dirname, '../_site')
if (!fs.existsSync(siteDir)) {
fs.mkdirSync(siteDir)
}
fs.writeFileSync(path.resolve(__dirname, '../_site/color.less'), css)
})