refactor: docs ordering

This commit is contained in:
iCrawl
2024-03-02 20:25:51 +01:00
parent 18cce83d80
commit 71bba547b6
8 changed files with 109 additions and 74 deletions

View File

@@ -114,18 +114,18 @@ export function DocItem({
<PropertyNode node={node.members.properties} packageName={packageName} version={version} /> <PropertyNode node={node.members.properties} packageName={packageName} version={version} />
) : null} ) : null}
{node.members?.events?.length ? (
<div>
<EventNode node={node.members.events} packageName={packageName} version={version} />
</div>
) : null}
{node.members?.methods?.length ? ( {node.members?.methods?.length ? (
<div> <div>
<MethodNode node={node.members.methods} packageName={packageName} version={version} /> <MethodNode node={node.members.methods} packageName={packageName} version={version} />
</div> </div>
) : null} ) : null}
{node.members?.events?.length ? (
<div>
<EventNode node={node.members.events} packageName={packageName} version={version} />
</div>
) : null}
{node.members?.length ? <EnumMemberNode node={node.members} packageName={packageName} version={version} /> : null} {node.members?.length ? <EnumMemberNode node={node.members} packageName={packageName} version={version} /> : null}
{node.unionMembers?.length ? <UnionMember node={node.unionMembers} version={version} /> : null} {node.unionMembers?.length ? <UnionMember node={node.unionMembers} version={version} /> : null}

View File

@@ -57,40 +57,6 @@ export async function Outline({ node }: { readonly node: any }) {
</Collapsible> </Collapsible>
) : null} ) : null}
{node.members?.events?.length ? (
<Collapsible className="flex flex-col gap-4 px-4" defaultOpen>
<CollapsibleTrigger className="group flex place-content-between place-items-center rounded-md p-2 hover:bg-neutral-200 dark:hover:bg-neutral-800">
<h2 className="flex place-items-center gap-2 text-xl font-bold">
<VscSymbolEvent aria-hidden className="flex-shrink-0" size={24} />
Events
</h2>
<ChevronDown className='group-data-[state="open"]:hidden' aria-hidden size={24} />
<ChevronUp className='group-data-[state="closed"]:hidden' aria-hidden size={24} />
</CollapsibleTrigger>
<CollapsibleContent>
<div className="flex flex-col gap-2 px-4">
{node.members.events.map((event: any, idx: number) => {
return (
<Fragment key={`${event.displayName}-${idx}`}>
<div className="flex flex-col gap-4">
<div className="flex place-content-between place-items-center">
<Link
href={`#${event.displayName}`}
className="grow truncate rounded-md p-2 font-mono transition-colors hover:bg-neutral-200 dark:hover:bg-neutral-800 md:px-1 md:py-1"
>
{event.displayName}
</Link>
</div>
</div>
</Fragment>
);
})}
</div>
</CollapsibleContent>
</Collapsible>
) : null}
{node.members?.methods?.length ? ( {node.members?.methods?.length ? (
<Collapsible className="flex flex-col gap-4 px-4" defaultOpen> <Collapsible className="flex flex-col gap-4 px-4" defaultOpen>
<CollapsibleTrigger className="group flex place-content-between place-items-center rounded-md p-2 hover:bg-neutral-200 dark:hover:bg-neutral-800"> <CollapsibleTrigger className="group flex place-content-between place-items-center rounded-md p-2 hover:bg-neutral-200 dark:hover:bg-neutral-800">
@@ -124,6 +90,40 @@ export async function Outline({ node }: { readonly node: any }) {
</CollapsibleContent> </CollapsibleContent>
</Collapsible> </Collapsible>
) : null} ) : null}
{node.members?.events?.length ? (
<Collapsible className="flex flex-col gap-4 px-4" defaultOpen>
<CollapsibleTrigger className="group flex place-content-between place-items-center rounded-md p-2 hover:bg-neutral-200 dark:hover:bg-neutral-800">
<h2 className="flex place-items-center gap-2 text-xl font-bold">
<VscSymbolEvent aria-hidden className="flex-shrink-0" size={24} />
Events
</h2>
<ChevronDown className='group-data-[state="open"]:hidden' aria-hidden size={24} />
<ChevronUp className='group-data-[state="closed"]:hidden' aria-hidden size={24} />
</CollapsibleTrigger>
<CollapsibleContent>
<div className="flex flex-col gap-2 px-4">
{node.members.events.map((event: any, idx: number) => {
return (
<Fragment key={`${event.displayName}-${idx}`}>
<div className="flex flex-col gap-4">
<div className="flex place-content-between place-items-center">
<Link
href={`#${event.displayName}`}
className="grow truncate rounded-md p-2 font-mono transition-colors hover:bg-neutral-200 dark:hover:bg-neutral-800 md:px-1 md:py-1"
>
{event.displayName}
</Link>
</div>
</div>
</Fragment>
);
})}
</div>
</CollapsibleContent>
</Collapsible>
) : null}
</div> </div>
<div aria-hidden className="px-4"> <div aria-hidden className="px-4">
<div role="separator" className="h-[2px] bg-neutral-300 dark:bg-neutral-700" /> <div role="separator" className="h-[2px] bg-neutral-300 dark:bg-neutral-700" />

View File

@@ -46,6 +46,7 @@
"@vercel/blob": "^0.22.1", "@vercel/blob": "^0.22.1",
"@vercel/postgres": "^0.7.2", "@vercel/postgres": "^0.7.2",
"meilisearch": "^0.37.0", "meilisearch": "^0.37.0",
"p-limit": "^5.0.0",
"tslib": "^2.6.2", "tslib": "^2.6.2",
"undici": "6.6.2" "undici": "6.6.2"
}, },

