43 lines
1.7 KiB
JavaScript
43 lines
1.7 KiB
JavaScript
import { existsSync } from "node:fs";
|
|
import { z } from "zod";
|
|
if (existsSync(".env"))
|
|
process.loadEnvFile(".env");
|
|
const bool = (fallback) => z
|
|
.enum(["true", "false", "1", "0"])
|
|
.optional()
|
|
.transform((v) => (v === undefined ? fallback : v === "true" || v === "1"));
|
|
const schema = z.object({
|
|
NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
|
|
PORT: z.coerce.number().int().default(4000),
|
|
CORS_ORIGINS: z.string().default(""),
|
|
TRUST_PROXY: z.coerce.number().int().min(0).default(1),
|
|
DATABASE_URL: z.string().min(1),
|
|
JWT_SECRET: z.string().min(32, "JWT_SECRET must be at least 32 characters"),
|
|
JWT_ACCESS_TTL: z.string().default("15m"),
|
|
REFRESH_TTL_DAYS: z.coerce.number().int().positive().default(30),
|
|
COOKIE_SECURE: bool(true),
|
|
S3_ENDPOINT: z.string().optional(),
|
|
S3_REGION: z.string().default("us-east-1"),
|
|
S3_BUCKET: z.string().default("imen-media"),
|
|
S3_ACCESS_KEY: z.string().default(""),
|
|
S3_SECRET_KEY: z.string().default(""),
|
|
S3_FORCE_PATH_STYLE: bool(true),
|
|
S3_ENSURE_BUCKET: bool(false),
|
|
MEDIA_PUBLIC_URL: z
|
|
.string()
|
|
.default("/media")
|
|
.transform((v) => v.replace(/\/+$/, "")),
|
|
WEB_REVALIDATE_URL: z.string().optional(),
|
|
REVALIDATE_SECRET: z.string().optional(),
|
|
ADMIN_PHONE: z.string().optional(),
|
|
ADMIN_PASSWORD: z.string().optional(),
|
|
ADMIN_NAME: z.string().default("مدیر سایت"),
|
|
});
|
|
const parsed = schema.safeParse(process.env);
|
|
if (!parsed.success) {
|
|
console.error("Invalid environment variables:\n" + z.prettifyError(parsed.error));
|
|
process.exit(1);
|
|
}
|
|
export const env = parsed.data;
|
|
export const isProd = env.NODE_ENV === "production";
|
|
//# sourceMappingURL=env.js.map
|