diff --git a/site/.gitignore b/site/.gitignore index c45e5c9..1f9030c 100644 --- a/site/.gitignore +++ b/site/.gitignore @@ -1,4 +1,3 @@ dist/ .astro/ node_modules/ -src/content/man/ diff --git a/site/package.json b/site/package.json index 0d76627..205cb09 100644 --- a/site/package.json +++ b/site/package.json @@ -5,7 +5,6 @@ "private": true, "scripts": { "dev": "astro dev", - "prebuild": "node scripts/fetch-man.mjs", "build": "astro build", "preview": "astro preview", "check": "astro check", diff --git a/site/scripts/fetch-man.mjs b/site/scripts/fetch-man.mjs deleted file mode 100644 index 892e8cf..0000000 --- a/site/scripts/fetch-man.mjs +++ /dev/null @@ -1,71 +0,0 @@ -import { mkdir, writeFile } from "node:fs/promises"; -import { dirname, join } from "node:path"; -import { fileURLToPath } from "node:url"; - -/** Pinned ref for reproducible builds. Bump when cutting a release. */ -export const MAN_REF = "v1.0.0"; - -export const LOCALES = ["en", "zh-CN", "it", "fr", "es"]; - -const REPO = "veeso/termscp"; - -export function manUrl(locale) { - const path = locale === "en" ? "docs/man.md" : `docs/${locale}/man.md`; - return `https://raw.githubusercontent.com/${REPO}/${MAN_REF}/${path}`; -} - -async function fetchText(url, { retries = 2 } = {}) { - const headers = process.env.GITHUB_TOKEN - ? { Authorization: `Bearer ${process.env.GITHUB_TOKEN}` } - : {}; - for (let attempt = 0; ; attempt += 1) { - try { - // Abort hung requests and surface them as retryable failures. - const res = await fetch(url, { headers, signal: AbortSignal.timeout(15000) }); - if (!res.ok) { - throw new Error(`fetch ${url} failed: ${res.status} ${res.statusText}`); - } - const text = await res.text(); - if (text.trim().length === 0) { - throw new Error(`fetch ${url} returned empty body`); - } - return text; - } catch (err) { - if (attempt >= retries) { - throw err; - } - await new Promise((resolve) => { - setTimeout(resolve, 500 * (attempt + 1)); - }); - } - } -} - -async function main() { - const here = dirname(fileURLToPath(import.meta.url)); - const outDir = join(here, "..", "src", "content", "man"); - await mkdir(outDir, { recursive: true }); - - for (const locale of LOCALES) { - let md; - try { - md = await fetchText(manUrl(locale)); - } catch (err) { - if (locale === "en") throw err; // en is required — fail the build - console.warn(`[fetch-man] ${locale} missing, falling back to en: ${err.message}`); - md = await fetchText(manUrl("en")); - } - await writeFile(join(outDir, `${locale}.md`), md, "utf8"); - console.log(`[fetch-man] wrote ${locale}.md`); - } -} - -// Run only when invoked directly (not when imported by tests). -// Compare via fileURLToPath so paths with spaces (percent-encoded in -// import.meta.url, raw in argv[1]) still match. -if (process.argv[1] === fileURLToPath(import.meta.url)) { - main().catch((err) => { - console.error(err); - process.exit(1); - }); -} diff --git a/site/scripts/fetch-man.test.ts b/site/scripts/fetch-man.test.ts deleted file mode 100644 index 647510f..0000000 --- a/site/scripts/fetch-man.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { manUrl, MAN_REF } from "./fetch-man.mjs"; - -describe("manUrl", () => { - it("uses the root man.md for en", () => { - expect(manUrl("en")).toBe( - `https://raw.githubusercontent.com/veeso/termscp/${MAN_REF}/docs/man.md` - ); - }); - - it("uses the per-locale path for non-en", () => { - expect(manUrl("it")).toBe( - `https://raw.githubusercontent.com/veeso/termscp/${MAN_REF}/docs/it/man.md` - ); - }); - - it("pins to a concrete ref, not a moving branch", () => { - expect(MAN_REF).not.toBe("main"); - expect(MAN_REF.length).toBeGreaterThan(0); - }); -}); diff --git a/site/src/components/ExplorerHero.astro b/site/src/components/ExplorerHero.astro index cf8f324..fb0ee55 100644 --- a/site/src/components/ExplorerHero.astro +++ b/site/src/components/ExplorerHero.astro @@ -1,5 +1,5 @@ --- -import { localizePath, useTranslations, type Locale } from "../i18n/ui"; +import { localizePath, useTranslations, DOCS_URL, type Locale } from "../i18n/ui"; interface Props { locale: Locale; } const { locale } = Astro.props; const t = useTranslations(locale); @@ -56,7 +56,7 @@ const remote = [
{t("hero.subtitle")}
diff --git a/site/src/components/Footer.astro b/site/src/components/Footer.astro index d9e2ed5..e124e0c 100644 --- a/site/src/components/Footer.astro +++ b/site/src/components/Footer.astro @@ -1,5 +1,5 @@ --- -import { useTranslations, type Locale } from "../i18n/ui"; +import { useTranslations, DOCS_URL, type Locale } from "../i18n/ui"; interface Props { locale: Locale; } const { locale } = Astro.props; const t = useTranslations(locale); @@ -10,6 +10,7 @@ const year = new Date().getFullYear();© {year} Christian Visintin · {t("footer.rights")}
diff --git a/site/src/components/Nav.astro b/site/src/components/Nav.astro index 6116eb1..53b4259 100644 --- a/site/src/components/Nav.astro +++ b/site/src/components/Nav.astro @@ -1,5 +1,5 @@ --- -import { localizePath, useTranslations, type Locale } from "../i18n/ui"; +import { localizePath, useTranslations, DOCS_URL, type Locale } from "../i18n/ui"; import ThemeToggle from "./ThemeToggle.astro"; import LangPicker from "./LangPicker.astro"; @@ -21,7 +21,7 @@ const p = (sub: string) => localizePath(locale, sub);