import fs from "node:fs"; import { z } from "zod"; export const isProd = Bun.env.NODE_ENV === "production"; import { loggers } from "@/utils/logging"; const logger = loggers.config; const robloxSchema = z.object({ cookie: z.string(), apiKey: z.string(), bloxlinkToken: z.string(), }); const discordSchema = z.object({ token: z.string(), app_id: z.string(), client_secret: z.string(), guild: z.string(), }); const Project = z.object({ universe: z.string(), name: z.string(), displayName: z.string(), iconURL: z.string().optional(), codes: z .array( z.object({ code: z.string(), expired: z.boolean().optional(), expiredAt: z.string().optional(), addedAt: z.string().optional(), }), ) .optional(), }); const projectSchema = z.record(z.string(), Project); const s3Schema = z.object({ accessKeyId: z.string(), secretAccessKey: z.string(), bucket: z.string(), endpoint: z.string().optional(), region: z.string().default("us-east-1"), publicUrl: z.string().optional(), }); const schema = z.object({ discord: discordSchema, s3: s3Schema, projects: projectSchema, roblox: robloxSchema, trelloBoardId: z.string().optional(), developerId: z.string(), terminology: z.string().default("project"), }); function validateConfig() { const env = process.env.NODE_ENV || "DEV"; const runtimeConfig = JSON.parse(fs.readFileSync(`.config.${env}.json`, "utf8")); const conf = schema.safeParse(runtimeConfig); if (conf.success) return conf.data; logger.error("invalid environment variables"); for (const err of conf.error.issues) logger.error(` ${err.message}: ${err.path}`); process.exit(1); } export default validateConfig(); export type Project = z.infer;