routing-controllers
Version:
Create structured, declarative and beautifully organized class-based controllers with heavy decorators usage for Express / Koa using TypeScript.
171 lines • 7.28 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.MetadataBuilder = void 0;
const ActionMetadata_1 = require("../metadata/ActionMetadata");
const ControllerMetadata_1 = require("../metadata/ControllerMetadata");
const InterceptorMetadata_1 = require("../metadata/InterceptorMetadata");
const MiddlewareMetadata_1 = require("../metadata/MiddlewareMetadata");
const ParamMetadata_1 = require("../metadata/ParamMetadata");
const ResponseHandleMetadata_1 = require("../metadata/ResponseHandleMetadata");
const UseMetadata_1 = require("../metadata/UseMetadata");
const index_1 = require("../index");
/**
* Builds metadata from the given metadata arguments.
*/
class MetadataBuilder {
constructor(options) {
this.options = options;
}
// -------------------------------------------------------------------------
// Public Methods
// -------------------------------------------------------------------------
/**
* Builds controller metadata from a registered controller metadata args.
*/
buildControllerMetadata(classes) {
return this.createControllers(classes);
}
/**
* Builds middleware metadata from a registered middleware metadata args.
*/
buildMiddlewareMetadata(classes) {
return this.createMiddlewares(classes);
}
/**
* Builds interceptor metadata from a registered interceptor metadata args.
*/
buildInterceptorMetadata(classes) {
return this.createInterceptors(classes);
}
// -------------------------------------------------------------------------
// Protected Methods
// -------------------------------------------------------------------------
/**
* Creates middleware metadatas.
*/
createMiddlewares(classes) {
const middlewares = !classes
? (0, index_1.getMetadataArgsStorage)().middlewares
: (0, index_1.getMetadataArgsStorage)().filterMiddlewareMetadatasForClasses(classes);
return middlewares.map(middlewareArgs => new MiddlewareMetadata_1.MiddlewareMetadata(middlewareArgs));
}
/**
* Creates interceptor metadatas.
*/
createInterceptors(classes) {
const interceptors = !classes
? (0, index_1.getMetadataArgsStorage)().interceptors
: (0, index_1.getMetadataArgsStorage)().filterInterceptorMetadatasForClasses(classes);
return interceptors.map(interceptorArgs => new InterceptorMetadata_1.InterceptorMetadata({
...interceptorArgs,
interceptor: interceptorArgs.target,
}));
}
/**
* Creates controller metadatas.
*/
createControllers(classes) {
const controllers = !classes
? (0, index_1.getMetadataArgsStorage)().controllers
: (0, index_1.getMetadataArgsStorage)().filterControllerMetadatasForClasses(classes);
return controllers.map(controllerArgs => {
const controller = new ControllerMetadata_1.ControllerMetadata(controllerArgs);
controller.build(this.createControllerResponseHandlers(controller));
controller.actions = this.createActions(controller);
controller.uses = this.createControllerUses(controller);
controller.interceptors = this.createControllerInterceptorUses(controller);
return controller;
});
}
/**
* Creates action metadatas.
*/
createActions(controller) {
const actionsWithTarget = [];
for (let target = controller.target; target; target = Object.getPrototypeOf(target)) {
const actions = (0, index_1.getMetadataArgsStorage)().filterActionsWithTarget(target);
const methods = actionsWithTarget.map(a => a.method);
actions
.filter(({ method }) => !methods.includes(method))
.forEach(actionArgs => {
const action = new ActionMetadata_1.ActionMetadata(controller, { ...actionArgs, target: controller.target }, this.options);
action.options = { ...controller.options, ...actionArgs.options };
action.params = this.createParams(action);
action.uses = this.createActionUses(action);
action.interceptors = this.createActionInterceptorUses(action);
action.build(this.createActionResponseHandlers(action));
actionsWithTarget.push(action);
});
}
return actionsWithTarget;
}
/**
* Creates param metadatas.
*/
createParams(action) {
return (0, index_1.getMetadataArgsStorage)()
.filterParamsWithTargetAndMethod(action.target, action.method)
.map(paramArgs => new ParamMetadata_1.ParamMetadata(action, this.decorateDefaultParamOptions(paramArgs)));
}
/**
* Creates response handler metadatas for action.
*/
createActionResponseHandlers(action) {
return (0, index_1.getMetadataArgsStorage)()
.filterResponseHandlersWithTargetAndMethod(action.target, action.method)
.map(handlerArgs => new ResponseHandleMetadata_1.ResponseHandlerMetadata(handlerArgs));
}
/**
* Creates response handler metadatas for controller.
*/
createControllerResponseHandlers(controller) {
return (0, index_1.getMetadataArgsStorage)()
.filterResponseHandlersWithTarget(controller.target)
.map(handlerArgs => new ResponseHandleMetadata_1.ResponseHandlerMetadata(handlerArgs));
}
/**
* Creates use metadatas for actions.
*/
createActionUses(action) {
return (0, index_1.getMetadataArgsStorage)()
.filterUsesWithTargetAndMethod(action.target, action.method)
.map(useArgs => new UseMetadata_1.UseMetadata(useArgs));
}
/**
* Creates use interceptors for actions.
*/
createActionInterceptorUses(action) {
return (0, index_1.getMetadataArgsStorage)()
.filterInterceptorUsesWithTargetAndMethod(action.target, action.method)
.map(useArgs => new InterceptorMetadata_1.InterceptorMetadata(useArgs));
}
/**
* Creates use metadatas for controllers.
*/
createControllerUses(controller) {
return (0, index_1.getMetadataArgsStorage)()
.filterUsesWithTargetAndMethod(controller.target, undefined)
.map(useArgs => new UseMetadata_1.UseMetadata(useArgs));
}
/**
* Creates use interceptors for controllers.
*/
createControllerInterceptorUses(controller) {
return (0, index_1.getMetadataArgsStorage)()
.filterInterceptorUsesWithTargetAndMethod(controller.target, undefined)
.map(useArgs => new InterceptorMetadata_1.InterceptorMetadata(useArgs));
}
/**
* Decorate paramArgs with default settings
*/
decorateDefaultParamOptions(paramArgs) {
const options = this.options.defaults && this.options.defaults.paramOptions;
if (!options)
return paramArgs;
if (paramArgs.required === undefined)
paramArgs.required = options.required || false;
return paramArgs;
}
}
exports.MetadataBuilder = MetadataBuilder;
//# sourceMappingURL=MetadataBuilder.js.map
;