UNPKG

@nestjs/core

Version:

Nest - modern, fast, powerful node.js web framework (@core)

75 lines (74 loc) 2.83 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* eslint-disable @typescript-eslint/no-use-before-define */ const common_1 = require("@nestjs/common"); const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); const pathToRegexp = require("path-to-regexp"); const uuid_1 = require("uuid"); const iterare_1 = require("iterare"); exports.filterMiddleware = (middleware, excludedRoutes, httpAdapter) => { const excluded = excludedRoutes.map(route => (Object.assign(Object.assign({}, route), { regex: pathToRegexp(route.path) }))); return iterare_1.iterate([]) .concat(middleware) .filter(shared_utils_1.isFunction) .map((item) => exports.mapToClass(item, excluded, httpAdapter)) .toArray(); }; exports.mapToClass = (middleware, excludedRoutes, httpAdapter) => { if (isClass(middleware)) { if (excludedRoutes.length <= 0) { return middleware; } const MiddlewareHost = class extends middleware { use(...params) { const [req, _, next] = params; const isExcluded = isRouteExcluded(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 = isRouteExcluded(req, excludedRoutes, httpAdapter); if (isExcluded) { return next(); } return middleware(...params); }; } }); }; function isClass(middleware) { return middleware.toString().substring(0, 5) === 'class'; } exports.isClass = isClass; function assignToken(metatype, token = uuid_1.v4()) { Object.defineProperty(metatype, 'name', { value: token }); return metatype; } exports.assignToken = assignToken; function isRouteExcluded(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; const isExcluded = excludedRoutes.some(({ method, regex }) => { if (common_1.RequestMethod.ALL === method || common_1.RequestMethod[method] === reqMethod) { return regex.exec(pathname); } return false; }); return isExcluded; } exports.isRouteExcluded = isRouteExcluded;