Files
the_order/packages/shared/src/env.ts
T

152 lines
4.2 KiB
TypeScript

/**
* Environment variable validation
*/
import { z } from 'zod';
/**
* Environment variable schema
*/
const envSchema = z.object({
// Node environment
NODE_ENV: z.enum(['development', 'staging', 'production']).default('development'),
// Server configuration
PORT: z.string().transform(Number).pipe(z.number().int().positive()).default('3000'),
// Database
DATABASE_URL: z.string().url(),
// Storage (S3/GCS)
STORAGE_TYPE: z.enum(['s3', 'gcs']).default('s3'),
STORAGE_BUCKET: z.string(),
STORAGE_REGION: z.string().default('us-east-1'),
AWS_ACCESS_KEY_ID: z.string().optional(),
AWS_SECRET_ACCESS_KEY: z.string().optional(),
GCP_PROJECT_ID: z.string().optional(),
GCP_KEY_FILE: z.string().optional(),
// KMS
KMS_TYPE: z.enum(['aws', 'gcp']).default('aws'),
KMS_KEY_ID: z.string(),
KMS_REGION: z.string().default('us-east-1'),
// Authentication
JWT_SECRET: z.string().min(32),
OIDC_ISSUER: z.string().url().optional(),
OIDC_CLIENT_ID: z.string().optional(),
OIDC_CLIENT_SECRET: z.string().optional(),
VC_ISSUER_DID: z.string().optional(),
VC_ISSUER_DOMAIN: z.string().optional(),
SWAGGER_SERVER_URL: z.string().url().optional(),
// eIDAS
EIDAS_PROVIDER_URL: z.string().url().optional(),
EIDAS_API_KEY: z.string().optional(),
// Credential Rate Limiting
CREDENTIAL_RATE_LIMIT_PER_USER: z.string().optional(),
CREDENTIAL_RATE_LIMIT_PER_IP: z.string().optional(),
// CORS
CORS_ORIGIN: z.string().optional(),
// Logging
LOG_LEVEL: z.enum(['fatal', 'error', 'warn', 'info', 'debug', 'trace']).default('info'),
// Monitoring
OTEL_EXPORTER_OTLP_ENDPOINT: z.string().url().optional(),
OTEL_SERVICE_NAME: z.string().optional(),
// Payment Gateway
PAYMENT_GATEWAY_API_KEY: z.string().optional(),
PAYMENT_GATEWAY_WEBHOOK_SECRET: z.string().optional(),
// OCR Service
OCR_SERVICE_URL: z.string().url().optional(),
OCR_SERVICE_API_KEY: z.string().optional(),
// ML Classification
ML_CLASSIFICATION_SERVICE_URL: z.string().url().optional(),
ML_CLASSIFICATION_API_KEY: z.string().optional(),
// Redis/Cache
REDIS_URL: z.string().url().optional(),
// Message Queue
MESSAGE_QUEUE_URL: z.string().url().optional(),
// Notifications
EMAIL_PROVIDER: z.enum(['smtp', 'sendgrid', 'ses', 'sendinblue']).optional(),
EMAIL_API_KEY: z.string().optional(),
EMAIL_FROM: z.string().email().optional(),
EMAIL_FROM_NAME: z.string().optional(),
SMS_PROVIDER: z.enum(['twilio', 'aws-sns', 'nexmo']).optional(),
SMS_API_KEY: z.string().optional(),
SMS_FROM_NUMBER: z.string().optional(),
PUSH_PROVIDER: z.enum(['fcm', 'apns', 'web-push']).optional(),
PUSH_API_KEY: z.string().optional(),
// Credential URLs
CREDENTIALS_URL: z.string().url().optional(),
RENEWAL_URL: z.string().url().optional(),
// Compliance providers
KYC_PROVIDER_URL: z.string().url().optional(),
AML_PROVIDER_URL: z.string().url().optional(),
SANCTIONS_PROVIDER_URL: z.string().url().optional(),
// KYC Provider (Veriff)
VERIFF_API_KEY: z.string().optional(),
VERIFF_API_URL: z.string().url().optional(),
VERIFF_WEBHOOK_SECRET: z.string().optional(),
// Sanctions Provider (ComplyAdvantage)
SANCTIONS_API_KEY: z.string().optional(),
SANCTIONS_API_URL: z.string().url().optional(),
// eResidency Service
ERESIDENCY_SERVICE_URL: z.string().url().optional(),
// DSB Configuration
DSB_ISSUER_DID: z.string().optional(),
DSB_ISSUER_DOMAIN: z.string().optional(),
DSB_SCHEMA_REGISTRY_URL: z.string().url().optional(),
// Secrets Management
SECRETS_PROVIDER: z.enum(['aws', 'gcp', 'env']).optional(),
SECRETS_CACHE_TTL: z.string().transform(Number).pipe(z.number().int().positive()).optional(),
});
/**
* Validated environment variables
*/
export type Env = z.infer<typeof envSchema>;
let env: Env | null = null;
/**
* Get validated environment variables
*/
export function getEnv(): Env {
if (env) {
return env;
}
try {
env = envSchema.parse(process.env);
return env;
} catch (error) {
if (error instanceof z.ZodError) {
const missing = error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ');
throw new Error(`Invalid environment variables: ${missing}`);
}
throw error;
}
}
/**
* Validate environment variables on module load
*/
getEnv();