refactor: docs (#10126)

This commit is contained in:
Noel
2024-02-29 04:37:52 +01:00
committed by GitHub
parent 0f9017ef95
commit 18cce83d80
192 changed files with 8116 additions and 6321 deletions

View File

@@ -1,26 +1,17 @@
export const PACKAGES = [
'discord.js',
'brokers',
'builders',
'collection',
'core',
'formatters',
'next',
'proxy',
'rest',
'util',
'voice',
'ws',
{ name: 'discord.js' },
{ name: 'brokers' },
{ name: 'builders' },
{ name: 'collection' },
{ name: 'core' },
{ name: 'formatters' },
{ name: 'next' },
{ name: 'proxy' },
{ name: 'rest' },
{ name: 'util' },
{ name: 'voice' },
{ name: 'ws' },
];
export const N_RECENT_VERSIONS = 2;
export const OVERLOAD_SEPARATOR = ':';
export const METHOD_SEPARATOR = '#';
export const DESCRIPTION =
"discord.js is a powerful Node.js module that allows you to interact with the Discord API very easily. It takes a much more object-oriented approach than most other JS Discord libraries, making your bot's code significantly tidier and easier to comprehend.";
export const DISCORD_API_TYPES_VERSION = 'v10';
export const DISCORD_API_TYPES_DOCS_URL = `https://discord-api-types.dev/api/discord-api-types-${DISCORD_API_TYPES_VERSION}`;

View File

@@ -0,0 +1,7 @@
import { sql } from '@vercel/postgres';
export async function fetchLatestVersion(packageName: string): Promise<string> {
const { rows } = await sql`select version from documentation where name = ${packageName} order by version desc`;
return rows.map((row) => row.version).at(1) ?? 'main';
}

View File

@@ -1,34 +0,0 @@
import { ApiModel, ApiFunction, ApiPackage } from '@discordjs/api-extractor-model';
import { fetchModelJSON } from '~/app/docAPI';
import { OVERLOAD_SEPARATOR, PACKAGES } from './constants';
import { findMember, findMemberByKey } from './model';
export const fetchMember = async (packageName: string, branchName: string, item?: string) => {
if (!PACKAGES.includes(packageName)) {
return null;
}
if (!item) {
return null;
}
const model = new ApiModel();
const modelJSON = await fetchModelJSON(packageName, branchName);
if (!modelJSON) {
return null;
}
model.addMember(ApiPackage.loadFromJson(modelJSON));
const [memberName, overloadIndex] = decodeURIComponent(item).split(OVERLOAD_SEPARATOR);
// eslint-disable-next-line prefer-const
let { containerKey, displayName: name } = findMember(model, packageName, memberName) ?? {};
if (name && overloadIndex && !Number.isNaN(Number.parseInt(overloadIndex, 10))) {
containerKey = ApiFunction.getContainerKey(name, Number.parseInt(overloadIndex, 10));
}
return memberName && containerKey ? findMemberByKey(model, packageName, containerKey) ?? null : null;
};

View File

@@ -0,0 +1,13 @@
import { sql } from '@vercel/postgres';
export async function fetchVersions(packageName: string) {
try {
const { rows } = await sql<{
version: string;
}>`select version from documentation where name = ${packageName} order by version desc`;
return rows;
} catch {
return [];
}
}

View File

@@ -1,13 +0,0 @@
import { Inter, JetBrains_Mono } from 'next/font/google';
export const inter = Inter({
subsets: ['latin'],
display: 'swap',
variable: '--font-inter',
});
export const jetBrainsMono = JetBrains_Mono({
subsets: ['latin'],
display: 'swap',
variable: '--font-mono',
});

View File

@@ -1,41 +0,0 @@
import type { ApiItem, ApiItemContainerMixin } from '@discordjs/api-extractor-model';
/**
* Resolves all inherited members (including merged members) of a given parent.
*
* @param parent - The parent to resolve the inherited members of.
* @param predicate - A predicate to filter the members by.
*/
export function resolveMembers<WantedItem extends ApiItem>(
parent: ApiItemContainerMixin,
predicate: (item: ApiItem) => item is WantedItem,
) {
const seenItems = new Set<string>();
const inheritedMembers = parent.findMembersWithInheritance().items.reduce((acc, item) => {
if (predicate(item) && !seenItems.has(item.displayName)) {
acc.push({
item,
inherited:
item.parent?.containerKey === parent.containerKey
? undefined
: (item.parent as ApiItemContainerMixin | undefined),
});
seenItems.add(item.displayName);
}
return acc;
}, new Array<{ inherited?: ApiItemContainerMixin | undefined; item: WantedItem }>());
const mergedMembers = parent
.getMergedSiblings()
.filter((sibling) => sibling.containerKey !== parent.containerKey)
.flatMap((sibling) => (sibling as ApiItemContainerMixin).findMembersWithInheritance().items)
.filter((item) => predicate(item) && !seenItems.has(item.containerKey))
.map((item) => ({
item: item as WantedItem,
inherited: item.parent ? (item.parent as ApiItemContainerMixin) : undefined,
}));
return [...inheritedMembers, ...mergedMembers];
}

View File

@@ -1,56 +0,0 @@
import type { ApiDocumentedItem, ApiEntryPoint, ApiModel, Excerpt } from '@discordjs/api-extractor-model';
import { ApiParameterListMixin } from '@discordjs/api-extractor-model';
import type { DocSection } from '@microsoft/tsdoc';
import { resolvePackageName } from './resolvePackageName';
export const findMemberByKey = (model: ApiModel, packageName: string, containerKey: string) => {
const pkg = model.tryGetPackageByName(resolvePackageName(packageName))!;
return (pkg.members[0] as ApiEntryPoint).tryGetMemberByKey(containerKey);
};
export const findMember = (model: ApiModel, packageName: string, memberName: string | undefined) => {
if (!memberName) {
return undefined;
}
const pkg = model.tryGetPackageByName(resolvePackageName(packageName))!;
return pkg.entryPoints[0]?.findMembersByName(memberName)[0];
};
interface ResolvedParameter {
description?: DocSection | undefined;
isOptional: boolean;
isRest: boolean;
name: string;
parameterTypeExcerpt: Excerpt;
}
/**
* This takes an api item with a parameter list and resolves the names and descriptions of all the parameters.
*
* @remarks
* This is different from accessing `Parameter#name` or `Parameter.tsdocBlockComment` as this method cross-references the associated tsdoc
* parameter names and descriptions and uses them as a higher precedence to the source code.
* @param item - The api item to resolve parameter data for
* @returns An array of parameters
*/
export function resolveParameters(item: ApiDocumentedItem & ApiParameterListMixin): ResolvedParameter[] {
return item.parameters.map((param, idx) => {
const tsdocAnalog =
item.tsdocComment?.params.blocks[idx] ??
item
.getMergedSiblings()
.find(
(paramList): paramList is ApiDocumentedItem & ApiParameterListMixin =>
ApiParameterListMixin.isBaseClassOf(paramList) && paramList.overloadIndex === 1,
)?.tsdocComment?.params.blocks[idx];
return {
name: param.tsdocParamBlock?.parameterName ?? tsdocAnalog?.parameterName ?? param.name,
description: param.tsdocParamBlock?.content ?? tsdocAnalog?.content,
isOptional: param.isOptional,
isRest: param.isRest,
parameterTypeExcerpt: param.parameterTypeExcerpt,
};
});
}

View File

@@ -0,0 +1,35 @@
import { VscSymbolClass } from '@react-icons/all-files/vsc/VscSymbolClass';
import { VscSymbolEnum } from '@react-icons/all-files/vsc/VscSymbolEnum';
import { VscSymbolEnumMember } from '@react-icons/all-files/vsc/VscSymbolEnumMember';
import { VscSymbolEvent } from '@react-icons/all-files/vsc/VscSymbolEvent';
import { VscSymbolInterface } from '@react-icons/all-files/vsc/VscSymbolInterface';
import { VscSymbolMethod } from '@react-icons/all-files/vsc/VscSymbolMethod';
import { VscSymbolParameter } from '@react-icons/all-files/vsc/VscSymbolParameter';
import { VscSymbolProperty } from '@react-icons/all-files/vsc/VscSymbolProperty';
import { VscSymbolVariable } from '@react-icons/all-files/vsc/VscSymbolVariable';
export function resolveKind(item: any, size = 24) {
switch (item) {
case 'Class':
return <VscSymbolClass aria-hidden className="flex-shrink-0" size={size} />;
case 'Enum':
return <VscSymbolEnum aria-hidden className="flex-shrink-0" size={size} />;
case 'EnumMember':
return <VscSymbolEnumMember aria-hidden className="flex-shrink-0" size={size} />;
case 'Interface':
return <VscSymbolInterface aria-hidden className="flex-shrink-0" size={size} />;
case 'Property':
case 'PropertySignature':
return <VscSymbolProperty aria-hidden className="flex-shrink-0" size={size} />;
case 'TypeAlias':
case 'Variable':
return <VscSymbolVariable aria-hidden className="flex-shrink-0" size={size} />;
case 'Event':
return <VscSymbolEvent aria-hidden className="flex-shrink-0" size={size} />;
case 'Parameter':
case 'TypeParameter':
return <VscSymbolParameter aria-hidden className="flex-shrink-0" size={size} />;
default:
return <VscSymbolMethod aria-hidden className="flex-shrink-0" size={size} />;
}
}

View File

@@ -1,3 +0,0 @@
export function resolvePackageName(packageName: string) {
return packageName === 'discord.js' ? packageName : `@discordjs/${packageName}`;
}

View File

@@ -1,6 +0,0 @@
import MeiliSearch from 'meilisearch';
export const client = new MeiliSearch({
host: 'https://search.discordjs.dev',
apiKey: 'b51923c6abb574b1e97be9a03dc6414b6c69fb0c5696d0ef01a82b0f77d223db',
});