swaf/dist/Controller.js

104 lines
14 KiB
JavaScript

import config from "config";
import Logger from "./Logger";
export default class Controller {
static route(route, params = [], absolute = false) {
let path = this.routes[route];
if (path === undefined)
throw new Error(`Unknown route for name ${route}.`);
if (typeof params === 'string' || typeof params === 'number') {
path = path.replace(/:[a-zA-Z_-]+\??/, '' + params);
}
else if (Array.isArray(params)) {
let i = 0;
for (const match of path.matchAll(/:[a-zA-Z_-]+\??/)) {
if (match.length > 0) {
path = path.replace(match[0], typeof params[i] !== 'undefined' ? params[i] : '');
}
i++;
}
path = path.replace(/\/+/, '/');
}
else {
for (const key in params) {
if (params.hasOwnProperty(key)) {
path = path.replace(new RegExp(`:${key}\\??`), params[key]);
}
}
}
return `${absolute ? config.get('public_url') : ''}${path}`;
}
getGlobalHandlers() {
return [];
}
hasGlobalHandlers() {
return this.getGlobalHandlers().length > 0;
}
setupGlobalHandlers(router) {
for (const globalHandler of this.getGlobalHandlers()) {
router.use(this.wrap(globalHandler));
}
}
getRoutesPrefix() {
return '/';
}
setupRoutes(router) {
this.router = router;
this.routes();
}
use(handler) {
var _a;
(_a = this.router) === null || _a === void 0 ? void 0 : _a.use(this.wrap(handler));
}
get(path, handler, routeName, ...middlewares) {
var _a, _b;
this.registerRoutes(path, handler, routeName);
for (const middleware of middlewares) {
(_a = this.router) === null || _a === void 0 ? void 0 : _a.get(path, this.wrap(middleware));
}
(_b = this.router) === null || _b === void 0 ? void 0 : _b.get(path, this.wrap(handler));
}
post(path, handler, routeName, ...middlewares) {
var _a, _b;
this.registerRoutes(path, handler, routeName);
for (const middleware of middlewares) {
(_a = this.router) === null || _a === void 0 ? void 0 : _a.post(path, this.wrap(middleware));
}
(_b = this.router) === null || _b === void 0 ? void 0 : _b.post(path, this.wrap(handler));
}
wrap(handler) {
return (req, res, next) => {
const promise = handler.call(this, req, res, next);
if (promise instanceof Promise) {
promise.catch(err => next(err));
}
};
}
registerRoutes(path, handler, routeName) {
if (typeof routeName !== 'string') {
routeName = handler.name
.replace(/(?:^|\.?)([A-Z])/g, (x, y) => '_' + y.toLowerCase())
.replace(/(^_|get_|post_)/g, '');
}
if (routeName.length === 0)
return;
let routePath = null;
if (path instanceof Array && path.length > 0) {
path = path[0];
}
if (typeof path === 'string') {
const prefix = this.getRoutesPrefix();
routePath = (prefix !== '/' ? prefix : '') + path;
}
if (!Controller.routes[routeName]) {
if (typeof routePath === 'string') {
Logger.info(`Route ${routeName} has path ${routePath}`);
Controller.routes[routeName] = routePath;
}
else {
Logger.warn(`Cannot assign path to route ${routeName}.`);
}
}
}
}
Controller.routes = {};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIuLyIsInNvdXJjZXMiOlsiQ29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxNQUFNLE1BQU0sVUFBVSxDQUFDO0FBRTlCLE1BQU0sQ0FBQyxPQUFPLE9BQWdCLFVBQVU7SUFHN0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFhLEVBQUUsU0FBc0IsRUFBRSxFQUFFLFdBQW9CLEtBQUs7UUFDbEYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixJQUFJLElBQUksS0FBSyxTQUFTO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUU1RSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDMUQsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDO1NBQ3ZEO2FBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNWLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO2dCQUNsRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNsQixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNwRjtnQkFDRCxDQUFDLEVBQUUs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QUN4RCxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFNBQVMsQ0FBQzthQUM1QztpQkFBTTtnQkFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixTQUFTLEdBQUcsQ0FBQyxDQUFDO2FBQzVEO1NBQ0o7SUFDTCxDQUFDOztBQTlHdUIsaUJBQU0sR0FBNEIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtSZXF1ZXN0SGFuZGxlciwgUm91dGVyfSBmcm9tIFwiZXhwcmVzc1wiO1xuaW1wb3J0IHtQYXRoUGFyYW1zfSBmcm9tIFwiZXhwcmVzcy1zZXJ2ZS1zdGF0aWMtY29yZVwiO1xuaW1wb3J0IGNvbmZpZyBmcm9tIFwiY29uZmlnXCI7XG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuL0xvZ2dlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBhYnN0cmFjdCBjbGFzcyBDb250cm9sbGVyIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSByb3V0ZXM6IHsgW3A6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5cbiAgICBwdWJsaWMgc3RhdGljIHJvdXRlKHJvdXRlOiBzdHJpbmcsIHBhcmFtczogUm91dGVQYXJhbXMgPSBbXSwgYWJzb2x1dGU6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgICAgIGxldCBwYXRoID0gdGhpcy5yb3V0ZXNbcm91dGVdO1xuICAgICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcm91dGUgZm9yIG5hbWUgJHtyb3V0ZX0uYCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwYXJhbXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC86W2EtekEtWl8tXStcXD8/LywgJycgKyBwYXJhbXMpO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zKSkge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBwYXRoLm1hdGNoQWxsKC86W2EtekEtWl8tXStcXD8/LykpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKG1hdGNoWzBdLCB0eXBlb2YgcGFyYW1zW2ldICE9PSAndW5kZWZpbmVkJyA/IHBhcmFtc1tpXSA6ICcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKy8sICcvJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBwYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZShuZXcgUmVnRXhwKGA6JHtrZXl9XFxcXD8/YCksIHBhcmFtc1trZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYCR7YWJzb2x1dGUgPyBjb25maWcuZ2V0PHN0cmluZz4oJ3B1YmxpY191cmwnKSA6ICcnfSR7cGF0aH1gO1xuICAgIH1cblxuICAgIHByaXZhdGUgcm91dGVyPzogUm91dGVyO1xuXG4gICAgcHVibGljIGdldEdsb2JhbEhhbmRsZXJzKCk6IFJlcXVlc3RIYW5kbGVyW10ge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcHVibGljIGhhc0dsb2JhbEhhbmRsZXJzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRHbG9iYWxIYW5kbGVycygpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgcHVibGljIHNldHVwR2xvYmFsSGFuZGxlcnMocm91dGVyOiBSb3V0ZXIpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBnbG9iYWxIYW5kbGVyIG9mIHRoaXMuZ2V0R2xvYmFsSGFuZGxlcnMoKSkge1xuICAgICAgICAgICAgcm91dGVyLnVzZSh0aGlzLndyYXAoZ2xvYmFsSGFuZGxlcikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJvdXRlc1ByZWZpeCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJy8nO1xuICAgIH1cblxuICAgIHB1YmxpYyBhYnN0cmFjdCByb3V0ZXMoKTogdm9pZDtcblxuICAgIHB1YmxpYyBzZXR1cFJvdXRlcyhyb3V0ZXI6IFJvdXRlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnJvdXRlciA9IHJvdXRlcjtcbiAgICAgICAgdGhpcy5yb3V0ZXMoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdXNlKGhhbmRsZXI6IFJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgIHRoaXMucm91dGVyPy51c2UodGhpcy53cmFwKGhhbmRsZXIpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0KHBhdGg6IFBhdGhQYXJhbXMsIGhhbmRsZXI6IFJlcXVlc3RIYW5kbGVyLCByb3V0ZU5hbWU/OiBzdHJpbmcsIC4uLm1pZGRsZXdhcmVzOiBSZXF1ZXN0SGFuZGxlcltdKSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJSb3V0ZXMocGF0aCwgaGFuZGxlciwgcm91dGVOYW1lKTtcbiAgICAgICAgZm9yIChjb25zdCBtaWRkbGV3YXJlIG9mIG1pZGRsZXdhcmVzKSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlcj8uZ2V0KHBhdGgsIHRoaXMud3JhcChtaWRkbGV3YXJlKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yb3V0ZXI/LmdldChwYXRoLCB0aGlzLndyYXAoaGFuZGxlcikpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwb3N0KHBhdGg6IFBhdGhQYXJhbXMsIGhhbmRsZXI6IFJlcXVlc3RIYW5kbGVyLCByb3V0ZU5hbWU/OiBzdHJpbmcsIC4uLm1pZGRsZXdhcmVzOiBSZXF1ZXN0SGFuZGxlcltdKSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJSb3V0ZXMocGF0aCwgaGFuZGxlciwgcm91dGVOYW1lKTtcbiAgICAgICAgZm9yIChjb25zdCBtaWRkbGV3YXJlIG9mIG1pZGRsZXdhcmVzKSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlcj8ucG9zdChwYXRoLCB0aGlzLndyYXAobWlkZGxld2FyZSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm91dGVyPy5wb3N0KHBhdGgsIHRoaXMud3JhcChoYW5kbGVyKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cmFwKGhhbmRsZXI6IFJlcXVlc3RIYW5kbGVyKTogUmVxdWVzdEhhbmRsZXIge1xuICAgICAgICByZXR1cm4gKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlci5jYWxsKHRoaXMsIHJlcSwgcmVzLCBuZXh0KTtcbiAgICAgICAgICAgIGlmIChwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHByb21pc2UuY2F0Y2goZXJyID0+IG5leHQoZXJyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlclJvdXRlcyhwYXRoOiBQYXRoUGFyYW1zLCBoYW5kbGVyOiBSZXF1ZXN0SGFuZGxlciwgcm91dGVOYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygcm91dGVOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcm91dGVOYW1lID0gaGFuZGxlci5uYW1lXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLyg/Ol58XFwuPykoW0EtWl0pL2csICh4LCB5KSA9PiAnXycgKyB5LnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheX3xnZXRffHBvc3RfKS9nLCAnJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm91dGVOYW1lLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGxldCByb3V0ZVBhdGggPSBudWxsO1xuICAgICAgICBpZiAocGF0aCBpbnN0YW5jZW9mIEFycmF5ICYmIHBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcGF0aCA9IHBhdGhbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gdGhpcy5nZXRSb3V0ZXNQcmVmaXgoKTtcbiAgICAgICAgICAgIHJvdXRlUGF0aCA9IChwcmVmaXggIT09ICcvJyA/IHByZWZpeCA6ICcnKSArIHBhdGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIUNvbnRyb2xsZXIucm91dGVzW3JvdXRlTmFtZV0pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygcm91dGVQYXRoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIExvZ2dlci5pbmZvKGBSb3V0ZSAke3JvdXRlTmFtZX0gaGFzIHBhdGggJHtyb3V0ZVBhdGh9YCk7XG4gICAgICAgICAgICAgICAgQ29udHJvbGxlci5yb3V0ZXNbcm91dGVOYW1lXSA9IHJvdXRlUGF0aDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgTG9nZ2VyLndhcm4oYENhbm5vdCBhc3NpZ24gcGF0aCB0byByb3V0ZSAke3JvdXRlTmFtZX0uYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIFJvdXRlUGFyYW1zID0geyBbcDogc3RyaW5nXTogc3RyaW5nIH0gfCBzdHJpbmdbXSB8IHN0cmluZyB8IG51bWJlcjsiXX0=