diff --git a/.changeset/perfect-tomatoes-protect.md b/.changeset/perfect-tomatoes-protect.md new file mode 100644 index 0000000000..6fc637b51d --- /dev/null +++ b/.changeset/perfect-tomatoes-protect.md @@ -0,0 +1,5 @@ +--- +"create-t3-app": minor +--- + +construct `serverEnv`, like we do with `clientEnv` #1000 diff --git a/cli/template/base/src/env/schema.mjs b/cli/template/base/src/env/schema.mjs index c621d13e39..eee6cdfcd4 100644 --- a/cli/template/base/src/env/schema.mjs +++ b/cli/template/base/src/env/schema.mjs @@ -9,6 +9,15 @@ export const serverSchema = z.object({ NODE_ENV: z.enum(["development", "test", "production"]), }); +/** + * 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]: z.infer[k] | undefined }} + */ +export const serverEnv = { + NODE_ENV: process.env.NODE_ENV, +}; + /** * Specify your client-side environment variables schema here. * This way you can ensure the app isn't built with invalid env vars. diff --git a/cli/template/base/src/env/server.mjs b/cli/template/base/src/env/server.mjs index 736e3a6bf0..c04b5ae239 100644 --- a/cli/template/base/src/env/server.mjs +++ b/cli/template/base/src/env/server.mjs @@ -3,10 +3,10 @@ * This file is included in `/next.config.mjs` which ensures the app isn't built with invalid env vars. * It has to be a `.mjs`-file to be imported there. */ -import { serverSchema } from "./schema.mjs"; +import { serverSchema, serverEnv } from "./schema.mjs"; import { env as clientEnv, formatErrors } from "./client.mjs"; -const _serverEnv = serverSchema.safeParse(process.env); +const _serverEnv = serverSchema.safeParse(serverEnv); if (!_serverEnv.success) { console.error( diff --git a/cli/template/extras/src/env/schema/with-auth-prisma.mjs b/cli/template/extras/src/env/schema/with-auth-prisma.mjs index 33e923bcd6..3e5bd6c47b 100644 --- a/cli/template/extras/src/env/schema/with-auth-prisma.mjs +++ b/cli/template/extras/src/env/schema/with-auth-prisma.mjs @@ -23,6 +23,20 @@ export const serverSchema = z.object({ DISCORD_CLIENT_SECRET: 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]: z.infer[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, + DISCORD_CLIENT_ID: process.env.DISCORD_CLIENT_ID, + DISCORD_CLIENT_SECRET: process.env.DISCORD_CLIENT_SECRET, +}; + /** * Specify your client-side environment variables schema here. * This way you can ensure the app isn't built with invalid env vars. diff --git a/cli/template/extras/src/env/schema/with-auth.mjs b/cli/template/extras/src/env/schema/with-auth.mjs index cd0e268155..1068e79918 100644 --- a/cli/template/extras/src/env/schema/with-auth.mjs +++ b/cli/template/extras/src/env/schema/with-auth.mjs @@ -22,6 +22,19 @@ export const serverSchema = z.object({ DISCORD_CLIENT_SECRET: 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]: z.infer[k] | undefined }} + */ +export const serverEnv = { + 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, +}; + /** * Specify your client-side environment variables schema here. * This way you can ensure the app isn't built with invalid env vars. diff --git a/cli/template/extras/src/env/schema/with-prisma.mjs b/cli/template/extras/src/env/schema/with-prisma.mjs index 45d39359e2..f2a36da932 100644 --- a/cli/template/extras/src/env/schema/with-prisma.mjs +++ b/cli/template/extras/src/env/schema/with-prisma.mjs @@ -10,6 +10,16 @@ export const serverSchema = z.object({ NODE_ENV: z.enum(["development", "test", "production"]), }); +/** + * 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]: z.infer[k] | undefined }} + */ +export const serverEnv = { + DATABASE_URL: process.env.DATABASE_URL, + NODE_ENV: process.env.NODE_ENV, +}; + /** * Specify your client-side environment variables schema here. * This way you can ensure the app isn't built with invalid env vars. diff --git a/www/src/pages/ar/usage/env-variables.md b/www/src/pages/ar/usage/env-variables.md index 59fde64e14..c899bf71e1 100644 --- a/www/src/pages/ar/usage/env-variables.md +++ b/www/src/pages/ar/usage/env-variables.md @@ -29,6 +29,10 @@ export const serverSchema = z.object({ // DATABASE_URL: z.string().url(), }); +export const serverEnv = { + // DATABASE_URL: process.env.DATABASE_URL, +}; + export const clientSchema = z.object({ // NEXT_PUBLIC_WS_KEY: z.string(), }); @@ -105,6 +109,11 @@ export const serverSchema = z.object({ // ... TWITTER_API_TOKEN: z.string(), }); + +export const serverEnv = { + // ... + TWITTER_API_TOKEN: process.env.TWITTER_API_TOKEN, +}; ``` **ملحوطة:** النص الفارغ تتعامل معة zod علي أنه نص صحيح، إذا ما اردت ان تُغيّر هذا الاسلوب فإستخدم `z.string().min(1)` diff --git a/www/src/pages/en/usage/env-variables.md b/www/src/pages/en/usage/env-variables.md index e7a05fab07..ba2a09ba15 100644 --- a/www/src/pages/en/usage/env-variables.md +++ b/www/src/pages/en/usage/env-variables.md @@ -21,13 +21,17 @@ _TLDR; If you want to add a new environment variable, you must add it to both yo ## schema.mjs -This is the file you will actually touch. It contains two schemas, one for server-side environment variables and one for client-side as well as a `clientEnv` object. +This is the file you will actually touch. It contains two schemas & environment objects, one for server-side environment variables and one for client-side. ```ts:env/schema.mjs export const serverSchema = z.object({ // DATABASE_URL: z.string().url(), }); +export const serverEnv = { + // DATABASE_URL: process.env.DATABASE_URL, +}; + export const clientSchema = z.object({ // NEXT_PUBLIC_WS_KEY: z.string(), }); @@ -116,6 +120,11 @@ export const serverSchema = z.object({ // ... TWITTER_API_TOKEN: z.string(), }); + +export const serverEnv = { + // ... + TWITTER_API_TOKEN: process.env.TWITTER_API_TOKEN, +}; ``` _**NOTE:** An empty string is still a string, so `z.string()` will accept an empty string as a valid value. If you want to make sure that the environment variable is not empty, you can use `z.string().min(1)`._ diff --git a/www/src/pages/fr/usage/env-variables.md b/www/src/pages/fr/usage/env-variables.md index f0a89bc785..cb87c542ee 100644 --- a/www/src/pages/fr/usage/env-variables.md +++ b/www/src/pages/fr/usage/env-variables.md @@ -29,6 +29,10 @@ export const serverSchema = z.object({ // DATABASE_URL: z.string().url(), }); +export const serverEnv = { + // DATABASE_URL: process.env.DATABASE_URL, +}; + export const clientSchema = z.object({ // NEXT_PUBLIC_WS_KEY: z.string(), }); @@ -117,6 +121,11 @@ export const serverSchema = z.object({ // ... TWITTER_API_TOKEN: z.string(), }); + +export const serverEnv = { + // ... + TWITTER_API_TOKEN: process.env.TWITTER_API_TOKEN, +}; ``` _**NOTE:** Une chaîne vide est toujours une chaîne, donc `z.string()` acceptera une chaîne vide comme valeur valide. Si vous voulez vous assurer que la variable d'environnement n'est pas vide, vous pouvez utiliser `z.string().min(1)`._ diff --git a/www/src/pages/no/usage/env-variables.md b/www/src/pages/no/usage/env-variables.md index a7bf305f24..f6efc4841c 100644 --- a/www/src/pages/no/usage/env-variables.md +++ b/www/src/pages/no/usage/env-variables.md @@ -28,6 +28,10 @@ export const serverSchema = z.object({ // DATABASE_URL: z.string().url(), }); +export const serverEnv = { + // DATABASE_URL: process.env.DATABASE_URL, +}; + export const clientSchema = z.object({ // NEXT_PUBLIC_WS_KEY: z.string(), }); @@ -114,6 +118,11 @@ export const serverSchema = z.object({ // ... TWITTER_API_TOKEN: z.string(), }); + +export const serverEnv = { + // ... + TWITTER_API_TOKEN: process.env.TWITTER_API_TOKEN, +}; ``` _**MERK:** En tom streng er fortsatt en streng, så `z.string()` vil godta en tom streng som en gyldig verdi. Hvis du vil forsikre deg om at miljøvariabelen ikke er tom, kan du bruke `z.string().min(1)`._ diff --git a/www/src/pages/pt/usage/env-variables.md b/www/src/pages/pt/usage/env-variables.md index 05cba014fb..85e2f5bb86 100644 --- a/www/src/pages/pt/usage/env-variables.md +++ b/www/src/pages/pt/usage/env-variables.md @@ -28,6 +28,10 @@ export const serverSchema = z.object({ // DATABASE_URL: z.string().url(), }); +export const serverEnv = { + // DATABASE_URL: process.env.DATABASE_URL, +}; + export const clientSchema = z.object({ // NEXT_PUBLIC_WS_KEY: z.string(), }); @@ -114,6 +118,11 @@ export const serverSchema = z.object({ // ... TWITTER_API_TOKEN: z.string(), }); + +export const serverEnv = { + // ... + TWITTER_API_TOKEN: process.env.TWITTER_API_TOKEN, +}; ``` _**NOTA:** Uma string vazia ainda é uma string, então `z.string()` aceitará uma string vazia como um valor válido. Se você quiser ter certeza de que a variável de ambiente não está vazia, você pode usar `z.string().min(1)`._ diff --git a/www/src/pages/ru/usage/env-variables.md b/www/src/pages/ru/usage/env-variables.md index 0dd0946932..f5df20a58e 100644 --- a/www/src/pages/ru/usage/env-variables.md +++ b/www/src/pages/ru/usage/env-variables.md @@ -28,6 +28,10 @@ export const serverSchema = z.object({ // DATABASE_URL: z.string().url(), }); +export const serverEnv = { + // DATABASE_URL: process.env.DATABASE_URL, +}; + export const clientSchema = z.object({ // NEXT_PUBLIC_WS_KEY: z.string(), }); @@ -115,6 +119,11 @@ export const serverSchema = z.object({ // ... TWITTER_API_TOKEN: z.string(), }); + +export const serverEnv = { + // ... + TWITTER_API_TOKEN: process.env.TWITTER_API_TOKEN, +}; ``` _**Обратите внимание:** Пустая строка все еще является строкой, поэтому `z.string()` примет пустую строку как допустимое значение. Если вы хотите убедиться, что переменная среды не пуста, вы можете использовать `z.string().min(1)`._ diff --git a/www/src/pages/zh-hans/usage/env-variables.md b/www/src/pages/zh-hans/usage/env-variables.md index c9aeed2f65..f1ef4cda76 100644 --- a/www/src/pages/zh-hans/usage/env-variables.md +++ b/www/src/pages/zh-hans/usage/env-variables.md @@ -28,6 +28,10 @@ export const serverSchema = z.object({ // DATABASE_URL: z.string().url(), }); +export const serverEnv = { + // DATABASE_URL: process.env.DATABASE_URL, +}; + export const clientSchema = z.object({ // NEXT_PUBLIC_WS_KEY: z.string(), }); @@ -116,6 +120,11 @@ export const serverSchema = z.object({ // ... TWITTER_API_TOKEN: z.string(), }); + +export const serverEnv = { + // ... + TWITTER_API_TOKEN: process.env.TWITTER_API_TOKEN, +}; ``` _**注意:** 一个空的字符串仍然是一个字符串,所以 `z.string()` 会认为它是一个有效值。如果你想要确保环境变量的值不能为空,你可以使用 `z.string().min(1)`。_