@tsclean/core
Version:
Plugin for API Rest Full development, based on Clean Architecture, IoC and Dependency Injection.
142 lines • 15.5 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ExpressAdapter = void 0;
const cors_1 = __importDefault(require("cors"));
const express_1 = __importDefault(require("express"));
const http = __importStar(require("http"));
const https = __importStar(require("https"));
const bodyParser = __importStar(require("body-parser"));
const core_1 = require("../core");
const helpers_1 = require("../helpers");
const utils_1 = require("../utils");
class ExpressAdapter extends core_1.AbstractHttpAdapter {
constructor(instance) {
super(instance || (0, express_1.default)());
this.routerMethodFactory = new helpers_1.RouterMethodFactory();
}
reply(response, body, statusCode) {
if (statusCode)
response.status(statusCode);
if ((0, utils_1.isNil)(body))
return response.send();
return (0, utils_1.isObject)(body) ? response.json(body) : response.send(String(body));
}
status(response, statusCode) {
return response.status(statusCode);
}
render(response, view, options) {
return response.render(view, options);
}
redirect(response, statusCode, url) {
return response.redirect(statusCode, url);
}
setErrorHandler(handler, prefix) {
return this.use(handler);
}
setNotFoundHandler(handler, prefix) {
return this.use(handler);
}
setHeader(response, name, value) {
return response.set(name, value);
}
listen(port, ...args) {
return this.httpServer.listen(port, ...args);
}
close() {
if (!this.httpServer) {
return undefined;
}
return new Promise(resolve => this.httpServer.close(resolve));
}
set(...args) {
return this.instance.set(...args);
}
enable(...args) {
return this.instance.enable(...args);
}
disable(...args) {
return this.instance.disable(...args);
}
getRequestHostname(request) {
return request.hostname;
}
getRequestMethod(request) {
return request.method;
}
getRequestUrl(request) {
return request.originalUrl;
}
enableCors(options) {
return this.use((0, cors_1.default)(options));
}
createMiddlewareFactory(requestMethod) {
return this.routerMethodFactory
.get(this.instance, requestMethod)
.bind(this.instance);
}
initHttpServer(options) {
const isHttpsEnabled = options && options.httpsOptions;
if (isHttpsEnabled) {
this.httpServer = https.createServer(options.httpsOptions, this.getInstance());
return;
}
this.httpServer = http.createServer(this.getInstance());
}
registerParserMiddleware() {
const parserMiddleware = {
jsonParser: bodyParser.json(),
urlencodedParser: bodyParser.urlencoded({ extended: true }),
};
Object.keys(parserMiddleware)
.filter(parser => !this.isMiddlewareApplied(parser))
.forEach(parserKey => this.use(parserMiddleware[parserKey]));
}
getType() {
return 'express';
}
isMiddlewareApplied(name) {
const app = this.getInstance();
return (!!app._router &&
!!app._router.stack &&
(0, utils_1.isFunction)(app._router.stack.filter) &&
app._router.stack.some((layer) => layer && layer.handle && layer.handle.name === name));
}
}
exports.ExpressAdapter = ExpressAdapter;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwcmVzcy1hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci9leHByZXNzLWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQXdCO0FBQ3hCLHNEQUE4QjtBQUM5QiwyQ0FBNkI7QUFDN0IsNkNBQStCO0FBQy9CLHdEQUEwQztBQUUxQyxrQ0FBNEM7QUFDNUMsd0NBQStDO0FBQy9DLG9DQUFxRDtBQVNyRCxNQUFhLGNBQWUsU0FBUSwwQkFBbUI7SUFHbkQsWUFBWSxRQUFjO1FBQ3RCLEtBQUssQ0FBQyxRQUFRLElBQUksSUFBQSxpQkFBTyxHQUFFLENBQUMsQ0FBQztRQUhoQix3QkFBbUIsR0FBRyxJQUFJLDZCQUFtQixFQUFFLENBQUM7SUFJakUsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFhLEVBQUUsSUFBUyxFQUFFLFVBQW1CO1FBQ3RELElBQUksVUFBVTtZQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUMsSUFBSSxJQUFBLGFBQUssRUFBQyxJQUFJLENBQUM7WUFBRSxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV4QyxPQUFPLElBQUEsZ0JBQVEsRUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRU0sTUFBTSxDQUFDLFFBQWEsRUFBRSxVQUFrQjtRQUMzQyxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxRQUFhLEVBQUUsSUFBWSxFQUFFLE9BQVk7UUFDbkQsT0FBTyxRQUFRLENBQUMsTUFBTSxD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QUFHO1lBQ3JCLFVBQVUsRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQzdCLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDLENBQUM7U0FDNUQsQ0FBQztRQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7YUFDeEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDbkQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVNLE9BQU87UUFDVixPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRU8sbUJBQW1CLENBQUMsSUFBWTtRQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsT0FBTyxDQUNILENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTztZQUNiLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUs7WUFDbkIsSUFBQSxrQkFBVSxFQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNwQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQ2xCLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxJQUFJLENBQ3RFLENBQ0osQ0FBQztJQUNOLENBQUM7Q0FDSjtBQTFIRCx3Q0EwSEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29ycyBmcm9tICdjb3JzJztcbmltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCAqIGFzIGh0dHBzIGZyb20gJ2h0dHBzJztcbmltcG9ydCAqIGFzIGJvZHlQYXJzZXIgZnJvbSAnYm9keS1wYXJzZXInO1xuXG5pbXBvcnQge0Fic3RyYWN0SHR0cEFkYXB0ZXJ9IGZyb20gXCIuLi9jb3JlXCI7XG5pbXBvcnQge1JvdXRlck1ldGhvZEZhY3Rvcnl9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQge2lzRnVuY3Rpb24sIGlzTmlsLCBpc09iamVjdH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmltcG9ydCB7XG4gICAgQ29yc09wdGlvbnMsXG4gICAgQ29yc09wdGlvbnNEZWxlZ2F0ZSxcbiAgICBBcHBsaWNhdGlvbk9wdGlvbnNJbnRlcmZhY2Vcbn0gZnJvbSBcIi4uL2NvbnRyYWN0c1wiO1xuaW1wb3J0IHtSZXF1ZXN0TWV0aG9kfSBmcm9tIFwiLi4vZW51bXNcIjtcblxuZXhwb3J0IGNsYXNzIEV4cHJlc3NBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RIdHRwQWRhcHRlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXJNZXRob2RGYWN0b3J5ID0gbmV3IFJvdXRlck1ldGhvZEZhY3RvcnkoKTtcblxuICAgIGNvbnN0cnVjdG9yKGluc3RhbmNlPzogYW55KSB7XG4gICAgICAgIHN1cGVyKGluc3RhbmNlIHx8IGV4cHJlc3MoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlcGx5KHJlc3BvbnNlOiBhbnksIGJvZHk6IGFueSwgc3RhdHVzQ29kZT86IG51bWJlcikge1xuICAgICAgICBpZiAoc3RhdHVzQ29kZSkgcmVzcG9uc2Uuc3RhdHVzKHN0YXR1c0NvZGUpO1xuICAgICAgICBpZiAoaXNOaWwoYm9keSkpIHJldHVybiByZXNwb25zZS5zZW5kKCk7XG5cbiAgICAgICAgcmV0dXJuIGlzT2JqZWN0KGJvZHkpID8gcmVzcG9uc2UuanNvbihib2R5KSA6IHJlc3BvbnNlLnNlbmQoU3RyaW5nKGJvZHkpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdHVzKHJlc3BvbnNlOiBhbnksIHN0YXR1c0NvZGU6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2Uuc3RhdHVzKHN0YXR1c0NvZGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW5kZXIocmVzcG9uc2U6IGFueSwgdmlldzogc3RyaW5nLCBvcHRpb25zOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlbmRlcih2aWV3LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVkaXJlY3QocmVzcG9uc2U6IGFueSwgc3RhdHVzQ29kZTogbnVtYmVyLCB1cmw6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UucmVkaXJlY3Qoc3RhdHVzQ29kZSwgdXJsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RXJyb3JIYW5kbGVyKGhhbmRsZXI6IEZ1bmN0aW9uLCBwcmVmaXg/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlKGhhbmRsZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXROb3RGb3VuZEhhbmRsZXIoaGFuZGxlcjogRnVuY3Rpb24sIHByZWZpeD86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy51c2UoaGFuZGxlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEhlYWRlcihyZXNwb25zZTogYW55LCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnNldChuYW1lLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3Rlbihwb3J0OiBzdHJpbmcgfCBudW1iZXIsIGNhbGxiYWNrPzogKCkgPT4gdm9pZCk6IGFueTtcbiAgICBwdWJsaWMgbGlzdGVuKHBvcnQ6IHN0cmluZyB8IG51bWJlciwgaG9zdG5hbWU6IHN0cmluZywgY2FsbGJhY2s/OiAoKSA9PiB2b2lkKTogYW55O1xuICAgIHB1YmxpYyBsaXN0ZW4ocG9ydDogYW55LCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwU2VydmVyLmxpc3Rlbihwb3J0LCAuLi5hcmdzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5odHRwU2VydmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHRoaXMuaHR0cFNlcnZlci5jbG9zZShyZXNvbHZlKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZS5zZXQoLi4uYXJncyk7XG4gICAgfVxuXG4gICAgcHVibGljIGVuYWJsZSguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZS5lbmFibGUoLi4uYXJncyk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc2FibGUoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UuZGlzYWJsZSguLi5hcmdzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVxdWVzdEhvc3RuYW1lKHJlcXVlc3Q6IGFueSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiByZXF1ZXN0Lmhvc3RuYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZXF1ZXN0TWV0aG9kKHJlcXVlc3Q6IGFueSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiByZXF1ZXN0Lm1ldGhvZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmVxdWVzdFVybChyZXF1ZXN0OiBhbnkpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gcmVxdWVzdC5vcmlnaW5hbFVybDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZW5hYmxlQ29ycyhvcHRpb25zOiBDb3JzT3B0aW9ucyB8IENvcnNPcHRpb25zRGVsZWdhdGU8YW55Pikge1xuICAgICAgICByZXR1cm4gdGhpcy51c2UoY29ycyhvcHRpb25zKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZU1pZGRsZXdhcmVGYWN0b3J5KHJlcXVlc3RNZXRob2Q6IFJlcXVlc3RNZXRob2QpOiAocGF0aDogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pID0+IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvdXRlck1ldGhvZEZhY3RvcnlcbiAgICAgICAgICAgIC5nZXQodGhpcy5pbnN0YW5jZSwgcmVxdWVzdE1ldGhvZClcbiAgICAgICAgICAgIC5iaW5kKHRoaXMuaW5zdGFuY2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0SHR0cFNlcnZlcihvcHRpb25zOiBBcHBsaWNhdGlvbk9wdGlvbnNJbnRlcmZhY2UpIHtcbiAgICAgICAgY29uc3QgaXNIdHRwc0VuYWJsZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cHNPcHRpb25zO1xuICAgICAgICBpZiAoaXNIdHRwc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaHR0cFNlcnZlciA9IGh0dHBzLmNyZWF0ZVNlcnZlcihcbiAgICAgICAgICAgICAgICBvcHRpb25zLmh0dHBzT3B0aW9ucyxcbiAgICAgICAgICAgICAgICB0aGlzLmdldEluc3RhbmNlKCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaHR0cFNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKHRoaXMuZ2V0SW5zdGFuY2UoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyUGFyc2VyTWlkZGxld2FyZSgpIHtcbiAgICAgICAgY29uc3QgcGFyc2VyTWlkZGxld2FyZSA9IHtcbiAgICAgICAgICAgIGpzb25QYXJzZXI6IGJvZHlQYXJzZXIuanNvbigpLFxuICAgICAgICAgICAgdXJsZW5jb2RlZFBhcnNlcjogYm9keVBhcnNlci51cmxlbmNvZGVkKHtleHRlbmRlZDogdHJ1ZX0pLFxuICAgICAgICB9O1xuICAgICAgICBPYmplY3Qua2V5cyhwYXJzZXJNaWRkbGV3YXJlKVxuICAgICAgICAgICAgLmZpbHRlcihwYXJzZXIgPT4gIXRoaXMuaXNNaWRkbGV3YXJlQXBwbGllZChwYXJzZXIpKVxuICAgICAgICAgICAgLmZvckVhY2gocGFyc2VyS2V5ID0+IHRoaXMudXNlKHBhcnNlck1pZGRsZXdhcmVbcGFyc2VyS2V5XSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAnZXhwcmVzcyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc01pZGRsZXdhcmVBcHBsaWVkKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBhcHAgPSB0aGlzLmdldEluc3RhbmNlKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAhIWFwcC5fcm91dGVyICYmXG4gICAgICAgICAgICAhIWFwcC5fcm91dGVyLnN0YWNrICYmXG4gICAgICAgICAgICBpc0Z1bmN0aW9uKGFwcC5fcm91dGVyLnN0YWNrLmZpbHRlcikgJiZcbiAgICAgICAgICAgIGFwcC5fcm91dGVyLnN0YWNrLnNvbWUoXG4gICAgICAgICAgICAgICAgKGxheWVyOiBhbnkpID0+IGxheWVyICYmIGxheWVyLmhhbmRsZSAmJiBsYXllci5oYW5kbGUubmFtZSA9PT0gbmFtZSxcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=