mirror of
https://gitee.com/vant-contrib/vant.git
synced 2025-04-05 19:41:42 +08:00
108 lines
2.5 KiB
JavaScript
108 lines
2.5 KiB
JavaScript
/* eslint-disable no-use-before-define */
|
|
/**
|
|
* Build style entry of all components
|
|
*/
|
|
|
|
const fs = require('fs-extra');
|
|
const path = require('path');
|
|
const dependencyTree = require('dependency-tree');
|
|
const components = require('./get-components')();
|
|
|
|
const whiteList = [
|
|
'info',
|
|
'icon',
|
|
'loading',
|
|
'cell',
|
|
'cell-group',
|
|
'button',
|
|
'overlay'
|
|
];
|
|
const dir = path.join(__dirname, '../es');
|
|
|
|
function destEntryFile(component, filename, ext = '') {
|
|
const deps = analyzeDependencies(component).map(dep => (
|
|
getStyleRelativePath(component, dep, ext)
|
|
));
|
|
|
|
const esEntry = path.join(dir, component, `style/${filename}`);
|
|
const libEntry = path.join(
|
|
__dirname,
|
|
'../lib',
|
|
component,
|
|
`style/${filename}`
|
|
);
|
|
const esContent = deps.map(dep => `import '${dep}';`).join('\n');
|
|
const libContent = deps.map(dep => `require('${dep}');`).join('\n');
|
|
|
|
fs.outputFileSync(esEntry, esContent);
|
|
fs.outputFileSync(libEntry, libContent);
|
|
}
|
|
|
|
// analyze component dependencies
|
|
function analyzeDependencies(component) {
|
|
const checkList = ['base'];
|
|
|
|
search(
|
|
dependencyTree({
|
|
directory: dir,
|
|
filename: path.join(dir, component, 'index.js'),
|
|
filter: path => !~path.indexOf('node_modules')
|
|
}),
|
|
component,
|
|
checkList
|
|
);
|
|
|
|
if (!whiteList.includes(component)) {
|
|
checkList.push(component);
|
|
}
|
|
|
|
return checkList.filter(item => checkComponentHasStyle(item));
|
|
}
|
|
|
|
function search(tree, component, checkList) {
|
|
Object.keys(tree).forEach(key => {
|
|
search(tree[key], component, checkList);
|
|
components
|
|
.filter(item => (
|
|
key
|
|
.replace(dir, '')
|
|
.split('/')
|
|
.includes(item)
|
|
))
|
|
.forEach(item => {
|
|
if (
|
|
!checkList.includes(item) &&
|
|
!whiteList.includes(item) &&
|
|
item !== component
|
|
) {
|
|
checkList.push(item);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
function getStylePath(component, ext = '.css') {
|
|
if (component === 'base') {
|
|
return path.join(__dirname, `../es/style/base${ext}`);
|
|
}
|
|
return path.join(__dirname, `../es/${component}/index${ext}`);
|
|
}
|
|
|
|
function getStyleRelativePath(component, style, ext) {
|
|
return path.relative(
|
|
path.join(__dirname, `../es/${component}/style`),
|
|
getStylePath(style, ext)
|
|
);
|
|
}
|
|
|
|
function checkComponentHasStyle(component) {
|
|
return fs.existsSync(getStylePath(component));
|
|
}
|
|
|
|
components.forEach(component => {
|
|
// css entry
|
|
destEntryFile(component, 'index.js', '.css');
|
|
// less entry
|
|
destEntryFile(component, 'less.js', '.less');
|
|
});
|