{{={= =}=}} import * as z from "zod" import { ensureEnvSchema } from "../env/validation.js" {=# envValidationSchema.isDefined =} {=& envValidationSchema.importStatement =} const userServerEnvSchema = {= envValidationSchema.importIdentifier =}; {=/ envValidationSchema.isDefined =} {=^ envValidationSchema.isDefined =} const userServerEnvSchema = z.object({}); {=/ envValidationSchema.isDefined =} const waspCommonServerEnvSchema = z.object({ PORT: z.coerce.number().default({= defaultServerPort =}), {= databaseUrlEnvVarName =}: z.string({ error: '{= databaseUrlEnvVarName =} is required', }), PG_BOSS_NEW_OPTIONS: z.string().optional(), {=# isEmailSenderEnabled =} {=# enabledEmailSenders.isSmtpProviderEnabled =} SMTP_HOST: z.string({ error: getRequiredEnvVarErrorMessage('SMTP email sender', 'SMTP_HOST'), }), SMTP_PORT: z.coerce.number({ error: getRequiredEnvVarErrorMessage('SMTP email sender', 'SMTP_PORT'), }), SMTP_USERNAME: z.string({ error: getRequiredEnvVarErrorMessage('SMTP email sender', 'SMTP_USERNAME'), }), SMTP_PASSWORD: z.string({ error: getRequiredEnvVarErrorMessage('SMTP email sender', 'SMTP_PASSWORD'), }), {=/ enabledEmailSenders.isSmtpProviderEnabled =} {=# enabledEmailSenders.isSendGridProviderEnabled =} SENDGRID_API_KEY: z.string({ error: getRequiredEnvVarErrorMessage('SendGrid email sender', 'SENDGRID_API_KEY'), }), {=/ enabledEmailSenders.isSendGridProviderEnabled =} {=# enabledEmailSenders.isMailgunProviderEnabled =} MAILGUN_API_KEY: z.string({ error: getRequiredEnvVarErrorMessage('Mailgun email sender', 'MAILGUN_API_KEY'), }), MAILGUN_DOMAIN: z.string({ error: getRequiredEnvVarErrorMessage('Mailgun email sender', 'MAILGUN_DOMAIN'), }), MAILGUN_API_URL: z.string().optional(), {=/ enabledEmailSenders.isMailgunProviderEnabled =} {=/ isEmailSenderEnabled =} SKIP_EMAIL_VERIFICATION_IN_DEV: z .enum(['true', 'false'], { error: 'SKIP_EMAIL_VERIFICATION_IN_DEV must be either "true" or "false"', }) .default('false') .transform((value) => value === 'true'), {=# isAuthEnabled =} {=# enabledAuthProviders.isGoogleAuthEnabled =} GOOGLE_CLIENT_ID: z.string({ error: getRequiredEnvVarErrorMessage('Google auth provider', 'GOOGLE_CLIENT_ID'), }), GOOGLE_CLIENT_SECRET: z.string({ error: getRequiredEnvVarErrorMessage('Google auth provider', 'GOOGLE_CLIENT_SECRET'), }), {=/ enabledAuthProviders.isGoogleAuthEnabled =} {=# enabledAuthProviders.isGitHubAuthEnabled =} GITHUB_CLIENT_ID: z.string({ error: getRequiredEnvVarErrorMessage('GitHub auth provider', 'GITHUB_CLIENT_ID'), }), GITHUB_CLIENT_SECRET: z.string({ error: getRequiredEnvVarErrorMessage('GitHub auth provider', 'GITHUB_CLIENT_SECRET'), }), {=/ enabledAuthProviders.isGitHubAuthEnabled =} {=# enabledAuthProviders.isSlackAuthEnabled =} SLACK_CLIENT_ID: z.string({ error: getRequiredEnvVarErrorMessage('Slack auth provider', 'SLACK_CLIENT_ID'), }), SLACK_CLIENT_SECRET: z.string({ error: getRequiredEnvVarErrorMessage('Slack auth provider', 'SLACK_CLIENT_SECRET'), }), {=/ enabledAuthProviders.isSlackAuthEnabled =} {=# enabledAuthProviders.isDiscordAuthEnabled =} DISCORD_CLIENT_ID: z.string({ error: getRequiredEnvVarErrorMessage('Discord auth provider', 'DISCORD_CLIENT_ID'), }), DISCORD_CLIENT_SECRET: z.string({ error: getRequiredEnvVarErrorMessage('Discord auth provider', 'DISCORD_CLIENT_SECRET'), }), {=/ enabledAuthProviders.isDiscordAuthEnabled =} {=# enabledAuthProviders.isKeycloakAuthEnabled =} KEYCLOAK_CLIENT_ID: z.string({ error: getRequiredEnvVarErrorMessage('Keycloak auth provider', 'KEYCLOAK_CLIENT_ID'), }), KEYCLOAK_CLIENT_SECRET: z.string({ error: getRequiredEnvVarErrorMessage('Keycloak auth provider', 'KEYCLOAK_CLIENT_SECRET'), }), KEYCLOAK_REALM_URL: z.string({ error: getRequiredEnvVarErrorMessage('Keycloak auth provider', 'KEYCLOAK_REALM_URL'), }) .pipe( z.url({ error: 'KEYCLOAK_REALM_URL must be a valid URL', }) ), {=/ enabledAuthProviders.isKeycloakAuthEnabled =} {=# enabledAuthProviders.isMicrosoftAuthEnabled =} MICROSOFT_TENANT_ID: z.string({ error: getRequiredEnvVarErrorMessage('Microsoft auth provider', 'MICROSOFT_TENANT_ID'), }), MICROSOFT_CLIENT_ID: z.string({ error: getRequiredEnvVarErrorMessage('Microsoft auth provider', 'MICROSOFT_CLIENT_ID'), }), MICROSOFT_CLIENT_SECRET: z.string({ error: getRequiredEnvVarErrorMessage('Microsoft auth provider', 'MICROSOFT_CLIENT_SECRET'), }), {=/ enabledAuthProviders.isMicrosoftAuthEnabled =} {=/ isAuthEnabled =} }); const serverUrlSchema = z.string({ error: '{= serverUrlEnvVarName =} is required', }) .pipe( z.url({ error: '{= serverUrlEnvVarName =} must be a valid URL', }) ) const clientUrlSchema = z.string({ error: '{= clientUrlEnvVarName =} is required', }) .pipe( z.url({ error: '{= clientUrlEnvVarName =} must be a valid URL', }) ) {=# isAuthEnabled =} const jwtTokenSchema = z .string({ error: '{= jwtSecretEnvVarName =} is required', }) {=/ isAuthEnabled =} // In development, we provide default values for some environment variables // to make the development process easier. const waspDevServerEnvSchema = z.object({ NODE_ENV: z.literal("development"), "{= serverUrlEnvVarName =}": serverUrlSchema .default("{= defaultServerUrl =}"), "{= clientUrlEnvVarName =}": clientUrlSchema .default("{= defaultClientUrl =}"), {=# isAuthEnabled =} "{= jwtSecretEnvVarName =}": jwtTokenSchema .default("DEVJWTSECRET"), {=/ isAuthEnabled =} }); const waspProdServerEnvSchema = z.object({ NODE_ENV: z.literal("production"), "{= serverUrlEnvVarName =}": serverUrlSchema, "{= clientUrlEnvVarName =}": clientUrlSchema, {=# isAuthEnabled =} "{= jwtSecretEnvVarName =}": jwtTokenSchema, {=/ isAuthEnabled =} }); const waspServerEnvSchema = z.discriminatedUnion("NODE_ENV", [ z.object({...waspCommonServerEnvSchema.shape, ...waspDevServerEnvSchema.shape}), z.object({...waspCommonServerEnvSchema.shape, ...waspProdServerEnvSchema.shape}), ]); const serverEnvSchema = userServerEnvSchema.and(waspServerEnvSchema); const defaultNodeEnvValue = waspDevServerEnvSchema.shape.NODE_ENV.value; const { NODE_ENV: inputNodeEnvValue, ...restEnv } = process.env; // PUBLIC API export const env = ensureEnvSchema( { NODE_ENV: inputNodeEnvValue ?? defaultNodeEnvValue, ...restEnv, }, serverEnvSchema, ); function getRequiredEnvVarErrorMessage(featureName: string, envVarName: string) { return `${envVarName} is required when using ${featureName}` }