@nestjs/core
Version:
Nest - modern, fast, powerful node.js web framework (@core)
107 lines (106 loc) • 4.28 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.mapToClass = exports.filterMiddleware = exports.mapToExcludeRoute = void 0;
exports.isMiddlewareClass = isMiddlewareClass;
exports.assignToken = assignToken;
exports.isMiddlewareRouteExcluded = isMiddlewareRouteExcluded;
const common_1 = require("@nestjs/common");
const shared_utils_1 = require("@nestjs/common/utils/shared.utils");
const iterare_1 = require("iterare");
const path_to_regexp_1 = require("path-to-regexp");
const uid_1 = require("uid");
const legacy_route_converter_1 = require("../router/legacy-route-converter");
const utils_1 = require("../router/utils");
const mapToExcludeRoute = (routes) => {
return routes.map(route => {
const originalPath = (0, shared_utils_1.isString)(route) ? route : route.path;
const path = legacy_route_converter_1.LegacyRouteConverter.tryConvert(originalPath);
try {
if ((0, shared_utils_1.isString)(route)) {
return {
path,
requestMethod: common_1.RequestMethod.ALL,
pathRegex: (0, path_to_regexp_1.pathToRegexp)((0, shared_utils_1.addLeadingSlash)(path)).regexp,
};
}
return {
path,
requestMethod: route.method,
pathRegex: (0, path_to_regexp_1.pathToRegexp)((0, shared_utils_1.addLeadingSlash)(path)).regexp,
};
}
catch (e) {
if (e instanceof TypeError) {
legacy_route_converter_1.LegacyRouteConverter.printError(originalPath);
}
throw e;
}
});
};
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) {
const middlewareStr = middleware.toString();
if (middlewareStr.substring(0, 5) === 'class') {
return true;
}
const middlewareArr = middlewareStr.split(' ');
return (middlewareArr[0] === 'function' &&
/[A-Z]/.test(middlewareArr[1]?.[0]) &&
(0, shared_utils_1.isFunction)(middleware.prototype?.use));
}
function assignToken(metatype, token = (0, uid_1.uid)(21)) {
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('?') : -1;
const pathname = queryParamsIndex >= 0
? originalUrl.slice(0, queryParamsIndex)
: originalUrl;
return (0, utils_1.isRouteExcluded)(excludedRoutes, pathname, common_1.RequestMethod[reqMethod]);
}
;