const fs = require('fs'); const path = require('path'); const glob = require('glob'); const matter = require('gray-matter'); module.exports = function getDocsFromDir(dir, cateList) { // docs/ const baseDir = path.join(__dirname, '../docs/'); const docsDir = path.join(baseDir, dir); function isNil(value) { return value === undefined || value === null; } function getMarkdownOrder(filepath) { const { data } = matter(fs.readFileSync(filepath, 'utf-8')); const { sidebar_position } = data || {}; return isNil(sidebar_position) ? 100 : sidebar_position; } const docs = glob.sync('*.md?(x)', { cwd: docsDir, // ignore: 'README.md', }); const result = docs .filter((doc) => !/^index.md(x)?$/.test(doc)) .map((doc) => { return path.join(docsDir, doc); }) .sort((a, b) => { const orderA = getMarkdownOrder(a); const orderB = getMarkdownOrder(b); return orderA - orderB; }) .map((filepath) => { // /Users/xxx/site/docs/guide/basic/router.md => guide/basic/router const id = path .relative(baseDir, filepath) .replace(/\\/g, '/') .replace(/\.mdx?/, ''); return id; }); (cateList || []).forEach((item) => { const { dir, subCategory, ...otherConfig } = item; const indexList = glob.sync('index.md?(x)', { cwd: path.join(baseDir, dir), }); if (indexList.length > 0) { otherConfig.link = { type: 'doc', id: `${dir}/index`, }; } result.push({ type: 'category', collapsed: false, ...otherConfig, items: getDocsFromDir(dir, subCategory), }); }); return result; };