@tsclean/core
Version:
Plugin for API Rest Full development, based on Clean Architecture, IoC and Dependency Injection.
98 lines • 14 kB
JavaScript
;
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