Core & UI: Support trailing slash

This commit is contained in:
Fuma Nama
2025-01-11 11:36:40 +08:00
parent 1e6ece0439
commit 041f23040b
9 changed files with 46 additions and 59 deletions
+6
View File
@@ -0,0 +1,6 @@
---
'fumadocs-core': patch
'fumadocs-ui': patch
---
Support trailing slash
-3
View File
@@ -13,9 +13,6 @@ const config: NextConfig = {
ignoreDuringBuilds: true,
},
serverExternalPackages: ['ts-morph', 'typescript', 'oxc-transform'],
experimental: {
reactCompiler: true,
},
images: {
unoptimized: true,
remotePatterns: [
-1
View File
@@ -20,7 +20,6 @@
"@radix-ui/react-tooltip": "^1.1.6",
"@shikijs/rehype": "^1.26.1",
"@theguild/remark-mermaid": "^0.2.0",
"babel-plugin-react-compiler": "19.0.0-beta-df7b47d-20241124",
"class-variance-authority": "^0.7.1",
"fumadocs-core": "workspace:*",
"fumadocs-docgen": "workspace:^",
+3 -1
View File
@@ -116,7 +116,9 @@ export function getBreadcrumbItemsFromPath(
export function searchPath(
nodes: PageTree.Node[],
url: string,
): (PageTree.Folder | PageTree.Item | PageTree.Separator)[] | null {
): PageTree.Node[] | null {
if (url.endsWith('/')) url = url.slice(0, -1);
let separator: PageTree.Separator | undefined;
for (const node of nodes) {
@@ -21,7 +21,7 @@ export interface Option {
/**
* Detect from a list of urls
*/
urls?: string[];
urls?: Set<string>;
props?: HTMLAttributes<HTMLElement>;
}
@@ -41,7 +41,9 @@ export function RootToggle({
const selected = useMemo(() => {
return options.findLast((item) =>
item.urls
? item.urls.includes(pathname)
? item.urls.has(
pathname.endsWith('/') ? pathname.slice(0, -1) : pathname,
)
: isActive(item.url, pathname, true),
);
}, [options, pathname]);
+9 -7
View File
@@ -157,7 +157,7 @@ function getSidebarTabs(
icon: node.icon,
description: node.description,
urls: getFolderUrls(node),
urls: getFolderUrls(node, new Set()),
};
const mapped = transform ? transform(option, node) : option;
@@ -175,14 +175,16 @@ function getSidebarTabs(
return findOptions(pageTree as PageTree.Folder);
}
function getFolderUrls(folder: PageTree.Folder): string[] {
const results: string[] = [];
if (folder.index) results.push(folder.index.url);
function getFolderUrls(
folder: PageTree.Folder,
output: Set<string>,
): Set<string> {
if (folder.index) output.add(folder.index.url);
for (const child of folder.children) {
if (child.type === 'page') results.push(child.url);
if (child.type === 'folder') results.push(...getFolderUrls(child));
if (child.type === 'page') output.add(child.url);
if (child.type === 'folder') getFolderUrls(child, output);
}
return results;
return output;
}
+2 -1
View File
@@ -22,6 +22,7 @@ import {
getBreadcrumbItemsFromPath,
} from 'fumadocs-core/breadcrumb';
import { usePageStyles } from '@/contexts/layout';
import { isActive } from '@/utils/is-active';
export function TocNav(props: HTMLAttributes<HTMLDivElement>) {
const { open } = useSidebar();
@@ -152,7 +153,7 @@ export function Footer({ items }: FooterProps) {
const list = cached ?? scanNavigationList(root.children);
listCache.set(root, list);
const idx = list.findIndex((item) => item.url === pathname);
const idx = list.findIndex((item) => isActive(item.url, pathname, false));
if (idx === -1) return {};
return {
+3
View File
@@ -3,5 +3,8 @@ export function isActive(
pathname: string,
nested = true,
): boolean {
if (url.endsWith('/')) url = url.slice(0, -1);
if (pathname.endsWith('/')) pathname = pathname.slice(0, -1);
return url === pathname || (nested && pathname.startsWith(`${url}/`));
}
+19 -44
View File
@@ -80,9 +80,6 @@ importers:
'@theguild/remark-mermaid':
specifier: ^0.2.0
version: 0.2.0([email protected])
babel-plugin-react-compiler:
specifier: 19.0.0-beta-df7b47d-20241124
version: 19.0.0-beta-df7b47d-20241124
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
@@ -109,7 +106,7 @@ importers:
version: link:../../packages/ui
geist:
specifier: ^1.3.1
version: 1.3.1([email protected](@opentelemetry/[email protected])([email protected])([email protected]([email protected]))([email protected]))
version: 1.3.1([email protected](@opentelemetry/[email protected])([email protected]([email protected]))([email protected]))
hast-util-to-jsx-runtime:
specifier: ^2.3.2
version: 2.3.2
@@ -121,7 +118,7 @@ importers:
version: 0.469.0([email protected])
next:
specifier: 15.1.4
version: 15.1.4(@opentelemetry/[email protected])([email protected])([email protected]([email protected]))([email protected])
version: 15.1.4(@opentelemetry/[email protected])([email protected]([email protected]))([email protected])
oxc-transform:
specifier: ^0.44.0
version: 0.44.0
@@ -245,7 +242,7 @@ importers:
version: link:../../packages/ui
next:
specifier: ^15.1.4
version: 15.1.4(@opentelemetry/[email protected])([email protected])([email protected]([email protected]))([email protected])
version: 15.1.4(@opentelemetry/[email protected])([email protected]([email protected]))([email protected])
react:
specifier: 19.0.0
version: 19.0.0
@@ -294,7 +291,7 @@ importers:
version: link:../../packages/ui
next:
specifier: 15.1.4
version: 15.1.4(@opentelemetry/[email protected])([email protected])([email protected]([email protected]))([email protected])
version: 15.1.4(@opentelemetry/[email protected])([email protected]([email protected]))([email protected])
react:
specifier: 19.0.0
version: 19.0.0
@@ -328,7 +325,7 @@ importers:
version: link:../../packages/ui
next:
specifier: 15.1.4
version: 15.1.4(@opentelemetry/[email protected])([email protected])([email protected]([email protected]))([email protected])
version: 15.1.4(@opentelemetry/[email protected])([email protected]([email protected]))([email protected])
react:
specifier: 19.0.0
version: 19.0.0
@@ -368,7 +365,7 @@ importers:
version: link:../../packages/ui
next:
specifier: 15.1.4
version: 15.1.4(@opentelemetry/[email protected])([email protected])([email protected]([email protected]))([email protected])
version: 15.1.4(@opentelemetry/[email protected])([email protected]([email protected]))([email protected])
postcss:
specifier: ^8.4.49
version: 8.4.49
@@ -417,7 +414,7 @@ importers:
version: link:../../packages/ui
next:
specifier: 15.1.4
version: 15.1.4(@opentelemetry/[email protected])([email protected])([email protected]([email protected]))([email protected])
version: 15.1.4(@opentelemetry/[email protected])([email protected]([email protected]))([email protected])
react:
specifier: 19.0.0
version: 19.0.0
@@ -606,7 +603,7 @@ importers:
version: 2.0.1
next:
specifier: ^15.1.4
version: 15.1.4(@opentelemetry/[email protected])([email protected])([email protected]([email protected]))([email protected])
version: 15.1.4(@opentelemetry/[email protected])([email protected]([email protected]))([email protected])
remark-mdx:
specifier: ^3.1.0
version: 3.1.0
@@ -685,7 +682,7 @@ importers:
version: 10.4.20([email protected])
next:
specifier: 15.1.4
version: 15.1.4(@opentelemetry/[email protected])([email protected])([email protected]([email protected]))([email protected])
version: 15.1.4(@opentelemetry/[email protected])([email protected]([email protected]))([email protected])
postcss:
specifier: ^8.4.49
version: 8.4.49
@@ -821,7 +818,7 @@ importers:
version: 3.1.3
next:
specifier: ^15.1.4
version: 15.1.4(@opentelemetry/[email protected])([email protected])([email protected]([email protected]))([email protected])
version: 15.1.4(@opentelemetry/[email protected])([email protected]([email protected]))([email protected])
tsconfig:
specifier: workspace:*
version: link:../tsconfig
@@ -888,7 +885,7 @@ importers:
version: link:../core
next:
specifier: 15.1.4
version: 15.1.4(@opentelemetry/[email protected])([email protected])([email protected]([email protected]))([email protected])
version: 15.1.4(@opentelemetry/[email protected])([email protected]([email protected]))([email protected])
tsconfig:
specifier: workspace:*
version: link:../tsconfig
@@ -985,7 +982,7 @@ importers:
version: 0.469.0([email protected])
next:
specifier: 15.1.4
version: 15.1.4(@opentelemetry/[email protected])([email protected])([email protected]([email protected]))([email protected])
version: 15.1.4(@opentelemetry/[email protected])([email protected]([email protected]))([email protected])
openapi-types:
specifier: ^12.1.3
version: 12.1.3
@@ -1191,7 +1188,7 @@ importers:
version: link:../core
next:
specifier: 15.1.4
version: 15.1.4(@opentelemetry/[email protected])([email protected])([email protected]([email protected]))([email protected])
version: 15.1.4(@opentelemetry/[email protected])([email protected]([email protected]))([email protected])
postcss:
specifier: ^8.4.49
version: 8.4.49
@@ -1273,10 +1270,6 @@ packages:
resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
engines: {node: '>=6.9.0'}
'@babel/[email protected]':
resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
engines: {node: '>=6.9.0'}
'@babel/[email protected]':
resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
engines: {node: '>=6.9.0'}
@@ -1285,10 +1278,6 @@ packages:
resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==}
engines: {node: '>=6.9.0'}
'@babel/[email protected]':
resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==}
engines: {node: '>=6.9.0'}
'@braintree/[email protected]':
resolution: {integrity: sha512-o+UlMLt49RvtCASlOMW0AkHnabN9wR9rwCCherxO0yG4Npy34GkvrAqdXQvrhNs+jh+gkK8gB8Lf05qL/O7KWg==}
@@ -3417,9 +3406,6 @@ packages:
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'}
[email protected]:
resolution: {integrity: sha512-93iSASR20HNsotcOTQ+KPL0zpgfRFVWL86AtXpmHp995HuMVnC9femd8Winr3GxkPEh8lEOyaw3nqY4q2HUm5w==}
[email protected]:
resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
@@ -6692,19 +6678,13 @@ snapshots:
picocolors: 1.1.1
optional: true
'@babel/helper-string-pars[email protected]': {}
'@babel/[email protected]': {}
'@babel/helper-validator-identifi[email protected]':
optional: true
'@babel/[email protected]':
dependencies:
regenerator-runtime: 0.14.1
'@babel/[email protected]':
dependencies:
'@babel/helper-string-parser': 7.25.9
'@babel/helper-validator-identifier': 7.25.9
'@braintree/[email protected]': {}
'@changesets/[email protected]':
@@ -6912,7 +6892,7 @@ snapshots:
dependencies:
'@content-collections/core': 0.8.0([email protected])
'@content-collections/integrations': 0.2.1(@content-collections/[email protected]([email protected]))
next: 15.1.4(@opentelemetry/[email protected])([email protected])([email protected]([email protected]))([email protected])
next: 15.1.4(@opentelemetry/[email protected])([email protected]([email protected]))([email protected])
'@discoveryjs/[email protected]': {}
@@ -8799,10 +8779,6 @@ snapshots:
dependencies:
possible-typed-array-names: 1.0.0
[email protected]:
dependencies:
'@babel/types': 7.26.3
[email protected]: {}
[email protected]: {}
@@ -9862,9 +9838,9 @@ snapshots:
[email protected]: {}
[email protected]([email protected](@opentelemetry/[email protected])([email protected])([email protected]([email protected]))([email protected])):
[email protected]([email protected](@opentelemetry/[email protected])([email protected]([email protected]))([email protected])):
dependencies:
next: 15.1.4(@opentelemetry/[email protected])([email protected])([email protected]([email protected]))([email protected])
next: 15.1.4(@opentelemetry/[email protected])([email protected]([email protected]))([email protected])
[email protected]: {}
@@ -11126,7 +11102,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
[email protected](@opentelemetry/[email protected])([email protected])([email protected]([email protected]))([email protected]):
[email protected](@opentelemetry/[email protected])([email protected]([email protected]))([email protected]):
dependencies:
'@next/env': 15.1.4
'@swc/counter': 0.1.3
@@ -11147,7 +11123,6 @@ snapshots:
'@next/swc-win32-arm64-msvc': 15.1.4
'@next/swc-win32-x64-msvc': 15.1.4
'@opentelemetry/api': 1.9.0
babel-plugin-react-compiler: 19.0.0-beta-df7b47d-20241124
sharp: 0.33.5
transitivePeerDependencies:
- '@babel/core'