UNPKG

@tsclean/core

Version:

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

98 lines 14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RoutesMapper = void 0; const metadata_scanner_1 = require("../app/metadata-scanner"); const shared_utils_1 = require("../utils/shared.utils"); const constants_1 = require("../helpers/constants"); const paths_explorer_1 = require("../router/paths-explorer"); class RoutesMapper { constructor(container, applicationConfig) { this.container = container; this.applicationConfig = applicationConfig; this.pathsExplorer = new paths_explorer_1.PathsExplorer(new metadata_scanner_1.MetadataScanner()); } mapRouteToRouteInfo(controllerOrRoute) { if ((0, shared_utils_1.isString)(controllerOrRoute)) { return this.getRouteInfoFromPath(controllerOrRoute); } const routePathOrPaths = this.getRoutePath(controllerOrRoute); if (this.isRouteInfo(routePathOrPaths, controllerOrRoute)) { return this.getRouteInfoFromObject(controllerOrRoute); } return this.getRouteInfoFromController(controllerOrRoute, routePathOrPaths); } getRouteInfoFromPath(routePath) { const defaultRequestMethod = -1; return [ { path: (0, shared_utils_1.addLeadingSlash)(routePath), method: defaultRequestMethod, }, ]; } getRouteInfoFromObject(routeInfoObject) { const routeInfo = { path: (0, shared_utils_1.addLeadingSlash)(routeInfoObject.path), method: routeInfoObject.method, }; return [routeInfo]; } getRouteInfoFromController(controller, routePath) { const controllerPaths = this.pathsExplorer.scanForPaths(Object.create(controller), controller.prototype); const moduleRef = this.getHostModuleOfController(controller); const modulePath = this.getModulePath(moduleRef === null || moduleRef === void 0 ? void 0 : moduleRef.metaType); const concatPaths = (acc, currentValue) => acc.concat(currentValue); const toRouteInfo = (item, prefix) => { var _a; return (_a = item.path) === null || _a === void 0 ? void 0 : _a.flatMap(p => { let endpointPath = modulePath !== null && modulePath !== void 0 ? modulePath : ''; endpointPath += this.normalizeGlobalPath(prefix) + (0, shared_utils_1.addLeadingSlash)(p); const routeInfo = { path: endpointPath, method: item.requestMethod, }; return routeInfo; }); }; return [] .concat(routePath) .map(routePath => controllerPaths .map(item => toRouteInfo(item, routePath)) .reduce(concatPaths, [])) .reduce(concatPaths, []); } isRouteInfo(path, objectOrClass) { return (0, shared_utils_1.isUndefined)(path); } normalizeGlobalPath(path) { const prefix = (0, shared_utils_1.addLeadingSlash)(path); return prefix === '/' ? '' : prefix; } getRoutePath(route) { return Reflect.getMetadata(constants_1.PATH_METADATA, route); } getHostModuleOfController(metatype) { if (!metatype) { return; } const modulesContainer = this.container.getModules(); // const moduleRefsSet = targetModulesByContainer.get(modulesContainer); // if (!moduleRefsSet) { // return; // } // const modules = Array.from(modulesContainer.values()).filter(moduleRef => // moduleRefsSet.has(moduleRef), // ); //return modules.find(({ routes }) => routes.has(metatype)); } getModulePath(metatype) { if (!metatype) { return; } const modulesContainer = this.container.getModules(); const modulePath = Reflect.getMetadata(constants_1.MODULE_PATH + modulesContainer.applicationId, metatype); return modulePath !== null && modulePath !== void 0 ? modulePath : Reflect.getMetadata(constants_1.MODULE_PATH, metatype); } } exports.RoutesMapper = RoutesMapper; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVzLW1hcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL3JvdXRlcy1tYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsOERBQXlEO0FBRXpELHdEQUE4RTtBQUM5RSxvREFBaUU7QUFFakUsNkRBQXlFO0FBRXpFLE1BQWEsWUFBWTtJQUd2QixZQUNtQixTQUF1QixFQUN2QixpQkFBb0M7UUFEcEMsY0FBUyxHQUFULFNBQVMsQ0FBYztRQUN2QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBRXJELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSw4QkFBYSxDQUFDLElBQUksa0NBQWUsRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVNLG1CQUFtQixDQUN4QixpQkFBaUQ7UUFHakQsSUFBSSxJQUFBLHVCQUFRLEVBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUNELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7WUFDMUQsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsMEJBQTBCLENBQUMsaUJBQWlCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRU8sb0JBQW9CLENBQUMsU0FBaUI7UUFDNUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNoQyxPQUFPO1lBQ0w7Z0JBQ0UsSUFBSSxFQUFFLElBQUEsOEJBQWUsRUFBQyxTQUFTLENBQUM7Z0JBQ2hDLE1BQU0sRUFBRSxvQkFB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SUFDOUQsQ0FBQztJQUVPLGFBQWEsQ0FDbkIsUUFBbUM7UUFFbkMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsT0FBTTtRQUNSLENBQUM7UUFDRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDcEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FDcEMsdUJBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQzVDLFFBQVEsQ0FDVCxDQUFBO1FBQ0QsT0FBTyxVQUFVLGFBQVYsVUFBVSxjQUFWLFVBQVUsR0FBSSxPQUFPLENBQUMsV0FBVyxDQUFDLHVCQUFXLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDakUsQ0FBQztDQUNGO0FBaElELG9DQWdJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnRhaW5lcklvQyB9IGZyb20gJy4uL2NvcmUvaW5qZWN0b3InXG5pbXBvcnQgeyBNb2R1bGUgfSBmcm9tICcuLi9jb3JlL2luamVjdG9yL21vZHVsZSdcbmltcG9ydCB7IE1ldGFkYXRhU2Nhbm5lciB9IGZyb20gJy4uL2FwcC9tZXRhZGF0YS1zY2FubmVyJ1xuaW1wb3J0IHsgUm91dGVJbmZvLCBUeXBlIH0gZnJvbSAnLi4vY29udHJhY3RzJ1xuaW1wb3J0IHsgYWRkTGVhZGluZ1NsYXNoLCBpc1N0cmluZywgaXNVbmRlZmluZWQgfSBmcm9tICcuLi91dGlscy9zaGFyZWQudXRpbHMnXG5pbXBvcnQgeyBNT0RVTEVfUEFUSCwgUEFUSF9NRVRBREFUQSB9IGZyb20gJy4uL2hlbHBlcnMvY29uc3RhbnRzJ1xuaW1wb3J0IHsgQXBwbGljYXRpb25Db25maWcgfSBmcm9tICcuLi9hcHAnXG5pbXBvcnQgeyBQYXRoc0V4cGxvcmVyLCBSb3V0ZURlZmluaXRpb24gfSBmcm9tICcuLi9yb3V0ZXIvcGF0aHMtZXhwbG9yZXInXG5cbmV4cG9ydCBjbGFzcyBSb3V0ZXNNYXBwZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHBhdGhzRXhwbG9yZXI6IFBhdGhzRXhwbG9yZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IENvbnRhaW5lcklvQyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcGxpY2F0aW9uQ29uZmlnOiBBcHBsaWNhdGlvbkNvbmZpZ1xuICApIHtcbiAgICB0aGlzLnBhdGhzRXhwbG9yZXIgPSBuZXcgUGF0aHNFeHBsb3JlcihuZXcgTWV0YWRhdGFTY2FubmVyKCkpO1xuICB9XG5cbiAgcHVibGljIG1hcFJvdXRlVG9Sb3V0ZUluZm8oXG4gICAgY29udHJvbGxlck9yUm91dGU6IFR5cGU8YW55PiB8IFJvdXRlSW5mbyB8IHN0cmluZyxcbiAgKTogUm91dGVJbmZvW10ge1xuICAgXG4gICAgaWYgKGlzU3RyaW5nKGNvbnRyb2xsZXJPclJvdXRlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Um91dGVJbmZvRnJvbVBhdGgoY29udHJvbGxlck9yUm91dGUpO1xuICAgIH1cbiAgICBjb25zdCByb3V0ZVBhdGhPclBhdGhzID0gdGhpcy5nZXRSb3V0ZVBhdGgoY29udHJvbGxlck9yUm91dGUpO1xuICAgIGlmICh0aGlzLmlzUm91dGVJbmZvKHJvdXRlUGF0aE9yUGF0aHMsIGNvbnRyb2xsZXJPclJvdXRlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Um91dGVJbmZvRnJvbU9iamVjdChjb250cm9sbGVyT3JSb3V0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0Um91dGVJbmZvRnJvbUNvbnRyb2xsZXIoY29udHJvbGxlck9yUm91dGUsIHJvdXRlUGF0aE9yUGF0aHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSb3V0ZUluZm9Gcm9tUGF0aChyb3V0ZVBhdGg6IHN0cmluZyk6IFJvdXRlSW5mb1tdIHtcbiAgICBjb25zdCBkZWZhdWx0UmVxdWVzdE1ldGhvZCA9IC0xO1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHBhdGg6IGFkZExlYWRpbmdTbGFzaChyb3V0ZVBhdGgpLFxuICAgICAgICBtZXRob2Q6IGRlZmF1bHRSZXF1ZXN0TWV0aG9kIGFzIGFueSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Um91dGVJbmZvRnJvbU9iamVjdChyb3V0ZUluZm9PYmplY3Q6IFJvdXRlSW5mbyk6IFJvdXRlSW5mb1tdIHtcbiAgICBjb25zdCByb3V0ZUluZm86IFJvdXRlSW5mbyA9IHtcbiAgICAgIHBhdGg6IGFkZExlYWRpbmdTbGFzaChyb3V0ZUluZm9PYmplY3QucGF0aCksXG4gICAgICBtZXRob2Q6IHJvdXRlSW5mb09iamVjdC5tZXRob2QsXG4gICAgfTtcblxuICAgIHJldHVybiBbcm91dGVJbmZvXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Um91dGVJbmZvRnJvbUNvbnRyb2xsZXIoXG4gICAgY29udHJvbGxlcjogVHlwZTxhbnk+LFxuICAgIHJvdXRlUGF0aDogc3RyaW5nLFxuICApOiBSb3V0ZUluZm9bXSB7XG4gICAgY29uc3QgY29udHJvbGxlclBhdGhzID0gdGhpcy5wYXRoc0V4cGxvcmVyLnNjYW5Gb3JQYXRocyhcbiAgICAgIE9iamVjdC5jcmVhdGUoY29udHJvbGxlciksXG4gICAgICBjb250cm9sbGVyLnByb3RvdHlwZSxcbiAgICApO1xuICAgXG4gICAgY29uc3QgbW9kdWxlUmVmID0gdGhpcy5nZXRIb3N0TW9kdWxlT2ZDb250cm9sbGVyKGNvbnRyb2xsZXIpO1xuICAgIGNvbnN0IG1vZHVsZVBhdGggPSB0aGlzLmdldE1vZHVsZVBhdGgobW9kdWxlUmVmPy5tZXRhVHlwZSk7XG5cbiAgICBjb25zdCBjb25jYXRQYXRocyA9IDxUPihhY2M6IFRbXSwgY3VycmVudFZhbHVlOiBUW10pID0+XG4gICAgICBhY2MuY29uY2F0KGN1cnJlbnRWYWx1ZSk7XG5cbiAgICBjb25zdCB0b1JvdXRlSW5mbyA9IChpdGVtOiBSb3V0ZURlZmluaXRpb24sIHByZWZpeDogc3RyaW5nKSA9PlxuICAgICAgaXRlbS5wYXRoPy5mbGF0TWFwKHAgPT4ge1xuICAgICAgICBsZXQgZW5kcG9pbnRQYXRoID0gbW9kdWxlUGF0aCA/PyAnJztcbiAgICAgICAgZW5kcG9pbnRQYXRoICs9IHRoaXMubm9ybWFsaXplR2xvYmFsUGF0aChwcmVmaXgpICsgYWRkTGVhZGluZ1NsYXNoKHApO1xuXG4gICAgICAgIGNvbnN0IHJvdXRlSW5mbzogUm91dGVJbmZvID0ge1xuICAgICAgICAgIHBhdGg6IGVuZHBvaW50UGF0aCxcbiAgICAgICAgICBtZXRob2Q6IGl0ZW0ucmVxdWVzdE1ldGhvZCxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJvdXRlSW5mbztcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIFtdXG4gICAgICAuY29uY2F0KHJvdXRlUGF0aClcbiAgICAgIC5tYXAocm91dGVQYXRoID0+XG4gICAgICAgIGNvbnRyb2xsZXJQYXRoc1xuICAgICAgICAgIC5tYXAoaXRlbSA9PiB0b1JvdXRlSW5mbyhpdGVtLCByb3V0ZVBhdGgpKVxuICAgICAgICAgIC5yZWR1Y2UoY29uY2F0UGF0aHMsIFtdKSxcbiAgICAgIClcbiAgICAgIC5yZWR1Y2UoY29uY2F0UGF0aHMsIFtdKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNSb3V0ZUluZm8oXG4gICAgcGF0aDogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQsXG4gICAgb2JqZWN0T3JDbGFzczogRnVuY3Rpb24gfCBSb3V0ZUluZm9cbiAgKTogb2JqZWN0T3JDbGFzcyBpcyBSb3V0ZUluZm8ge1xuICAgIHJldHVybiBpc1VuZGVmaW5lZChwYXRoKVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVHbG9iYWxQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJlZml4ID0gYWRkTGVhZGluZ1NsYXNoKHBhdGgpXG4gICAgcmV0dXJuIHByZWZpeCA9PT0gJy8nID8gJycgOiBwcmVmaXhcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Um91dGVQYXRoKHJvdXRlOiBUeXBlPGFueT4gfCBSb3V0ZUluZm8pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBSZWZsZWN0LmdldE1ldGFkYXRhKFBBVEhfTUVUQURBVEEsIHJvdXRlKVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRIb3N0TW9kdWxlT2ZDb250cm9sbGVyKFxuICAgIG1ldGF0eXBlOiBUeXBlPHVua25vd24+XG4gICk6IE1vZHVsZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFtZXRhdHlwZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IG1vZHVsZXNDb250YWluZXIgPSB0aGlzLmNvbnRhaW5lci5nZXRNb2R1bGVzKClcbiAgICAvLyBjb25zdCBtb2R1bGVSZWZzU2V0ID0gdGFyZ2V0TW9kdWxlc0J5Q29udGFpbmVyLmdldChtb2R1bGVzQ29udGFpbmVyKTtcbiAgICAvLyBpZiAoIW1vZHVsZVJlZnNTZXQpIHtcbiAgICAvLyAgIHJldHVybjtcbiAgICAvLyB9XG5cbiAgICAvLyBjb25zdCBtb2R1bGVzID0gQXJyYXkuZnJvbShtb2R1bGVzQ29udGFpbmVyLnZhbHVlcygpKS5maWx0ZXIobW9kdWxlUmVmID0+XG4gICAgLy8gICBtb2R1bGVSZWZzU2V0Lmhhcyhtb2R1bGVSZWYpLFxuICAgIC8vICk7XG4gICAgLy9yZXR1cm4gbW9kdWxlcy5maW5kKCh7IHJvdXRlcyB9KSA9PiByb3V0ZXMuaGFzKG1ldGF0eXBlKSk7XG4gIH1cblxuICBwcml2YXRlIGdldE1vZHVsZVBhdGgoXG4gICAgbWV0YXR5cGU6IFR5cGU8dW5rbm93bj4gfCB1bmRlZmluZWRcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIW1ldGF0eXBlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgbW9kdWxlc0NvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLmdldE1vZHVsZXMoKVxuICAgIGNvbnN0IG1vZHVsZVBhdGggPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgTU9EVUxFX1BBVEggKyBtb2R1bGVzQ29udGFpbmVyLmFwcGxpY2F0aW9uSWQsXG4gICAgICBtZXRhdHlwZVxuICAgIClcbiAgICByZXR1cm4gbW9kdWxlUGF0aCA/PyBSZWZsZWN0LmdldE1ldGFkYXRhKE1PRFVMRV9QQVRILCBtZXRhdHlwZSlcbiAgfVxufVxuIl19