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} />
) : null}
{node.members?.events?.length ? (
<div>
<EventNode node={node.members.events} packageName={packageName} version={version} />
</div>
) : null}
{node.members?.methods?.length ? (
<div>
<MethodNode node={node.members.methods} packageName={packageName} version={version} />
</div>
) : 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.unionMembers?.length ? <UnionMember node={node.unionMembers} version={version} /> : null}

View File

@@ -57,40 +57,6 @@ export async function Outline({ node }: { readonly node: any }) {
</Collapsible>
) : 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 ? (
<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">
@@ -124,6 +90,40 @@ export async function Outline({ node }: { readonly node: any }) {
</CollapsibleContent>
</Collapsible>
) : 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 aria-hidden className="px-4">
<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/postgres": "^0.7.2",
"meilisearch": "^0.37.0",
"p-limit": "^5.0.0",
"tslib": "^2.6.2",
"undici": "6.6.2"
},

View File

@@ -4,6 +4,7 @@ import { getInput, setFailed } from '@actions/core';
import { create } from '@actions/glob';
import { put } from '@vercel/blob';
import { createPool } from '@vercel/postgres';
import pLimit from 'p-limit';
if (!process.env.DATABASE_URL) {
setFailed('DATABASE_URL is not set');
@@ -16,22 +17,36 @@ const pool = createPool({
connectionString: process.env.DATABASE_URL,
});
const limit = pLimit(10);
const promises = [];
const globber = await create(`packages/${pkg}/docs/docs.api.json`);
for await (const file of globber.globGenerator()) {
const data = await readFile(file, 'utf8');
try {
console.log(`Uploading ${file} with ${version}...`);
const json = JSON.parse(data);
const name = json.name ?? json.n;
const { url } = await put(`${name.replace('@discordjs/', '')}/${version}.json`, data, {
access: 'public',
addRandomSuffix: false,
});
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`;
promises.push(
// eslint-disable-next-line @typescript-eslint/no-loop-func
limit(async () => {
console.log(`Uploading ${file} with ${version}...`);
const json = JSON.parse(data);
const name = json.name ?? json.n;
const { url } = await put(`${name.replace('@discordjs/', '')}/${version}.json`, data, {
access: 'public',
addRandomSuffix: false,
});
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) {
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 { createPool } from '@vercel/postgres';
import { MeiliSearch } from 'meilisearch';
import pLimit from 'p-limit';
import { fetch } from 'undici';
if (!process.env.DATABASE_URL) {
@@ -26,6 +27,9 @@ const client = new MeiliSearch({
apiKey: process.env.SEARCH_API_KEY!,
});
const limit = pLimit(10);
let promises: Promise<any>[] = [];
try {
console.log('Generating all indices...');
const indices = await generateAllIndices({
@@ -49,8 +53,9 @@ try {
console.log('Uploading indices...');
try {
await Promise.all(
indices.map(async (index) => {
// eslint-disable-next-line @typescript-eslint/no-floating-promises
promises = indices.map(async (index) =>
limit(async () => {
console.log(`Uploading ${index.index}...`);
let task;
try {
@@ -71,3 +76,9 @@ try {
const err = error as Error;
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 { create } from '@actions/glob';
import { put } from '@vercel/blob';
import pLimit from 'p-limit';
const pkg = getInput('package') || '*';
const version = getInput('version') || 'main';
const limit = pLimit(10);
const promises = [];
const globber = await create(`packages/${pkg}/docs/${pkg}/split/*.api.json`);
for await (const file of globber.globGenerator()) {
const data = await readFile(file, 'utf8');
try {
console.log(`Uploading ${file} with ${version}...`);
const name = basename(file).replace('main.', '');
await put(`rewrite/${pkg}/${version}.${name}`, data, {
access: 'public',
addRandomSuffix: false,
});
promises.push(
// eslint-disable-next-line @typescript-eslint/no-loop-func
limit(async () => {
console.log(`Uploading ${file} with ${version}...`);
const name = basename(file).replace('main.', '');
await put(`rewrite/${pkg}/${version}.${name}`, data, {
access: 'public',
addRandomSuffix: false,
});
}),
);
} catch (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,
containerKey: resolved.item.containerKey,
uri: resolveItemURI(resolved.item),
packageName: resolved.package,
packageName: resolved.package?.replace('@discordjs/', ''),
version: resolved.version,
},
};

20
pnpm-lock.yaml generated
View File

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