sd-telegram-bot/src/config.ts

48 lines
1.3 KiB
TypeScript

import "dotenv/config";
import z, { ZodError, ZodIssueCode } from "zod";
function parseJsonSafe(path: string) {
return (value: unknown) => {
try {
return JSON.parse(String(value));
} catch {
throw new ZodError([
{
code: ZodIssueCode.custom,
path: [path],
fatal: true,
message: "Invalid JSON",
},
]);
}
};
}
const configSchema = z.object({
NODE_ENV: z.enum(["development", "production"]),
LOG_LEVEL: z
.enum(["trace", "debug", "info", "warn", "error", "fatal", "silent"])
.default("info"),
BOT_TOKEN: z.string(),
BOT_ADMIN_USER_ID: z
.preprocess(
parseJsonSafe("BOT_ADMIN_USER_ID"),
z.array(z.coerce.number().safe()).or(z.coerce.number().safe()),
)
.transform((v) => (Array.isArray(v) ? v : [v]))
.default([]),
});
const parseConfig = (environment: NodeJS.ProcessEnv) => {
const config = configSchema.parse(environment);
return {
...config,
isDev: process.env.NODE_ENV === "development",
isProd: process.env.NODE_ENV === "production",
};
};
export type Config = ReturnType<typeof parseConfig>;
export const config = parseConfig(process.env);