@zenweb/controller
Advanced tools
+19
-9
@@ -5,5 +5,5 @@ /// <reference types="koa__router" /> | ||
| interface MappingItem { | ||
| method: RouterMethod; | ||
| methods: RouterMethod[]; | ||
| path: RouterPath; | ||
| middleware?: Router.Middleware[]; | ||
| middleware: Router.Middleware[]; | ||
| handle: (...args: any[]) => Promise<void> | void; | ||
@@ -33,13 +33,23 @@ params: any[]; | ||
| * 如果方法中存在参数,则自动注入 | ||
| * @param method HTTP 方法 | ||
| * @param path 路径。如不指定则使用方法名 | ||
| * @param middleware 可选中间件 | ||
| * @param arg0.method HTTP 方法,默认 GET | ||
| * @param arg0.path 路径,默认 /{方法名} | ||
| * @param arg0.middleware 中间件 | ||
| */ | ||
| export declare function mapping(method?: RouterMethod, path?: RouterPath, ...middleware: Router.Middleware[]): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => void; | ||
| export declare function mapping({ method, path, middleware, }?: { | ||
| method?: RouterMethod | RouterMethod[]; | ||
| path?: RouterPath; | ||
| middleware?: Router.Middleware | Router.Middleware[]; | ||
| }): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => void; | ||
| interface ControlleOption extends Router.RouterOptions { | ||
| middleware?: Router.Middleware | Router.Middleware[]; | ||
| } | ||
| /** | ||
| * 控制器 | ||
| * @param middleware 控制器中间件 | ||
| * 控制器选项 | ||
| */ | ||
| export declare function controller<C>(...middleware: Router.Middleware[]): (controllerClass: ControllerClass<C>) => void; | ||
| export declare function controller<C>(opt: ControlleOption): (target: ControllerClass<C>) => void; | ||
| /** | ||
| * 取得控制器选项 | ||
| */ | ||
| export declare function getControllerOption(target: any): ControlleOption; | ||
| /** | ||
| * 将控制器中的路由配置添加到指定路由中 | ||
@@ -46,0 +56,0 @@ * @param router 路由实例 |
+32
-23
@@ -12,5 +12,7 @@ "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.addToRouter = exports.controller = exports.mapping = exports.addControllerMapping = exports.getControllerMapping = exports.Controller = void 0; | ||
| exports.addToRouter = exports.getControllerOption = exports.controller = exports.mapping = exports.addControllerMapping = exports.getControllerMapping = exports.Controller = void 0; | ||
| const inject_1 = require("@zenweb/inject"); | ||
| const router_1 = require("@zenweb/router"); | ||
| const MAPPING = Symbol('Controller#mapping'); | ||
| const OPTION = Symbol('Controller#option'); | ||
| class Controller { | ||
@@ -46,13 +48,13 @@ } | ||
| * 如果方法中存在参数,则自动注入 | ||
| * @param method HTTP 方法 | ||
| * @param path 路径。如不指定则使用方法名 | ||
| * @param middleware 可选中间件 | ||
| * @param arg0.method HTTP 方法,默认 GET | ||
| * @param arg0.path 路径,默认 /{方法名} | ||
| * @param arg0.middleware 中间件 | ||
| */ | ||
| function mapping(method = 'GET', path, ...middleware) { | ||
| function mapping({ method, path, middleware, } = {}) { | ||
| return function (target, propertyKey, descriptor) { | ||
| const params = Reflect.getMetadata('design:paramtypes', target, propertyKey) || []; | ||
| addControllerMapping(target, { | ||
| method, | ||
| methods: method ? (Array.isArray(method) ? method : [method]) : ['GET'], | ||
| path: path || `/${propertyKey}`, | ||
| middleware, | ||
| middleware: middleware ? (Array.isArray(middleware) ? middleware : [middleware]) : [], | ||
| handle: descriptor.value, | ||
@@ -65,14 +67,7 @@ params, | ||
| /** | ||
| * 控制器 | ||
| * @param middleware 控制器中间件 | ||
| * 控制器选项 | ||
| */ | ||
| function controller(...middleware) { | ||
| return function (controllerClass) { | ||
| const mappingList = getControllerMapping(controllerClass.prototype); | ||
| if (mappingList) { | ||
| for (const item of mappingList) { | ||
| // 把控制器的中间件推到方法前 | ||
| item.middleware.unshift(...middleware); | ||
| } | ||
| } | ||
| function controller(opt) { | ||
| return function (target) { | ||
| Reflect.defineMetadata(OPTION, opt, target); | ||
| }; | ||
@@ -82,2 +77,9 @@ } | ||
| /** | ||
| * 取得控制器选项 | ||
| */ | ||
| function getControllerOption(target) { | ||
| return Reflect.getMetadata(OPTION, target); | ||
| } | ||
| exports.getControllerOption = getControllerOption; | ||
| /** | ||
| * 将控制器中的路由配置添加到指定路由中 | ||
@@ -90,11 +92,18 @@ * @param router 路由实例 | ||
| if (mappingList) { | ||
| const option = getControllerOption(target); | ||
| const _router = new router_1.Router(option); | ||
| if (option && option.middleware) { | ||
| _router.use(...(Array.isArray(option.middleware) ? option.middleware : [option.middleware])); | ||
| } | ||
| for (const item of mappingList) { | ||
| router[item.method.toLowerCase()](item.path, ...item.middleware, async (ctx) => { | ||
| const controller = await ctx.injector.getInstance(target); | ||
| const args = await Promise.all(item.params.map(i => ctx.injector.getInstance(i))); | ||
| await item.handle.apply(controller, args); | ||
| }); | ||
| // <any>item.path 实际上路由参数支持数组形式,只是 ts 文件没有正确描述 | ||
| _router.register(item.path, item.methods, [...item.middleware, async (ctx) => { | ||
| const controller = await ctx.injector.getInstance(target); | ||
| const args = await Promise.all(item.params.map(i => ctx.injector.getInstance(i))); | ||
| await item.handle.apply(controller, args); | ||
| }]); | ||
| } | ||
| router.use(_router.routes()); | ||
| } | ||
| } | ||
| exports.addToRouter = addToRouter; |
+1
-1
| { | ||
| "name": "@zenweb/controller", | ||
| "version": "3.1.0", | ||
| "version": "3.2.0", | ||
| "description": "Zenweb Controller module", | ||
@@ -5,0 +5,0 @@ "exports": "./dist/index.js", |
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
9348
9.89%208
10.05%