@ark7/router
Version:
Ark7 Router layer framework.
1 lines • 6.38 kB
Source Map (JSON)
{"version":3,"sources":["../src/declarations.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAG1B,OAAO,KAAK,MAAM,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,oBAAY,MAAM;IAChB,GAAG,QAAQ;IACX,IAAI,SAAS;IACb,GAAG,QAAQ;IACX,MAAM,WAAW;CAClB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,SACxB,GAAG,QAAQ,GAAG,mBAIlC;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,SAAS;IACjB,sDAAsD;IACtD,OAAO,CAAC,WAAW;IACnB,iDAAiD;IACjD,OAAO,CAAC,YAAY;IACpB,0BAA0B;IAC1B,OAAO,CAAC,aAAa;gBANb,SAAS,EAAE,MAAM;IACzB,sDAAsD;IAC9C,WAAW,GAAE,MAAM,CAAC,WAAW,EAAO;IAC9C,iDAAiD;IACzC,YAAY,GAAE,sBAAsB,EAAO;IACnD,0BAA0B;IAClB,aAAa,GAAE,MAAM,CAAC,cAAmB;IAGnD,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,oBAAoB;IAOlD,SAAS,CAAC,UAAU,EAAE,YAAY,GAAG,MAAM;IAyD3C,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,cAAc,GAAG,IAAI;IAKnD,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAK9B,sBAAsB,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,GAAG,IAAI;IAK/D,KAAK,IAAI,oBAAoB;IAS7B,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB;IAIzD,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,sBAAsB;CAc3E;AAED,oBAAY,0BAA0B;IACpC,OAAO,YAAY;IACnB,cAAc,mBAAmB;CAClC;AAED,qBAAa,sBAAsB;IAQd,IAAI,EAAE,MAAM;IAP/B,IAAI,CAAC,EAAE,0BAA0B,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAM;IAEvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,YAAY,CAAC;gBAEP,IAAI,EAAE,MAAM;IAE/B,IAAI,kBAAkB,IAAI,MAAM,CAAC,WAAW,CAE3C;IAED,sBAAsB,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,GAAG,IAAI;IAK/D,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,GAAG,IAAI;CAI7D;AAED,eAAO,MAAM,YAAY,yBAAyB,CAAC","file":"declarations.d.ts","sourcesContent":["import 'reflect-metadata';\n\nimport * as _ from 'underscore';\nimport * as Router from 'koa-router';\n\nimport { A7Controller } from './controller';\nimport { compose } from './utils';\n\nexport enum Method {\n GET = 'get',\n POST = 'post',\n PUT = 'put',\n DELETE = 'delete',\n}\n\nexport function injectHandler(handler: string) {\n return async (ctx: any, next: any) => {\n ctx.handler = handler;\n await next();\n };\n}\n\n/**\n * Metadata injected to the A7Controller class.\n */\nexport class A7ControllerMetadata {\n constructor(\n private className: string,\n /** Global middlewares applied to all the handlers. */\n private middlewares: Router.IMiddleware[] = [],\n /** Subsidiaries under the current controller. */\n private subsidiaries: A7ControllerSubsidiary[] = [],\n /** Koa router options. */\n private routerOptions: Router.IRouterOptions = {},\n ) {}\n\n static getMetadata(cls: any): A7ControllerMetadata {\n return (\n Reflect.getMetadata(METADATA_KEY, cls) ??\n new A7ControllerMetadata(cls.name)\n );\n }\n\n koaRouter(controller: A7Controller): Router {\n const koaRouter = new Router(this.routerOptions);\n\n if (!_.isEmpty(this.middlewares)) {\n koaRouter.use(compose(this.middlewares));\n }\n\n for (const subsidiary of this.subsidiaries) {\n /**\n * ES2022 overwrite properties on the prototypes, so reset the value here.\n */\n const name = subsidiary.name;\n const prototype = Object.getPrototypeOf(controller);\n\n if (\n Object.getOwnPropertyNames(controller).includes(name) &&\n Object.getOwnPropertyNames(prototype).includes(name)\n ) {\n const value = (controller as any)[name];\n delete (controller as any)[name];\n (controller as any)[name] = value;\n }\n\n switch (subsidiary.type) {\n case A7ControllerSubsidiaryType.HANDLER:\n if (subsidiary.path != null) {\n (koaRouter as any)[subsidiary.method](\n subsidiary.name,\n subsidiary.path,\n compose([\n injectHandler(`${this.className}.${subsidiary.name}`),\n subsidiary.composedMiddleware,\n ]).bind(controller),\n );\n }\n break;\n\n case A7ControllerSubsidiaryType.SUB_CONTROLLER:\n const router = new Router({\n prefix: subsidiary.path,\n });\n\n if (!_.isEmpty(subsidiary.middlewares)) {\n router.use(subsidiary.composedMiddleware.bind(controller));\n }\n\n const subController = new subsidiary.cls();\n router.use(...subController.$koaRouterUseArgs);\n\n koaRouter.use(router.routes(), router.allowedMethods());\n break;\n }\n }\n\n return koaRouter;\n }\n\n extendOptions(options: Router.IRouterOptions): this {\n _.extend(this.routerOptions, options);\n return this;\n }\n\n defineMetadata(cls: any): this {\n Reflect.defineMetadata(METADATA_KEY, this, cls);\n return this;\n }\n\n pushMiddlewaresInFront(middlewares: Router.IMiddleware[]): this {\n this.middlewares = _.union(middlewares, this.middlewares);\n return this;\n }\n\n clone(): A7ControllerMetadata {\n return new A7ControllerMetadata(\n this.className,\n _.clone(this.middlewares),\n _.clone(this.subsidiaries),\n _.clone(this.routerOptions),\n );\n }\n\n getSubsidiaryByName(name: string): A7ControllerSubsidiary {\n return _.find(this.subsidiaries, (s) => s.name === name);\n }\n\n getOrCreateSubsidiary(name: string, path?: string): A7ControllerSubsidiary {\n let subsidiary = this.getSubsidiaryByName(name);\n\n if (subsidiary == null) {\n subsidiary = new A7ControllerSubsidiary(name);\n this.subsidiaries.push(subsidiary);\n }\n\n if (path != null) {\n subsidiary.path = path;\n }\n\n return subsidiary;\n }\n}\n\nexport enum A7ControllerSubsidiaryType {\n HANDLER = 'HANDLER',\n SUB_CONTROLLER = 'SUB_CONTROLLER',\n}\n\nexport class A7ControllerSubsidiary {\n type?: A7ControllerSubsidiaryType;\n path?: string;\n middlewares: Router.IMiddleware[] = [];\n\n method?: Method;\n cls?: typeof A7Controller;\n\n constructor(public name: string) {}\n\n get composedMiddleware(): Router.IMiddleware {\n return compose(this.middlewares);\n }\n\n pushMiddlewaresInFront(middlewares: Router.IMiddleware[]): this {\n this.middlewares = _.union(middlewares, this.middlewares);\n return this;\n }\n\n pushMiddlewaresBack(middlewares: Router.IMiddleware[]): this {\n this.middlewares = _.union(this.middlewares, middlewares);\n return this;\n }\n}\n\nexport const METADATA_KEY = 'ark7:router:metadata';\n"],"sourceRoot":"/Users/yz/workspace/router/src"}