all repos — stealth-developers @ de82bde6bbf10b37933301403c47e641dd8288e6

pkgs/config/src/schema.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
import z from "zod";

import { ENVIRONMENT, IS_PROD } from ".";

const discordSchema = z.object({
	token: z.string(),
	app_id: z.string(),
	client_secret: z.string(),
	server: z.object({
		id: z.string(),
		ticket_category: z.string(),
		transcript_channel: z.string(),
	}),
});

const dbSchema = z.discriminatedUnion("dialect", [
	z.object({
		dialect: z.literal("turso"),
		url: z.string(),
		auth: z.string(),
	}),
	z.object({
		dialect: z.literal("sqlite"),
		url: z.string(),
		auth: z.string().optional(),
	}),
]);

const robloxSchema = z.object({
	apiKey: z.string(),
	cookie: z.string(),
});

const apiSchema = z.object({
	port: z.number().default(3000),
	publicDir: z.string(),
});

const s3Schema = z.object({
	accessKeyId: z.string(),
	secretAccessKey: z.string(),
	bucket: z.string(),
	endpoint: z.string().optional(),
	region: z.string().optional(),
	publicUrl: z.string().optional(),
});

const schema = z
	.object({
		discord: discordSchema,
		db: dbSchema,
		api: apiSchema,
		s3: s3Schema,
		roblox: robloxSchema,
	})
	.transform((config) => {
		return {
			...config,
			environment: ENVIRONMENT,
			isProd: IS_PROD,
		};
	});

export default schema;
export type Config = z.infer<typeof schema>;