|
1 | 1 | import { createEnv } from '@t3-oss/env-nextjs' |
| 2 | +import { env as runtimeEnv } from 'next-runtime-env' |
2 | 3 | import { z } from 'zod' |
3 | 4 |
|
| 5 | +/** |
| 6 | + * Universal environment variable getter that works in both client and server contexts. |
| 7 | + * - Client-side: Uses next-runtime-env for runtime injection (supports Docker runtime vars) |
| 8 | + * - Server-side: Falls back to process.env when runtimeEnv returns undefined |
| 9 | + * - Provides seamless Docker runtime variable support for NEXT_PUBLIC_ vars |
| 10 | + */ |
| 11 | +const getEnv = (variable: string): string | undefined => { |
| 12 | + return runtimeEnv(variable) ?? process.env[variable] |
| 13 | +} |
| 14 | + |
4 | 15 | export const env = createEnv({ |
5 | 16 | skipValidation: true, |
6 | 17 |
|
@@ -131,18 +142,20 @@ export const env = createEnv({ |
131 | 142 | }, |
132 | 143 |
|
133 | 144 | experimental__runtimeEnv: { |
134 | | - NEXT_PUBLIC_APP_URL: process.env.NEXT_PUBLIC_APP_URL, |
135 | | - NEXT_PUBLIC_VERCEL_URL: process.env.VERCEL_URL, |
136 | | - NEXT_PUBLIC_SENTRY_DSN: process.env.NEXT_PUBLIC_SENTRY_DSN, |
137 | | - NEXT_PUBLIC_GOOGLE_CLIENT_ID: process.env.NEXT_PUBLIC_GOOGLE_CLIENT_ID, |
138 | | - NEXT_PUBLIC_GOOGLE_API_KEY: process.env.NEXT_PUBLIC_GOOGLE_API_KEY, |
139 | | - NEXT_PUBLIC_GOOGLE_PROJECT_NUMBER: process.env.NEXT_PUBLIC_GOOGLE_PROJECT_NUMBER, |
140 | | - NEXT_PUBLIC_SOCKET_URL: process.env.NEXT_PUBLIC_SOCKET_URL, |
141 | | - NODE_ENV: process.env.NODE_ENV, |
142 | | - NEXT_TELEMETRY_DISABLED: process.env.NEXT_TELEMETRY_DISABLED, |
| 145 | + NEXT_PUBLIC_APP_URL: getEnv('NEXT_PUBLIC_APP_URL'), |
| 146 | + NEXT_PUBLIC_VERCEL_URL: process.env.VERCEL_URL, // Keep as-is (server-only) |
| 147 | + NEXT_PUBLIC_SENTRY_DSN: getEnv('NEXT_PUBLIC_SENTRY_DSN'), |
| 148 | + NEXT_PUBLIC_GOOGLE_CLIENT_ID: getEnv('NEXT_PUBLIC_GOOGLE_CLIENT_ID'), |
| 149 | + NEXT_PUBLIC_GOOGLE_API_KEY: getEnv('NEXT_PUBLIC_GOOGLE_API_KEY'), |
| 150 | + NEXT_PUBLIC_GOOGLE_PROJECT_NUMBER: getEnv('NEXT_PUBLIC_GOOGLE_PROJECT_NUMBER'), |
| 151 | + NEXT_PUBLIC_SOCKET_URL: getEnv('NEXT_PUBLIC_SOCKET_URL'), |
| 152 | + NODE_ENV: process.env.NODE_ENV, // Keep as-is (build-time) |
| 153 | + NEXT_TELEMETRY_DISABLED: process.env.NEXT_TELEMETRY_DISABLED, // Keep as-is (build-time) |
143 | 154 | }, |
144 | 155 | }) |
145 | 156 |
|
146 | 157 | // Needing this utility because t3-env is returning string for boolean values. |
147 | 158 | export const isTruthy = (value: string | boolean | number | undefined) => |
148 | 159 | typeof value === 'string' ? value === 'true' || value === '1' : Boolean(value) |
| 160 | + |
| 161 | +export { getEnv } |
0 commit comments