typenexus
Version:
TypeNexus is a good tool for API encapsulation and management. It provides a clean and lightweight way to package TypeORM functionality, helping you build applications faster while reducing template code redundancy and type conversion work.
128 lines (127 loc) • 4.96 kB
JavaScript
import { ControllerMetadata } from '../metadata/ControllerMetadata.js';
import { MiddlewareMetadata } from '../metadata/MiddlewareMetadata.js';
import { getMetadataArgsStorage } from '../metadata/MetadataArgsStorage.js';
import { ActionMetadata } from '../metadata/ActionMetadata.js';
import { ResponseHandlerMetadata } from '../metadata/ResponseHandleMetadata.js';
import { ParamMetadata } from '../metadata/ParamMetadata.js';
import { ParamConstructorMetadata } from '../metadata/ParamConstructorMetadata.js';
import { UseMetadata } from '../metadata/UseMetadata.js';
/**
* Builds metadata from the given metadata arguments.
*/
export class MetadataBuilder {
options;
constructor(options) {
this.options = options;
}
/**
* 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);
}
/**
* Creates middleware metadatas.
*/
createMiddlewares(classes) {
const middlewares = !classes
? getMetadataArgsStorage().middlewares
: getMetadataArgsStorage().filterMiddlewareMetadatasForClasses(classes);
return middlewares.map((middlewareArgs) => new MiddlewareMetadata(middlewareArgs));
}
/**
* Creates controller metadatas.
*/
createControllers(classes) {
const controllers = !classes
? getMetadataArgsStorage().controllers
: getMetadataArgsStorage().filterControllerMetadataForClasses(classes);
return controllers.map((controllerArgs) => {
const controller = new ControllerMetadata(controllerArgs);
controller.build(this.createControllerResponseHandlers(controller));
controller.actions = this.createActions(controller);
controller.uses = this.createControllerUses(controller);
return controller;
});
}
/**
* Creates action metadata.
*/
createActions(controller) {
const actionsWithTarget = [];
for (let target = controller.target; target; target = Object.getPrototypeOf(target)) {
const actions = getMetadataArgsStorage().filterActionsWithTarget(target);
const methods = actionsWithTarget.map((a) => a.method);
actions
.filter(({ method }) => !methods.includes(method))
.forEach((actionArgs) => {
const action = new ActionMetadata(controller, { ...actionArgs, target: controller.target }, this.options);
action.params = this.createParams(action);
action.paramsConstructor = this.createParamsConstructor(action);
action.uses = this.createActionUses(action);
action.build(this.createActionResponseHandlers(action));
actionsWithTarget.push(action);
});
}
return actionsWithTarget;
}
/**
* Creates constructor param metadatas.
*/
createParamsConstructor(action) {
return getMetadataArgsStorage()
.filterParamsConstructorWithTargetAndMethod('constructor')
.map((paramArgs) => new ParamConstructorMetadata(action, paramArgs));
}
/**
* Creates param metadatas.
*/
createParams(action) {
const dta = getMetadataArgsStorage()
.filterParamsWithTargetAndMethod(action.target, action.method)
.map((paramArgs) => {
return new ParamMetadata(action, paramArgs);
});
return dta;
}
/**
* Creates response handler metadatas for action.
*/
createActionResponseHandlers(action) {
return getMetadataArgsStorage()
.filterResponseHandlersWithTargetAndMethod(action.target, action.method)
.map((handlerArgs) => {
return new ResponseHandlerMetadata(handlerArgs);
});
}
/**
* Creates use metadatas for actions.
*/
createActionUses(action) {
return getMetadataArgsStorage()
.filterUsesWithTargetAndMethod(action.target, action.method)
.map((useArgs) => new UseMetadata(useArgs));
}
/**
* Creates response handler metadatas for controller.
*/
createControllerResponseHandlers(controller) {
return getMetadataArgsStorage()
.filterResponseHandlersWithTarget(controller.target)
.map((handlerArgs) => new ResponseHandlerMetadata(handlerArgs));
}
/**
* Creates use metadatas for controllers.
*/
createControllerUses(controller) {
return getMetadataArgsStorage()
.filterUsesWithTargetAndMethod(controller.target, undefined)
.map((useArgs) => new UseMetadata(useArgs));
}
}