Prioritize Endorphin and retire Endor from the catalog

This commit is contained in:
2026-11-05 22:13:19 +08:00
parent 18af3802c6
commit 53aef1eb64
4 changed files with 26 additions and 4 deletions
+11 -2
View File
@@ -1,5 +1,11 @@
import type { DocLink } from "@/lib/docs";
// Keep superseded Endor pages addressable without offering them as current material.
export function catalogDocuments<T extends DocLink>(docs: T[]): T[] {
return docs.filter((doc) => doc.collection !== "Endor 文档")
.sort((a, b) => Number(b.collection === "Endorphin") - Number(a.collection === "Endorphin"));
}
export function collectionLabel(name: string) {
return name.replace(/ 文档$| 源码教程$|问题集$/g, "");
}
@@ -15,10 +21,13 @@ export function collectionIcon(name?: string): "book" | "code" | "layers" | "nod
if (name?.includes("垃圾回收")) return "nodes";
return "book";
}
export function collectionEntries(docs: DocLink[]) {
export function collectionEntries(documents: DocLink[]) {
const docs = catalogDocuments(documents);
return [...new Set(docs.map((doc) => doc.collection))].map((name) => {
const items = docs.filter((doc) => doc.collection === name);
const entry = items.find((doc) => doc.slug.endsWith("/overview")) ?? items[0];
const entry = items.find((doc) => doc.slug.endsWith("/overview"))
?? (name === "Endorphin" ? items.find((doc) => doc.featured) : undefined)
?? items[0];
return { name, entry, count: items.length };
});
}
+2 -1
View File
@@ -1,4 +1,5 @@
import { randomUUID, createHash } from "node:crypto";
import { catalogDocuments } from "./collections";
import { openSiteDatabase } from "./site-database";
import { DocumentValidationError, DocumentConflictError } from "./document-errors";
import { sectionSchema, loadSections, reconcileSections, persistSections, splitSections, outline,
@@ -188,7 +189,7 @@ export async function readDoc(slug: string): Promise<Doc> {
}
export async function listDocs(): Promise<DocLink[]> {
return allDocuments().map(({ content: _, ...doc }) => { void _; return doc; });
return catalogDocuments(allDocuments()).map(({ content: _, ...doc }) => { void _; return doc; });
}
// Explicit, atomic bootstrap only. Runtime reads never import repository data.
+2 -1
View File
@@ -1,4 +1,5 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { catalogDocuments } from "@/lib/collections";
import { allDocuments } from "@/lib/docs";
// The proxy authenticates this endpoint, including index content.
@@ -9,7 +10,7 @@ export default async function handler(request: NextApiRequest, response: NextApi
return response.status(405).end();
}
try {
const index = allDocuments().map(({ content, ...doc }) => ({ ...doc, searchText: content }));
const index = catalogDocuments(allDocuments()).map(({ content, ...doc }) => ({ ...doc, searchText: content }));
return response.status(200).json(index);
} catch {
return response.status(503).json({ error: "文档数据库暂时不可用" });