{"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"}