mirror of
https://github.com/discordjs/discord.js.git
synced 2026-03-13 18:13:29 +01:00
refactor: docs (#10126)
This commit is contained in:
@@ -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}`;
|
||||
|
||||
7
apps/website/src/util/fetchLatestVersion.ts
Normal file
7
apps/website/src/util/fetchLatestVersion.ts
Normal 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';
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
13
apps/website/src/util/fetchVersions.ts
Normal file
13
apps/website/src/util/fetchVersions.ts
Normal 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 [];
|
||||
}
|
||||
}
|
||||
@@ -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',
|
||||
});
|
||||
@@ -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];
|
||||
}
|
||||
@@ -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,
|
||||
};
|
||||
});
|
||||
}
|
||||
35
apps/website/src/util/resolveNodeKind.tsx
Normal file
35
apps/website/src/util/resolveNodeKind.tsx
Normal 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} />;
|
||||
}
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
export function resolvePackageName(packageName: string) {
|
||||
return packageName === 'discord.js' ? packageName : `@discordjs/${packageName}`;
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
import MeiliSearch from 'meilisearch';
|
||||
|
||||
export const client = new MeiliSearch({
|
||||
host: 'https://search.discordjs.dev',
|
||||
apiKey: 'b51923c6abb574b1e97be9a03dc6414b6c69fb0c5696d0ef01a82b0f77d223db',
|
||||
});
|
||||
Reference in New Issue
Block a user