refactor: Improve handling of root document retrieval

This commit is contained in:
Gauthier Daniels 2025-04-18 18:34:54 +02:00
parent 115ab1b45b
commit e33700f13d
2 changed files with 19 additions and 12 deletions

View File

@ -12,11 +12,8 @@ export type Data = Awaited<ReturnType<typeof data>>;
export async function data(_pageContext: PageContext) {
const config = useConfig();
const doc = await docsService.getDoc("docs", "index");
if (!doc) {
throw render(404);
}
const doc = await docsService.getDoc("root");
if (!doc) throw render(404);
const readingTimeObject = readingTime(doc.content, 300, "fr");

View File

@ -109,16 +109,19 @@ class DocsService {
public async fetchDocs() {
const docs = glob.sync(DocsService.DOCS_PATH + `/**/*.{${DocsService.DOCS_EXTS.join(",")}}`);
const data = await Promise.all(
docs.map((doc) => {
const content = fs.readFileSync(doc, "utf-8");
const extension = path.extname(doc).slice(1) as DocExtension;
const key = doc
let key = doc
.replace(DocsService.DOCS_PATH, "")
.replace(`page.${extension}`, "")
.replace(`.${extension}`, "")
.replace(/\/$/g, "");
if (key === "") key = "/root";
const ast = Markdoc.parse(content);
const title = ast.attributes?.frontmatter?.match(/^title:\s*(.*?)\s*$/m)?.[1];
const description = ast.attributes?.frontmatter?.match(/^description:\s*(.*?)\s*$/m)?.[1]?.replaceAll('"', "");
@ -149,23 +152,30 @@ class DocsService {
};
}
public async getDoc(namespace: "docs" | "certifications", key: string) {
public async getDoc(namespace: "root"): Promise<DocData | undefined>;
public async getDoc(namespace: "docs" | "certifications", key: string): Promise<DocData | undefined>;
public async getDoc(namespace: "root" | "docs" | "certifications", key?: string): Promise<DocData | undefined> {
try {
await this.fetchDocs();
const doc = this.getFromCache(`/${namespace}/${key}`);
let doc: DocData | undefined;
if (!doc) {
throw new Error("Doc not found");
if (namespace === "root") {
doc = this.getFromCache(`/${namespace}`);
} else {
doc = this.getFromCache(`/${namespace}/${key}`);
}
if (!doc) throw new Error("Doc not found");
return doc;
} catch (error) {
console.error("Error fetching docs:", error);
return null;
return undefined;
}
}
public async getUrls(namespace: "docs" | "certifications") {
public async getUrls(namespace: "root" | "docs" | "certifications") {
try {
await this.fetchDocs();
const docs = Array.from(this.cache.keys()).filter((key) => key.startsWith(`/${namespace}`));