diff --git a/apps/website/src/components/ExcerptText.tsx b/apps/website/src/components/ExcerptText.tsx index c5050ef2f..64abcea04 100644 --- a/apps/website/src/components/ExcerptText.tsx +++ b/apps/website/src/components/ExcerptText.tsx @@ -1,4 +1,4 @@ -import type { Excerpt } from '@discordjs/api-extractor-model'; +import type { ApiPackage, Excerpt } from '@discordjs/api-extractor-model'; import { ExcerptTokenKind } from '@discordjs/api-extractor-model'; import { BuiltinDocumentationLinks } from '~/util/builtinDocumentationLinks'; import { DISCORD_API_TYPES_DOCS_URL } from '~/util/constants'; @@ -7,6 +7,11 @@ import { ItemLink } from './ItemLink'; import { resolveCanonicalReference, resolveItemURI } from './documentation/util'; export interface ExcerptTextProps { + /** + * The package this excerpt is referenced from. + */ + readonly apiPackage: ApiPackage; + /** * The tokens to render. */ @@ -16,7 +21,7 @@ export interface ExcerptTextProps { /** * A component that renders excerpt tokens from an api item. */ -export function ExcerptText({ excerpt }: ExcerptTextProps) { +export function ExcerptText({ excerpt, apiPackage }: ExcerptTextProps) { return ( {excerpt.spannedTokens.map((token, idx) => { @@ -53,7 +58,9 @@ export function ExcerptText({ excerpt }: ExcerptTextProps) { ); } - const resolved = token.canonicalReference ? resolveCanonicalReference(token.canonicalReference) : null; + const resolved = token.canonicalReference + ? resolveCanonicalReference(token.canonicalReference, apiPackage) + : null; if (!resolved) { return token.text; @@ -65,6 +72,7 @@ export function ExcerptText({ excerpt }: ExcerptTextProps) { itemURI={resolveItemURI(resolved.item)} key={`${resolved.item.displayName}-${resolved.item.containerKey}-${idx}`} packageName={resolved.package} + version={resolved.version} > {token.text} diff --git a/apps/website/src/components/ItemLink.tsx b/apps/website/src/components/ItemLink.tsx index 13126bf51..d54082be2 100644 --- a/apps/website/src/components/ItemLink.tsx +++ b/apps/website/src/components/ItemLink.tsx @@ -20,6 +20,11 @@ export interface ItemLinkProps extends Omit(props: PropsWithChildren; + return ; } diff --git a/apps/website/src/components/ParameterTable.tsx b/apps/website/src/components/ParameterTable.tsx index 046a20d94..c10c4791b 100644 --- a/apps/website/src/components/ParameterTable.tsx +++ b/apps/website/src/components/ParameterTable.tsx @@ -17,7 +17,7 @@ export function ParameterTable({ item }: { readonly item: ApiDocumentedItem & Ap () => params.map((param) => ({ Name: param.isRest ? `...${param.name}` : param.name, - Type: , + Type: , Optional: param.isOptional ? 'Yes' : 'No', Description: param.description ? : 'None', })), diff --git a/apps/website/src/components/Property.tsx b/apps/website/src/components/Property.tsx index 0a5b6cedf..242d7dad5 100644 --- a/apps/website/src/components/Property.tsx +++ b/apps/website/src/components/Property.tsx @@ -32,7 +32,9 @@ export function Property({ > {`${item.displayName}${item.isOptional ? '?' : ''}`} : - {item.propertyTypeExcerpt.text ? : null} + {item.propertyTypeExcerpt.text ? ( + + ) : null} {hasSummary || inheritedFrom ? ( diff --git a/apps/website/src/components/SignatureText.tsx b/apps/website/src/components/SignatureText.tsx index ab7227a5e..e381488b9 100644 --- a/apps/website/src/components/SignatureText.tsx +++ b/apps/website/src/components/SignatureText.tsx @@ -1,10 +1,10 @@ -import type { Excerpt } from '@discordjs/api-extractor-model'; +import type { ApiPackage, Excerpt } from '@discordjs/api-extractor-model'; import { ExcerptText } from './ExcerptText'; -export function SignatureText({ excerpt }: { readonly excerpt: Excerpt }) { +export function SignatureText({ excerpt, apiPackage }: { readonly apiPackage: ApiPackage; readonly excerpt: Excerpt }) { return (

- +

); } diff --git a/apps/website/src/components/TypeParamTable.tsx b/apps/website/src/components/TypeParamTable.tsx index 9b5db7b2a..a16f79d07 100644 --- a/apps/website/src/components/TypeParamTable.tsx +++ b/apps/website/src/components/TypeParamTable.tsx @@ -15,9 +15,9 @@ export function TypeParamTable({ item }: { readonly item: ApiTypeParameterListMi () => item.typeParameters.map((typeParam) => ({ Name: typeParam.name, - Constraints: , + Constraints: , Optional: typeParam.isOptional ? 'Yes' : 'No', - Default: , + Default: , Description: typeParam.tsdocTypeParamBlock ? ( ) : ( diff --git a/apps/website/src/components/documentation/HierarchyText.tsx b/apps/website/src/components/documentation/HierarchyText.tsx index 13fc07c79..6bf9a5ec7 100644 --- a/apps/website/src/components/documentation/HierarchyText.tsx +++ b/apps/website/src/components/documentation/HierarchyText.tsx @@ -48,7 +48,7 @@ export function HierarchyText({

{type}

- +
))} diff --git a/apps/website/src/components/documentation/tsdoc/TSDoc.tsx b/apps/website/src/components/documentation/tsdoc/TSDoc.tsx index 487e2edb0..a7f69fd34 100644 --- a/apps/website/src/components/documentation/tsdoc/TSDoc.tsx +++ b/apps/website/src/components/documentation/tsdoc/TSDoc.tsx @@ -52,7 +52,7 @@ export function TSDoc({ item, tsdoc }: { readonly item: ApiItem; readonly tsdoc: const declarationReference = item.getAssociatedModel()?.resolveDeclarationReference(codeDestination, item); const foundItem = declarationReference?.resolvedApiItem; - const resolved = resolveCanonicalReference(codeDestination); + const resolved = resolveCanonicalReference(codeDestination, item.getAssociatedPackage()); if (!foundItem && !resolved) return null; @@ -84,6 +84,12 @@ export function TSDoc({ item, tsdoc }: { readonly item: ApiItem; readonly tsdoc: itemURI={resolveItemURI(foundItem ?? resolved!.item)} key={idx} packageName={resolved?.package ?? item.getAssociatedPackage()?.displayName.replace('@discordjs/', '')} + version={ + resolved?.package + ? // eslint-disable-next-line unicorn/better-regex + item.getAssociatedPackage()?.dependencies?.[resolved.package]?.replace(/[~^]/, '') + : undefined + } > {linkText ?? foundItem?.displayName ?? resolved!.item.displayName}
diff --git a/apps/website/src/components/documentation/util.ts b/apps/website/src/components/documentation/util.ts index 6ef4df07c..6e2ebfbdf 100644 --- a/apps/website/src/components/documentation/util.ts +++ b/apps/website/src/components/documentation/util.ts @@ -9,6 +9,7 @@ import type { ApiDocumentedItem, ApiParameterListMixin, ApiEvent, + ApiPackage, } from '@discordjs/api-extractor-model'; import type { DocDeclarationReference } from '@microsoft/tsdoc'; import { SelectorKind } from '@microsoft/tsdoc'; @@ -29,6 +30,7 @@ export interface ApiItemLike { interface ResolvedCanonicalReference { item: ApiItemLike; package: string | undefined; + version: string | undefined; } const kindToMeaning = new Map([ @@ -72,6 +74,7 @@ export function resolveItemURI(item: ApiItemLike): string { export function resolveCanonicalReference( canonicalReference: DeclarationReference | DocDeclarationReference, + apiPackage: ApiPackage | undefined, ): ResolvedCanonicalReference | null { if ( 'source' in canonicalReference && @@ -89,6 +92,8 @@ export function resolveCanonicalReference( canonicalReference.symbol.meaning }|${canonicalReference.symbol.componentPath.component.toString()}`, }, + // eslint-disable-next-line unicorn/better-regex + version: apiPackage?.dependencies?.[canonicalReference.source.packageName]?.replace(/[~^]/, ''), }; else if ( 'memberReferences' in canonicalReference && @@ -107,6 +112,8 @@ export function resolveCanonicalReference( .slice(1) .map((member) => ({ kind: member.kind, displayName: member.memberIdentifier!.identifier! })), }, + // eslint-disable-next-line unicorn/better-regex + version: apiPackage?.dependencies?.[canonicalReference.packageName ?? '']?.replace(/[~^]/, ''), }; } diff --git a/apps/website/src/components/model/enum/EnumMember.tsx b/apps/website/src/components/model/enum/EnumMember.tsx index f2d50a18c..21bb67def 100644 --- a/apps/website/src/components/model/enum/EnumMember.tsx +++ b/apps/website/src/components/model/enum/EnumMember.tsx @@ -14,7 +14,9 @@ export function EnumMember({ member }: { readonly member: ApiEnumMember }) { > {member.name} = - {member.initializerExcerpt ? : null} + {member.initializerExcerpt ? ( + + ) : null} {member.tsdocComment ? : null} diff --git a/apps/website/src/components/model/method/MethodHeader.tsx b/apps/website/src/components/model/method/MethodHeader.tsx index 785799bfb..973773cc0 100644 --- a/apps/website/src/components/model/method/MethodHeader.tsx +++ b/apps/website/src/components/model/method/MethodHeader.tsx @@ -22,7 +22,7 @@ export function MethodHeader({ method }: { readonly method: ApiMethod | ApiMetho > {`${method.name}(${parametersString(method)})`} : - + diff --git a/packages/api-extractor/src/generators/ApiModelGenerator.ts b/packages/api-extractor/src/generators/ApiModelGenerator.ts index 567d232c9..775f92813 100644 --- a/packages/api-extractor/src/generators/ApiModelGenerator.ts +++ b/packages/api-extractor/src/generators/ApiModelGenerator.ts @@ -1094,6 +1094,10 @@ export class ApiModelGenerator { fileColumn: sourceLocation.sourceFileColumn, }); } else if (jsDoc) { + if (jsDoc.inherited) { + return; + } + const methodOptions = this._mapMethod(jsDoc, parentApiItem.getAssociatedPackage()!.name); if (methodOptions.releaseTag === ReleaseTag.Internal || methodOptions.releaseTag === ReleaseTag.Alpha) { return; // trim out items marked as "@internal" or "@alpha" @@ -1802,7 +1806,7 @@ export class ApiModelGenerator { text: `${ method.scope === 'global' ? `export function ${method.name}(` - : `${method.access}${method.scope === 'static' ? ' static' : ''} ${method.name}(` + : `${method.access ? `${method.access} ` : ''}${method.scope === 'static' ? 'static ' : ''}${method.name}(` }${ method.params?.length ? `${method.params[0]!.name}${method.params[0]!.nullable || method.params[0]!.optional ? '?' : ''}` @@ -1853,8 +1857,8 @@ export class ApiModelGenerator { ?.map((param) => ` * @param ${param.name} - ${this._fixLinkTags(param.description) ?? ''}\n`) .join('') ?? '' }${ - method.returns?.length && !Array.isArray(method.returns[0]) - ? ` * @returns ${this._fixLinkTags(method.returns[0]!.description) ?? ''}\n` + method.returns?.length && !Array.isArray(method.returns[0]) && method.returns[0]!.description + ? ` * @returns ${this._fixLinkTags(method.returns[0]!.description) ?? ''}` : '' }${method.examples?.map((example) => ` * @example\n * \`\`\`js\n * ${example}\n * \`\`\`\n`).join('') ?? ''}${ method.deprecated