import nunjucks, {Environment} 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; private env?: Environment; constructor(viewsPath: string = 'views') { super(); this.viewsPath = viewsPath; } public async start(app: Express): Promise { let coreVersion = 'unknown'; try { coreVersion = require('../../package.json').version; } catch (e) { try { coreVersion = require('../package.json').version; } catch (e) { } } this.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', coreVersion) .addFilter('hex', (v: number) => { return v.toString(16); }); app.set('view engine', 'njk'); } public async init(router: Router): Promise { router.use((req, res, next) => { req.env = this.env!; res.locals.url = req.url; res.locals.params = () => req.params; res.locals.app = config.get('app'); next(); }); } }