import path from "node:path"; function required(name: string): string { const value = process.env[name]; if (!value) { throw new Error(`Ontbrekende omgevingsvariabele ${name}. Zie .env.example.`); } return value; } function optional(name: string, fallback: string): string { const value = process.env[name]; return value && value.length > 0 ? value : fallback; } function hostOf(url: string): string { try { return new URL(url).hostname; } catch { return "localhost"; } } const repoRoot = path.resolve(required("REPO_ROOT")); export const config = { repoRoot, /** * De publieke momentopnames staan in eigen bare repositories, los van je eigen * repositories met geschiedenis. Dat is geen extra voorzichtigheid maar de enige * werkende manier: git-namespaces en hidden refs houden objecten alleen uit de * advertentie, terwijl `git fetch ` ze daarna gewoon ophaalt. Wat niet * gedeeld mag worden, moet in een andere repository staan. */ publishedRoot: path.join(repoRoot, ".published"), port: Number.parseInt(optional("PORT", "3300"), 10), host: optional("HOST", "127.0.0.1"), publicUrl: optional("PUBLIC_URL", "http://localhost:3300").replace(/\/+$/, ""), ownerToken: required("OWNER_TOKEN"), sessionSecret: required("SESSION_SECRET"), siteName: optional("SITE_NAME", "Repositories"), trustProxy: optional("TRUST_PROXY", "0") === "1", /** URL-prefix voor het git smart-HTTP transport. Clone-URL wordt PUBLIC_URL + dit + /naam.git */ gitPrefix: "/git", /** * Tweede transport-prefix, uitsluitend voor jezelf: hier wordt niets afgeschermd, * dus je clonet je volledige geschiedenis terug. Vraagt altijd om inloggegevens, * ook voor publieke repositories. */ gitFullPrefix: "/git-full", /** Gebruikersnaam voor Basic auth en voor het inlogformulier. */ ownerUser: optional("OWNER_USER", "owner"), /** * Auteur van de gepubliceerde momentopnames. Deze naam en dit adres reizen mee * naar iedereen die je code cloont, dus zet hier hoe je bekend wil staan. */ snapshotAuthor: { name: optional("SNAPSHOT_AUTHOR_NAME", "pub-repo"), email: optional( "SNAPSHOT_AUTHOR_EMAIL", `pub-repo@${hostOf(optional("PUBLIC_URL", "http://localhost"))}`, ), }, /** Bestanden groter dan dit worden niet gerenderd, alleen als download aangeboden. */ maxRenderBytes: 1024 * 1024, /** Bovengrens op een enkele push, in bytes. Voorkomt dat iemand je schijf volzet. */ maxRequestBuffer: "100M", } as const; export type Config = typeof config;