scripts/mini-program-site/generateMiniFiles.js (119 lines of code) (raw):
const fse = require('fs-extra');
const path = require('path');
const chalk = require('chalk');
const { formatMarkdown } = require('./utils/index');
const { FILE_COMMENT } = require('./utils/constants');
const { generateAppConfig } = require('./generateAppConfig');
const { generateComponentIndex } = require('./generateComponentIndex');
const coreDir = path.resolve(__dirname, '../../packages/bui-core/src');
const iconsDir = path.resolve(__dirname, '../../packages/bui-icons/src');
const targetDir = path.resolve(__dirname, '../../websites/mini-program');
const subPackageDir = `${targetDir}/src/subpackages`;
const appConfigPath = `${targetDir}/src/app.config.ts`;
const routeConfigPath = `${targetDir}/src/route.config.ts`;
let subpackages = [],
groupList = [];
const generateMiniPages = () => {
try {
subpackages = [];
groupList = [];
const dirs = fse.readdirSync(coreDir);
dirs.forEach((dir) => {
const componentDir = path.resolve(coreDir, dir);
if (fse.lstatSync(componentDir).isDirectory()) {
const files = fse.readdirSync(componentDir);
files.forEach((file) => {
// 原来的 '.md' 改为 'zh-CN.md'
if (file.split('.').slice(1).join('.') === 'zh-CN.md') {
handleMdFile(componentDir, file);
}
});
}
});
// 处理bui-icons
const iconMd = (fse.readdirSync(iconsDir) || []).find(
(item) => path.extname(item) === '.md',
);
handleMdFile(iconsDir, iconMd);
console.log(chalk.green(`✅ 生成小程序页面:[${targetDir}/src/pages/*]`));
generateAppConfig(appConfigPath, subpackages);
generateRouteConfig();
console.log(
chalk.green(`✅ 小程序代码生成完毕!请在 [${targetDir}] 目录下查看`),
);
} catch (error) {
console.log(chalk.red(`❌ 小程序代码生成失败!ERROR:`, error));
}
};
const handleMdFile = (componentDir, file) => {
const mdPath = path.resolve(componentDir, file);
const mdFile = formatMarkdown(mdPath);
const demoComponentDir = `${subPackageDir}/${
mdFile.theme.groupEnName
}/${mdFile.theme?.enName.toLowerCase()}`;
collectPages(mdFile.theme, { demoComponentDir });
generatePagesFile(mdFile, demoComponentDir);
};
/**
* 生成mini-program/pages/* 目录文件
*/
const generatePagesFile = ({ codeModules, theme }, componentDir) => {
// if (theme.enName === 'Tabs') {
// debugger;
// }
codeModules.forEach((codeModule) => {
if (!fse.pathExistsSync(componentDir)) {
fse.mkdirSync(componentDir, { recursive: true });
}
const targetFilePath = `${componentDir}/${codeModule?.componentName}.tsx`;
fse.writeFileSync(targetFilePath, codeModule.code);
});
const indexPath = `${componentDir}/index`;
generateComponentIndex({ theme, codeModules }, indexPath);
};
/**
* 生成mini-program/src/route.config.ts 文件
* 用于pages/index/index展示各组件入口
*/
const generateRouteConfig = () => {
try {
fse.writeFileSync(
routeConfigPath,
`${FILE_COMMENT}export default ${JSON.stringify(groupList, null, 2)}`,
'utf8',
);
console.log(
chalk.green(
`✅ 生成小程序路由配置文件:[${targetDir}/src/route.config.ts]`,
),
);
} catch (error) {
console.log(
chalk.red(
`❌ 生成小程序路由配置文件(route.config.ts)失败!ERROR:`,
error,
),
);
}
};
/**
* 收集页面
*/
const collectPages = (theme, { demoComponentDir }) => {
// if (theme.enName === 'Progress') {
// debugger;
// }
const routePath = `${demoComponentDir}/index`.split(
`${theme.groupEnName}/`,
)[1];
const { groupName, groupEnName, ...componentInfo } = theme;
const root = `subpackages/${theme.groupEnName}`;
const componentItem = {
...componentInfo,
path: `${root}/${routePath}`,
};
const item = subpackages.find((it) => it.root === root);
const group = groupList.find((it) => it.groupEnName === theme.groupEnName);
if (!item) {
const subpackageItem = {
root,
pages: [routePath],
};
subpackages.push(subpackageItem);
} else {
item.pages.push(routePath);
}
if (!group) {
const groupItem = {
groupName,
groupEnName,
components: [componentItem],
};
groupList.push(groupItem);
} else {
group.components.push(componentItem);
}
};
generateMiniPages();