38 lines
1.3 KiB
TypeScript
38 lines
1.3 KiB
TypeScript
|
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<void> {
|
||
|
public async start(app: Express, router: Router): Promise<void> {
|
||
|
const env = nunjucks.configure('views', {
|
||
|
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', 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;
|
||
|
next();
|
||
|
});
|
||
|
}
|
||
|
|
||
|
public async stop(): Promise<void> {
|
||
|
}
|
||
|
|
||
|
}
|