scripts/generate-md/help.mjs (123 lines of code) (raw):
import fs from 'node:fs';
import path from 'path';
import { input } from '@inquirer/prompts';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// 常量配置
export const CONFIG = {
DEFAULT_MD_FILE: 'TabBar',
BASE_PATH: '../../packages/bui-core/src',
MD_FILE_NAME: 'index.zh-CN.md',
};
export async function readFileContent(filePath) {
try {
return fs.readFileSync(filePath, 'utf-8');
} catch (error) {
console.error(`读取文件失败: ${filePath}`, error);
throw error;
}
}
async function getCode(componentName) {
const componentDir = path.resolve(
__dirname,
'../../packages/bui-core/src',
componentName,
);
const tsxFiles = [];
const typesFiles = [];
const styleFiles = [];
const filesInDir = fs
.readdirSync(componentDir)
.filter(
(file) =>
file.endsWith('.tsx') ||
file.endsWith('.types.ts') ||
file.endsWith('.less'),
);
for (const file of filesInDir) {
const filePath = path.join(componentDir, file);
if (file.endsWith('.tsx')) {
tsxFiles.push(
`${file}\n\n---\n\n${await readFileContent(filePath)}\n\n---\n\n`,
);
} else if (file.endsWith('.types.ts')) {
typesFiles.push(
`${file}\n\n---\n\n${await readFileContent(filePath)}\n\n---\n\n`,
);
} else if (file.endsWith('.less')) {
styleFiles.push(
`${file}\n\n---\n\n${await readFileContent(filePath)}\n\n---\n\n`,
);
}
}
const componentCode = tsxFiles.join('');
const typesCode = typesFiles.join('');
const styleCode = styleFiles.join('');
return { componentCode, typesCode, styleCode };
}
// 获取所有必要的代码
export const getAllCodes = async (componentName, mdFileName) => {
try {
const [targetCodes, referenceCodes, stackCode, mdFormat] =
await Promise.all([
getCode(componentName),
getCode(mdFileName),
getCode('Stack'),
readFileContent(
path.resolve(
__dirname,
CONFIG.BASE_PATH,
mdFileName,
CONFIG.MD_FILE_NAME,
),
),
]);
return {
targetCodes,
referenceCodes,
stackCode: stackCode.componentCode,
mdFormat,
};
} catch (error) {
throw new Error(`获取代码失败: ${error.message}`);
}
};
// 获取组件名称
export const getComponentName = async () => {
let componentName = '';
while (!componentName) {
componentName = await input({ message: '组件名称' });
}
return componentName;
};
export const saveMarkdown = (componentName, markdown) => {
const componentDir = path.resolve(__dirname, CONFIG.BASE_PATH, componentName);
const outputPath = path.join(componentDir, 'index.zh-CN.md');
if (!fs.existsSync(outputPath)) {
console.log(`正在生成${componentName} 的Markdown文档`);
fs.writeFileSync(outputPath, markdown);
} else {
console.log(`正在覆盖${componentName} Markdown的API和样式变量部分`);
const existingContent = fs.readFileSync(outputPath, 'utf-8');
const apiStart = existingContent.indexOf('# API');
const styleVarsStart = existingContent.indexOf('# 样式变量');
let newContent;
if (apiStart !== -1 || styleVarsStart !== -1) {
const beforeAPI =
apiStart !== -1
? existingContent.substring(0, apiStart)
: existingContent;
const apiAndStyleVars = markdown.substring(
markdown.indexOf('# API') !== -1
? markdown.indexOf('# API')
: markdown.indexOf('# 样式变量'),
);
newContent = beforeAPI + apiAndStyleVars;
} else {
newContent = markdown;
}
fs.writeFileSync(outputPath, newContent);
}
return outputPath;
};