Core: Remove undefined values from page tree

This commit is contained in:
Fuma Nama
2024-03-04 18:42:54 +08:00
parent 3274d2b812
commit d8483a819c
3 changed files with 52 additions and 56 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'fumadocs-core': patch
---
Remove undefined values from page tree
+14 -4
View File
@@ -177,7 +177,7 @@ function buildFolderNode(
children = nodes ?? restNodes;
}
return {
return removeUndefined({
type: 'folder',
name: meta?.title ?? index?.name ?? pathToName(folder.file.name),
icon: ctx.resolveIcon(meta?.icon),
@@ -185,7 +185,7 @@ function buildFolderNode(
defaultOpen: meta?.defaultOpen,
index,
children,
};
});
}
function buildFileNode(page: Page, ctx: PageTreeBuilderContext): PageTree.Item {
@@ -198,12 +198,12 @@ function buildFileNode(page: Page, ctx: PageTreeBuilderContext): PageTree.Item {
if (result) localePage = result;
}
return {
return removeUndefined({
type: 'page',
name: localePage.data.title,
icon: ctx.resolveIcon(localePage.data.icon),
url: localePage.url,
};
});
}
function build(ctx: PageTreeBuilderContext): PageTree.Root {
@@ -254,3 +254,13 @@ export function createPageTreeBuilder({
function pathToName(path: string): string {
return path.slice(0, 1).toUpperCase() + path.slice(1);
}
function removeUndefined<T extends object>(value: T): T {
const obj = value as Record<string, unknown>;
Object.keys(obj).forEach((key) => {
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete -- Remove undefined values
if (obj[key] === undefined) delete obj[key];
});
return value;
}
+33 -52
View File
@@ -24,18 +24,17 @@ test('Simple', () => {
});
expect(result.pageTree, 'Page Tree').toMatchInlineSnapshot(`
{
"children": [
{
"icon": undefined,
"name": "Hello",
"type": "page",
"url": "/test",
},
],
"name": "",
}
`);
{
"children": [
{
"name": "Hello",
"type": "page",
"url": "/test",
},
],
"name": "",
}
`);
expect(result.getPages().length).toBe(1);
expect(result.getPage(['test'])).toBeDefined();
@@ -74,7 +73,6 @@ test('Nested Directories', async () => {
{
"children": [
{
"icon": undefined,
"name": "Hello",
"type": "page",
"url": "/test",
@@ -82,17 +80,12 @@ test('Nested Directories', async () => {
{
"children": [
{
"icon": undefined,
"name": "Nested Page",
"type": "page",
"url": "/nested/test",
},
],
"defaultOpen": undefined,
"icon": undefined,
"index": undefined,
"name": "Nested",
"root": undefined,
"type": "folder",
},
{
@@ -172,7 +165,6 @@ test('Internationalized Routing', () => {
{
"children": [
{
"icon": undefined,
"name": "Hello",
"type": "page",
"url": "/test",
@@ -180,17 +172,12 @@ test('Internationalized Routing', () => {
{
"children": [
{
"icon": undefined,
"name": "Nested Page",
"type": "page",
"url": "/nested/test",
},
],
"defaultOpen": undefined,
"icon": undefined,
"index": undefined,
"name": "Nested",
"root": undefined,
"type": "folder",
},
],
@@ -199,34 +186,28 @@ test('Internationalized Routing', () => {
`);
expect(result.pageTree['cn'], 'Page Tree').toMatchInlineSnapshot(`
{
"children": [
{
"icon": undefined,
"name": "Hello Chinese",
"type": "page",
"url": "/cn/test",
},
{
"children": [
{
"icon": undefined,
"name": "Nested Page Chinese",
"type": "page",
"url": "/cn/nested/test",
},
],
"defaultOpen": undefined,
"icon": undefined,
"index": undefined,
"name": "Nested Chinese",
"root": undefined,
"type": "folder",
},
],
"name": "Docs Chinese",
}
`);
{
"children": [
{
"name": "Hello Chinese",
"type": "page",
"url": "/cn/test",
},
{
"children": [
{
"name": "Nested Page Chinese",
"type": "page",
"url": "/cn/nested/test",
},
],
"name": "Nested Chinese",
"type": "folder",
},
],
"name": "Docs Chinese",
}
`);
expect(result.getPages().length).toBe(2);
expect(result.getPage(['test'])).toBeDefined();