nextui/apps/docs/scripts/update-search-meta.ts
Junior Garcia b8e7b94586
🚀 (#4570)
* docs: optimize route higtlight (#4520)

* docs: optimize home display (#4519)

* docs: optimize home display and route highlight

* docs: optimize home display

* fix(alert): propagate className (#4535)

* fix(alert): propagate className

* chore(alert): remove className from alert theme

* fix(avatar): title type in Avatar (#4529)

* fix(avatar): title type in Avatar

* fix(alert): apply isEmpty check on title

* fix(alert): alert interface props type

* refactor: remove unnecessary props types (#4530)

* refactor(docs): remove string type as it is included in ReactNode

* refactor: remove unnecessary types

* feat(changeset): add changeset

* chore: remove changeset

* refactor: remove null since ReactNode unions it already

* fix(input): use onPress for wrapper click focus (#4483)

* fix(input): use onPress for wrapper click focus

* test(input): wrapper click focus test

* chore(changeset): input onPress for wrapper click focus

* chore(changeset): minor wording

* Refactor/rebrand (#4532)

* chore: rebrand in progress

* chore: update docs to use heroui

* chore: components renbranded

* chore: figma moved to the docs files

* fix: posthog config

* fix(docs): extra classname in form example (#4465)

* chore: clean git

* chore: make heroui private

* chore: new logo

* chore: node env var renamed

* chore: public robots txt deleted

* chore: wrangler installed

* chore: wrangler renamed

* chore: cloudlfare workers removed

* chore: force vercel deploy

* refactor: first migration and provider

* refactor: rename nextui plugin

* refactor: rename github site

* refactor: rename CONTRIBUTING

* refactor: rename package name

* refactor: nextjs image hostname

* refactor: mdx repo nextui-org rename frontio-ai

* refactor: nextui.org rename heroui.com

* refactor: add heroui to missing places

* fix: heroui plugin name

* fix: update docs

* docs: nextui to heroui add npmrc pnpm migratation

* chore: rename all packages with new org name

* chore: replace frontio-ai by frontioai

* chore: revert previous changes

* chore: small adjustment

* chore: doc updated

* feat: blog

* chore: avatar updated

* fix: url

* chore: add new ogimage

* fix: ogimage command

* fix: heroui name and storybook welcome page

* fix: og image url

* feat: favicon and icon changed

---------

Co-authored-by: աӄա <wingkwong.code@gmail.com>
Co-authored-by: winches <329487092@qq.com>

* fix: postbuild script

* chore: core package updates

* ci(changesets): version packages (#4569)

Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>

* feat: contributors added to the blog

---------

Co-authored-by: winches <329487092@qq.com>
Co-authored-by: աӄա <wingkwong.code@gmail.com>
Co-authored-by: Peterl561 <76144929+Peterl561@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-01-16 16:24:32 -03:00

161 lines
3.7 KiB
TypeScript

/* eslint-disable no-console */
import path from "path";
import fs from 'fs'
import {v4 as uuid} from "uuid"
import shell from "shelljs";
import dotenv from "dotenv";
import algoliasearch from "algoliasearch";
// @ts-ignore
import prettier from 'prettier'
// @ts-ignore
import toc from "markdown-toc";
import {parseMarkdownFile, fileToPath, removePrefix} from "@docusaurus/utils";
const docsRootFolder = "content/docs";
const configFolder = "config";
interface ResultType {
content: string
objectID: string
url: string
type: 'lvl1' | 'lvl2' | 'lvl3'
hierarchy: {
lvl1: string | null
lvl2?: string | null
lvl3?: string | null
}
}
interface TOCResultItem {
content: string
slug: string
lvl: 1 | 2 | 3
i: number
seen: number
}
const getUrl = (slug: string) => {
const url = removePrefix(slug, "/")
return `/docs${url}`
}
async function getMDXMeta(file: string) {
const {content, frontMatter: _frontMatter} = await parseMarkdownFile(file);
const frontMatter = _frontMatter as Record<string, any>
const tableOfContent = toc(content);
const json = tableOfContent.json as TOCResultItem[]
let slug = fileToPath(file)
.replace(`/${docsRootFolder}`, "")
.replace(process.cwd(), "");
const result:ResultType[] = [];
const title = frontMatter.title || "";
result.push({
content: title,
objectID: uuid(),
type: "lvl1",
url: getUrl(slug),
hierarchy: {
lvl1: title,
},
});
json.forEach((item, index) => {
item.content !== title && result.push({
content: item.content,
objectID: uuid(),
type: `lvl${item.lvl}`,
url: getUrl(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(saveMode: "algolia" | "local" = "local") {
dotenv.config();
try {
let json: any = [];
const files = shell
.ls("-R", docsRootFolder)
.map((file: any) => path.join(process.cwd(), docsRootFolder, file))
.filter((file: any) => file.endsWith(".mdx"));
for (const file of files) {
let result: ResultType[] = [];
try {
result = await getMDXMeta(file);
json.push(...result);
} catch (error) {}
}
if (saveMode === "local") {
// Uncomment this to see save json into a file
json = prettier.format(JSON.stringify(json), { parser: 'json' });
// create a folder if it doesn't exist
if (!fs.existsSync(`${configFolder}`)) {
fs.mkdirSync(`${configFolder}`);
}
const outPath = path.join(
process.cwd(),
`${configFolder}`,
'search-meta.json'
);
fs.writeFileSync(outPath, json);
console.log("[HeroUI] Search meta is ready ✅");
return;
}
// Initialize Algolia client
const client = algoliasearch(
process.env.ALGOLIA_APP_ID || "",
process.env.ALGOLIA_ADMIN_API_KEY || "",
);
const tmpIndex = await client.initIndex("prod_docs_tmp");
const mainIndex = await client.initIndex("prod_docs");
// 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("[HeroUI] Search meta is ready ✅");
} catch (error) {
console.error(`[ERROR 🔥]:`, error);
}
}
getSearchMeta();