feat: list all wikiPages on the index page

This commit is contained in:
2026-08-25 12:34:47 +02:00
parent 1d34622b39
commit 675c046029
2 changed files with 64 additions and 17 deletions
+8 -4
View File
@@ -1,7 +1,11 @@
import Article from "@/components/wiki/Article";
import { getAllWikiPages } from "@/lib/wiki";
export default function WikiIndexPage() {
const allPages = getAllWikiPages();
return (
<div>
<p>hi</p>
</div>
)
<Article title="Wiki">
<p>hi</p>
</Article>
);
}
+56 -13
View File
@@ -11,6 +11,11 @@ export type WikiArticle = {
updatedAt?: string;
};
export type WikiPage = {
title: string;
path: string;
}
const wikiDirectory = path.join(process.cwd(), "data/wiki/pages");
export async function getWikiPageBySlug(slug: string): Promise<WikiArticle | null> {
@@ -32,23 +37,34 @@ export async function getWikiPageBySlug(slug: string): Promise<WikiArticle | nul
}
}
export function getAllTsFiles(dirPath: string): string[] {
/**
* Liest rekursiv alle Dateien aus einem Verzeichnis aus.
* @param dirPath - Der Startordner
* @param extension - Optionale Dateiendung zur Filterung (z. B. ".ts" oder "ts")
* @returns Array mit den Dateipfaden
*/
export function getAllFiles(dirPath: string, extension?: string): string[] {
if (!fs.existsSync(dirPath)) return [];
let results: string[] = [];
if (!fs.existsSync(dirPath)) return results;
const list = fs.readdirSync(dirPath);
// optionales führendes Dot sicherstellen (z. B. aus "ts" wird ".ts")
const targetExt = extension && !extension.startsWith('.')
? `.${extension}`
: extension;
list.forEach((file) => {
const filePath = path.join(dirPath, file);
const stat = fs.statSync(filePath);
// withFileTypes: true spart zusätzliche fs.statSync Aufrufe
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
if (stat && stat.isDirectory()) {
results = results.concat(getAllTsFiles(filePath));
} else if (filePath.endsWith('.ts') && !filePath.endsWith('.d.ts')) {
results.push(filePath);
for (const entry of entries) {
const fullPath = path.join(dirPath, entry.name);
if (entry.isDirectory()) {
results = results.concat(getAllFiles(fullPath, targetExt));
} else if (!targetExt || entry.name.endsWith(targetExt)) {
results.push(fullPath);
}
});
}
return results;
}
@@ -149,7 +165,7 @@ export function filterMethods(
export async function getAllApis(): Promise<ApiRoute[]> {
try {
const apiBasePath = path.join(process.cwd(), "app/api");
const allTsFiles = getAllTsFiles(apiBasePath);
const allTsFiles = getAllFiles(apiBasePath, ".ts");
const routes: ApiRoute[] = [];
allTsFiles.forEach((filePath) => {
@@ -182,4 +198,31 @@ export async function getAllApis(): Promise<ApiRoute[]> {
console.error("Fehler beim Auslesen der API-Dateien:", error);
return [];
}
}
export async function getAllWikiPages(): Promise<WikiPage[]> {
try {
const pagesBasePath = path.join(process.cwd(), "data/wiki/pages");
const allPaths = getAllFiles(pagesBasePath, ".mdx");
const allPages: WikiPage[] = [];
for (const filePath of allPaths) {
// extract filename of the path (e. g. "test" at "data/wiki/pages/test.mdx")
const slug = path.parse(filePath).name;
const wikiPage = await getWikiPageBySlug(slug);
if (wikiPage) {
allPages.push({
path: slug,
title: wikiPage.title,
});
}
}
console.log(allPages);
return allPages;
} catch (error) {
console.error("Fehler beim Auslesen der Wiki-Seiten:", error);
return [];
}
}