UNPKG

jsdoctoveps

Version:

js -> markdown-> vitepress

96 lines (87 loc) 3.48 kB
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();