import nunjucks from "nunjucks"; import config from "config"; import {Express, Router} from "express"; import ApplicationComponent from "../ApplicationComponent"; import Controller from "../Controller"; import {ServerError} from "../HttpError"; export default class NunjucksComponent extends ApplicationComponent { private readonly viewsPath: string; constructor(viewsPath: string = 'views') { super(); this.viewsPath = viewsPath; } public async start(app: Express, router: Router): Promise { const env = nunjucks.configure(this.viewsPath, { autoescape: true, express: app, noCache: !config.get('view.cache'), throwOnUndefined: true, }) .addGlobal('route', (route: string, params: { [p: string]: string } | [] = [], absolute: boolean = false) => { const path = Controller.route(route, params, absolute); if (path === null) throw new ServerError(`Route ${route} not found.`); return path; }) .addGlobal('app_version', this.app!.getVersion()) .addGlobal('core_version', require('../../package.json').version) .addFilter('hex', (v: number) => { return v.toString(16); }); app.set('view engine', 'njk'); router.use((req, res, next) => { req.env = env; res.locals.url = req.url; res.locals.params = () => req.params; res.locals.app = config.get('app'); next(); }); } public async stop(): Promise { } }