Minimale git-remote met publiek/prive-toggle
Deze repository wordt als momentopname gepubliceerd: een clone bevat de volledige inhoud, maar geen commitgeschiedenis.
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 <sha>` 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;