hm
This commit is contained in:
81
src/env/server.ts
vendored
81
src/env/server.ts
vendored
@@ -1,5 +1,8 @@
|
|||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
|
|
||||||
|
// Check if we're running in a server context
|
||||||
|
const isServer = typeof process !== "undefined" && process.env !== undefined;
|
||||||
|
|
||||||
const serverEnvSchema = z.object({
|
const serverEnvSchema = z.object({
|
||||||
// Server-side environment variables
|
// Server-side environment variables
|
||||||
NODE_ENV: z.enum(["development", "test", "production"]),
|
NODE_ENV: z.enum(["development", "test", "production"]),
|
||||||
@@ -181,36 +184,62 @@ export const validateClientEnv = (
|
|||||||
let _cachedEnv: ServerEnv | null = null;
|
let _cachedEnv: ServerEnv | null = null;
|
||||||
let _validationAttempted = false;
|
let _validationAttempted = false;
|
||||||
|
|
||||||
|
const validateEnvLazy = (): ServerEnv => {
|
||||||
|
if (!_validationAttempted) {
|
||||||
|
_validationAttempted = true;
|
||||||
|
|
||||||
|
// If not on server, return empty object (will throw on access)
|
||||||
|
if (!isServer) {
|
||||||
|
console.warn("⚠️ Server environment accessed in browser context");
|
||||||
|
_cachedEnv = {} as ServerEnv;
|
||||||
|
return _cachedEnv;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Validate server environment variables using process.env
|
||||||
|
_cachedEnv = validateServerEnv(process.env);
|
||||||
|
console.log("✅ Environment validation successful");
|
||||||
|
} catch (error) {
|
||||||
|
if (error instanceof EnvironmentError) {
|
||||||
|
console.error("❌ Environment validation failed:", error.message);
|
||||||
|
if (error.errors) {
|
||||||
|
console.error(
|
||||||
|
"Detailed errors:",
|
||||||
|
JSON.stringify(error.errors, null, 2)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
throw new Error(`Environment validation failed: ${error.message}`);
|
||||||
|
}
|
||||||
|
console.error("❌ Unexpected environment validation error:", error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_cachedEnv) {
|
||||||
|
throw new Error("Environment validation failed");
|
||||||
|
}
|
||||||
|
|
||||||
|
return _cachedEnv;
|
||||||
|
};
|
||||||
|
|
||||||
export const env = new Proxy({} as ServerEnv, {
|
export const env = new Proxy({} as ServerEnv, {
|
||||||
get(_target, prop: string) {
|
get(_target, prop: string) {
|
||||||
// Only validate once
|
if (!isServer) {
|
||||||
if (!_validationAttempted) {
|
throw new Error(
|
||||||
_validationAttempted = true;
|
`Cannot access server environment variable "${prop}" in browser context. This is a development error - server-only code is being bundled into the client.`
|
||||||
try {
|
);
|
||||||
// Validate server environment variables using process.env
|
|
||||||
_cachedEnv = validateServerEnv(process.env);
|
|
||||||
console.log("✅ Environment validation successful");
|
|
||||||
} catch (error) {
|
|
||||||
if (error instanceof EnvironmentError) {
|
|
||||||
console.error("❌ Environment validation failed:", error.message);
|
|
||||||
if (error.errors) {
|
|
||||||
console.error(
|
|
||||||
"Detailed errors:",
|
|
||||||
JSON.stringify(error.errors, null, 2)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
throw new Error(`Environment validation failed: ${error.message}`);
|
|
||||||
}
|
|
||||||
console.error("❌ Unexpected environment validation error:", error);
|
|
||||||
throw new Error("Unexpected environment validation error occurred");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
const validatedEnv = validateEnvLazy();
|
||||||
if (!_cachedEnv) {
|
return validatedEnv[prop as keyof ServerEnv];
|
||||||
throw new Error("Environment validation has not been performed yet");
|
},
|
||||||
|
has(_target, prop: string) {
|
||||||
|
if (!isServer) return false;
|
||||||
|
try {
|
||||||
|
const validatedEnv = validateEnvLazy();
|
||||||
|
return prop in validatedEnv;
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return _cachedEnv[prop as keyof ServerEnv];
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user