diff --git a/drizzle.config.ts b/drizzle.config.ts index 15e4e7b..9b40cc1 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,7 +1,7 @@ import { type Config } from "drizzle-kit"; import "dotenv/config"; -import { env } from "~/env"; +import { dbEnv as env } from "~/db-env"; export default { schema: "./src/server/db/schema.ts", diff --git a/src/db-env.js b/src/db-env.js new file mode 100644 index 0000000..a332c1e --- /dev/null +++ b/src/db-env.js @@ -0,0 +1,64 @@ +import { createEnv } from "@t3-oss/env-nextjs"; +import { z } from "zod"; +/** + * @import { type ZodType } from "zod" + */ + +/** + * @template {ZodType} T + * @param {T} validator + */ +export function optionalInDev(validator) { + return process.env.NODE_ENV === "production" + ? validator + : validator.optional(); +} + +export const dbEnv = createEnv({ + /** + * Specify your server-side environment variables schema here. This way you can ensure the app + * isn't built with invalid env vars. + */ + server: { + DATABASE_URL: z.string().url(), + TURSO_AUTH_TOKEN: optionalInDev(z.string()), + TURSO_ORG_SLUG: optionalInDev(z.string()), + NODE_ENV: z + .enum(["development", "test", "production"]) + .default("development"), + VERCEL_GIT_COMMIT_REF: z.string().optional(), + VERCEL_GIT_PULL_REQUEST_ID: z.coerce.number().int().optional(), + }, + + /** + * 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_`. + */ + client: { + // NEXT_PUBLIC_CLIENTVAR: z.string(), + }, + + /** + * You can't destruct `process.env` as a regular object in the Next.js edge runtimes (e.g. + * middlewares) or client-side so we need to destruct manually. + */ + runtimeEnv: { + DATABASE_URL: process.env.DATABASE_URL, + TURSO_AUTH_TOKEN: process.env.TURSO_AUTH_TOKEN, + TURSO_ORG_SLUG: process.env.TURSO_ORG_SLUG, + NODE_ENV: process.env.NODE_ENV, + VERCEL_GIT_COMMIT_REF: process.env.VERCEL_GIT_COMMIT_REF, + VERCEL_GIT_PULL_REQUEST_ID: process.env.VERCEL_GIT_PULL_REQUEST_ID, + }, + /** + * Run `build` or `dev` with `SKIP_ENV_VALIDATION` to skip env validation. This is especially + * useful for Docker builds. + */ + skipValidation: !!process.env.SKIP_ENV_VALIDATION, + /** + * Makes it so that empty strings are treated as undefined. `SOME_VAR: z.string()` and + * `SOME_VAR=''` will throw an error. + */ + emptyStringAsUndefined: true, +}); \ No newline at end of file diff --git a/src/env.js b/src/env.js index 919f868..9c22918 100644 --- a/src/env.js +++ b/src/env.js @@ -1,31 +1,13 @@ import { createEnv } from "@t3-oss/env-nextjs"; import { z } from "zod"; -/** - * @import { type ZodType } from "zod" - */ +import { dbEnv, optionalInDev } from "./db-env.js"; -/** - * @template {ZodType} T - * @param {T} validator - */ -function optionalInDev(validator) { - return process.env.NODE_ENV === "production" - ? validator - : validator.optional(); -} - -export const env = createEnv({ +export const authEnv = createEnv({ /** * Specify your server-side environment variables schema here. This way you can ensure the app * isn't built with invalid env vars. */ server: { - DATABASE_URL: z.string().url(), - TURSO_AUTH_TOKEN: optionalInDev(z.string()), - TURSO_ORG_SLUG: optionalInDev(z.string()), - NODE_ENV: z - .enum(["development", "test", "production"]) - .default("development"), NEXTAUTH_SECRET: optionalInDev(z.string()), NEXTAUTH_URL: z.preprocess( // This makes Vercel deployments not fail if you don't set NEXTAUTH_URL @@ -36,8 +18,6 @@ export const env = createEnv({ ), DISCORD_CLIENT_ID: optionalInDev(z.string()), DISCORD_CLIENT_SECRET: optionalInDev(z.string()), - VERCEL_GIT_COMMIT_REF: z.string().optional(), - VERCEL_GIT_PULL_REQUEST_ID: z.coerce.number().int().optional(), }, /** @@ -54,16 +34,10 @@ export const env = createEnv({ * middlewares) or client-side so we need to destruct manually. */ runtimeEnv: { - DATABASE_URL: process.env.DATABASE_URL, - TURSO_AUTH_TOKEN: process.env.TURSO_AUTH_TOKEN, - TURSO_ORG_SLUG: process.env.TURSO_ORG_SLUG, - NODE_ENV: process.env.NODE_ENV, NEXTAUTH_SECRET: process.env.NEXTAUTH_SECRET, NEXTAUTH_URL: process.env.NEXTAUTH_URL, DISCORD_CLIENT_ID: process.env.DISCORD_CLIENT_ID, DISCORD_CLIENT_SECRET: process.env.DISCORD_CLIENT_SECRET, - VERCEL_GIT_COMMIT_REF: process.env.VERCEL_GIT_COMMIT_REF, - VERCEL_GIT_PULL_REQUEST_ID: process.env.VERCEL_GIT_PULL_REQUEST_ID, }, /** * Run `build` or `dev` with `SKIP_ENV_VALIDATION` to skip env validation. This is especially @@ -76,3 +50,5 @@ export const env = createEnv({ */ emptyStringAsUndefined: true, }); + +export const env = { ...dbEnv, ...authEnv }; \ No newline at end of file