nextui/scripts/update-index-docs.js
2022-11-06 05:42:45 +08:00

108 lines
2.8 KiB
JavaScript

const path = require("path");
const uuid = require("uuid").v4;
const shell = require("shelljs");
const dotenv = require("dotenv");
const algoliasearch = require("algoliasearch");
const toc = require("markdown-toc/index");
const docusaurusUtils = require("@docusaurus/utils");
const {parseMarkdownFile, fileToPath, removePrefix} = docusaurusUtils;
const docsRootFolder = "apps/docs";
async function getMDXMeta(file) {
const {content, frontMatter} = await parseMarkdownFile(file);
const tableOfContent = toc(content);
const json = tableOfContent.json;
const slug = fileToPath(file)
.replace(`/${docsRootFolder}`, "")
.replace("/content", "")
.replace(process.cwd(), "");
const result = [];
const title = !!frontMatter.title ? frontMatter.title : "";
result.push({
content: title,
objectID: uuid(),
type: "lvl1",
url: removePrefix(slug, "/"),
hierarchy: {
lvl1: title,
},
});
json.forEach((item, index) => {
result.push({
content: item.content,
objectID: uuid(),
type: `lvl${item.lvl}`,
url: removePrefix(slug, "/") + `#${item.slug}`,
hierarchy: {
lvl1: title,
lvl2: item.lvl === 2 ? item.content : json[index - 1]?.content ?? null,
lvl3: item.lvl === 3 ? item.content : null,
},
});
});
return result;
}
async function getSearchMeta() {
dotenv.config();
// Initialise Algolia client
const client = algoliasearch(
process.env.ALGOLIA_APP_ID || "",
process.env.ALGOLIA_ADMIN_API_KEY || "",
);
try {
const tmpIndex = await client.initIndex("prod_docs_tmp");
const mainIndex = await client.initIndex("prod_docs");
let json = [];
const files = shell
.ls("-R", docsRootFolder)
.map((file) => path.join(process.cwd(), docsRootFolder, file))
.filter((file) => file.endsWith(".mdx"));
for (const file of files) {
let result = [];
try {
result = await getMDXMeta(file);
json.push(...result);
} catch (error) {}
}
// Uncomment this to see save json into a file
// json = prettier.format(JSON.stringify(json), { parser: 'json' });
// const outPath = path.join(
// process.cwd(),
// `${docsRootFolder}/content/docs`,
// 'search-meta.json'
// );
// fs.writeFileSync(outPath, json);
// Get settings of main index and set them to the temp index
const indexSettings = await mainIndex.getSettings();
await tmpIndex.setSettings(indexSettings);
console.log("[Items count 🚀]: " + json.length);
console.log("[Saving on Algolia ⏰...]");
await mainIndex.replaceAllObjects(json, {
autoGenerateObjectIDIfNotExist: true,
safe: true,
});
console.log("[NextUI] Search meta is ready ✅");
} catch (error) {
console.error(`[ERROR 🔥]:`, error);
}
}
getSearchMeta();