56 lines
1.4 KiB
TypeScript
56 lines
1.4 KiB
TypeScript
import { z } from 'zod';
|
|
|
|
// Environment variables
|
|
const envSchema = z.object({
|
|
NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),
|
|
PORT: z.string().transform(Number).default(3000),
|
|
HOST: z.string().default('0.0.0.0'),
|
|
API_RATE_LIMIT_WINDOW: z.string().transform(Number).default(60000), // 1 minute
|
|
API_RATE_LIMIT_MAX_REQUESTS: z.string().transform(Number).default(100),
|
|
CORS_ORIGIN: z.string().default('http://localhost:5173'),
|
|
});
|
|
|
|
export const apiEnv = envSchema.parse({
|
|
NODE_ENV: process.env.NODE_ENV,
|
|
PORT: process.env.PORT,
|
|
HOST: process.env.HOST,
|
|
API_RATE_LIMIT_WINDOW: process.env.API_RATE_LIMIT_WINDOW,
|
|
API_RATE_LIMIT_MAX_REQUESTS: process.env.API_RATE_LIMIT_MAX_REQUESTS,
|
|
CORS_ORIGIN: process.env.CORS_ORIGIN,
|
|
});
|
|
|
|
// Rate limit configuration by tier
|
|
export const rateLimitConfig = {
|
|
basic: {
|
|
windowMs: 60000, // 1 minute
|
|
maxRequests: 100,
|
|
},
|
|
plus: {
|
|
windowMs: 60000,
|
|
maxRequests: 500,
|
|
},
|
|
premium: {
|
|
windowMs: 60000,
|
|
maxRequests: 2000,
|
|
},
|
|
};
|
|
|
|
// API versioning configuration
|
|
export const apiVersioning = {
|
|
defaultVersion: '1',
|
|
headerName: 'X-API-Version',
|
|
queryParam: 'api-version',
|
|
};
|
|
|
|
// Logging configuration
|
|
export const loggingConfig = {
|
|
level: apiEnv.NODE_ENV === 'production' ? 'info' : 'debug',
|
|
transport: apiEnv.NODE_ENV === 'development' ? {
|
|
target: 'pino-pretty',
|
|
options: {
|
|
colorize: true,
|
|
translateTime: true,
|
|
},
|
|
} : undefined,
|
|
};
|