diff --git a/packages/next-utils/package.json b/packages/next-utils/package.json index a86c574..c8a7e27 100644 --- a/packages/next-utils/package.json +++ b/packages/next-utils/package.json @@ -1,6 +1,6 @@ { "name": "@mintel/next-utils", - "version": "1.7.13", + "version": "1.7.14", "publishConfig": { "access": "public", "registry": "https://npm.infra.mintel.me" diff --git a/packages/next-utils/src/env.ts b/packages/next-utils/src/env.ts index 0f2a0fe..e609a7a 100644 --- a/packages/next-utils/src/env.ts +++ b/packages/next-utils/src/env.ts @@ -50,17 +50,45 @@ export const mintelEnvSchema = { INTERNAL_DIRECTUS_URL: z.string().url().optional(), }; +/** + * Standard Mintel refinements for environment variables. + * Enforces mandatory requirements for non-development environments. + */ +export const withMintelRefinements = (schema: T) => { + return schema.superRefine((data: any, ctx) => { + const target = data.TARGET || data.NEXT_PUBLIC_TARGET || "development"; + + // Strict validation for non-development environments + if (target !== "development") { + if (!data.MAIL_HOST) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: "MAIL_HOST is required in non-development environments", + path: ["MAIL_HOST"], + }); + } + } + }); +}; + export type MintelEnv> = - z.infer>; + z.infer< + ReturnType< + typeof withMintelRefinements> + > + >; export function validateMintelEnv< T extends z.ZodRawShape = Record, >(schemaExtension: T = {} as T): MintelEnv { - const fullSchema = z.object(mintelEnvSchema).extend(schemaExtension); + const fullSchema = withMintelRefinements( + z.object(mintelEnvSchema).extend(schemaExtension), + ); const isBuildTime = process.env.NEXT_PHASE === "phase-production-build" || - process.env.SKIP_ENV_VALIDATION === "true"; + process.env.SKIP_ENV_VALIDATION === "true" || + process.env.SKIP_RUNTIME_ENV_VALIDATION === "true"; const result = fullSchema.safeParse(process.env); @@ -80,5 +108,5 @@ export function validateMintelEnv< throw new Error("Invalid environment variables"); } - return result.data; + return result.data as MintelEnv; }