diff --git a/apps/website/src/util/fetchLatestVersion.ts b/apps/website/src/util/fetchLatestVersion.ts index 62303ee5b..15c7cb11e 100644 --- a/apps/website/src/util/fetchLatestVersion.ts +++ b/apps/website/src/util/fetchLatestVersion.ts @@ -18,13 +18,32 @@ export async function fetchLatestVersion(packageName: string): Promise { } try { - const { result } = await client.d1.database.query(process.env.CF_D1_DOCS_ID!, { + const data = await client.d1.database.query(process.env.CF_D1_DOCS_ID!, { account_id: process.env.CF_ACCOUNT_ID!, - sql: `select version from documentation where name = ? and version != 'main' order by version desc limit 1;`, + sql: `WITH parsed AS ( + SELECT + version, + CAST(substr(version, 1, instr(version, '.') - 1) AS INTEGER) AS major, + substr(version, instr(version, '.') + 1) AS rest + FROM documentation + WHERE name = ? AND version != 'main' + ), + parsed2 AS ( + SELECT + version, + major, + CAST(substr(rest, 1, instr(rest, '.') - 1) AS INTEGER) AS minor, + CAST(substr(rest, instr(rest, '.') + 1) AS INTEGER) AS patch + FROM parsed + ) + SELECT version + FROM parsed2 + ORDER BY major DESC, minor DESC, patch DESC + LIMIT 1;`, params: [packageName], }); - return `${(result[0]?.results as { version: string }[] | undefined)?.[0]?.version ?? 'main'}${hasEntryPoints ? ['', ...DEFAULT_ENTRY_POINT].join('/') : ''}`; + return `${((data.result[0]?.results ?? []) as { version: string }[])[0]?.version ?? 'main'}${hasEntryPoints ? ['', ...DEFAULT_ENTRY_POINT].join('/') : ''}`; } catch { return ''; } diff --git a/apps/website/src/util/fetchVersions.ts b/apps/website/src/util/fetchVersions.ts index d5bc3ba09..7b4d24142 100644 --- a/apps/website/src/util/fetchVersions.ts +++ b/apps/website/src/util/fetchVersions.ts @@ -1,24 +1,12 @@ -// import Cloudflare from 'cloudflare'; +import type Cloudflare from 'cloudflare'; import { ENV } from './env'; -// const client = new Cloudflare({ -// apiToken: process.env.CF_D1_DOCS_API_KEY, -// }); - export async function fetchVersions(packageName: string) { if (ENV.IS_LOCAL_DEV) { return [{ version: 'main' }]; } try { - // const { result } = await client.d1.database.query(process.env.CF_D1_DOCS_ID!, { - // account_id: process.env.CF_ACCOUNT_ID!, - // sql: `select version from documentation where name = ? order by version desc;`, - // params: [packageName], - // }); - - // return (result[0]?.results as { version: string }[] | undefined) ?? []; - const response = await fetch( `https://api.cloudflare.com/client/v4/accounts/${process.env.CF_ACCOUNT_ID}/d1/database/${process.env.CF_D1_DOCS_ID}/query`, { @@ -28,15 +16,48 @@ export async function fetchVersions(packageName: string) { }, method: 'POST', body: JSON.stringify({ - sql: `select version from documentation where name = ? order by version desc;`, + sql: `WITH parsed AS ( + SELECT + version, + CASE + WHEN version = 'main' THEN NULL + ELSE CAST(substr(version, 1, instr(version, '.') - 1) AS INTEGER) + END AS major, + CASE + WHEN version = 'main' THEN NULL + ELSE substr(version, instr(version, '.') + 1) + END AS rest + FROM documentation + WHERE name = ? + ), + parsed2 AS ( + SELECT + version, + major, + CASE + WHEN version = 'main' THEN NULL + ELSE CAST(substr(rest, 1, instr(rest, '.') - 1) AS INTEGER) + END AS minor, + CASE + WHEN version = 'main' THEN NULL + ELSE CAST(substr(rest, instr(rest, '.') + 1) AS INTEGER) + END AS patch + FROM parsed + ) + SELECT version + FROM parsed2 + ORDER BY + CASE WHEN version = 'main' THEN 0 ELSE 1 END, + major DESC, + minor DESC, + patch DESC;`, params: [packageName], }), }, ); - const data = await response.json(); - - return data.result[0]?.results; + const data = (await response.json()) as Cloudflare.D1Resource.Database.QueryResultsSinglePage; + return (data.result[0]?.results ?? []) as { version: string }[]; } catch { return []; }