// @ts-check import { z } from "zod"; /** * Specify your server-side environment variables schema here. * This way you can ensure the app isn't built with invalid env vars. */ export const serverSchema = z.object({ DATABASE_URL: z.string().url(), NODE_ENV: z.enum(["development", "test", "production"]), NEXTAUTH_SECRET: process.env.NODE_ENV === "production" ? z.string().min(1) : z.string().min(1).optional(), NEXTAUTH_URL: z.preprocess( // This makes Vercel deployments not fail if you don't set NEXTAUTH_URL // Since NextAuth.js automatically uses the VERCEL_URL if present. (str) => process.env.VERCEL_URL ?? str, // VERCEL_URL doesn't include `https` so it cant be validated as a URL process.env.VERCEL ? z.string() : z.string().url() ), GOOGLE_CLIENT_ID: z.string(), GOOGLE_CLIENT_SECRET: z.string(), PUSHER_APP_ID: z.string(), PUSHER_APP_KEY: z.string(), PUSHER_APP_SECRET: z.string(), PUSHER_APP_CLUSTER: z.string(), MUX_TOKEN_ID: z.string(), MUX_SECRET_KEY: z.string(), MUX_SIGNING_SECRET: z.string(), MUX_HOOK_URL: z.string(), }); /** * You can't destruct `process.env` as a regular object in the Next.js * middleware, so you have to do it manually here. * @type {{ [k in keyof z.infer<typeof serverSchema>]: z.infer<typeof serverSchema>[k] | undefined }} */ export const serverEnv = { DATABASE_URL: process.env.DATABASE_URL, NODE_ENV: process.env.NODE_ENV, NEXTAUTH_SECRET: process.env.NEXTAUTH_SECRET, NEXTAUTH_URL: process.env.NEXTAUTH_URL, GOOGLE_CLIENT_ID: process.env.GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET: process.env.GOOGLE_CLIENT_SECRET, PUSHER_APP_ID: process.env.PUSHER_APP_ID, PUSHER_APP_KEY: process.env.PUSHER_APP_KEY, PUSHER_APP_SECRET: process.env.PUSHER_APP_SECRET, PUSHER_APP_CLUSTER: process.env.PUSHER_APP_CLUSTER, MUX_TOKEN_ID: process.env.MUX_TOKEN_ID, MUX_SECRET_KEY: process.env.MUX_SECRET_KEY, MUX_SIGNING_SECRET: process.env.MUX_SIGNING_SECRET, MUX_HOOK_URL: process.env.MUX_HOOK_URL, }; /** * Specify your client-side environment variables schema here. * This way you can ensure the app isn't built with invalid env vars. * To expose them to the client, prefix them with `NEXT_PUBLIC_`. */ export const clientSchema = z.object({ // NEXT_PUBLIC_CLIENTVAR: z.string(), }); /** * You can't destruct `process.env` as a regular object, so you have to do * it manually here. This is because Next.js evaluates this at build time, * and only used environment variables are included in the build. * @type {{ [k in keyof z.infer<typeof clientSchema>]: z.infer<typeof clientSchema>[k] | undefined }} */ export const clientEnv = { // NEXT_PUBLIC_CLIENTVAR: process.env.NEXT_PUBLIC_CLIENTVAR, };