press-ui
Version:
简单、易用的跨端组件库,兼容 Vue2 和 Vue3,同时支持 uni-app和普通 Vue 项目
181 lines (146 loc) • 4.25 kB
JavaScript
const fs = require('fs');
const path = require('path');
const { mkDirsSync, getPureCompName, execCommand } = require('t-comm');
const { getActPageDir, COMP_PREFIX, IS_INNER_DOCS } = require('../utils/utils');
let gComponentConfig;
const PATH_MAP = {
DOC_PATH: `./${IS_INNER_DOCS ? 'docs/' : ''}docs/components/press`,
DOC_EN_PATH: `./${IS_INNER_DOCS ? 'docs/' : ''}docs/en/components/press`,
DEMO_PATH: './src/pages/',
COMPONENT_DIR: './src/packages',
};
const FILENAME_MAP = {
LOCAL_DOC_NAME: 'README.md',
LOCAL_DOC_EN_NAME: 'README.en-US.md',
LOCAL_DEMO_NAME: 'demo.vue',
};
/**
* 获取组件文件夹
*/
function getComps() {
const dirs = fs.readdirSync(PATH_MAP.COMPONENT_DIR);
const comps = dirs
.filter((dir) => {
const vuePath = path.resolve(PATH_MAP.COMPONENT_DIR, dir, `${dir}.vue`);
const vueListPath = path.resolve(PATH_MAP.COMPONENT_DIR, dir, `${dir}-list.vue`);
return fs.existsSync(vuePath) || fs.existsSync(vueListPath);
})
.map(dir => ({
path: path.resolve(PATH_MAP.COMPONENT_DIR, dir),
name: dir,
}));
return comps;
}
/**
* 获取组件附近的文档列表
*/
function getLocalDocOrDemo(comps, postfix) {
const docs = comps
.filter((comp) => {
const { path: dir } = comp;
const readmePath = path.resolve(dir, postfix);
return fs.existsSync(readmePath);
})
.map((comp) => {
const { path: dir } = comp;
return {
...comp,
path: path.resolve(dir, postfix),
};
});
return docs;
}
/**
* 移动文档
*/
function moveDocs(cb) {
const comps = getComps();
const docs = getLocalDocOrDemo(comps, FILENAME_MAP.LOCAL_DOC_NAME);
const docsEn = getLocalDocOrDemo(comps, FILENAME_MAP.LOCAL_DOC_EN_NAME);
const docsPath = path.resolve(PATH_MAP.DOC_PATH);
const docsEnPath = path.resolve(PATH_MAP.DOC_EN_PATH);
execCommand(`rm -rf ${docsPath}`, process.cwd(), 'inherit');
console.log(`>>> 已删除:${docsPath}`);
execCommand(`rm -rf ${docsEnPath}`, process.cwd(), 'inherit');
console.log(`>>> 已删除:${docsEnPath}\n`);
console.log(`>> 共有${docs.length}个组件文档`);
console.log(`>> 共有${docsEn.length}个英文组件文档\n`);
for (const doc of docs) {
const { path: dir, name } = doc;
const data = fs.readFileSync(dir, {
encoding: 'utf-8',
});
writeCompDoc(data, name, PATH_MAP.DOC_PATH);
}
for (const doc of docsEn) {
const { path: dir, name } = doc;
const data = fs.readFileSync(dir, {
encoding: 'utf-8',
});
writeCompDoc(data, name, PATH_MAP.DOC_EN_PATH);
}
if (typeof cb === 'function') {
cb();
}
}
/**
* 将文档写入docs目录
*/
function writeCompDoc(data, name, docPath) {
console.log(`>> 正在写入 ${name} 文档...`);
if (!fs.existsSync(docPath)) {
mkDirsSync(docPath);
}
fs.writeFileSync(path.resolve(docPath, `${name}.md`), data, {
encoding: 'utf-8',
});
}
/**
* 将demo写入pages目录
*/
function writeCompDemo(data, name) {
const pureName = getPureCompName(name, COMP_PREFIX);
const demoPath = `${PATH_MAP.DEMO_PATH}${getActPageDir(pureName, gComponentConfig)}`;
console.log(`>> 正在写入 ${pureName} demo...`);
if (!fs.existsSync(demoPath)) {
mkDirsSync(demoPath);
}
const dir = path.resolve(
demoPath,
pureName,
);
if (!fs.existsSync(dir)) {
mkDirsSync(dir);
}
fs.writeFileSync(path.resolve(dir, `${pureName}.vue`), data, {
encoding: 'utf-8',
});
}
function moveDemo(cb, config, options) {
if (Array.isArray(options?.toDeleteDirs)) {
options.toDeleteDirs.forEach((dir) => {
console.log(`>>> 已删除:${dir}\n`);
execCommand(`rm -rf ${dir}`, process.cwd(), 'inherit');
});
}
const comps = getComps();
const demos = getLocalDocOrDemo(comps, FILENAME_MAP.LOCAL_DEMO_NAME);
console.log(`>> 共有${demos.length}个组件demo\n`);
if (config) {
gComponentConfig = config;
}
for (const doc of demos) {
const { path: dir, name } = doc;
const data = fs.readFileSync(dir, {
encoding: 'utf-8',
});
writeCompDemo(data, name);
}
if (typeof cb === 'function') {
cb();
}
}
module.exports = {
moveDocs,
moveDemo,
};