diff --git a/packages/website/src/components/SidebarLayout.tsx b/packages/website/src/components/SidebarLayout.tsx index 2eb2b6d63..86e225378 100644 --- a/packages/website/src/components/SidebarLayout.tsx +++ b/packages/website/src/components/SidebarLayout.tsx @@ -129,7 +129,7 @@ export function SidebarLayout({ )) ?? []; - const asPathWithoutQueryAndAnchor = router.asPath.split('?')[0]?.split('#')[0]; + const asPathWithoutQueryAndAnchor = router.asPath.split('?')[0]?.split('#')[0]?.split(':')[0]; const breadcrumbs = asPathWithoutQueryAndAnchor?.split('/').map((path, idx, original) => ( {path} diff --git a/packages/website/src/pages/docs/[...slug].tsx b/packages/website/src/pages/docs/[...slug].tsx index eacef5fb9..5dde87adf 100644 --- a/packages/website/src/pages/docs/[...slug].tsx +++ b/packages/website/src/pages/docs/[...slug].tsx @@ -2,7 +2,7 @@ import { readFile } from 'node:fs/promises'; import { join } from 'node:path'; import { Affix, Box, Button, LoadingOverlay, Transition } from '@mantine/core'; import { useMediaQuery, useWindowScroll } from '@mantine/hooks'; -import { ApiFunction, type ApiPackage } from '@microsoft/api-extractor-model'; +import { ApiFunction, ApiItemKind, type ApiPackage } from '@microsoft/api-extractor-model'; import { MDXRemote } from 'next-mdx-remote'; import { serialize } from 'next-mdx-remote/serialize'; import Head from 'next/head'; @@ -66,25 +66,29 @@ export const getStaticPaths: GetStaticPaths = async () => { const pkgs = models.map((model) => findPackage(model, packageName)) as ApiPackage[]; return [ - { params: { slug: ['packages', packageName, 'main'] } }, ...versions.map((version) => ({ params: { slug: ['packages', packageName, version] } })), ...pkgs .map((pkg, idx) => - getMembers(pkg, versions[idx]!) - // Filtering out enum `RESTEvents` because of interface with similar name `RestEvents` - // causing next.js export to error - .filter((member) => member.name !== 'RESTEvents') - .map((member) => { - if (member.kind === 'Function' && member.overloadIndex && member.overloadIndex > 1) { - return { - params: { - slug: ['packages', packageName, versions[idx]!, `${member.name}:${member.overloadIndex}`], - }, - }; - } + getMembers(pkg, versions[idx]!).map((member) => { + if (member.kind === ApiItemKind.Function && member.overloadIndex && member.overloadIndex > 1) { + return { + params: { + slug: [ + 'packages', + packageName, + versions[idx]!, + `${member.name}:${member.overloadIndex}:${member.kind}`, + ], + }, + }; + } - return { params: { slug: ['packages', packageName, versions[idx]!, member.name] } }; - }), + return { + params: { + slug: ['packages', packageName, versions[idx]!, `${member.name}:${member.kind}`], + }, + }; + }), ) .flat(), ]; @@ -95,21 +99,17 @@ export const getStaticPaths: GetStaticPaths = async () => { return [ { params: { slug: ['packages', packageName, 'main'] } }, - ...getMembers(pkg!, 'main') - // Filtering out enum `RESTEvents` because of interface with similar name `RestEvents` - // causing next.js export to error - .filter((member) => member.name !== 'RESTEvents') - .map((member) => { - if (member.kind === 'Function' && member.overloadIndex && member.overloadIndex > 1) { - return { - params: { - slug: ['packages', packageName, 'main', `${member.name}:${member.overloadIndex}`], - }, - }; - } + ...getMembers(pkg!, 'main').map((member) => { + if (member.kind === ApiItemKind.Function && member.overloadIndex && member.overloadIndex > 1) { + return { + params: { + slug: ['packages', packageName, 'main', `${member.name}:${member.overloadIndex}:${member.kind}`], + }, + }; + } - return { params: { slug: ['packages', packageName, 'main', member.name] } }; - }), + return { params: { slug: ['packages', packageName, 'main', `${member.name}:${member.kind}`] } }; + }), ]; } catch { return { params: { slug: [] } }; @@ -120,7 +120,7 @@ export const getStaticPaths: GetStaticPaths = async () => { return { paths: pkgs, - fallback: 'blocking', + fallback: true, }; }; @@ -159,7 +159,7 @@ export const getStaticProps: GetStaticProps = async ({ params }) => { const pkg = findPackage(model, packageName); let { containerKey, name } = findMember(model, packageName, memberName, branchName) ?? {}; - if (name && overloadIndex) { + if (name && overloadIndex && !Number.isNaN(parseInt(overloadIndex, 10))) { containerKey = ApiFunction.getContainerKey(name, parseInt(overloadIndex, 10)); } @@ -209,6 +209,8 @@ export default function SlugPage(props: Partial @@ -225,7 +227,7 @@ export default function SlugPage(props: Partial - discord.js | {props.data.member.name} + {name} {member(props.data.member)} diff --git a/packages/website/src/util/parse.server.ts b/packages/website/src/util/parse.server.ts index 5e940fbea..5b982c036 100644 --- a/packages/website/src/util/parse.server.ts +++ b/packages/website/src/util/parse.server.ts @@ -40,17 +40,17 @@ export function generatePath(items: readonly ApiItem[], version: string) { const functionItem = item as ApiFunction; path += `/${functionItem.displayName}${ functionItem.overloadIndex && functionItem.overloadIndex > 1 ? `:${functionItem.overloadIndex}` : '' - }`; + }:${item.kind}`; break; case ApiItemKind.Property: case ApiItemKind.Method: case ApiItemKind.MethodSignature: case ApiItemKind.PropertySignature: // TODO: Take overloads into account - path += `#${item.displayName}`; + path += `#${item.displayName}:${item.kind}`; break; default: - path += `/${item.displayName}`; + path += `/${item.displayName}:${item.kind}`; } }