src/config.ts (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
import fs from "node:fs";
import { z } from "zod";
import { loggers } from "@/utils/logging";
const logger = loggers.config;
const discordSchema = z.object({
token: z.string(),
app_id: 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,
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<typeof Project>;
|