{"version":3,"sources":["../src/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAG1B,OAAO,KAAK,MAAM,MAAM,YAAY,CAAC;AAUrC;;GAEG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,cAAc,SACtC,GAAG,UAKjB;AAED,wBAAgB,UAAU,CACxB,WAAW,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,GACrD,cAAc,GAAG,iBAAiB,GAAG,eAAe,CAsBtD","file":"decorators.d.ts","sourcesContent":["import 'reflect-metadata';\n\nimport * as _ from 'underscore';\nimport * as Router from 'koa-router';\n\nimport { A7Controller } from './controller';\nimport {\n  A7ControllerMetadata,\n  A7ControllerSubsidiary,\n  A7ControllerSubsidiaryType,\n} from './declarations';\nimport { a7RouterConfig } from './global-config';\n\n/**\n * A decorator to config a router class.\n */\nexport function Config(options: Router.IRouterOptions) {\n  return (cls: any) => {\n    const meta = A7ControllerMetadata.getMetadata(cls);\n    meta.extendOptions(options);\n    meta.defineMetadata(cls);\n  };\n}\n\nexport function Middleware(\n  middlewares: Router.IMiddleware | Router.IMiddleware[],\n): ClassDecorator & PropertyDecorator & MethodDecorator {\n  middlewares = _.chain([middlewares])\n    .flatten()\n    .map(a7RouterConfig.middlewareMapper)\n    .value();\n\n  return (\n    target: any,\n    propertyKey?: string,\n    descriptor?: TypedPropertyDescriptor<any>,\n  ): any => {\n    if (propertyKey == null) {\n      buildConstructorMiddleware(target, middlewares as Router.IMiddleware[]);\n    } else {\n      return buildPropertyMiddleware(\n        target,\n        propertyKey,\n        middlewares as Router.IMiddleware[],\n        descriptor,\n      );\n    }\n  };\n}\n\nfunction buildConstructorMiddleware(\n  cls: any,\n  middlewares: Router.IMiddleware[],\n) {\n  A7ControllerMetadata.getMetadata(cls)\n    .clone()\n    .pushMiddlewaresInFront(middlewares)\n    .defineMetadata(cls);\n}\n\nfunction getDescription(handler: A7ControllerSubsidiary) {\n  return {\n    get: function () {\n      return handler.composedMiddleware;\n    },\n    set: function (fn: Router.IMiddleware | typeof A7Controller) {\n      if (fn.prototype instanceof A7Controller) {\n        handler.cls = fn as typeof A7Controller;\n        handler.type = A7ControllerSubsidiaryType.SUB_CONTROLLER;\n      } else {\n        handler.pushMiddlewaresBack(_.flatten([fn as Router.IMiddleware]));\n        handler.type = A7ControllerSubsidiaryType.HANDLER;\n      }\n    },\n    enumerable: false,\n    configurable: true,\n    _a7: true,\n  };\n}\n\nfunction buildPropertyMiddleware(\n  target: any,\n  propertyKey: string,\n  middlewares: Router.IMiddleware[],\n  descriptor: TypedPropertyDescriptor<Router.IMiddleware>,\n) {\n  const cls = target.constructor;\n  const meta = A7ControllerMetadata.getMetadata(cls).clone();\n\n  const subsidiary = meta.getOrCreateSubsidiary(propertyKey);\n\n  subsidiary.pushMiddlewaresInFront(middlewares);\n\n  if (descriptor != null && !(descriptor as any)._a7) {\n    subsidiary.pushMiddlewaresBack([descriptor.value]);\n  }\n\n  meta.defineMetadata(cls);\n\n  if (!(descriptor as any)?._a7) {\n    return getDescription(subsidiary);\n  }\n}\n"],"sourceRoot":"/Users/yz/workspace/router/src"}