Skip to content

Commit 69ba4eb

Browse files
authored
chore: Upgrade docs framework to Next 16.2.6 and Fumadocs 16.9.1 (#3944)
chore: Upgrade docs framework to latest
1 parent 6860132 commit 69ba4eb

7 files changed

Lines changed: 282 additions & 190 deletions

File tree

bun.lock

Lines changed: 191 additions & 107 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@
2323
"@heroicons/react": "^2.2.0",
2424
"@r4ai/remark-callout": "^0.6.2",
2525
"@vercel/analytics": "^2.0.1",
26-
"fumadocs-core": "16.6.17",
27-
"fumadocs-docgen": "^3.0.4",
28-
"fumadocs-mdx": "14.2.10",
29-
"fumadocs-typescript": "5.1.5",
30-
"fumadocs-ui": "16.6.17",
26+
"fumadocs-core": "16.9.1",
27+
"fumadocs-docgen": "3.0.10",
28+
"fumadocs-mdx": "15.0.9",
29+
"fumadocs-typescript": "5.2.6",
30+
"fumadocs-ui": "16.9.1",
3131
"lucide-react": "0.575.0",
3232
"motion": "^12.36.0",
33-
"next": "16.1.6",
33+
"next": "16.2.6",
3434
"picocolors": "^1.1.1",
3535
"react": "19.2.3",
3636
"react-dom": "19.2.3"

docs/src/lib/source/api-reference-tree-plugin.test.ts

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,49 @@
11
import { describe, expect, test } from 'bun:test'
22
import type { Folder, Item, Root } from 'fumadocs-core/page-tree'
33
import {
4+
type ContentStorage,
5+
type ContentStorageMetaFile,
46
type ContentStoragePageFile,
57
FileSystem,
8+
type PageData as FumadocsPageData,
69
type PageTreeBuilderContext,
7-
type SourceConfig,
810
} from 'fumadocs-core/source'
911
import { createApiReferenceTreePlugin } from '@/lib/source/api-reference-tree-plugin'
1012
import { createPlatformLabelPlugin } from '@/lib/source/platform-label-plugin'
1113

12-
type PageData = {
14+
type TestPageData = FumadocsPageData & {
1315
title: string
1416
hybridParent?: string
1517
platforms?: string[]
1618
}
1719

18-
type PageFile = {
20+
type PageFile = ContentStoragePageFile<undefined, TestPageData>
21+
type PageFileInput = {
1922
format: 'page'
20-
data: PageData
21-
}
22-
23-
type TestSourceConfig = SourceConfig & {
24-
pageData: PageData
25-
}
26-
27-
type TestLoaderConfig = {
28-
source: TestSourceConfig
29-
i18n: undefined
23+
data: TestPageData
3024
}
25+
type TestStorage = ContentStorage<PageFile, ContentStorageMetaFile>
3126

3227
function createPage(file: string, title: string): Item {
3328
return {
3429
$id: file,
35-
$ref: { file },
30+
$ref: file,
3631
type: 'page',
3732
name: title,
3833
url: `/api/${title}`,
3934
}
4035
}
4136

4237
function createContext(
43-
files: Record<string, PageFile>,
44-
): PageTreeBuilderContext<TestSourceConfig> {
45-
const storage = new FileSystem<ContentStoragePageFile<TestSourceConfig>>()
38+
files: Record<string, PageFileInput>,
39+
): PageTreeBuilderContext<TestStorage> {
40+
const storage = new FileSystem<
41+
PageFile | ContentStorageMetaFile
42+
>() as TestStorage
4643

4744
for (const [filePath, file] of Object.entries(files)) {
4845
storage.write(filePath, {
46+
type: undefined,
4947
path: filePath,
5048
format: 'page',
5149
slugs: [file.data.title],
@@ -55,27 +53,29 @@ function createContext(
5553

5654
const getUrl = () => ''
5755
// Fumadocs exposes PageTreeBuilder in its type surface, but not from the runtime module.
58-
const builder = {} as PageTreeBuilderContext<TestSourceConfig>['builder']
56+
const builder = {} as PageTreeBuilderContext<TestStorage>['builder']
5957
return {
60-
idPrefix: 'test',
61-
noRef: false,
6258
transformers: [],
6359
builder,
6460
storage,
65-
getUrl,
61+
options: {
62+
idPrefix: 'test',
63+
noRef: false,
64+
url: getUrl,
65+
},
6666
}
6767
}
6868

6969
function getNodeTitle(
7070
node: Folder['children'][number],
71-
files: Record<string, PageFile>,
71+
files: Record<string, PageFileInput>,
7272
): string {
73-
if (node.type === 'folder' && node.index?.$ref?.file) {
74-
return files[node.index.$ref.file]?.data.title ?? ''
73+
if (node.type === 'folder' && node.index?.$ref) {
74+
return files[node.index.$ref]?.data.title ?? ''
7575
}
7676

77-
if (node.type === 'page' && node.$ref?.file) {
78-
return files[node.$ref.file]?.data.title ?? ''
77+
if (node.type === 'page' && node.$ref) {
78+
return files[node.$ref]?.data.title ?? ''
7979
}
8080

8181
return ''
@@ -94,7 +94,7 @@ function getFolderByTitle(root: Root, title: string): Folder {
9494

9595
function getChildFolderByTitle(
9696
folder: Folder,
97-
files: Record<string, PageFile>,
97+
files: Record<string, PageFileInput>,
9898
title: string,
9999
): Folder {
100100
const child = folder.children.find(
@@ -110,7 +110,7 @@ function getChildFolderByTitle(
110110

111111
describe('api reference tree plugin', () => {
112112
test('nests platform-labeled hybrid children under their stable hybrid parent', () => {
113-
const files: Record<string, PageFile> = {
113+
const files: Record<string, PageFileInput> = {
114114
'CameraOutput.mdx': {
115115
format: 'page',
116116
data: { title: 'CameraOutput' },
@@ -181,8 +181,8 @@ describe('api reference tree plugin', () => {
181181
}
182182

183183
const context = createContext(files)
184-
const apiTreePlugin = createApiReferenceTreePlugin<TestLoaderConfig>()
185-
const platformLabelPlugin = createPlatformLabelPlugin<TestLoaderConfig>()
184+
const apiTreePlugin = createApiReferenceTreePlugin<TestStorage>()
185+
const platformLabelPlugin = createPlatformLabelPlugin<TestStorage>()
186186
const transformApiTree = apiTreePlugin.transformPageTree?.root
187187
const transformPlatformLabels = platformLabelPlugin.transformPageTree?.root
188188

docs/src/lib/source/api-reference-tree-plugin.ts

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@ import type {
55
Root as PageTreeRoot,
66
} from 'fumadocs-core/page-tree'
77
import type {
8-
LoaderConfig,
98
LoaderPlugin,
9+
PageData,
1010
PageTreeBuilderContext,
11-
SourceConfig,
1211
} from 'fumadocs-core/source'
1312
import {
1413
API_SECTION_NAME_BY_KEY,
@@ -18,19 +17,17 @@ import {
1817
} from '@/lib/shared/api-reference.shared'
1918
import {
2019
getNodeNameAsString,
20+
type PageDataStorage,
2121
type PageDataWithHybridParent,
2222
type PageDataWithTitle,
2323
readHybridParent,
2424
readStablePageTitle,
2525
} from '@/lib/source/page-tree'
2626

27-
type ApiReferencePageData = PageDataWithTitle & PageDataWithHybridParent
28-
type ApiReferenceSourceConfig = SourceConfig & {
29-
pageData: ApiReferencePageData
30-
}
31-
type ApiReferenceLoaderConfig = LoaderConfig & {
32-
source: ApiReferenceSourceConfig
33-
}
27+
type ApiReferencePageData = PageData &
28+
PageDataWithTitle &
29+
PageDataWithHybridParent
30+
type ApiReferenceStorage = PageDataStorage<ApiReferencePageData>
3431

3532
function withCanonicalSectionName(folder: PageTreeFolder): PageTreeFolder {
3633
const folderName = getNodeNameAsString(folder.name)
@@ -108,9 +105,9 @@ function reorderSectionFolders(folder: PageTreeFolder): PageTreeFolder {
108105
}
109106

110107
function nestHybridObjectChildren<
111-
Config extends ApiReferenceSourceConfig = ApiReferenceSourceConfig,
108+
Storage extends ApiReferenceStorage = ApiReferenceStorage,
112109
>(
113-
context: PageTreeBuilderContext<Config>,
110+
context: PageTreeBuilderContext<Storage>,
114111
folder: PageTreeFolder,
115112
): PageTreeFolder {
116113
const pageNodes = folder.children.filter(
@@ -189,7 +186,8 @@ function nestHybridObjectChildren<
189186
const createHybridNodeId = (seed: string): string => {
190187
hybridNodeCounter += 1
191188
const safeSeed = seed.toLowerCase().replace(/[^a-z0-9]+/g, '-')
192-
return `${context.idPrefix}-hybrid-${safeSeed}-${hybridNodeCounter}`
189+
const idPrefix = context.options.idPrefix ?? 'api-reference'
190+
return `${idPrefix}-hybrid-${safeSeed}-${hybridNodeCounter}`
193191
}
194192

195193
const createNode = (
@@ -270,8 +268,8 @@ function nestHybridObjectChildren<
270268
}
271269

272270
function transformApiTreeNode<
273-
Config extends ApiReferenceSourceConfig = ApiReferenceSourceConfig,
274-
>(context: PageTreeBuilderContext<Config>, node: PageTreeNode): PageTreeNode {
271+
Storage extends ApiReferenceStorage = ApiReferenceStorage,
272+
>(context: PageTreeBuilderContext<Storage>, node: PageTreeNode): PageTreeNode {
275273
if (node.type !== 'folder') {
276274
return node
277275
}
@@ -291,12 +289,12 @@ function transformApiTreeNode<
291289
}
292290

293291
export function createApiReferenceTreePlugin<
294-
Config extends ApiReferenceLoaderConfig = ApiReferenceLoaderConfig,
295-
>(): LoaderPlugin<Config> {
292+
Storage extends ApiReferenceStorage = ApiReferenceStorage,
293+
>(): LoaderPlugin<Storage> {
296294
return {
297295
name: 'api-reference-tree',
298296
transformPageTree: {
299-
root(this: PageTreeBuilderContext<Config['source']>, node: PageTreeRoot) {
297+
root(this: PageTreeBuilderContext<Storage>, node: PageTreeRoot) {
300298
return {
301299
...node,
302300
children: node.children.map((child) =>

docs/src/lib/source/page-tree.ts

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,36 @@ import type {
22
Item as PageTreeItem,
33
Node as PageTreeNode,
44
} from 'fumadocs-core/page-tree'
5-
import type { PageTreeBuilderContext, SourceConfig } from 'fumadocs-core/source'
5+
import type {
6+
ContentStorage,
7+
ContentStorageMetaFile,
8+
ContentStoragePageFile,
9+
PageData,
10+
PageTreeBuilderContext,
11+
} from 'fumadocs-core/source'
612

7-
export type PageDataWithTitle = {
13+
export type PageDataWithTitle = PageData & {
814
title?: string
915
}
1016

11-
export type PageDataWithHybridParent = {
17+
export type PageDataWithHybridParent = PageData & {
1218
hybridParent?: string
1319
}
1420

21+
export type PageDataStorage<Data extends PageData = PageData> = ContentStorage<
22+
ContentStoragePageFile<string | undefined, Data>,
23+
ContentStorageMetaFile
24+
>
25+
1526
export function getNodeNameAsString(name: PageTreeNode['name']): string {
1627
return typeof name === 'string' ? name : ''
1728
}
1829

19-
export function readPageData<Config extends SourceConfig>(
20-
context: PageTreeBuilderContext<Config>,
30+
export function readPageData<Storage extends PageDataStorage>(
31+
context: PageTreeBuilderContext<Storage>,
2132
item: PageTreeItem,
22-
): Config['pageData'] | null {
23-
const filePath = item.$ref?.file
33+
): Storage['$inferPage']['data'] | null {
34+
const filePath = item.$ref
2435
if (typeof filePath !== 'string' || filePath.length === 0) {
2536
return null
2637
}
@@ -34,24 +45,24 @@ export function readPageData<Config extends SourceConfig>(
3445
}
3546

3647
export function readPageTitle<
37-
Config extends SourceConfig & { pageData: PageDataWithTitle },
38-
>(context: PageTreeBuilderContext<Config>, item: PageTreeItem): string | null {
48+
Storage extends PageDataStorage<PageDataWithTitle>,
49+
>(context: PageTreeBuilderContext<Storage>, item: PageTreeItem): string | null {
3950
const title = readPageData(context, item)?.title
4051
return typeof title === 'string' && title.length > 0 ? title : null
4152
}
4253

4354
export function readHybridParent<
44-
Config extends SourceConfig & { pageData: PageDataWithHybridParent },
45-
>(context: PageTreeBuilderContext<Config>, item: PageTreeItem): string | null {
55+
Storage extends PageDataStorage<PageDataWithHybridParent>,
56+
>(context: PageTreeBuilderContext<Storage>, item: PageTreeItem): string | null {
4657
const hybridParent = readPageData(context, item)?.hybridParent
4758
return typeof hybridParent === 'string' && hybridParent.length > 0
4859
? hybridParent
4960
: null
5061
}
5162

5263
export function readStablePageTitle<
53-
Config extends SourceConfig & { pageData: PageDataWithTitle },
54-
>(context: PageTreeBuilderContext<Config>, item: PageTreeItem): string | null {
64+
Storage extends PageDataStorage<PageDataWithTitle>,
65+
>(context: PageTreeBuilderContext<Storage>, item: PageTreeItem): string | null {
5566
const title = readPageTitle(context, item)
5667
if (title != null) {
5768
return title

docs/src/lib/source/platform-label-plugin.ts

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,19 @@ import type {
44
Root as PageTreeRoot,
55
} from 'fumadocs-core/page-tree'
66
import type {
7-
LoaderConfig,
87
LoaderPlugin,
8+
PageData,
99
PageTreeBuilderContext,
10-
SourceConfig,
1110
} from 'fumadocs-core/source'
1211
import { createElement } from 'react'
1312
import {
1413
type PageDataWithPlatforms,
1514
readSinglePlatformFromPageData,
1615
} from '@/lib/platforms'
17-
import { readPageData } from '@/lib/source/page-tree'
16+
import { type PageDataStorage, readPageData } from '@/lib/source/page-tree'
1817

19-
type PlatformSourceConfig = SourceConfig & {
20-
pageData: PageDataWithPlatforms
21-
}
22-
type PlatformLoaderConfig = LoaderConfig & {
23-
source: PlatformSourceConfig
24-
}
18+
type PlatformPageData = PageData & PageDataWithPlatforms
19+
type PlatformStorage = PageDataStorage<PlatformPageData>
2520

2621
const SIDEBAR_ITEM_CONTENT_CLASS = 'api-sidebar-item-content'
2722
const SIDEBAR_ITEM_LABEL_CLASS = 'api-sidebar-item-label'
@@ -40,8 +35,8 @@ function withSidebarPlatformLabel(
4035
}
4136

4237
function withPlatformLabelOnItem<
43-
Config extends PlatformSourceConfig = PlatformSourceConfig,
44-
>(context: PageTreeBuilderContext<Config>, item: PageTreeItem): PageTreeItem {
38+
Storage extends PlatformStorage = PlatformStorage,
39+
>(context: PageTreeBuilderContext<Storage>, item: PageTreeItem): PageTreeItem {
4540
const platform = readSinglePlatformFromPageData(readPageData(context, item))
4641
if (platform == null) {
4742
return item
@@ -53,9 +48,10 @@ function withPlatformLabelOnItem<
5348
}
5449
}
5550

56-
function withPlatformLabels<
57-
Config extends PlatformSourceConfig = PlatformSourceConfig,
58-
>(context: PageTreeBuilderContext<Config>, node: PageTreeNode): PageTreeNode {
51+
function withPlatformLabels<Storage extends PlatformStorage = PlatformStorage>(
52+
context: PageTreeBuilderContext<Storage>,
53+
node: PageTreeNode,
54+
): PageTreeNode {
5955
if (node.type === 'page') {
6056
return withPlatformLabelOnItem(context, node)
6157
}
@@ -76,12 +72,12 @@ function withPlatformLabels<
7672
}
7773

7874
export function createPlatformLabelPlugin<
79-
Config extends PlatformLoaderConfig = PlatformLoaderConfig,
80-
>(): LoaderPlugin<Config> {
75+
Storage extends PlatformStorage = PlatformStorage,
76+
>(): LoaderPlugin<Storage> {
8177
return {
8278
name: 'page-tree-platform-labels',
8379
transformPageTree: {
84-
root(this: PageTreeBuilderContext<Config['source']>, node: PageTreeRoot) {
80+
root(this: PageTreeBuilderContext<Storage>, node: PageTreeRoot) {
8581
return {
8682
...node,
8783
children: node.children.map((child) =>

docs/tsconfig.scripts.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
"skipLibCheck": true,
1010
"esModuleInterop": true,
1111
"allowSyntheticDefaultImports": true,
12+
"paths": {
13+
"@/*": ["./src/*"]
14+
},
1215
"types": ["node"]
1316
},
1417
"include": [

0 commit comments

Comments
 (0)