import 'zone.js/dist/zone-node';
import { ngExpressEngine } from '@nguniversal/express-engine';
import * as express from 'express';
import { join } from 'path';
import { AppServerModule } from './src/main.server';
import { APP_BASE_HREF } from '@angular/common';
import { existsSync, readFileSync } from 'fs';
// Simulation DOM (nécessaire pour certaines librairies côté serveur)
const domino = require('domino');
const distFolder = join(process.cwd(), 'dist/fatboar/browser');
const indexHtml = existsSync(join(distFolder, 'index.html')) ? 'index.html' : 'index';
const template = readFileSync(join(distFolder, indexHtml)).toString();
// Simuler un DOM global pour les libs (Leaflet, Material, etc.)
const win = domino.createWindow(template);
global['window'] = win;
global['document'] = win.document;
global['navigator'] = win.navigator;
global['CSS'] = null;
export function app() {
const server = express();
// Moteur de rendu Angular Universal
server.engine('html', ngExpressEngine({
bootstrap: AppServerModule,
}));
server.set('view engine', 'html');
server.set('views', distFolder);
// Fichiers statiques (CSS, JS, images…)
server.get('*.*', express.static(distFolder, { maxAge: '1y' }));
// Routes SEO
server.get('/sitemap.xml', (req, res) => {
res.header('Content-Type', 'application/xml');
res.sendFile(join(distFolder, 'sitemap.xml'));
});
server.get('/robots.txt', (req, res) => {
res.sendFile(join(distFolder, 'robots.txt'));
});
// Toutes les autres routes => rendu SSR
server.get('*', (req, res) => {
res.render(indexHtml, {
req,
providers: [
{ provide: APP_BASE_HREF, useValue: req.baseUrl },
{ provide: 'CANONICAL_URL', useValue: `https://angular-dev.foodgame.fr${req.originalUrl}` }
]
}, (err, html) => {
if (err) {
console.error(err);
return res.status(500).send(err);
}
// Injection Preboot pour capturer les interactions avant bootstrap Angular
const prebootScript = `
`;
// Injection des CSS directement dans le SSR pour éviter le flash
const styles = `
`;
res.send(
html
.replace('', `${styles}`)
.replace('