diff --git a/apps/sim/lib/env.ts b/apps/sim/lib/env.ts index 09b97dfeaa..2aacdd3aba 100644 --- a/apps/sim/lib/env.ts +++ b/apps/sim/lib/env.ts @@ -1,6 +1,17 @@ import { createEnv } from '@t3-oss/env-nextjs' +import { env as runtimeEnv } from 'next-runtime-env' import { z } from 'zod' +/** + * Universal environment variable getter that works in both client and server contexts. + * - Client-side: Uses next-runtime-env for runtime injection (supports Docker runtime vars) + * - Server-side: Falls back to process.env when runtimeEnv returns undefined + * - Provides seamless Docker runtime variable support for NEXT_PUBLIC_ vars + */ +const getEnv = (variable: string): string | undefined => { + return runtimeEnv(variable) ?? process.env[variable] +} + export const env = createEnv({ skipValidation: true, @@ -131,18 +142,20 @@ export const env = createEnv({ }, experimental__runtimeEnv: { - NEXT_PUBLIC_APP_URL: process.env.NEXT_PUBLIC_APP_URL, - NEXT_PUBLIC_VERCEL_URL: process.env.VERCEL_URL, - NEXT_PUBLIC_SENTRY_DSN: process.env.NEXT_PUBLIC_SENTRY_DSN, - NEXT_PUBLIC_GOOGLE_CLIENT_ID: process.env.NEXT_PUBLIC_GOOGLE_CLIENT_ID, - NEXT_PUBLIC_GOOGLE_API_KEY: process.env.NEXT_PUBLIC_GOOGLE_API_KEY, - NEXT_PUBLIC_GOOGLE_PROJECT_NUMBER: process.env.NEXT_PUBLIC_GOOGLE_PROJECT_NUMBER, - NEXT_PUBLIC_SOCKET_URL: process.env.NEXT_PUBLIC_SOCKET_URL, - NODE_ENV: process.env.NODE_ENV, - NEXT_TELEMETRY_DISABLED: process.env.NEXT_TELEMETRY_DISABLED, + NEXT_PUBLIC_APP_URL: getEnv('NEXT_PUBLIC_APP_URL'), + NEXT_PUBLIC_VERCEL_URL: process.env.VERCEL_URL, // Keep as-is (server-only) + NEXT_PUBLIC_SENTRY_DSN: getEnv('NEXT_PUBLIC_SENTRY_DSN'), + NEXT_PUBLIC_GOOGLE_CLIENT_ID: getEnv('NEXT_PUBLIC_GOOGLE_CLIENT_ID'), + NEXT_PUBLIC_GOOGLE_API_KEY: getEnv('NEXT_PUBLIC_GOOGLE_API_KEY'), + NEXT_PUBLIC_GOOGLE_PROJECT_NUMBER: getEnv('NEXT_PUBLIC_GOOGLE_PROJECT_NUMBER'), + NEXT_PUBLIC_SOCKET_URL: getEnv('NEXT_PUBLIC_SOCKET_URL'), + NODE_ENV: process.env.NODE_ENV, // Keep as-is (build-time) + NEXT_TELEMETRY_DISABLED: process.env.NEXT_TELEMETRY_DISABLED, // Keep as-is (build-time) }, }) // Needing this utility because t3-env is returning string for boolean values. export const isTruthy = (value: string | boolean | number | undefined) => typeof value === 'string' ? value === 'true' || value === '1' : Boolean(value) + +export { getEnv }