@tsclean/core
Version:
Plugin for API Rest Full development, based on Clean Architecture, IoC and Dependency Injection.
95 lines • 13 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.mapToClass = exports.filterMiddleware = exports.mapToExcludeRoute = void 0;
exports.isMiddlewareClass = isMiddlewareClass;
exports.assignToken = assignToken;
exports.isMiddlewareRouteExcluded = isMiddlewareRouteExcluded;
const iterare_1 = require("iterare");
const path_to_regexp_1 = __importDefault(require("path-to-regexp"));
const uuid_1 = require("uuid");
const utils_1 = require("../router/utils");
const shared_utils_1 = require("../utils/shared.utils");
const enums_1 = require("../enums");
const mapToExcludeRoute = (routes) => {
return routes.map(route => {
if ((0, shared_utils_1.isString)(route)) {
return {
path: route,
requestMethod: enums_1.RequestMethod.ALL,
pathRegex: (0, path_to_regexp_1.default)((0, shared_utils_1.addLeadingSlash)(route))
};
}
return {
path: route.path,
requestMethod: route.method,
pathRegex: (0, path_to_regexp_1.default)((0, shared_utils_1.addLeadingSlash)(route.path))
};
});
};
exports.mapToExcludeRoute = mapToExcludeRoute;
const filterMiddleware = (middleware, routes, httpAdapter) => {
const excludedRoutes = (0, exports.mapToExcludeRoute)(routes);
return (0, iterare_1.iterate)([])
.concat(middleware)
.filter(shared_utils_1.isFunction)
.map((item) => (0, exports.mapToClass)(item, excludedRoutes, httpAdapter))
.toArray();
};
exports.filterMiddleware = filterMiddleware;
const mapToClass = (middleware, excludedRoutes, httpAdapter) => {
if (isMiddlewareClass(middleware)) {
if (excludedRoutes.length <= 0)
return middleware;
const MiddlewareHost = class extends middleware {
use(...params) {
const [req, _, next] = params;
const isExcluded = isMiddlewareRouteExcluded(req, excludedRoutes, httpAdapter);
if (isExcluded) {
return next();
}
return super.use(...params);
}
};
return assignToken(MiddlewareHost, middleware.name);
}
return assignToken(class {
constructor() {
this.use = (...params) => {
const [req, _, next] = params;
const isExcluded = isMiddlewareRouteExcluded(req, excludedRoutes, httpAdapter);
if (isExcluded) {
return next();
}
return middleware(...params);
};
}
});
};
exports.mapToClass = mapToClass;
function isMiddlewareClass(middleware) {
var _a, _b;
const middlewareStr = middleware.toString();
if (middlewareStr.substring(0, 5) === 'class')
return true;
const middlewareArr = middlewareStr.split(' ');
return (middlewareArr[0] === 'function' &&
/[A-Z]/.test((_a = middlewareArr[1]) === null || _a === void 0 ? void 0 : _a[0]) &&
typeof ((_b = middleware.prototype) === null || _b === void 0 ? void 0 : _b.use) === 'function');
}
function assignToken(metaType, token = (0, uuid_1.v4)()) {
Object.defineProperty(metaType, 'name', { value: token });
return metaType;
}
function isMiddlewareRouteExcluded(req, excludedRoutes, httpAdapter) {
if (excludedRoutes.length <= 0)
return false;
const reqMethod = httpAdapter.getRequestMethod(req);
const originalUrl = httpAdapter.getRequestUrl(req);
const queryParamsIndex = originalUrl && originalUrl.indexOf('?');
const pathname = queryParamsIndex >= 0 ? originalUrl.slice(0, queryParamsIndex) : originalUrl;
return (0, utils_1.isRouteExcluded)(excludedRoutes, pathname, enums_1.RequestMethod[reqMethod]);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlkZGxld2FyZS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUF5RkEsOENBVUM7QUFFRCxrQ0FHQztBQUVELDhEQWNDO0FBeEhELHFDQUFpQztBQUNqQyxvRUFBeUM7QUFDekMsK0JBQWlDO0FBRWpDLDJDQUFpRDtBQVFqRCx3REFBNkU7QUFDN0Usb0NBQXdDO0FBRWpDLE1BQU0saUJBQWlCLEdBQUcsQ0FDL0IsTUFBOEIsRUFDTixFQUFFO0lBQzFCLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN4QixJQUFJLElBQUEsdUJBQVEsRUFBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BCLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsYUFBYSxFQUFFLHFCQUFhLENBQUMsR0FBRztnQkFDaEMsU0FBUyxFQUFFLElBQUEsd0JBQVksRUFBQyxJQUFBLDhCQUFlLEVBQUMsS0FBSyxDQUFDLENBQUM7YUFDaEQsQ0FBQTtRQUNILENBQUM7UUFDRCxPQUFPO1lBQ0wsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1lBQ2hCLGFBQWEsRUFBRSxLQUFLLENBQUMsTUFBTTtZQUMzQixTQUFTLEVBQUUsSUFBQSx3QkFBWSxFQUFDLElBQUEsOEJBQWUsRUFBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckQsQ0FBQTtJQUNILENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFBO0FBakJZLFFBQUEsaUJBQWlCLHFCQWlCN0I7QUFFTSxNQUFNLGdCQUFnQixHQUFHLENBQzlCLFVBQWUsRUFDZixNQUFtQixFQUNuQixXQUF1QixFQUN2QixFQUFFO0lBQ0YsTUFBTSxjQUFjLEdBQUcsSUFBQSx5QkFBaUIsRUFBQyxNQUFNLENBQUMsQ0FBQTtJQUNoRCxPQUFPLElBQUEsaUJBQU8sRUFBQyxFQUFFLENBQUM7U0FDZixNQUFN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QU0sSUFBSSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUE7SUFFNUMsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ25ELE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDbEQsTUFBTSxnQkFBZ0IsR0FBRyxXQUFXLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNoRSxNQUFNLFFBQVEsR0FDWixnQkFBZ0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQTtJQUU5RSxPQUFPLElBQUEsdUJBQWUsRUFBQyxjQUFjLEVBQUUsUUFBUSxFQUFFLHFCQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtBQUM1RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXRlcmF0ZSB9IGZyb20gJ2l0ZXJhcmUnXG5pbXBvcnQgcGF0aFRvUmVnZXhwIGZyb20gJ3BhdGgtdG8tcmVnZXhwJ1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gJ3V1aWQnXG5cbmltcG9ydCB7IGlzUm91dGVFeGNsdWRlZCB9IGZyb20gJy4uL3JvdXRlci91dGlscydcbmltcG9ydCB7XG4gIEV4Y2x1ZGVSb3V0ZU1ldGFkYXRhLFxuICBFeGNsdWRlUm91dGVNZXRhZGF0YUludGVyZmFjZSxcbiAgSHR0cFNlcnZlcixcbiAgUm91dGVJbmZvLFxuICBUeXBlXG59IGZyb20gJy4uL2NvbnRyYWN0cydcbmltcG9ydCB7IGFkZExlYWRpbmdTbGFzaCwgaXNGdW5jdGlvbiwgaXNTdHJpbmcgfSBmcm9tICcuLi91dGlscy9zaGFyZWQudXRpbHMnXG5pbXBvcnQgeyBSZXF1ZXN0TWV0aG9kIH0gZnJvbSAnLi4vZW51bXMnXG5cbmV4cG9ydCBjb25zdCBtYXBUb0V4Y2x1ZGVSb3V0ZSA9IChcbiAgcm91dGVzOiAoc3RyaW5nIHwgUm91dGVJbmZvKVtdXG4pOiBFeGNsdWRlUm91dGVNZXRhZGF0YVtdID0+IHtcbiAgcmV0dXJuIHJvdXRlcy5tYXAocm91dGUgPT4ge1xuICAgIGlmIChpc1N0cmluZyhyb3V0ZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGg6IHJvdXRlLFxuICAgICAgICByZXF1ZXN0TWV0aG9kOiBSZXF1ZXN0TWV0aG9kLkFMTCxcbiAgICAgICAgcGF0aFJlZ2V4OiBwYXRoVG9SZWdleHAoYWRkTGVhZGluZ1NsYXNoKHJvdXRlKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGg6IHJvdXRlLnBhdGgsXG4gICAgICByZXF1ZXN0TWV0aG9kOiByb3V0ZS5tZXRob2QsXG4gICAgICBwYXRoUmVnZXg6IHBhdGhUb1JlZ2V4cChhZGRMZWFkaW5nU2xhc2gocm91dGUucGF0aCkpXG4gICAgfVxuICB9KVxufVxuXG5leHBvcnQgY29uc3QgZmlsdGVyTWlkZGxld2FyZSA9IDxUIGV4dGVuZHMgRnVuY3Rpb24gfCBUeXBlPGFueT4gPSBhbnk+KFxuICBtaWRkbGV3YXJlOiBUW10sXG4gIHJvdXRlczogUm91dGVJbmZvW10sXG4gIGh0dHBBZGFwdGVyOiBIdHRwU2VydmVyXG4pID0+IHtcbiAgY29uc3QgZXhjbHVkZWRSb3V0ZXMgPSBtYXBUb0V4Y2x1ZGVSb3V0ZShyb3V0ZXMpXG4gIHJldHVybiBpdGVyYXRlKFtdKVxuICAgIC5jb25jYXQobWlkZGxld2FyZSlcbiAgICAuZmlsdGVyKGlzRnVuY3Rpb24pXG4gICAgLm1hcCgoaXRlbTogVCkgPT4gbWFwVG9DbGFzcyhpdGVtLCBleGNsdWRlZFJvdXRlcywgaHR0cEFkYXB0ZXIpKVxuICAgIC50b0FycmF5KClcbn1cblxuZXhwb3J0IGNvbnN0IG1hcFRvQ2xhc3MgPSA8VCBleHRlbmRzIEZ1bmN0aW9uIHwgVHlwZTxhbnk+PihcbiAgbWlkZGxld2FyZTogVCxcbiAgZXhjbHVkZWRSb3V0ZXM6IEV4Y2x1ZGVSb3V0ZU1ldGFkYXRhSW50ZXJmYWNlW10sXG4gIGh0dHBBZGFwdGVyOiBIdHRwU2VydmVyXG4pID0+IHtcbiAgaWYgKGlzTWlkZGxld2FyZUNsYXNzKG1pZGRsZXdhcmUpKSB7XG4gICAgaWYgKGV4Y2x1ZGVkUm91dGVzLmxlbmd0aCA8PSAwKSByZXR1cm4gbWlkZGxld2FyZVxuXG4gICAgY29uc3QgTWlkZGxld2FyZUhvc3QgPSBjbGFzcyBleHRlbmRzIChtaWRkbGV3YXJlIGFzIFR5cGU8YW55Pikge1xuICAgICAgdXNlICguLi5wYXJhbXM6IHVua25vd25bXSkge1xuICAgICAgICBjb25zdCBbcmVxLCBfLCBuZXh0XSA9IHBhcmFtcyBhcyBbUmVjb3JkPHN0cmluZywgYW55PiwgYW55LCBGdW5jdGlvbl1cbiAgICAgICAgY29uc3QgaXNFeGNsdWRlZCA9IGlzTWlkZGxld2FyZVJvdXRlRXhjbHVkZWQoXG4gICAgICAgICAgcmVxLFxuICAgICAgICAgIGV4Y2x1ZGVkUm91dGVzLFxuICAgICAgICAgIGh0dHBBZGFwdGVyXG4gICAgICAgIClcbiAgICAgICAgaWYgKGlzRXhjbHVkZWQpIHtcbiAgICAgICAgICByZXR1cm4gbmV4dCgpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLnVzZSguLi5wYXJhbXMpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhc3NpZ25Ub2tlbihNaWRkbGV3YXJlSG9zdCwgbWlkZGxld2FyZS5uYW1lKVxuICB9XG4gIHJldHVybiBhc3NpZ25Ub2tlbihcbiAgICBjbGFzcyB7XG4gICAgICB1c2UgPSAoLi4ucGFyYW1zOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgY29uc3QgW3JlcSwgXywgbmV4dF0gPSBwYXJhbXMgYXMgW1JlY29yZDxzdHJpbmcsIGFueT4sIGFueSwgRnVuY3Rpb25dXG4gICAgICAgIGNvbnN0IGlzRXhjbHVkZWQgPSBpc01pZGRsZXdhcmVSb3V0ZUV4Y2x1ZGVkKFxuICAgICAgICAgIHJlcSxcbiAgICAgICAgICBleGNsdWRlZFJvdXRlcyxcbiAgICAgICAgICBodHRwQWRhcHRlclxuICAgICAgICApXG4gICAgICAgIGlmIChpc0V4Y2x1ZGVkKSB7XG4gICAgICAgICAgcmV0dXJuIG5leHQoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAobWlkZGxld2FyZSBhcyBGdW5jdGlvbikoLi4ucGFyYW1zKVxuICAgICAgfVxuICAgIH1cbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNNaWRkbGV3YXJlQ2xhc3MgKG1pZGRsZXdhcmU6IGFueSk6IG1pZGRsZXdhcmUgaXMgVHlwZTxhbnk+IHtcbiAgY29uc3QgbWlkZGxld2FyZVN0ciA9IG1pZGRsZXdhcmUudG9TdHJpbmcoKVxuICBpZiAobWlkZGxld2FyZVN0ci5zdWJzdHJpbmcoMCwgNSkgPT09ICdjbGFzcycpIHJldHVybiB0cnVlXG5cbiAgY29uc3QgbWlkZGxld2FyZUFyciA9IG1pZGRsZXdhcmVTdHIuc3BsaXQoJyAnKVxuICByZXR1cm4gKFxuICAgIG1pZGRsZXdhcmVBcnJbMF0gPT09ICdmdW5jdGlvbicgJiZcbiAgICAvW0EtWl0vLnRlc3QobWlkZGxld2FyZUFyclsxXT8uWzBdKSAmJlxuICAgIHR5cGVvZiBtaWRkbGV3YXJlLnByb3RvdHlwZT8udXNlID09PSAnZnVuY3Rpb24nXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2lnblRva2VuIChtZXRhVHlwZTogVHlwZTxhbnk+LCB0b2tlbiA9IHV1aWQoKSk6IFR5cGU8YW55PiB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZXRhVHlwZSwgJ25hbWUnLCB7IHZhbHVlOiB0b2tlbiB9KVxuICByZXR1cm4gbWV0YVR5cGVcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWlkZGxld2FyZVJvdXRlRXhjbHVkZWQgKFxuICByZXE6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGV4Y2x1ZGVkUm91dGVzOiBFeGNsdWRlUm91dGVNZXRhZGF0YUludGVyZmFjZVtdLFxuICBodHRwQWRhcHRlcjogSHR0cFNlcnZlclxuKTogYm9vbGVhbiB7XG4gIGlmIChleGNsdWRlZFJvdXRlcy5sZW5ndGggPD0gMCkgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgcmVxTWV0aG9kID0gaHR0cEFkYXB0ZXIuZ2V0UmVxdWVzdE1ldGhvZChyZXEpXG4gIGNvbnN0IG9yaWdpbmFsVXJsID0gaHR0cEFkYXB0ZXIuZ2V0UmVxdWVzdFVybChyZXEpXG4gIGNvbnN0IHF1ZXJ5UGFyYW1zSW5kZXggPSBvcmlnaW5hbFVybCAmJiBvcmlnaW5hbFVybC5pbmRleE9mKCc/JylcbiAgY29uc3QgcGF0aG5hbWUgPVxuICAgIHF1ZXJ5UGFyYW1zSW5kZXggPj0gMCA/IG9yaWdpbmFsVXJsLnNsaWNlKDAsIHF1ZXJ5UGFyYW1zSW5kZXgpIDogb3JpZ2luYWxVcmxcblxuICByZXR1cm4gaXNSb3V0ZUV4Y2x1ZGVkKGV4Y2x1ZGVkUm91dGVzLCBwYXRobmFtZSwgUmVxdWVzdE1ldGhvZFtyZXFNZXRob2RdKVxufVxuIl19