diff --git a/packages/api-extractor-utils/.eslintrc.json b/packages/api-extractor-utils/.eslintrc.json new file mode 100644 index 000000000..6115ee5c0 --- /dev/null +++ b/packages/api-extractor-utils/.eslintrc.json @@ -0,0 +1,7 @@ +{ + "extends": "../../.eslintrc.json", + "plugins": ["eslint-plugin-tsdoc"], + "rules": { + "tsdoc/syntax": "warn" + } +} diff --git a/packages/api-extractor-utils/.gitignore b/packages/api-extractor-utils/.gitignore new file mode 100644 index 000000000..86b93e929 --- /dev/null +++ b/packages/api-extractor-utils/.gitignore @@ -0,0 +1,27 @@ +# Packages +node_modules/ + +# Log files +logs/ +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed + +# Env +.env + +# Dist +dist/ +typings/ +docs/**/* +!docs/index.json +!docs/README.md + +# Miscellaneous +.tmp/ +coverage/ +tsconfig.tsbuildinfo diff --git a/packages/api-extractor-utils/.lintstagedrc.js b/packages/api-extractor-utils/.lintstagedrc.js new file mode 100644 index 000000000..dc17706a5 --- /dev/null +++ b/packages/api-extractor-utils/.lintstagedrc.js @@ -0,0 +1 @@ +module.exports = require('../../.lintstagedrc.json'); diff --git a/packages/api-extractor-utils/.prettierignore b/packages/api-extractor-utils/.prettierignore new file mode 100644 index 000000000..8b94c7d45 --- /dev/null +++ b/packages/api-extractor-utils/.prettierignore @@ -0,0 +1,8 @@ +# Autogenerated +CHANGELOG.md +.turbo +dist/ +docs/**/* +!docs/index.yml +!docs/README.md +coverage/ \ No newline at end of file diff --git a/packages/api-extractor-utils/package.json b/packages/api-extractor-utils/package.json new file mode 100644 index 000000000..5f14d291e --- /dev/null +++ b/packages/api-extractor-utils/package.json @@ -0,0 +1,65 @@ +{ + "name": "@discordjs/api-extractor-utils", + "version": "1.0.0", + "description": "Utilities for api-extractor", + "private": true, + "scripts": { + "build": "unbuild", + "lint": "prettier --check . && TIMING=1 eslint src --ext mjs,js,ts", + "format": "prettier --write . && TIMING=1 eslint src --ext mjs,js,ts --fix", + "fmt": "yarn format" + }, + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "exports": { + "import": "./dist/index.mjs", + "require": "./dist/index.cjs", + "types": "./dist/index.d.ts" + }, + "directories": { + "lib": "src", + "test": "__tests__" + }, + "files": [ + "dist" + ], + "contributors": [ + "Suneet Tipirneni " + ], + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "git+https://github.com/discordjs/discord.js.git" + }, + "bugs": { + "url": "https://github.com/discordjs/discord.js/issues" + }, + "homepage": "https://discord.js.org", + "dependencies": { + "@microsoft/api-extractor-model": "^7.23.3", + "@microsoft/tsdoc": "^0.14.1" + }, + "devDependencies": { + "@favware/cliff-jumper": "^1.8.7", + "@types/node": "^16.11.54", + "@typescript-eslint/eslint-plugin": "^5.34.0", + "@typescript-eslint/parser": "^5.34.0", + "eslint": "^8.22.0", + "eslint-config-marine": "^9.4.1", + "eslint-config-prettier": "^8.5.0", + "eslint-import-resolver-typescript": "^3.5.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-tsdoc": "^0.2.16", + "prettier": "^2.7.1", + "rollup-plugin-typescript2": "^0.33.0", + "typescript": "^4.7.4", + "unbuild": "^0.8.9" + }, + "engines": { + "node": ">=16.9.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/website/src/DocModel/ApiNodeJSONEncoder.ts b/packages/api-extractor-utils/src/ApiNodeJSONEncoder.ts similarity index 94% rename from packages/website/src/DocModel/ApiNodeJSONEncoder.ts rename to packages/api-extractor-utils/src/ApiNodeJSONEncoder.ts index 433586b6f..cd0923b85 100644 --- a/packages/website/src/DocModel/ApiNodeJSONEncoder.ts +++ b/packages/api-extractor-utils/src/ApiNodeJSONEncoder.ts @@ -18,20 +18,12 @@ import { type ApiConstructor, type ApiItemContainerMixin, } from '@microsoft/api-extractor-model'; -import { generateTypeParamData } from './TypeParameterMixin'; -import { Visibility } from './Visibility'; -import { createCommentNode } from './comment'; -import type { DocBlockJSON } from './comment/CommentBlock'; -import type { AnyDocNodeJSON } from './comment/CommentNode'; -import { type DocNodeContainerJSON, nodeContainer } from './comment/CommentNodeContainer'; -import { - generatePath, - genParameter, - genReference, - genToken, - resolveName, - type TokenDocumentation, -} from '~/util/parse.server'; +import { generateTypeParamData } from './TypeParameterJSONEncoder'; +import { type TokenDocumentation, resolveName, genReference, genToken, genParameter, generatePath } from './parse'; +import { createCommentNode } from './tsdoc'; +import type { DocBlockJSON } from './tsdoc/CommentBlock'; +import type { AnyDocNodeJSON } from './tsdoc/CommentNode'; +import { type DocNodeContainerJSON, nodeContainer } from './tsdoc/CommentNodeContainer'; export interface ReferenceData { name: string; @@ -96,7 +88,7 @@ export interface ApiMethodSignatureJSON export interface ApiMethodJSON extends ApiMethodSignatureJSON { static: boolean; - visibility: Visibility; + protected: boolean; } export interface ApiParameterJSON { @@ -293,7 +285,7 @@ export class ApiNodeJSONEncoder { return { ...this.encodeMethodSignature(model, item, parent, version), static: item.isStatic, - visibility: item.isProtected ? Visibility.Protected : Visibility.Public, + protected: item.isProtected, }; } diff --git a/packages/website/src/DocModel/TypeParameterMixin.ts b/packages/api-extractor-utils/src/TypeParameterJSONEncoder.ts similarity index 80% rename from packages/website/src/DocModel/TypeParameterMixin.ts rename to packages/api-extractor-utils/src/TypeParameterJSONEncoder.ts index 45f90a254..43a028786 100644 --- a/packages/website/src/DocModel/TypeParameterMixin.ts +++ b/packages/api-extractor-utils/src/TypeParameterJSONEncoder.ts @@ -1,6 +1,6 @@ -import type { ApiItem, ApiModel, TypeParameter } from '@microsoft/api-extractor-model'; -import { block, type DocBlockJSON } from './comment/CommentBlock'; -import { genToken, type TokenDocumentation } from '~/util/parse.server'; +import type { TypeParameter, ApiModel, ApiItem } from '@microsoft/api-extractor-model'; +import { type TokenDocumentation, genToken } from './parse'; +import { type DocBlockJSON, block } from './tsdoc/CommentBlock'; export interface TypeParameterData { name: string; diff --git a/packages/api-extractor-utils/src/index.ts b/packages/api-extractor-utils/src/index.ts new file mode 100644 index 000000000..833d0a0f5 --- /dev/null +++ b/packages/api-extractor-utils/src/index.ts @@ -0,0 +1,4 @@ +export * from './ApiNodeJSONEncoder'; +export * from './parse'; +export * from './tsdoc'; +export * from './TypeParameterJSONEncoder'; diff --git a/packages/website/src/util/parse.server.ts b/packages/api-extractor-utils/src/parse.ts similarity index 97% rename from packages/website/src/util/parse.server.ts rename to packages/api-extractor-utils/src/parse.ts index 5b982c036..c1558843f 100644 --- a/packages/website/src/util/parse.server.ts +++ b/packages/api-extractor-utils/src/parse.ts @@ -14,8 +14,8 @@ import { } from '@microsoft/api-extractor-model'; import type { DocNode, DocParagraph, DocPlainText } from '@microsoft/tsdoc'; import { type Meaning, ModuleSource } from '@microsoft/tsdoc/lib-commonjs/beta/DeclarationReference'; -import { createCommentNode } from '~/DocModel/comment'; -import type { DocBlockJSON } from '~/DocModel/comment/CommentBlock'; +import { createCommentNode } from './tsdoc'; +import type { DocBlockJSON } from './tsdoc/CommentBlock'; export function findPackage(model: ApiModel, name: string): ApiPackage | undefined { return (model.findMembersByName(name)[0] ?? model.findMembersByName(`@discordjs/${name}`)[0]) as diff --git a/packages/website/src/DocModel/comment/CommentBlock.ts b/packages/api-extractor-utils/src/tsdoc/CommentBlock.ts similarity index 100% rename from packages/website/src/DocModel/comment/CommentBlock.ts rename to packages/api-extractor-utils/src/tsdoc/CommentBlock.ts diff --git a/packages/website/src/DocModel/comment/CommentBlockTag.ts b/packages/api-extractor-utils/src/tsdoc/CommentBlockTag.ts similarity index 100% rename from packages/website/src/DocModel/comment/CommentBlockTag.ts rename to packages/api-extractor-utils/src/tsdoc/CommentBlockTag.ts diff --git a/packages/website/src/DocModel/comment/CommentCodeSpan.ts b/packages/api-extractor-utils/src/tsdoc/CommentCodeSpan.ts similarity index 100% rename from packages/website/src/DocModel/comment/CommentCodeSpan.ts rename to packages/api-extractor-utils/src/tsdoc/CommentCodeSpan.ts diff --git a/packages/website/src/DocModel/comment/CommentNode.ts b/packages/api-extractor-utils/src/tsdoc/CommentNode.ts similarity index 100% rename from packages/website/src/DocModel/comment/CommentNode.ts rename to packages/api-extractor-utils/src/tsdoc/CommentNode.ts diff --git a/packages/website/src/DocModel/comment/CommentNodeContainer.ts b/packages/api-extractor-utils/src/tsdoc/CommentNodeContainer.ts similarity index 100% rename from packages/website/src/DocModel/comment/CommentNodeContainer.ts rename to packages/api-extractor-utils/src/tsdoc/CommentNodeContainer.ts diff --git a/packages/website/src/DocModel/comment/FencedCodeCommentNode.ts b/packages/api-extractor-utils/src/tsdoc/FencedCodeCommentNode.ts similarity index 100% rename from packages/website/src/DocModel/comment/FencedCodeCommentNode.ts rename to packages/api-extractor-utils/src/tsdoc/FencedCodeCommentNode.ts diff --git a/packages/website/src/DocModel/comment/LinkTagCommentNode.ts b/packages/api-extractor-utils/src/tsdoc/LinkTagCommentNode.ts similarity index 88% rename from packages/website/src/DocModel/comment/LinkTagCommentNode.ts rename to packages/api-extractor-utils/src/tsdoc/LinkTagCommentNode.ts index 65e50a89e..3a0e14e00 100644 --- a/packages/website/src/DocModel/comment/LinkTagCommentNode.ts +++ b/packages/api-extractor-utils/src/tsdoc/LinkTagCommentNode.ts @@ -1,7 +1,7 @@ import type { ApiItem, ApiModel } from '@microsoft/api-extractor-model'; import type { DocDeclarationReference, DocLinkTag } from '@microsoft/tsdoc'; import { type DocNodeJSON, node } from './CommentNode'; -import { generatePath, resolveName } from '~/util/parse.server'; +import { resolveName, generatePath } from '../parse'; interface LinkTagCodeLink { name: string; @@ -15,7 +15,7 @@ export interface DocLinkTagJSON extends DocNodeJSON { urlDestination: string | null; } -export function genToken( +export function genLinkToken( model: ApiModel, ref: DocDeclarationReference, context: ApiItem | null, @@ -46,7 +46,7 @@ export function linkTagNode( : null; const codeDestination = linkNode.codeDestination - ? genToken(model, linkNode.codeDestination, parentItem ?? packageEntryPoint ?? null, version) + ? genLinkToken(model, linkNode.codeDestination, parentItem ?? packageEntryPoint ?? null, version) : null; const text = linkNode.linkText ?? null; const urlDestination = linkNode.urlDestination ?? null; diff --git a/packages/website/src/DocModel/comment/ParamBlock.ts b/packages/api-extractor-utils/src/tsdoc/ParamBlock.ts similarity index 100% rename from packages/website/src/DocModel/comment/ParamBlock.ts rename to packages/api-extractor-utils/src/tsdoc/ParamBlock.ts diff --git a/packages/website/src/DocModel/comment/PlainTextCommentNode.ts b/packages/api-extractor-utils/src/tsdoc/PlainTextCommentNode.ts similarity index 100% rename from packages/website/src/DocModel/comment/PlainTextCommentNode.ts rename to packages/api-extractor-utils/src/tsdoc/PlainTextCommentNode.ts diff --git a/packages/website/src/DocModel/comment/RootComment.ts b/packages/api-extractor-utils/src/tsdoc/RootComment.ts similarity index 100% rename from packages/website/src/DocModel/comment/RootComment.ts rename to packages/api-extractor-utils/src/tsdoc/RootComment.ts diff --git a/packages/website/src/DocModel/comment/index.ts b/packages/api-extractor-utils/src/tsdoc/index.ts similarity index 82% rename from packages/website/src/DocModel/comment/index.ts rename to packages/api-extractor-utils/src/tsdoc/index.ts index 6c4042594..d8c12c2b4 100644 --- a/packages/website/src/DocModel/comment/index.ts +++ b/packages/api-extractor-utils/src/tsdoc/index.ts @@ -50,3 +50,14 @@ export function createCommentNode( return _node(node); } } + +export * from './CommentNode'; +export * from './CommentNodeContainer'; +export * from './CommentBlock'; +export * from './CommentBlockTag'; +export * from './CommentCodeSpan'; +export * from './FencedCodeCommentNode'; +export * from './LinkTagCommentNode'; +export * from './ParamBlock'; +export * from './PlainTextCommentNode'; +export * from './RootComment'; diff --git a/packages/api-extractor-utils/tsconfig.eslint.json b/packages/api-extractor-utils/tsconfig.eslint.json new file mode 100644 index 000000000..d04d4be3a --- /dev/null +++ b/packages/api-extractor-utils/tsconfig.eslint.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "allowJs": true + }, + "include": [ + "**/*.ts", + "**/*.tsx", + "**/*.js", + "**/*.mjs", + "**/*.jsx", + "**/*.test.ts", + "**/*.test.js", + "**/*.test.mjs", + "**/*.spec.ts", + "**/*.spec.js", + "**/*.spec.mjs" + ], + "exclude": [] +} diff --git a/packages/api-extractor-utils/tsconfig.json b/packages/api-extractor-utils/tsconfig.json new file mode 100644 index 000000000..80a91e8d4 --- /dev/null +++ b/packages/api-extractor-utils/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "skipDefaultLibCheck": true, + "skipLibCheck": true + }, + "include": ["src/**/*.ts"] +} diff --git a/packages/scripts/.gitignore b/packages/scripts/.gitignore index 5189c6c61..47873baa9 100644 --- a/packages/scripts/.gitignore +++ b/packages/scripts/.gitignore @@ -23,3 +23,5 @@ docs/**/* # Miscellaneous .tmp/ coverage/ + +searchIndex/ \ No newline at end of file diff --git a/packages/scripts/package.json b/packages/scripts/package.json index 8245d541e..8ab1fb512 100644 --- a/packages/scripts/package.json +++ b/packages/scripts/package.json @@ -4,7 +4,6 @@ "description": "A set of scripts that we use for our workflows", "private": true, "scripts": { - "test": "vitest run", "build": "unbuild", "lint": "prettier --check . && TIMING=1 eslint src --ext mjs,js,ts", "format": "prettier --write . && TIMING=1 eslint src --ext mjs,js,ts --fix", @@ -44,6 +43,9 @@ }, "homepage": "https://discord.js.org", "dependencies": { + "@discordjs/api-extractor-utils": "workspace:^", + "@microsoft/api-extractor-model": "^7.23.3", + "@microsoft/tsdoc": "^0.14.1", "commander": "^9.4.0", "tslib": "^2.4.0" }, diff --git a/packages/scripts/src/generateIndex.ts b/packages/scripts/src/generateIndex.ts new file mode 100644 index 000000000..4509b88dd --- /dev/null +++ b/packages/scripts/src/generateIndex.ts @@ -0,0 +1,91 @@ +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { generatePath } from '@discordjs/api-extractor-utils'; +import { ApiDeclaredItem, ApiItem, ApiItemContainerMixin, ApiModel } from '@microsoft/api-extractor-model'; +import { DocCodeSpan, DocNode, DocNodeKind, DocParagraph, DocPlainText } from '@microsoft/tsdoc'; + +export interface MemberJSON { + name: string; + kind: string; + summary: string | null; + path: string; +} + +/** + * Attempts to resolve the summary text for the given item. + * @param item - The API item to resolve the summary text for. + */ +function tryResolveSummaryText(item: ApiDeclaredItem): string | null { + if (!item.tsdocComment) { + return null; + } + + const { summarySection } = item.tsdocComment; + + let retVal = ''; + + // Recursively visit the nodes in the summary section. + const visitTSDocNode = (node: DocNode) => { + switch (node.kind) { + case DocNodeKind.CodeSpan: + retVal += (node as DocCodeSpan).code; + break; + case DocNodeKind.PlainText: + retVal += (node as DocPlainText).text; + break; + case DocNodeKind.Section: + case DocNodeKind.Paragraph: + return (node as DocParagraph).nodes.forEach(visitTSDocNode); + default: // We'll ignore all other nodes. + break; + } + }; + + for (const node of summarySection.nodes) { + visitTSDocNode(node); + } + + if (retVal === '') { + return null; + } + + return retVal; +} + +export function visitNodes(item: ApiItem, tag: string) { + const members: MemberJSON[] = []; + + for (const member of item.members) { + if (!(member instanceof ApiDeclaredItem)) { + continue; + } + + if (ApiItemContainerMixin.isBaseClassOf(member)) { + members.push(...visitNodes(member, tag)); + } + + members.push({ + name: member.displayName, + kind: member.kind, + summary: tryResolveSummaryText(member), + path: generatePath(member.getHierarchy(), tag), + }); + } + + return members; +} + +export async function generateIndex(model: ApiModel, packageName: string, tag: string) { + const members = visitNodes(model, tag); + + const dir = 'searchIndex'; + + if (!(await fs.stat(dir)).isDirectory()) { + await fs.mkdir(dir); + } + + await fs.writeFile( + path.join('searchIndex', `${packageName}-${tag}-doc-index.json`), + JSON.stringify(members, undefined, 2), + ); +} diff --git a/packages/scripts/src/index.ts b/packages/scripts/src/index.ts index cb0ff5c3b..1b4fba204 100644 --- a/packages/scripts/src/index.ts +++ b/packages/scripts/src/index.ts @@ -1 +1 @@ -export {}; +export * from './generateIndex'; diff --git a/packages/website/package.json b/packages/website/package.json index d8fd69340..81390a357 100644 --- a/packages/website/package.json +++ b/packages/website/package.json @@ -39,6 +39,7 @@ }, "homepage": "https://discord.js.org", "dependencies": { + "@discordjs/api-extractor-utils": "workspace:^", "@emotion/react": "^11.10.0", "@emotion/server": "^11.10.0", "@mantine/core": "^5.2.3", diff --git a/packages/website/src/DocModel/Visibility.ts b/packages/website/src/DocModel/Visibility.ts deleted file mode 100644 index 3a0ca0019..000000000 --- a/packages/website/src/DocModel/Visibility.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum Visibility { - Public, - Protected, -} diff --git a/packages/website/src/components/CodeListing.tsx b/packages/website/src/components/CodeListing.tsx index e620ebac1..15c27407d 100644 --- a/packages/website/src/components/CodeListing.tsx +++ b/packages/website/src/components/CodeListing.tsx @@ -1,3 +1,4 @@ +import type { TokenDocumentation, ApiItemJSON, AnyDocNodeJSON, InheritanceData } from '@discordjs/api-extractor-utils'; import { ActionIcon, Badge, Box, createStyles, Group, MediaQuery, Stack, Title } from '@mantine/core'; import { useMediaQuery } from '@mantine/hooks'; import type { PropsWithChildren } from 'react'; @@ -5,9 +6,6 @@ import { FiLink } from 'react-icons/fi'; import { HyperlinkedText } from './HyperlinkedText'; import { InheritanceText } from './InheritanceText'; import { TSDoc } from './tsdoc/TSDoc'; -import type { ApiItemJSON, InheritanceData } from '~/DocModel/ApiNodeJSONEncoder'; -import type { AnyDocNodeJSON } from '~/DocModel/comment/CommentNode'; -import type { TokenDocumentation } from '~/util/parse.server'; export enum CodeListingSeparatorType { Type = ':', diff --git a/packages/website/src/components/DocContainer.tsx b/packages/website/src/components/DocContainer.tsx index 255939270..42af51317 100644 --- a/packages/website/src/components/DocContainer.tsx +++ b/packages/website/src/components/DocContainer.tsx @@ -1,3 +1,11 @@ +import type { + ApiItemJSON, + TokenDocumentation, + TypeParameterData, + AnyDocNodeJSON, + ApiClassJSON, + ApiInterfaceJSON, +} from '@discordjs/api-extractor-utils'; import { Group, Stack, @@ -30,10 +38,6 @@ import { Section } from './Section'; import { TableOfContentItems } from './TableOfContentItems'; import { TypeParamTable } from './TypeParamTable'; import { TSDoc } from './tsdoc/TSDoc'; -import type { ApiClassJSON, ApiInterfaceJSON, ApiItemJSON } from '~/DocModel/ApiNodeJSONEncoder'; -import type { TypeParameterData } from '~/DocModel/TypeParameterMixin'; -import type { AnyDocNodeJSON } from '~/DocModel/comment/CommentNode'; -import type { TokenDocumentation } from '~/util/parse.server'; type DocContainerProps = PropsWithChildren<{ name: string; diff --git a/packages/website/src/components/HyperlinkedText.tsx b/packages/website/src/components/HyperlinkedText.tsx index 9991d304e..d6953701e 100644 --- a/packages/website/src/components/HyperlinkedText.tsx +++ b/packages/website/src/components/HyperlinkedText.tsx @@ -1,6 +1,6 @@ +import type { TokenDocumentation } from '@discordjs/api-extractor-utils'; import { Anchor, Text } from '@mantine/core'; import Link from 'next/link'; -import type { TokenDocumentation } from '~/util/parse.server'; /** * Constructs a hyperlinked html node based on token type references diff --git a/packages/website/src/components/InheritanceText.tsx b/packages/website/src/components/InheritanceText.tsx index f7e964890..744d6b7e6 100644 --- a/packages/website/src/components/InheritanceText.tsx +++ b/packages/website/src/components/InheritanceText.tsx @@ -1,6 +1,6 @@ +import type { InheritanceData } from '@discordjs/api-extractor-utils'; import { Anchor, Text } from '@mantine/core'; import Link from 'next/link'; -import type { InheritanceData } from '~/DocModel/ApiNodeJSONEncoder'; export function InheritanceText({ data }: { data: InheritanceData }) { return ( diff --git a/packages/website/src/components/MethodItem.tsx b/packages/website/src/components/MethodItem.tsx index 93698a217..3ef6f1d37 100644 --- a/packages/website/src/components/MethodItem.tsx +++ b/packages/website/src/components/MethodItem.tsx @@ -1,3 +1,4 @@ +import type { ApiMethodJSON, ApiMethodSignatureJSON } from '@discordjs/api-extractor-utils'; import { ActionIcon, Badge, Box, createStyles, Group, MediaQuery, Stack, Title } from '@mantine/core'; import { useMediaQuery } from '@mantine/hooks'; import { FiLink } from 'react-icons/fi'; @@ -5,8 +6,6 @@ import { HyperlinkedText } from './HyperlinkedText'; import { InheritanceText } from './InheritanceText'; import { ParameterTable } from './ParameterTable'; import { TSDoc } from './tsdoc/TSDoc'; -import type { ApiMethodJSON, ApiMethodSignatureJSON } from '~/DocModel/ApiNodeJSONEncoder'; -import { Visibility } from '~/DocModel/Visibility'; const useStyles = createStyles((theme) => ({ outer: { @@ -48,7 +47,7 @@ export function MethodItem({ data }: { data: ApiMethodJSON | ApiMethodSignatureJ {data.deprecated || - (data.kind === 'Method' && method.visibility === Visibility.Protected) || + (data.kind === 'Method' && method.protected) || (data.kind === 'Method' && method.static) ? ( {data.deprecated ? ( @@ -56,9 +55,7 @@ export function MethodItem({ data }: { data: ApiMethodJSON | ApiMethodSignatureJ Deprecated ) : null} - {data.kind === 'Method' && method.visibility === Visibility.Protected ? ( - Protected - ) : null} + {data.kind === 'Method' && method.protected ? Protected : null} {data.kind === 'Method' && method.static ? Static : null} ) : null} diff --git a/packages/website/src/components/MethodList.tsx b/packages/website/src/components/MethodList.tsx index effb382f4..6f994fec3 100644 --- a/packages/website/src/components/MethodList.tsx +++ b/packages/website/src/components/MethodList.tsx @@ -1,7 +1,7 @@ +import type { ApiMethodJSON, ApiMethodSignatureJSON } from '@discordjs/api-extractor-utils'; import { Divider, Stack } from '@mantine/core'; import { Fragment } from 'react'; import { MethodItem } from './MethodItem'; -import type { ApiMethodJSON, ApiMethodSignatureJSON } from '~/DocModel/ApiNodeJSONEncoder'; export function MethodList({ data }: { data: (ApiMethodJSON | ApiMethodSignatureJSON)[] }) { return ( diff --git a/packages/website/src/components/ParameterTable.tsx b/packages/website/src/components/ParameterTable.tsx index d5a1cb50d..4666f387b 100644 --- a/packages/website/src/components/ParameterTable.tsx +++ b/packages/website/src/components/ParameterTable.tsx @@ -1,8 +1,8 @@ +import type { ParameterDocumentation } from '@discordjs/api-extractor-utils'; import { Box, ScrollArea } from '@mantine/core'; import { HyperlinkedText } from './HyperlinkedText'; import { Table } from './Table'; import { TSDoc } from './tsdoc/TSDoc'; -import type { ParameterDocumentation } from '~/util/parse.server'; const columnStyles = { Name: 'font-mono whitespace-nowrap', diff --git a/packages/website/src/components/PropertyList.tsx b/packages/website/src/components/PropertyList.tsx index 7397df375..4c47b8908 100644 --- a/packages/website/src/components/PropertyList.tsx +++ b/packages/website/src/components/PropertyList.tsx @@ -1,6 +1,6 @@ +import type { ApiPropertyItemJSON } from '@discordjs/api-extractor-utils'; import { Stack } from '@mantine/core'; import { CodeListing } from './CodeListing'; -import type { ApiPropertyItemJSON } from '~/DocModel/ApiNodeJSONEncoder'; export function PropertyList({ data }: { data: ApiPropertyItemJSON[] }) { return ( diff --git a/packages/website/src/components/Sections.tsx b/packages/website/src/components/Sections.tsx index 7c1fc1166..6a809b2fb 100644 --- a/packages/website/src/components/Sections.tsx +++ b/packages/website/src/components/Sections.tsx @@ -1,3 +1,9 @@ +import type { + ApiClassJSON, + ApiInterfaceJSON, + ParameterDocumentation, + ApiConstructorJSON, +} from '@discordjs/api-extractor-utils'; import { Stack, Group, Badge, Title } from '@mantine/core'; import { useMediaQuery } from '@mantine/hooks'; import { VscSymbolConstant, VscSymbolMethod, VscSymbolProperty } from 'react-icons/vsc'; @@ -6,8 +12,6 @@ import { ParameterTable } from './ParameterTable'; import { PropertyList } from './PropertyList'; import { Section } from './Section'; import { TSDoc } from './tsdoc/TSDoc'; -import type { ApiClassJSON, ApiConstructorJSON, ApiInterfaceJSON } from '~/DocModel/ApiNodeJSONEncoder'; -import type { ParameterDocumentation } from '~/util/parse.server'; export function PropertiesSection({ data }: { data: ApiClassJSON['properties'] | ApiInterfaceJSON['properties'] }) { const matches = useMediaQuery('(max-width: 768px)'); diff --git a/packages/website/src/components/SidebarLayout.tsx b/packages/website/src/components/SidebarLayout.tsx index 7c8278f02..0bd9053ee 100644 --- a/packages/website/src/components/SidebarLayout.tsx +++ b/packages/website/src/components/SidebarLayout.tsx @@ -1,3 +1,4 @@ +import type { getMembers, ApiItemJSON } from '@discordjs/api-extractor-utils'; import { useMantineTheme, AppShell, @@ -33,10 +34,8 @@ import { VscChevronDown, VscGithubInverted, VscPackage, VscVersions } from 'reac import { WiDaySunny, WiNightClear } from 'react-icons/wi'; import useSWR from 'swr'; import { SidebarItems } from './SidebarItems'; -import type { ApiItemJSON } from '~/DocModel/ApiNodeJSONEncoder'; import type { findMember } from '~/util/model.server'; import { PACKAGES } from '~/util/packages'; -import type { getMembers } from '~/util/parse.server'; const fetcher = (url: string) => fetch(url).then((res) => res.json()); diff --git a/packages/website/src/components/TableOfContentItems.tsx b/packages/website/src/components/TableOfContentItems.tsx index 266e59e23..ba3d7dd11 100644 --- a/packages/website/src/components/TableOfContentItems.tsx +++ b/packages/website/src/components/TableOfContentItems.tsx @@ -1,7 +1,7 @@ +import type { ApiClassJSON, ApiInterfaceJSON } from '@discordjs/api-extractor-utils'; import { createStyles, Group, Text, Box, Stack, ThemeIcon, useMantineColorScheme } from '@mantine/core'; import { useMemo } from 'react'; import { VscListSelection, VscSymbolMethod, VscSymbolProperty } from 'react-icons/vsc'; -import type { ApiClassJSON, ApiInterfaceJSON } from '~/DocModel/ApiNodeJSONEncoder'; const useStyles = createStyles((theme) => ({ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment diff --git a/packages/website/src/components/TypeParamTable.tsx b/packages/website/src/components/TypeParamTable.tsx index 580b4794e..063e96e49 100644 --- a/packages/website/src/components/TypeParamTable.tsx +++ b/packages/website/src/components/TypeParamTable.tsx @@ -1,8 +1,8 @@ +import type { TypeParameterData } from '@discordjs/api-extractor-utils'; import { ScrollArea } from '@mantine/core'; import { HyperlinkedText } from './HyperlinkedText'; import { Table } from './Table'; import { TSDoc } from './tsdoc/TSDoc'; -import type { TypeParameterData } from '~/DocModel/TypeParameterMixin'; const rowElements = { Name: 'font-mono whitespace-nowrap', diff --git a/packages/website/src/components/model/Class.tsx b/packages/website/src/components/model/Class.tsx index d40bb5b29..ffc001b78 100644 --- a/packages/website/src/components/model/Class.tsx +++ b/packages/website/src/components/model/Class.tsx @@ -1,8 +1,8 @@ +import type { ApiClassJSON } from '@discordjs/api-extractor-utils'; import { Skeleton } from '@mantine/core'; import { useRouter } from 'next/router'; import { DocContainer } from '../DocContainer'; import { ConstructorSection, MethodsSection, PropertiesSection } from '../Sections'; -import type { ApiClassJSON } from '~/DocModel/ApiNodeJSONEncoder'; export function Class({ data }: { data: ApiClassJSON }) { const router = useRouter(); diff --git a/packages/website/src/components/model/Enum.tsx b/packages/website/src/components/model/Enum.tsx index 69f2f1f08..490106ff2 100644 --- a/packages/website/src/components/model/Enum.tsx +++ b/packages/website/src/components/model/Enum.tsx @@ -1,3 +1,4 @@ +import type { ApiEnumJSON } from '@discordjs/api-extractor-utils'; import { Skeleton, Stack } from '@mantine/core'; import { useMediaQuery } from '@mantine/hooks'; import { useRouter } from 'next/router'; @@ -5,7 +6,6 @@ import { VscSymbolEnumMember } from 'react-icons/vsc'; import { CodeListing, CodeListingSeparatorType } from '../CodeListing'; import { DocContainer } from '../DocContainer'; import { Section } from '../Section'; -import type { ApiEnumJSON } from '~/DocModel/ApiNodeJSONEncoder'; export function Enum({ data }: { data: ApiEnumJSON }) { const router = useRouter(); diff --git a/packages/website/src/components/model/Function.tsx b/packages/website/src/components/model/Function.tsx index 1d3f997eb..9c81ef484 100644 --- a/packages/website/src/components/model/Function.tsx +++ b/packages/website/src/components/model/Function.tsx @@ -1,8 +1,8 @@ +import type { ApiFunctionJSON } from '@discordjs/api-extractor-utils'; import { Skeleton } from '@mantine/core'; import { useRouter } from 'next/router'; import { DocContainer } from '../DocContainer'; import { ParametersSection } from '../Sections'; -import type { ApiFunctionJSON } from '~/DocModel/ApiNodeJSONEncoder'; export function Function({ data }: { data: ApiFunctionJSON }) { const router = useRouter(); diff --git a/packages/website/src/components/model/Interface.tsx b/packages/website/src/components/model/Interface.tsx index a1e969a3b..72a9315d3 100644 --- a/packages/website/src/components/model/Interface.tsx +++ b/packages/website/src/components/model/Interface.tsx @@ -1,8 +1,8 @@ +import type { ApiInterfaceJSON } from '@discordjs/api-extractor-utils'; import { Skeleton } from '@mantine/core'; import { useRouter } from 'next/router'; import { DocContainer } from '../DocContainer'; import { MethodsSection, PropertiesSection } from '../Sections'; -import type { ApiInterfaceJSON } from '~/DocModel/ApiNodeJSONEncoder'; export function Interface({ data }: { data: ApiInterfaceJSON }) { const router = useRouter(); diff --git a/packages/website/src/components/model/TypeAlias.tsx b/packages/website/src/components/model/TypeAlias.tsx index f2e1ee4e5..0094d3d21 100644 --- a/packages/website/src/components/model/TypeAlias.tsx +++ b/packages/website/src/components/model/TypeAlias.tsx @@ -1,5 +1,5 @@ +import type { ApiTypeAliasJSON } from '@discordjs/api-extractor-utils'; import { DocContainer } from '../DocContainer'; -import type { ApiTypeAliasJSON } from '~/DocModel/ApiNodeJSONEncoder'; export function TypeAlias({ data }: { data: ApiTypeAliasJSON }) { return ( diff --git a/packages/website/src/components/model/Variable.tsx b/packages/website/src/components/model/Variable.tsx index 65b1fabc7..359dda290 100644 --- a/packages/website/src/components/model/Variable.tsx +++ b/packages/website/src/components/model/Variable.tsx @@ -1,5 +1,5 @@ +import type { ApiVariableJSON } from '@discordjs/api-extractor-utils'; import { DocContainer } from '../DocContainer'; -import type { ApiVariableJSON } from '~/DocModel/ApiNodeJSONEncoder'; export function Variable({ data }: { data: ApiVariableJSON }) { return ; diff --git a/packages/website/src/components/tsdoc/TSDoc.tsx b/packages/website/src/components/tsdoc/TSDoc.tsx index e8207b525..cae45400a 100644 --- a/packages/website/src/components/tsdoc/TSDoc.tsx +++ b/packages/website/src/components/tsdoc/TSDoc.tsx @@ -1,3 +1,12 @@ +import type { + AnyDocNodeJSON, + DocPlainTextJSON, + DocNodeContainerJSON, + DocLinkTagJSON, + DocFencedCodeJSON, + DocBlockJSON, + DocCommentJSON, +} from '@discordjs/api-extractor-utils'; import { Anchor, Box, Code, Text, useMantineColorScheme } from '@mantine/core'; import { DocNodeKind, StandardTags } from '@microsoft/tsdoc'; import Link from 'next/link'; @@ -5,13 +14,6 @@ import { Fragment, useCallback, type ReactNode } from 'react'; import { PrismAsyncLight as SyntaxHighlighter } from 'react-syntax-highlighter'; import { vscDarkPlus, ghcolors } from 'react-syntax-highlighter/dist/cjs/styles/prism'; import { BlockComment } from './BlockComment'; -import type { DocBlockJSON } from '~/DocModel/comment/CommentBlock'; -import type { AnyDocNodeJSON } from '~/DocModel/comment/CommentNode'; -import type { DocNodeContainerJSON } from '~/DocModel/comment/CommentNodeContainer'; -import type { DocFencedCodeJSON } from '~/DocModel/comment/FencedCodeCommentNode'; -import type { DocLinkTagJSON } from '~/DocModel/comment/LinkTagCommentNode'; -import type { DocPlainTextJSON } from '~/DocModel/comment/PlainTextCommentNode'; -import type { DocCommentJSON } from '~/DocModel/comment/RootComment'; export function TSDoc({ node }: { node: AnyDocNodeJSON }): JSX.Element { const { colorScheme } = useMantineColorScheme(); diff --git a/packages/website/src/contexts/member.tsx b/packages/website/src/contexts/member.tsx index f45fd071b..5c15056d2 100644 --- a/packages/website/src/contexts/member.tsx +++ b/packages/website/src/contexts/member.tsx @@ -1,5 +1,5 @@ +import type { ApiItemJSON } from '@discordjs/api-extractor-utils'; import { createContext, useContext, type ReactNode } from 'react'; -import type { ApiItemJSON } from '~/DocModel/ApiNodeJSONEncoder'; export const MemberContext = createContext(undefined); diff --git a/packages/website/src/pages/docs/[...slug].tsx b/packages/website/src/pages/docs/[...slug].tsx index 31ce9d3e5..3b8337f86 100644 --- a/packages/website/src/pages/docs/[...slug].tsx +++ b/packages/website/src/pages/docs/[...slug].tsx @@ -1,6 +1,17 @@ import { readFile } from 'node:fs/promises'; import { join } from 'node:path'; import { cwd } from 'node:process'; +import { + findPackage, + getMembers, + type ApiItemJSON, + type ApiClassJSON, + type ApiFunctionJSON, + type ApiInterfaceJSON, + type ApiTypeAliasJSON, + type ApiVariableJSON, + type ApiEnumJSON, +} from '@discordjs/api-extractor-utils'; import { ActionIcon, Affix, Box, LoadingOverlay, Transition } from '@mantine/core'; import { useMediaQuery, useWindowScroll } from '@mantine/hooks'; import { ApiFunction, ApiItemKind, type ApiPackage } from '@microsoft/api-extractor-model'; @@ -15,15 +26,6 @@ import rehypePrettyCode from 'rehype-pretty-code'; import rehypeRaw from 'rehype-raw'; import rehypeSlug from 'rehype-slug'; import remarkGfm from 'remark-gfm'; -import type { - ApiClassJSON, - ApiEnumJSON, - ApiFunctionJSON, - ApiInterfaceJSON, - ApiItemJSON, - ApiTypeAliasJSON, - ApiVariableJSON, -} from '~/DocModel/ApiNodeJSONEncoder'; import { SidebarLayout, type SidebarLayoutProps } from '~/components/SidebarLayout'; import { Class } from '~/components/model/Class'; import { Enum } from '~/components/model/Enum'; @@ -35,7 +37,6 @@ import { MemberProvider } from '~/contexts/member'; import { createApiModel } from '~/util/api-model.server'; import { findMember, findMemberByKey } from '~/util/model.server'; import { PACKAGES } from '~/util/packages'; -import { findPackage, getMembers } from '~/util/parse.server'; export const getStaticPaths: GetStaticPaths = async () => { const pkgs = ( @@ -94,11 +95,11 @@ export const getStaticPaths: GetStaticPaths = async () => { } const model = createApiModel(data); - const pkg = findPackage(model, packageName); + const pkg = findPackage(model, packageName)!; return [ { params: { slug: ['packages', packageName, 'main'] } }, - ...getMembers(pkg!, 'main').map((member) => { + ...getMembers(pkg, 'main').map((member) => { if (member.kind === ApiItemKind.Function && member.overloadIndex && member.overloadIndex > 1) { return { params: { diff --git a/packages/website/src/util/api-extractor.server.ts b/packages/website/src/util/api-extractor.server.ts deleted file mode 100644 index 6c4ee0f76..000000000 --- a/packages/website/src/util/api-extractor.server.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@microsoft/api-extractor-model'; diff --git a/packages/website/src/util/api-model.server.ts b/packages/website/src/util/api-model.server.ts index c6a797b1b..db961a41e 100644 --- a/packages/website/src/util/api-model.server.ts +++ b/packages/website/src/util/api-model.server.ts @@ -1,8 +1,9 @@ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ -import { ApiItem, ApiModel, type ApiPackage } from '~/util/api-extractor.server'; -import { TSDocConfigFile } from '~/util/tsdoc-config.server'; -import { TSDocConfiguration } from '~/util/tsdoc.server'; + +import { ApiModel, ApiItem, type ApiPackage } from '@microsoft/api-extractor-model'; +import { TSDocConfiguration } from '@microsoft/tsdoc'; +import { TSDocConfigFile } from '@microsoft/tsdoc-config'; export function createApiModel(data: any) { const model = new ApiModel(); diff --git a/packages/website/src/util/model.server.ts b/packages/website/src/util/model.server.ts index a1a96bd55..360f8ccdc 100644 --- a/packages/website/src/util/model.server.ts +++ b/packages/website/src/util/model.server.ts @@ -1,6 +1,5 @@ +import { findPackage, ApiNodeJSONEncoder } from '@discordjs/api-extractor-utils'; import type { ApiEntryPoint, ApiModel } from '@microsoft/api-extractor-model'; -import { findPackage } from './parse.server'; -import { ApiNodeJSONEncoder } from '~/DocModel/ApiNodeJSONEncoder'; export function findMemberByKey(model: ApiModel, packageName: string, containerKey: string, version: string) { const pkg = findPackage(model, packageName)!; diff --git a/packages/website/src/util/tsdoc-config.server.ts b/packages/website/src/util/tsdoc-config.server.ts deleted file mode 100644 index 8c8a52eac..000000000 --- a/packages/website/src/util/tsdoc-config.server.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@microsoft/tsdoc-config'; diff --git a/packages/website/src/util/tsdoc.server.tsx b/packages/website/src/util/tsdoc.server.tsx deleted file mode 100644 index f89461991..000000000 --- a/packages/website/src/util/tsdoc.server.tsx +++ /dev/null @@ -1 +0,0 @@ -export * from '@microsoft/tsdoc'; diff --git a/yarn.lock b/yarn.lock index 5fffa1e2e..58837b15d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1755,6 +1755,29 @@ __metadata: languageName: unknown linkType: soft +"@discordjs/api-extractor-utils@workspace:^, @discordjs/api-extractor-utils@workspace:packages/api-extractor-utils": + version: 0.0.0-use.local + resolution: "@discordjs/api-extractor-utils@workspace:packages/api-extractor-utils" + dependencies: + "@favware/cliff-jumper": ^1.8.7 + "@microsoft/api-extractor-model": ^7.23.3 + "@microsoft/tsdoc": ^0.14.1 + "@types/node": ^16.11.54 + "@typescript-eslint/eslint-plugin": ^5.34.0 + "@typescript-eslint/parser": ^5.34.0 + eslint: ^8.22.0 + eslint-config-marine: ^9.4.1 + eslint-config-prettier: ^8.5.0 + eslint-import-resolver-typescript: ^3.5.0 + eslint-plugin-import: ^2.26.0 + eslint-plugin-tsdoc: ^0.2.16 + prettier: ^2.7.1 + rollup-plugin-typescript2: ^0.33.0 + typescript: ^4.7.4 + unbuild: ^0.8.9 + languageName: unknown + linkType: soft + "@discordjs/builders@workspace:^, @discordjs/builders@workspace:packages/builders": version: 0.0.0-use.local resolution: "@discordjs/builders@workspace:packages/builders" @@ -1947,6 +1970,9 @@ __metadata: version: 0.0.0-use.local resolution: "@discordjs/scripts@workspace:packages/scripts" dependencies: + "@discordjs/api-extractor-utils": "workspace:^" + "@microsoft/api-extractor-model": ^7.23.3 + "@microsoft/tsdoc": ^0.14.1 "@types/node": ^16.11.54 "@typescript-eslint/eslint-plugin": ^5.34.0 "@typescript-eslint/parser": ^5.34.0 @@ -2007,6 +2033,7 @@ __metadata: version: 0.0.0-use.local resolution: "@discordjs/website@workspace:packages/website" dependencies: + "@discordjs/api-extractor-utils": "workspace:^" "@emotion/react": ^11.10.0 "@emotion/server": ^11.10.0 "@mantine/core": ^5.2.3 @@ -2908,7 +2935,7 @@ __metadata: languageName: node linkType: hard -"@microsoft/api-extractor-model@npm:7.23.1, @microsoft/api-extractor-model@npm:^7.23.1": +"@microsoft/api-extractor-model@npm:7.23.1": version: 7.23.1 resolution: "@microsoft/api-extractor-model@npm:7.23.1" dependencies: @@ -2919,6 +2946,17 @@ __metadata: languageName: node linkType: hard +"@microsoft/api-extractor-model@npm:^7.23.1, @microsoft/api-extractor-model@npm:^7.23.3": + version: 7.23.3 + resolution: "@microsoft/api-extractor-model@npm:7.23.3" + dependencies: + "@microsoft/tsdoc": 0.14.1 + "@microsoft/tsdoc-config": ~0.16.1 + "@rushstack/node-core-library": 3.51.1 + checksum: 00ec7a31d1f6d1583c3fcd97b16130bf8570e27cd3be2ecd07cf601b0c91ef63885a55bf068932c5d9278f8a9ab2046dc8305c0047158e6df5e86f5e56e35b77 + languageName: node + linkType: hard + "@microsoft/api-extractor@npm:^7.29.3": version: 7.29.3 resolution: "@microsoft/api-extractor@npm:7.29.3" @@ -2965,7 +3003,7 @@ __metadata: languageName: node linkType: hard -"@microsoft/tsdoc@npm:0.14.1": +"@microsoft/tsdoc@npm:0.14.1, @microsoft/tsdoc@npm:^0.14.1": version: 0.14.1 resolution: "@microsoft/tsdoc@npm:0.14.1" checksum: e4ad038ccff2cd96e0d53ee42e2136f0f5a925b16cfda14261f1c2eb55ba0088a0e3b08ff819b476ddc69b2242a391925fab7f6ae2afabb19b96f87e19c114fc @@ -3401,6 +3439,22 @@ __metadata: languageName: node linkType: hard +"@rushstack/node-core-library@npm:3.51.1": + version: 3.51.1 + resolution: "@rushstack/node-core-library@npm:3.51.1" + dependencies: + "@types/node": 12.20.24 + colors: ~1.2.1 + fs-extra: ~7.0.1 + import-lazy: ~4.0.0 + jju: ~1.4.0 + resolve: ~1.17.0 + semver: ~7.3.0 + z-schema: ~5.0.2 + checksum: 92f7e39f03f4931a7007b4a79427d82bfe078146133a138219205abf873607898f7667fa368e3cb28c93bb1a2b9dc70ddaf2d316bc47a9a17b591d69d1025068 + languageName: node + linkType: hard + "@rushstack/rig-package@npm:0.3.14": version: 0.3.14 resolution: "@rushstack/rig-package@npm:0.3.14" @@ -3959,9 +4013,9 @@ __metadata: linkType: hard "@types/node@npm:^16.11.54": - version: 16.11.54 - resolution: "@types/node@npm:16.11.54" - checksum: fa4d6a94498cc6ef96932a25557082587a178b5fa1da5e208bdb171b85265110a7ca6a4f296e740dca1b29d2a44b3c1e76e21d255e5eeed8be5f67ea538dcb9c + version: 16.11.56 + resolution: "@types/node@npm:16.11.56" + checksum: b4efade16eb08a39810921c54a1637e69c8f3184a20d87e8fe74d557d9bda73f0829ac318e2a30a32b1903e4b099812defd1dfe438be70b98dbfbea5b0d99a53 languageName: node linkType: hard