jsdoctoveps
Version:
js -> markdown-> vitepress
96 lines (87 loc) • 3.48 kB
JavaScript
const fs = require('fs-extra');
const path = require('path');
const jsdoc2md = require('jsdoc-to-markdown');
const { getEntries } = require('./utils');
const { srcDirPath, jsdocConfigPath, mdTemplatePath, mdDirPath } = require('../config');
const template = fs.readFileSync(mdTemplatePath, 'utf-8');
const generateMarkdown = async () => {
try {
await deleteDirectory(mdDirPath); //删除目标文件夹,mdDirPath->要处理的目标文件夹
const markdownDirs = getEntries(); // 获取输入与输出目录
await Promise.all(
markdownDirs.map(async (sourceObject) => { //对当前的目录进行循环处理
const { root, output, ingoreList = [] } = sourceObject;
await generateMarkDownForFiles(root, output, ingoreList);
})
);
} catch (error) {
console.log(error)
}
};
const generateMarkDownForFiles = async (root, output, ingoreList) => {
const fileList = await fs.readdir(root); // 读取我们当前目录下的文件
await Promise.all(
fileList.map(async (fileName) => { // 扫描目标目录下的文件
if (ingoreList.indexOf(fileName) === -1) { // 对当前目录进行校验
await generateMarkdownDocs(fileName, root, output);
}
})
);
await copeBelowJsFiles();
};
/**
* 生成 markdown
* @param sourceName 目标文件名
* @param sourceRootPath 目标文件所在文件夹名
* @param outputPath 生成文件所在文件夹名
* @return {Promise<void>}
*/
const generateMarkdownDocs = async (sourceName, sourceRootPath, outputPath) => {
let sourcePath = `${sourceRootPath}/${sourceName}`;
const outputName = sourceName.replace('.js', '').replace('.ts', ''); // 去除当前目标文件的后缀
try {
if (outputName === 'index') return;
const mdStr = await jsdoc2md.render({
template: template,
'example-lang': 'javascript',
files: path.resolve(process.cwd(), sourcePath),
'name-format': 'backticks',
'heading-depth': 2,
'module-index-format': 'none',
configure: jsdocConfigPath
});
if (mdStr) {
fs.outputFile(path.resolve(process.cwd(), `${outputPath}/${outputName}.md`), mdStr);
}
} catch (error) {
console.log(error);
}
};
/**
* copeBelowmdFiles 处理要扫描文件夹下的第一层级的 js/ts 文件
*/
async function copeBelowJsFiles() {
let mdList = [];
let belowFile = fs.readdirSync(srcDirPath)
belowFile.forEach((item) => { // 将对应目录下的文件夹进行剔除
let result = fs.lstatSync(path.join(srcDirPath, item)).isDirectory(); // 校验当前是否为文件夹(同步)
if (!result) {
mdList.push(item);
}
})
await Promise.all( // 遍历 js/ts 的集合(Array)
mdList.map(async (item) => { // Promise.all 期望一个 iterable 作为他的参数
await generateMarkdownDocs(item, srcDirPath, mdDirPath);
})
)
}
// 删除指定目录
async function deleteDirectory(dirPath) {
try {
await fs.remove(dirPath);
console.log(`Directory ${dirPath} deleted successfully.`);
} catch (err) {
console.error(`Error deleting directory ${dirPath}: ${err}`);
}
}
generateMarkdown();