feat(api): app NestJS con configuración validada y health check
Nest 12 (ESM, vitest, oxlint). El .env se valida con zod al arrancar; prefijo global /api, CORS configurable y GET /api/health. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
e4417705e7
commit
445efc998d
21 files changed
+6145
-1
No files matched your search
@@ -0,0 +1,30 @@
|
||||
import { z } from 'zod';
|
||||
|
||||
export const envSchema = z.object({
|
||||
NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),
|
||||
PORT: z.coerce.number().int().positive().default(3000),
|
||||
// Orígenes permitidos por CORS, separados por coma. Vacío = mismo origen.
|
||||
CORS_ORIGINS: z
|
||||
.string()
|
||||
.default('')
|
||||
.transform((v) =>
|
||||
v
|
||||
.split(',')
|
||||
.map((s) => s.trim())
|
||||
.filter(Boolean),
|
||||
),
|
||||
LOG_LEVEL: z.enum(['error', 'warn', 'log', 'debug', 'verbose']).default('log'),
|
||||
});
|
||||
|
||||
export type Env = z.infer<typeof envSchema>;
|
||||
|
||||
export function validateEnv(raw: Record<string, unknown>): Env {
|
||||
const result = envSchema.safeParse(raw);
|
||||
if (!result.success) {
|
||||
const detail = result.error.issues
|
||||
.map((i) => `${i.path.join('.')}: ${i.message}`)
|
||||
.join('; ');
|
||||
throw new Error(`Configuración inválida (.env): ${detail}`);
|
||||
}
|
||||
return result.data;
|
||||
}
|
||||
Reference in new issue
Block a user