feat: list all wikiPages on the index page
This commit is contained in:
+8
-4
@@ -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
@@ -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 [];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user