View File

@@ -4,6 +4,7 @@ import { getInput, setFailed } from '@actions/core';
import { create } from '@actions/glob'; import { create } from '@actions/glob';
import { put } from '@vercel/blob'; import { put } from '@vercel/blob';
import { createPool } from '@vercel/postgres'; import { createPool } from '@vercel/postgres';
import pLimit from 'p-limit';
if (!process.env.DATABASE_URL) { if (!process.env.DATABASE_URL) {
setFailed('DATABASE_URL is not set'); setFailed('DATABASE_URL is not set');
@@ -16,22 +17,36 @@ const pool = createPool({
connectionString: process.env.DATABASE_URL, connectionString: process.env.DATABASE_URL,
}); });
const limit = pLimit(10);
const promises = [];
const globber = await create(`packages/${pkg}/docs/docs.api.json`); const globber = await create(`packages/${pkg}/docs/docs.api.json`);
for await (const file of globber.globGenerator()) { for await (const file of globber.globGenerator()) {
const data = await readFile(file, 'utf8'); const data = await readFile(file, 'utf8');
try { try {
console.log(`Uploading ${file} with ${version}...`); promises.push(
const json = JSON.parse(data); // eslint-disable-next-line @typescript-eslint/no-loop-func
const name = json.name ?? json.n; limit(async () => {
const { url } = await put(`${name.replace('@discordjs/', '')}/${version}.json`, data, { console.log(`Uploading ${file} with ${version}...`);
access: 'public', const json = JSON.parse(data);
addRandomSuffix: false, const name = json.name ?? json.n;
}); const { url } = await put(`${name.replace('@discordjs/', '')}/${version}.json`, data, {
await pool.sql`insert into documentation (name, version, url) values (${name.replace( access: 'public',
'@discordjs/', addRandomSuffix: false,
'', });
)}, ${version}, ${url}) on conflict (name, version) do update set url = EXCLUDED.url`; await pool.sql`insert into documentation (name, version, url) values (${name.replace(
'@discordjs/',
'',
)}, ${version}, ${url}) on conflict (name, version) do update set url = EXCLUDED.url`;
}),
);
} catch (error) { } catch (error) {
console.log(error); console.log(error);
} }
} }
try {
await Promise.all(promises);
} catch (error) {
console.log(error);
}

View File

@@ -3,6 +3,7 @@ import { setFailed } from '@actions/core';
import { generateAllIndices } from '@discordjs/scripts'; import { generateAllIndices } from '@discordjs/scripts';
import { createPool } from '@vercel/postgres'; import { createPool } from '@vercel/postgres';
import { MeiliSearch } from 'meilisearch'; import { MeiliSearch } from 'meilisearch';
import pLimit from 'p-limit';
import { fetch } from 'undici'; import { fetch } from 'undici';
if (!process.env.DATABASE_URL) { if (!process.env.DATABASE_URL) {
@@ -26,6 +27,9 @@ const client = new MeiliSearch({
apiKey: process.env.SEARCH_API_KEY!, apiKey: process.env.SEARCH_API_KEY!,
}); });
const limit = pLimit(10);
let promises: Promise<any>[] = [];
try { try {
console.log('Generating all indices...'); console.log('Generating all indices...');
const indices = await generateAllIndices({ const indices = await generateAllIndices({
@@ -49,8 +53,9 @@ try {
console.log('Uploading indices...'); console.log('Uploading indices...');
try { try {
await Promise.all( // eslint-disable-next-line @typescript-eslint/no-floating-promises
indices.map(async (index) => { promises = indices.map(async (index) =>
limit(async () => {
console.log(`Uploading ${index.index}...`); console.log(`Uploading ${index.index}...`);
let task; let task;
try { try {
@@ -71,3 +76,9 @@ try {
const err = error as Error; const err = error as Error;
setFailed(err.message); setFailed(err.message);
} }
try {
await Promise.all(promises);
} catch (error) {
console.log(error);
}

View File

@@ -3,21 +3,37 @@ import { basename } from 'node:path';
import { getInput } from '@actions/core'; import { getInput } from '@actions/core';
import { create } from '@actions/glob'; import { create } from '@actions/glob';
import { put } from '@vercel/blob'; import { put } from '@vercel/blob';
import pLimit from 'p-limit';
const pkg = getInput('package') || '*'; const pkg = getInput('package') || '*';
const version = getInput('version') || 'main'; const version = getInput('version') || 'main';
const limit = pLimit(10);
const promises = [];
const globber = await create(`packages/${pkg}/docs/${pkg}/split/*.api.json`); const globber = await create(`packages/${pkg}/docs/${pkg}/split/*.api.json`);
for await (const file of globber.globGenerator()) { for await (const file of globber.globGenerator()) {
const data = await readFile(file, 'utf8'); const data = await readFile(file, 'utf8');
try { try {
console.log(`Uploading ${file} with ${version}...`); promises.push(
const name = basename(file).replace('main.', ''); // eslint-disable-next-line @typescript-eslint/no-loop-func
await put(`rewrite/${pkg}/${version}.${name}`, data, { limit(async () => {
access: 'public', console.log(`Uploading ${file} with ${version}...`);
addRandomSuffix: false, const name = basename(file).replace('main.', '');
});
await put(`rewrite/${pkg}/${version}.${name}`, data, {
access: 'public',
addRandomSuffix: false,
});
}),
);
} catch (error) { } catch (error) {
console.log(error); console.log(error);
} }
} }
try {
await Promise.all(promises);
} catch (error) {
console.log(error);
}

View File

@@ -270,7 +270,7 @@ function itemExcerptText(excerpt: Excerpt, apiPackage: ApiPackage) {
displayName: resolved.item.displayName, displayName: resolved.item.displayName,
containerKey: resolved.item.containerKey, containerKey: resolved.item.containerKey,
uri: resolveItemURI(resolved.item), uri: resolveItemURI(resolved.item),
packageName: resolved.package, packageName: resolved.package?.replace('@discordjs/', ''),
version: resolved.version, version: resolved.version,
}, },
}; };

20
pnpm-lock.yaml generated
View File

@@ -410,6 +410,9 @@ importers:
meilisearch: meilisearch:
specifier: ^0.37.0 specifier: ^0.37.0
version: 0.37.0 version: 0.37.0
p-limit:
specifier: ^5.0.0
version: 5.0.0
tslib: tslib:
specifier: ^2.6.2 specifier: ^2.6.2
version: 2.6.2 version: 2.6.2
@@ -3957,8 +3960,6 @@ packages:
peerDependencies: peerDependencies:
markdown-wasm: 1.x markdown-wasm: 1.x
peerDependenciesMeta: peerDependenciesMeta:
esbuild:
optional: true
markdown-wasm: markdown-wasm:
optional: true optional: true
dependencies: dependencies:
@@ -4017,10 +4018,6 @@ packages:
peerDependencies: peerDependencies:
'@effect-ts/otel-node': '*' '@effect-ts/otel-node': '*'
peerDependenciesMeta: peerDependenciesMeta:
'@effect-ts/core':
optional: true
'@effect-ts/otel':
optional: true
'@effect-ts/otel-node': '@effect-ts/otel-node':
optional: true optional: true
dependencies: dependencies:
@@ -13566,9 +13563,6 @@ packages:
/clipanion@3.2.1: /clipanion@3.2.1:
resolution: {integrity: sha512-dYFdjLb7y1ajfxQopN05mylEpK9ZX0sO1/RfMXdfmwjlIsPkbh4p7A682x++zFPLDCo1x3p82dtljHf5cW2LKA==} resolution: {integrity: sha512-dYFdjLb7y1ajfxQopN05mylEpK9ZX0sO1/RfMXdfmwjlIsPkbh4p7A682x++zFPLDCo1x3p82dtljHf5cW2LKA==}
peerDependenciesMeta:
typanion:
optional: true
dependencies: dependencies:
typanion: 3.14.0 typanion: 3.14.0
dev: false dev: false
@@ -14778,7 +14772,7 @@ packages:
dependencies: dependencies:
semver: 7.5.4 semver: 7.5.4
shelljs: 0.8.5 shelljs: 0.8.5
typescript: 5.5.0-dev.20240228 typescript: 5.5.0-dev.20240302
dev: true dev: true
/dts-critic@3.3.11(typescript@5.3.3): /dts-critic@3.3.11(typescript@5.3.3):
@@ -21840,7 +21834,6 @@ packages:
engines: {node: '>=18'} engines: {node: '>=18'}
dependencies: dependencies:
yocto-queue: 1.0.0 yocto-queue: 1.0.0
dev: true
/p-locate@3.0.0: /p-locate@3.0.0:
resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
@@ -25678,8 +25671,8 @@ packages:
engines: {node: '>=14.17'} engines: {node: '>=14.17'}
hasBin: true hasBin: true
/typescript@5.5.0-dev.20240228: /typescript@5.5.0-dev.20240302:
resolution: {integrity: sha512-bdFIn0U4p7+PrnESpBPXDc6jRXynawwVQssEw2Pd2o/Mud34LwGgqHXOgIY5EEmZFPjzT3osXB7VKQP1cdHi3g==} resolution: {integrity: sha512-Cbr0okulu+L25e+Hg7miQGjy1iPM2jm1BkdFBYdf+JK7eCw8HF19Ud22FuZ15Nmcfxz9SU384MNQFFhwy+adrw==}
engines: {node: '>=14.17'} engines: {node: '>=14.17'}
hasBin: true hasBin: true
dev: true dev: true
@@ -27420,7 +27413,6 @@ packages:
/yocto-queue@1.0.0: /yocto-queue@1.0.0:
resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==}
engines: {node: '>=12.20'} engines: {node: '>=12.20'}
dev: true
/yoga-wasm-web@0.3.3: /yoga-wasm-web@0.3.3:
resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==} resolution: {integrity: sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA==}