96 lines
2.3 KiB
TypeScript
96 lines
2.3 KiB
TypeScript
import express from 'express';
|
|
import * as compression from 'compression';
|
|
import * as cors from 'cors';
|
|
import * as path from 'path';
|
|
import chalk from 'chalk';
|
|
import manifestHelpers from 'express-manifest-helpers';
|
|
import * as bodyParser from 'body-parser';
|
|
import expressWinston from 'express-winston';
|
|
import i18nMiddleware from 'i18next-express-middleware';
|
|
import * as Sentry from '@sentry/node';
|
|
import enforce from 'express-sslify';
|
|
|
|
import '../config/env';
|
|
// @ts-ignore
|
|
import * as paths from '../config/paths';
|
|
import log from './log';
|
|
import serverRender from './render';
|
|
import i18n from './i18n';
|
|
|
|
process.env.SERVER_SIDE_RENDER = 'true';
|
|
const isDev = process.env.NODE_ENV === 'development';
|
|
|
|
Sentry.init({
|
|
dsn: process.env.SENTRY_DSN,
|
|
release: process.env.SENTRY_RELEASE,
|
|
environment: process.env.NODE_ENV,
|
|
});
|
|
|
|
const app = express();
|
|
|
|
// GZIP
|
|
app.use(compression());
|
|
|
|
// ssl
|
|
if (!isDev && !process.env.DISABLE_SSL) {
|
|
log.info('PRODUCTION mode, enforcing HTTPS redirect');
|
|
app.use(enforce.HTTPS({ trustProtoHeader: true }));
|
|
}
|
|
|
|
// sentry
|
|
app.use(Sentry.Handlers.requestHandler());
|
|
|
|
// log requests
|
|
app.use(expressWinston.logger({ winstonInstance: log }));
|
|
|
|
// i18next
|
|
app.use(i18nMiddleware.handle(i18n));
|
|
|
|
if (isDev) {
|
|
app.use(
|
|
paths.publicPath,
|
|
express.static(path.join(paths.clientBuild, paths.publicPath)),
|
|
);
|
|
app.use('/favicon.ico', (_, res) => {
|
|
res.send('');
|
|
});
|
|
} else {
|
|
log.warn('PRODUCTION mode, serving static assets from node server');
|
|
app.use(
|
|
paths.publicPath,
|
|
express.static(path.join(paths.clientBuild, paths.publicPath)),
|
|
);
|
|
app.use('/favicon.ico', (_, res) => {
|
|
res.send('');
|
|
});
|
|
}
|
|
|
|
app.use(cors());
|
|
app.use(bodyParser.json());
|
|
|
|
const manifestPath = path.join(paths.clientBuild, paths.publicPath);
|
|
|
|
app.use(
|
|
manifestHelpers({
|
|
manifestPath: `${manifestPath}/manifest.json`,
|
|
cache: process.env.NODE_ENV === 'production',
|
|
// prependPath: '//cdn.example/assets' // if statics are elsewhere
|
|
}),
|
|
);
|
|
|
|
app.use(serverRender());
|
|
|
|
app.use(Sentry.Handlers.errorHandler());
|
|
app.use(expressWinston.errorLogger({ winstonInstance: log }));
|
|
|
|
app.listen(process.env.PORT || 3000, () => {
|
|
const port = process.env.PORT || 3000;
|
|
if (isDev) {
|
|
console.log(chalk.blue(`App is running: 🌎 http://localhost:${port} `));
|
|
} else {
|
|
log.info(`Server started on port ${port}`);
|
|
}
|
|
});
|
|
|
|
export default app;
|