env.schema.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233
  1. import { z } from 'zod';
  2. export const envSchema = z.object({
  3. PORT: z.coerce.number().int().positive().default(3000),
  4. APP_BASE_URL: z.string().default('http://localhost:3000'),
  5. DATABASE_URL: z.string().default('mysql://root:root@localhost:3306/aitori_backend'),
  6. REDIS_URL: z.string().default('redis://localhost:6379'),
  7. AI_SIMULATION_BASE_URL: z.string().url().default('http://localhost:8084'),
  8. AI_SIMULATION_REFRESH_INTERVAL_MS: z.coerce.number().int().positive().default(10000),
  9. AI_SIMULATION_HTTP_TIMEOUT_MS: z.coerce.number().int().positive().default(15000),
  10. JWT_SECRET: z.string().default('replace-me'),
  11. JWT_EXPIRES_IN: z.string().default('7d'),
  12. CORS_ORIGIN: z.string().default('http://127.0.0.1:5173'),
  13. NODE_ENV: z.enum(['development', 'test', 'production']).default('development'),
  14. STORAGE_DRIVER: z.enum(['gcs']).default('gcs'),
  15. GCS_BUCKET: z.string().min(1),
  16. GCS_PROJECT_ID: z.string().min(1),
  17. GCS_CLIENT_EMAIL: z.string().email(),
  18. GCS_PRIVATE_KEY: z.string().min(1),
  19. CUSTOMER_DEFAULT_AVATAR_URL: z
  20. .string()
  21. .url()
  22. .default(
  23. 'https://storage.googleapis.com/aitori-public/style/sample/066c7ba22ea149268444bc2d919d5b97.png',
  24. ),
  25. RESEND_API_KEY: z.string().optional(),
  26. BETA_APPLICATION_EMAIL_FROM: z.string().default('Aitori Stylist <noreply@aitori.jp>'),
  27. BETA_APPLICATION_EMAIL_TO: z.string().email().default('info@aitori.jp'),
  28. });
  29. export function validateEnv(config: Record<string, unknown>) {
  30. return envSchema.parse(config);
  31. }