mirror of
https://github.com/vee1e/workorder-desk.git
synced 2026-09-01 09:50:13 +00:00
66 lines
1.8 KiB
TypeScript
66 lines
1.8 KiB
TypeScript
import express, { type Express } from 'express';
|
|
import helmet from 'helmet';
|
|
import compression from 'compression';
|
|
import cors from 'cors';
|
|
import cookieParser from 'cookie-parser';
|
|
import hpp from 'hpp';
|
|
import { env, corsOrigins } from './config/env.js';
|
|
import { httpLogger } from './config/logger.js';
|
|
import { requestIdMiddleware } from './middleware/request-id.middleware.js';
|
|
import { rejectDangerousKeys } from './middleware/security.middleware.js';
|
|
import { globalLimiter } from './middleware/rate-limit.middleware.js';
|
|
import { errorMiddleware, notFoundHandler } from './middleware/error.middleware.js';
|
|
import { healthRoutes } from './routes/health.routes.js';
|
|
import { routes } from './routes/index.js';
|
|
|
|
if (corsOrigins.includes('*')) {
|
|
throw new Error('CORS_ORIGIN must not be "*" when credentials are enabled');
|
|
}
|
|
|
|
export function createApp(): Express {
|
|
const app = express();
|
|
|
|
app.set('trust proxy', env.TRUST_PROXY_HOPS);
|
|
|
|
app.use(requestIdMiddleware);
|
|
app.use(httpLogger);
|
|
app.use(
|
|
helmet({
|
|
contentSecurityPolicy: {
|
|
directives: {
|
|
defaultSrc: ["'none'"],
|
|
},
|
|
},
|
|
}),
|
|
);
|
|
app.use(
|
|
compression({
|
|
filter: (req, res) => {
|
|
const type = res.getHeader('Content-Type');
|
|
if (typeof type === 'string' && type.includes('text/event-stream')) return false;
|
|
return compression.filter(req, res);
|
|
},
|
|
}),
|
|
);
|
|
app.use(
|
|
cors({
|
|
origin: corsOrigins,
|
|
credentials: true,
|
|
}),
|
|
);
|
|
app.use(cookieParser(env.COOKIE_SECRET));
|
|
app.use(express.json({ limit: '32kb' }));
|
|
app.use(hpp());
|
|
app.use(rejectDangerousKeys);
|
|
app.use(globalLimiter);
|
|
|
|
app.use(healthRoutes);
|
|
app.use('/api/v1', routes);
|
|
|
|
app.use(notFoundHandler);
|
|
app.use(errorMiddleware);
|
|
|
|
return app;
|
|
}
|
|
|
|
export const app = createApp();
|