UNPKG

@tsclean/core

Version:

Plugin for API Rest Full development, based on Clean Architecture, IoC and Dependency Injection.

142 lines 15.5 kB
"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=