Initial commit

This commit is contained in:
2023-09-08 22:09:35 +03:00
commit 2a6488488e
20 changed files with 2581 additions and 0 deletions

47
src/config.ts Normal file
View File

@ -0,0 +1,47 @@
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);