import { NestFactory } from '@nestjs/core'; import { ValidationPipe } from '@nestjs/common'; import helmet from 'helmet'; import { AppModule } from './app.module'; import { join } from 'path'; import * as express from 'express'; async function bootstrap() { const app = await NestFactory.create(AppModule, { logger: ['error', 'warn', 'log'], }); // Serve uploaded files before helmet so they're not blocked app.use('/uploads', express.static(join(__dirname, '..', 'uploads'))); // Security headers app.use( helmet({ contentSecurityPolicy: false, // Handled by Next.js crossOriginEmbedderPolicy: false, }), ); // CORS const allowedOrigins = (process.env.CORS_ORIGIN || 'http://localhost:3000,http://localhost:3002').split(','); app.enableCors({ origin: allowedOrigins, credentials: true, methods: ['GET', 'POST', 'PATCH', 'DELETE', 'OPTIONS'], allowedHeaders: ['Content-Type', 'Authorization'], }); app.setGlobalPrefix('api'); // Validation with sanitization app.useGlobalPipes( new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, transform: true, transformOptions: { enableImplicitConversion: true }, }), ); const port = process.env.API_PORT || 3001; await app.listen(port, '0.0.0.0'); console.log(`API running on http://localhost:${port}/api`); } bootstrap();