swaf/src/components/NunjucksComponent.ts

86 lines
3.1 KiB
TypeScript
Raw Normal View History

import nunjucks, {Environment} from "nunjucks";
2020-04-23 11:18:23 +02:00
import config from "config";
import {Express, Request, Router} from "express";
2020-04-23 11:18:23 +02:00
import ApplicationComponent from "../ApplicationComponent";
import Controller from "../Controller";
import {ServerError} from "../HttpError";
import * as querystring from "querystring";
2020-07-15 11:42:49 +02:00
import {ParsedUrlQueryInput} from "querystring";
import * as util from "util";
2020-04-23 11:18:23 +02:00
export default class NunjucksComponent extends ApplicationComponent<void> {
public static getPreviousURL(req: Request, defaultUrl?: string): string {
2020-07-15 11:42:49 +02:00
let referrer = req.headers.referer?.toString() || req.headers.referrer?.toString() || defaultUrl || '/';
if (referrer.startsWith('https://') || referrer.startsWith('http://')) return '/';
else if (!referrer.startsWith('/')) referrer = req.url + (req.url.endsWith('/') ? '' : '/') + referrer;
return referrer;
}
private readonly viewsPath: string;
private env?: Environment;
constructor(viewsPath: string = 'views') {
super();
this.viewsPath = viewsPath;
}
public async start(app: Express): Promise<void> {
2020-07-08 11:09:27 +02:00
let coreVersion = 'unknown';
try {
coreVersion = require('../../package.json').version;
} catch (e) {
try {
coreVersion = require('../package.json').version;
} catch (e) {
}
}
2020-07-12 11:46:21 +02:00
this.env = nunjucks.configure([
this.viewsPath,
'views',
'node_modules/wms-core/views'
], {
2020-04-23 11:18:23 +02:00
autoescape: true,
express: app,
noCache: !config.get('view.cache'),
throwOnUndefined: true,
})
2020-07-15 11:42:49 +02:00
.addGlobal('route', (route: string, params?: { [p: string]: string } | [], query?: ParsedUrlQueryInput, absolute?: boolean) => {
const path = Controller.route(route, params, query, absolute);
2020-04-23 11:18:23 +02:00
if (path === null) throw new ServerError(`Route ${route} not found.`);
return path;
})
.addGlobal('app_version', this.app!.getVersion())
2020-07-08 11:09:27 +02:00
.addGlobal('core_version', coreVersion)
.addGlobal('querystring', querystring)
.addFilter('dump', (val) => {
return util.inspect(val);
})
2020-04-23 11:18:23 +02:00
.addFilter('hex', (v: number) => {
return v.toString(16);
});
app.set('view engine', 'njk');
}
2020-04-23 11:18:23 +02:00
public async init(router: Router): Promise<void> {
2020-04-23 11:18:23 +02:00
router.use((req, res, next) => {
req.env = this.env!;
2020-04-23 11:18:23 +02:00
res.locals.url = req.url;
2020-07-15 11:42:49 +02:00
res.locals.params = req.params;
res.locals.query = req.query;
res.locals.body = req.body;
2020-06-27 17:11:31 +02:00
res.locals.app = config.get('app');
// Redirect back
res.redirectBack = (defaultUrl?: string) => {
res.redirect(NunjucksComponent.getPreviousURL(req, defaultUrl));
};
res.locals.getPreviousURL = (defaultURL?: string) => {
return NunjucksComponent.getPreviousURL(req, defaultURL);
};
2020-04-23 11:18:23 +02:00
next();
});
}
}