Files
wedding-website/lib/config.ts
T
Raul Lugo 4ced446c9c
Build & Deployment / Build & Deploy (push) Failing after 5s
initial commit
2026-08-10 17:55:26 +02:00

67 lines
2.0 KiB
TypeScript

import { z } from "zod";
const booleanStringSchema = z
.string()
.trim()
.transform((value) => value.toLowerCase())
.pipe(z.enum(["true", "false", "1", "0", "yes", "no"]))
.transform((value) => ["true", "1", "yes"].includes(value));
const serverConfigSchema = z.object({
DATABASE_URL: z.string().url(),
AUTH_SECRET: z.string().min(1),
AUTH_GOOGLE_ID: z.string().min(1),
AUTH_GOOGLE_SECRET: z.string().min(1),
ADMIN_EMAILS: z
.string()
.min(1)
.transform((value) =>
value
.split(",")
.map((email) => email.trim().toLowerCase())
.filter(Boolean),
),
APP_URL: z.string().url(),
RSVP_DEADLINE: z.iso.date(),
S3_ENDPOINT: z.string().url(),
S3_REGION: z.string().min(1),
S3_BUCKET: z.string().min(1),
S3_ACCESS_KEY_ID: z.string().min(1),
S3_SECRET_ACCESS_KEY: z.string().min(1),
S3_FORCE_PATH_STYLE: booleanStringSchema.default(true),
});
export type ServerConfig = z.infer<typeof serverConfigSchema>;
const buildTimeConfigDefaults = {
DATABASE_URL: "postgres://wedding:wedding@wedding-db:5432/wedding",
AUTH_SECRET: "docker-build-placeholder",
AUTH_GOOGLE_ID: "docker-build-placeholder",
AUTH_GOOGLE_SECRET: "docker-build-placeholder",
ADMIN_EMAILS: "admin@example.com",
APP_URL: "https://wedding.example.com",
RSVP_DEADLINE: "2099-12-31",
S3_ENDPOINT: "http://wedding-minio:9000",
S3_REGION: "us-east-1",
S3_BUCKET: "wedding-uploads",
S3_ACCESS_KEY_ID: "minioadmin",
S3_SECRET_ACCESS_KEY: "minioadmin",
S3_FORCE_PATH_STYLE: "true",
};
export function getServerConfig(env: NodeJS.ProcessEnv = process.env) {
if (env.SKIP_ENV_VALIDATION === "1") {
return serverConfigSchema.parse({ ...buildTimeConfigDefaults, ...env });
}
return serverConfigSchema.parse(env);
}
export function getDatabaseUrl(env: NodeJS.ProcessEnv = process.env) {
if (env.SKIP_ENV_VALIDATION === "1") {
return buildTimeConfigDefaults.DATABASE_URL;
}
return z.string().url().parse(env.DATABASE_URL);
}