mirror of
https://github.com/veeso/termscp.git
synced 2026-07-13 19:43:48 +02:00
refactor(site): drop in-site manual, link to external docs.termscp.rs
This commit is contained in:
@@ -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);
|
||||
});
|
||||
}
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user