@tsed/common 7.0.0-beta.8 → 7.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/coverage.json +6 -0
  2. package/jest.config.js +9 -0
  3. package/lib/cjs/builder/PlatformBuilder.js +86 -68
  4. package/lib/cjs/builder/PlatformBuilder.js.map +1 -1
  5. package/lib/cjs/config/interfaces/PlatformLoggerSettings.js.map +1 -1
  6. package/lib/cjs/config/services/PlatformConfiguration.js +0 -64
  7. package/lib/cjs/config/services/PlatformConfiguration.js.map +1 -1
  8. package/lib/cjs/decorators/params/error.js +1 -1
  9. package/lib/cjs/decorators/params/error.js.map +1 -1
  10. package/lib/cjs/domain/AnyToPromiseWithCtx.js +4 -5
  11. package/lib/cjs/domain/AnyToPromiseWithCtx.js.map +1 -1
  12. package/lib/cjs/domain/PlatformContext.js +46 -38
  13. package/lib/cjs/domain/PlatformContext.js.map +1 -1
  14. package/lib/cjs/domain/PlatformRouteDetails.js +0 -21
  15. package/lib/cjs/domain/PlatformRouteDetails.js.map +1 -1
  16. package/lib/cjs/exports.js +1 -1
  17. package/lib/cjs/exports.js.map +1 -1
  18. package/lib/cjs/index.js +1 -9
  19. package/lib/cjs/index.js.map +1 -1
  20. package/lib/cjs/interfaces/PlatformRouteOptions.js.map +1 -1
  21. package/lib/cjs/interfaces/Route.js.map +1 -1
  22. package/lib/cjs/middlewares/PlatformAcceptMimesMiddleware.js +2 -1
  23. package/lib/cjs/middlewares/PlatformAcceptMimesMiddleware.js.map +1 -1
  24. package/lib/cjs/middlewares/PlatformMulterMiddleware.js +2 -0
  25. package/lib/cjs/middlewares/PlatformMulterMiddleware.js.map +1 -1
  26. package/lib/cjs/services/FakeAdapter.js +6 -12
  27. package/lib/cjs/services/FakeAdapter.js.map +1 -1
  28. package/lib/cjs/services/Platform.js +30 -86
  29. package/lib/cjs/services/Platform.js.map +1 -1
  30. package/lib/cjs/services/PlatformAdapter.js +10 -0
  31. package/lib/cjs/services/PlatformAdapter.js.map +1 -1
  32. package/lib/cjs/services/PlatformApplication.js +23 -9
  33. package/lib/cjs/services/PlatformApplication.js.map +1 -1
  34. package/lib/cjs/services/PlatformHandler.js +112 -171
  35. package/lib/cjs/services/PlatformHandler.js.map +1 -1
  36. package/lib/cjs/services/PlatformMiddlewaresChain.js +5 -19
  37. package/lib/cjs/services/PlatformMiddlewaresChain.js.map +1 -1
  38. package/lib/cjs/services/PlatformRequest.js +16 -12
  39. package/lib/cjs/services/PlatformRequest.js.map +1 -1
  40. package/lib/cjs/services/PlatformResponse.js +19 -22
  41. package/lib/cjs/services/PlatformResponse.js.map +1 -1
  42. package/lib/cjs/services/PlatformTest.js +29 -9
  43. package/lib/cjs/services/PlatformTest.js.map +1 -1
  44. package/lib/cjs/utils/createContext.js +32 -21
  45. package/lib/cjs/utils/createContext.js.map +1 -1
  46. package/lib/cjs/utils/createHttpServer.js +3 -3
  47. package/lib/cjs/utils/createHttpServer.js.map +1 -1
  48. package/lib/cjs/utils/createHttpsServer.js +3 -3
  49. package/lib/cjs/utils/createHttpsServer.js.map +1 -1
  50. package/lib/cjs/utils/createInjector.js +6 -8
  51. package/lib/cjs/utils/createInjector.js.map +1 -1
  52. package/lib/cjs/utils/ensureContext.js +16 -0
  53. package/lib/cjs/utils/ensureContext.js.map +1 -0
  54. package/lib/cjs/utils/getConfiguration.js +6 -12
  55. package/lib/cjs/utils/getConfiguration.js.map +1 -1
  56. package/lib/cjs/utils/printRoutes.js +10 -8
  57. package/lib/cjs/utils/printRoutes.js.map +1 -1
  58. package/lib/cjs/utils/setResponseHeaders.js +8 -14
  59. package/lib/cjs/utils/setResponseHeaders.js.map +1 -1
  60. package/lib/esm/builder/PlatformBuilder.js +63 -68
  61. package/lib/esm/builder/PlatformBuilder.js.map +1 -1
  62. package/lib/esm/config/interfaces/PlatformLoggerSettings.js.map +1 -1
  63. package/lib/esm/config/services/PlatformConfiguration.js +0 -64
  64. package/lib/esm/config/services/PlatformConfiguration.js.map +1 -1
  65. package/lib/esm/decorators/params/error.js +1 -1
  66. package/lib/esm/decorators/params/error.js.map +1 -1
  67. package/lib/esm/domain/AnyToPromiseWithCtx.js +4 -5
  68. package/lib/esm/domain/AnyToPromiseWithCtx.js.map +1 -1
  69. package/lib/esm/domain/PlatformContext.js +46 -38
  70. package/lib/esm/domain/PlatformContext.js.map +1 -1
  71. package/lib/esm/domain/PlatformRouteDetails.js +1 -19
  72. package/lib/esm/domain/PlatformRouteDetails.js.map +1 -1
  73. package/lib/esm/exports.js +1 -1
  74. package/lib/esm/exports.js.map +1 -1
  75. package/lib/esm/index.js +1 -9
  76. package/lib/esm/index.js.map +1 -1
  77. package/lib/esm/interfaces/PlatformRouteOptions.js.map +1 -1
  78. package/lib/esm/interfaces/Route.js.map +1 -1
  79. package/lib/esm/middlewares/PlatformAcceptMimesMiddleware.js +2 -1
  80. package/lib/esm/middlewares/PlatformAcceptMimesMiddleware.js.map +1 -1
  81. package/lib/esm/middlewares/PlatformMulterMiddleware.js +2 -0
  82. package/lib/esm/middlewares/PlatformMulterMiddleware.js.map +1 -1
  83. package/lib/esm/services/FakeAdapter.js +6 -12
  84. package/lib/esm/services/FakeAdapter.js.map +1 -1
  85. package/lib/esm/services/Platform.js +31 -87
  86. package/lib/esm/services/Platform.js.map +1 -1
  87. package/lib/esm/services/PlatformAdapter.js +10 -0
  88. package/lib/esm/services/PlatformAdapter.js.map +1 -1
  89. package/lib/esm/services/PlatformApplication.js +23 -9
  90. package/lib/esm/services/PlatformApplication.js.map +1 -1
  91. package/lib/esm/services/PlatformHandler.js +114 -173
  92. package/lib/esm/services/PlatformHandler.js.map +1 -1
  93. package/lib/esm/services/PlatformMiddlewaresChain.js +5 -19
  94. package/lib/esm/services/PlatformMiddlewaresChain.js.map +1 -1
  95. package/lib/esm/services/PlatformRequest.js +16 -12
  96. package/lib/esm/services/PlatformRequest.js.map +1 -1
  97. package/lib/esm/services/PlatformResponse.js +19 -22
  98. package/lib/esm/services/PlatformResponse.js.map +1 -1
  99. package/lib/esm/services/PlatformTest.js +29 -9
  100. package/lib/esm/services/PlatformTest.js.map +1 -1
  101. package/lib/esm/utils/createContext.js +30 -20
  102. package/lib/esm/utils/createContext.js.map +1 -1
  103. package/lib/esm/utils/createHttpServer.js +3 -3
  104. package/lib/esm/utils/createHttpServer.js.map +1 -1
  105. package/lib/esm/utils/createHttpsServer.js +3 -3
  106. package/lib/esm/utils/createHttpsServer.js.map +1 -1
  107. package/lib/esm/utils/createInjector.js +7 -9
  108. package/lib/esm/utils/createInjector.js.map +1 -1
  109. package/lib/esm/utils/ensureContext.js +12 -0
  110. package/lib/esm/utils/ensureContext.js.map +1 -0
  111. package/lib/esm/utils/getConfiguration.js +8 -14
  112. package/lib/esm/utils/getConfiguration.js.map +1 -1
  113. package/lib/esm/utils/printRoutes.js +10 -8
  114. package/lib/esm/utils/printRoutes.js.map +1 -1
  115. package/lib/esm/utils/setResponseHeaders.js +8 -14
  116. package/lib/esm/utils/setResponseHeaders.js.map +1 -1
  117. package/lib/types/builder/PlatformBuilder.d.ts +17 -16
  118. package/lib/types/config/interfaces/PlatformLoggerSettings.d.ts +2 -43
  119. package/lib/types/config/services/PlatformConfiguration.d.ts +6 -22
  120. package/lib/types/domain/AnyToPromiseWithCtx.d.ts +1 -9
  121. package/lib/types/domain/PlatformContext.d.ts +32 -18
  122. package/lib/types/domain/PlatformRouteDetails.d.ts +4 -19
  123. package/lib/types/exports.d.ts +1 -1
  124. package/lib/types/index.d.ts +1 -9
  125. package/lib/types/interfaces/PlatformRouteOptions.d.ts +0 -1
  126. package/lib/types/interfaces/Route.d.ts +2 -3
  127. package/lib/types/middlewares/PlatformMulterMiddleware.d.ts +1 -1
  128. package/lib/types/services/FakeAdapter.d.ts +7 -6
  129. package/lib/types/services/Platform.d.ts +7 -28
  130. package/lib/types/services/PlatformAdapter.d.ts +22 -11
  131. package/lib/types/services/PlatformApplication.d.ts +14 -6
  132. package/lib/types/services/PlatformHandler.d.ts +21 -59
  133. package/lib/types/services/PlatformMiddlewaresChain.d.ts +1 -2
  134. package/lib/types/services/PlatformRequest.d.ts +8 -10
  135. package/lib/types/services/PlatformResponse.d.ts +11 -15
  136. package/lib/types/services/PlatformTest.d.ts +4 -3
  137. package/lib/types/utils/createContext.d.ts +4 -1
  138. package/lib/types/utils/createHttpsServer.d.ts +1 -0
  139. package/lib/types/utils/createInjector.d.ts +2 -2
  140. package/lib/types/utils/ensureContext.d.ts +2 -0
  141. package/lib/types/utils/listenServer.d.ts +2 -0
  142. package/package.json +27 -25
  143. package/readme.md +2 -1
  144. package/lib/cjs/builder/PlatformControllerBuilder.js +0 -82
  145. package/lib/cjs/builder/PlatformControllerBuilder.js.map +0 -1
  146. package/lib/cjs/config/interfaces/EndpointDirectoriesSettings.js +0 -3
  147. package/lib/cjs/config/interfaces/EndpointDirectoriesSettings.js.map +0 -1
  148. package/lib/cjs/domain/ControllerProvider.js +0 -51
  149. package/lib/cjs/domain/ControllerProvider.js.map +0 -1
  150. package/lib/cjs/domain/HandlerMetadata.js +0 -57
  151. package/lib/cjs/domain/HandlerMetadata.js.map +0 -1
  152. package/lib/cjs/middlewares/__mock__/FakeCtrl.js +0 -12
  153. package/lib/cjs/middlewares/__mock__/FakeCtrl.js.map +0 -1
  154. package/lib/cjs/middlewares/bindEndpointMiddleware.js +0 -13
  155. package/lib/cjs/middlewares/bindEndpointMiddleware.js.map +0 -1
  156. package/lib/cjs/services/PlatformRouter.js +0 -108
  157. package/lib/cjs/services/PlatformRouter.js.map +0 -1
  158. package/lib/cjs/utils/__mock__/Test1.js +0 -8
  159. package/lib/cjs/utils/__mock__/Test1.js.map +0 -1
  160. package/lib/cjs/utils/__mock__/Test2.js +0 -8
  161. package/lib/cjs/utils/__mock__/Test2.js.map +0 -1
  162. package/lib/cjs/utils/createHandlerMetadata.js +0 -49
  163. package/lib/cjs/utils/createHandlerMetadata.js.map +0 -1
  164. package/lib/cjs/utils/importProviders.js +0 -29
  165. package/lib/cjs/utils/importProviders.js.map +0 -1
  166. package/lib/cjs/utils/useCtxHandler.js +0 -15
  167. package/lib/cjs/utils/useCtxHandler.js.map +0 -1
  168. package/lib/esm/builder/PlatformControllerBuilder.js +0 -76
  169. package/lib/esm/builder/PlatformControllerBuilder.js.map +0 -1
  170. package/lib/esm/config/interfaces/EndpointDirectoriesSettings.js +0 -2
  171. package/lib/esm/config/interfaces/EndpointDirectoriesSettings.js.map +0 -1
  172. package/lib/esm/domain/ControllerProvider.js +0 -47
  173. package/lib/esm/domain/ControllerProvider.js.map +0 -1
  174. package/lib/esm/domain/HandlerMetadata.js +0 -53
  175. package/lib/esm/domain/HandlerMetadata.js.map +0 -1
  176. package/lib/esm/middlewares/__mock__/FakeCtrl.js +0 -9
  177. package/lib/esm/middlewares/__mock__/FakeCtrl.js.map +0 -1
  178. package/lib/esm/middlewares/bindEndpointMiddleware.js +0 -9
  179. package/lib/esm/middlewares/bindEndpointMiddleware.js.map +0 -1
  180. package/lib/esm/services/PlatformRouter.js +0 -105
  181. package/lib/esm/services/PlatformRouter.js.map +0 -1
  182. package/lib/esm/utils/__mock__/Test1.js +0 -4
  183. package/lib/esm/utils/__mock__/Test1.js.map +0 -1
  184. package/lib/esm/utils/__mock__/Test2.js +0 -4
  185. package/lib/esm/utils/__mock__/Test2.js.map +0 -1
  186. package/lib/esm/utils/createHandlerMetadata.js +0 -45
  187. package/lib/esm/utils/createHandlerMetadata.js.map +0 -1
  188. package/lib/esm/utils/importProviders.js +0 -25
  189. package/lib/esm/utils/importProviders.js.map +0 -1
  190. package/lib/esm/utils/useCtxHandler.js +0 -11
  191. package/lib/esm/utils/useCtxHandler.js.map +0 -1
  192. package/lib/types/builder/PlatformControllerBuilder.d.ts +0 -18
  193. package/lib/types/config/interfaces/EndpointDirectoriesSettings.d.ts +0 -3
  194. package/lib/types/domain/ControllerProvider.d.ts +0 -24
  195. package/lib/types/domain/HandlerMetadata.d.ts +0 -32
  196. package/lib/types/middlewares/__mock__/FakeCtrl.d.ts +0 -2
  197. package/lib/types/middlewares/bindEndpointMiddleware.d.ts +0 -6
  198. package/lib/types/services/PlatformRouter.d.ts +0 -51
  199. package/lib/types/utils/__mock__/Test1.d.ts +0 -3
  200. package/lib/types/utils/__mock__/Test2.d.ts +0 -3
  201. package/lib/types/utils/createHandlerMetadata.d.ts +0 -8
  202. package/lib/types/utils/importProviders.d.ts +0 -10
  203. package/lib/types/utils/useCtxHandler.d.ts +0 -13
@@ -1 +1 @@
1
- {"version":3,"file":"Platform.js","sourceRoot":"","sources":["../../../src/services/Platform.ts"],"names":[],"mappings":"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","sourcesContent":["import {Type} from \"@tsed/core\";\nimport {Injectable, InjectorService, ProviderScope, ProviderType, TokenProvider} from \"@tsed/di\";\nimport {concatPath, EndpointMetadata, getJsonEntityStore, getOperationsRoutes, JsonEntityStore} from \"@tsed/schema\";\nimport {buildRouter, createRouter, getRouter} from \"../builder/PlatformControllerBuilder\";\nimport {ControllerProvider} from \"../domain/ControllerProvider\";\nimport {PlatformRouteDetails} from \"../domain/PlatformRouteDetails\";\nimport {Route, RouteController} from \"../interfaces/Route\";\nimport {PlatformApplication} from \"./PlatformApplication\";\nimport {PlatformMiddlewaresChain} from \"./PlatformMiddlewaresChain\";\n\n/**\n * `Platform` is used to provide all routes collected by annotation `@Controller`.\n *\n * @platform\n */\n@Injectable({\n scope: ProviderScope.SINGLETON,\n imports: [PlatformMiddlewaresChain]\n})\nexport class Platform {\n private _routes: PlatformRouteDetails[] = [];\n private _controllers: RouteController[] = [];\n\n constructor(readonly injector: InjectorService, readonly platformApplication: PlatformApplication) {\n this.createRouters();\n }\n\n get app() {\n return this.platformApplication;\n }\n\n get routes(): PlatformRouteDetails[] {\n return this._routes;\n }\n\n public addRoutes(routes: Route[]) {\n routes.forEach((routeSettings) => {\n this.addRoute(routeSettings.route, routeSettings.token);\n });\n }\n\n public addRoute(basePath: string, token: TokenProvider) {\n const {injector} = this;\n const provider = injector.getProvider(token) as ControllerProvider;\n\n if (!provider || provider.hasParent()) {\n return;\n }\n\n this._controllers.push(...this.getAllControllers(basePath, token));\n\n const ctrlPath = concatPath(basePath, JsonEntityStore.from(provider.token).path);\n\n this.app.use(ctrlPath, ...[].concat(getRouter(injector, provider).callback()));\n\n this._routes = getOperationsRoutes<EndpointMetadata>(provider.token, {\n withChildren: true,\n basePath\n }).reduce((routes, operationRoute) => {\n if (injector.hasProvider(token)) {\n const provider = injector.getProvider(operationRoute.token) as ControllerProvider;\n const route = new PlatformRouteDetails({\n ...operationRoute,\n provider\n });\n\n routes = routes.concat(route);\n }\n\n return routes;\n }, this._routes);\n\n return this;\n }\n\n /**\n * Get all routes built by TsExpressDecorators and mounted on Express application.\n * @returns {PlatformRouteDetails[]}\n */\n public getRoutes(): PlatformRouteDetails[] {\n return this._routes;\n }\n\n /**\n * Get all controllers mounted on the application.\n * @returns {RouteController[]}\n */\n public getMountedControllers(): RouteController[] {\n return this._controllers;\n }\n\n protected $onInit() {\n this.buildControllers();\n }\n\n /**\n * Create routers from the collected controllers.\n * @private\n */\n private createRouters() {\n const {injector} = this;\n\n injector.getProviders(ProviderType.CONTROLLER).map((provider: ControllerProvider) => {\n createRouter(injector, provider);\n });\n }\n\n /**\n * Get all router controllers from the controller token.\n * @private\n */\n private getAllControllers(basePath: string, token: Type<any> | any): RouteController[] {\n const store: JsonEntityStore = token.isStore ? token : getJsonEntityStore(token);\n const ctrlPath = concatPath(basePath, JsonEntityStore.from(token).path);\n const children = store.get<Type[]>(\"childrenControllers\", []);\n\n return children\n .reduce<RouteController[]>((controllers, token) => {\n const childBasePath = concatPath(basePath, store.path);\n return controllers.concat(this.getAllControllers(childBasePath, token));\n }, [])\n .concat([\n {\n route: ctrlPath,\n provider: this.injector.getProvider(token) as ControllerProvider\n }\n ]);\n }\n\n /**\n * Create controllers from DI\n * @private\n */\n private buildControllers() {\n const {injector} = this;\n\n injector.getProviders(ProviderType.CONTROLLER).map((provider: ControllerProvider) => {\n if (!provider.hasParent()) {\n return buildRouter(injector, provider);\n }\n });\n }\n}\n"]}
1
+ {"version":3,"file":"Platform.js","sourceRoot":"","sources":["../../../src/services/Platform.ts"],"names":[],"mappings":";AAAA,OAAO,EAAqB,UAAU,EAAE,eAAe,EAAE,aAAa,EAAgB,MAAM,UAAU,CAAC;AACvG,OAAO,EAAC,eAAe,EAAC,MAAM,uBAAuB,CAAC;AAEtD,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAElD;;;;GAIG;AAKH,IAAa,QAAQ,GAArB,MAAa,QAAQ;IAIR;IACA;IACA;IALX,YAAY,GAAiC,IAAI,GAAG,EAAE,CAAC;IAEvD,YACW,QAAyB,EACzB,mBAAwC,EACxC,eAAgC;QAFhC,aAAQ,GAAR,QAAQ,CAAiB;QACzB,wBAAmB,GAAnB,mBAAmB,CAAqB;QACxC,oBAAe,GAAf,eAAe,CAAiB;QAEzC,eAAe,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IAEM,SAAS,CAAC,MAAe;QAC9B,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,EAAE;YAC/B,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,QAAQ,CAAC,KAAa,EAAE,KAAoB;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAuB,CAAC;QAExE,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE,EAAE;YACrC,OAAO,IAAI,CAAC;SACb;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEzD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAE5B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,SAAS;QACd,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;QAE9B,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC5D,IAAI,KAAK,CAAC,UAAU,EAAE,EAAE;gBACtB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE;oBAC1C,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACvD,QAAQ,EAAE,KAAK,CAAC,QAAQ;iBACzB,CAAC,CAAC;aACJ;YAED,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACI,qBAAqB;QAC1B,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;CACF,CAAA;AAzDY,QAAQ;IAJpB,UAAU,CAAC;QACV,KAAK,EAAE,aAAa,CAAC,SAAS;QAC9B,OAAO,EAAE,CAAC,eAAe,CAAC;KAC3B,CAAC;qCAKqB,eAAe;QACJ,mBAAmB;QACvB,eAAe;GANhC,QAAQ,CAyDpB;SAzDY,QAAQ","sourcesContent":["import {ControllerProvider, Injectable, InjectorService, ProviderScope, TokenProvider} from \"@tsed/di\";\nimport {PlatformRouters} from \"@tsed/platform-router\";\nimport {Route, RouteController} from \"../interfaces/Route\";\nimport {PlatformApplication} from \"./PlatformApplication\";\nimport {PlatformHandler} from \"./PlatformHandler\";\n\n/**\n * `Platform` is used to provide all routes collected by annotation `@Controller`.\n *\n * @platform\n */\n@Injectable({\n scope: ProviderScope.SINGLETON,\n imports: [PlatformHandler]\n})\nexport class Platform {\n #controllers: Map<string, RouteController> = new Map();\n\n constructor(\n readonly injector: InjectorService,\n readonly platformApplication: PlatformApplication,\n readonly platformRouters: PlatformRouters\n ) {\n platformRouters.prebuild();\n }\n\n get app() {\n return this.platformApplication;\n }\n\n public addRoutes(routes: Route[]) {\n routes.forEach((routeSettings) => {\n this.addRoute(routeSettings.route, routeSettings.token);\n });\n }\n\n public addRoute(route: string, token: TokenProvider) {\n const provider = this.injector.getProvider(token) as ControllerProvider;\n\n if (!provider || provider.hasParent()) {\n return this;\n }\n\n const router = this.platformRouters.from(provider.token);\n\n this.app.use(route, router);\n\n return this;\n }\n\n public getLayers() {\n this.#controllers = new Map();\n\n return this.platformRouters.getLayers(this.app).map((layer) => {\n if (layer.isProvider()) {\n this.#controllers.set(layer.provider.token, {\n route: String(layer.path).split(layer.provider.path)[0],\n provider: layer.provider\n });\n }\n\n return layer;\n });\n }\n\n /**\n * Get all controllers mounted on the application.\n * @returns {RouteController[]}\n */\n public getMountedControllers(): RouteController[] {\n return [...this.#controllers.values()];\n }\n}\n"]}
@@ -1,6 +1,16 @@
1
1
  import { InjectorService, registerProvider } from "@tsed/di";
2
2
  import { FakeAdapter } from "./FakeAdapter.js";
3
3
  export class PlatformAdapter {
4
+ /**
5
+ * Load providers in top priority
6
+ */
7
+ providers;
8
+ /**
9
+ * Called after the injector instantiation
10
+ */
11
+ onInit;
12
+ beforeLoadRoutes;
13
+ afterLoadRoutes;
4
14
  }
5
15
  registerProvider({
6
16
  provide: PlatformAdapter,
@@ -1 +1 @@
1
- {"version":3,"file":"PlatformAdapter.js","sourceRoot":"","sources":["../../../src/services/PlatformAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,eAAe,EAAgB,gBAAgB,EAAC,MAAM,UAAU,CAAC;AAIzE,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAE1C,MAAM,OAAgB,eAAe;CAoCpC;AAMD,gBAAgB,CAAC;IACf,OAAO,EAAE,eAAe;IACxB,IAAI,EAAE,CAAC,eAAe,CAAC;IACvB,QAAQ,EAAE,WAAW;CACtB,CAAC,CAAC","sourcesContent":["import {Type} from \"@tsed/core\";\nimport {InjectorService, ProviderOpts, registerProvider} from \"@tsed/di\";\nimport {PlatformMulter, PlatformMulterSettings} from \"../config/interfaces/PlatformMulterSettings\";\nimport {PlatformStaticsOptions} from \"../config/interfaces/PlatformStaticsSettings\";\nimport {RouterOptions} from \"express\";\nimport {FakeAdapter} from \"./FakeAdapter\";\n\nexport abstract class PlatformAdapter<App = TsED.Application, Router = TsED.Router> {\n /**\n * Load providers in top priority\n */\n providers: ProviderOpts[];\n /**\n * Called after the injector instantiation\n */\n onInit?: () => any;\n beforeLoadRoutes?: () => Promise<any>;\n afterLoadRoutes?: () => Promise<any>;\n useRouter?: () => any;\n useContext?: () => any;\n\n abstract app(): {app: App; callback(): any};\n\n abstract router(routerOptions?: Partial<RouterOptions>): {router: Router; callback(): any};\n /**\n * Return the statics middlewares\n * @param endpoint\n * @param options\n */\n abstract statics(endpoint: string, options: PlatformStaticsOptions): any;\n\n /**\n * Return the multipart middleware\n * @param options\n */\n abstract multipart(options: PlatformMulterSettings): PlatformMulter;\n\n /**\n * Return the body parser for the given\n * @param type\n * @param opts\n */\n abstract bodyParser(type: string, opts?: Record<string, any>): any;\n}\n\nexport interface PlatformBuilderSettings<App = TsED.Application, Router = TsED.Router> extends Partial<TsED.Configuration> {\n adapter?: Type<PlatformAdapter<App, Router>>;\n}\n\nregisterProvider({\n provide: PlatformAdapter,\n deps: [InjectorService],\n useClass: FakeAdapter\n});\n"]}
1
+ {"version":3,"file":"PlatformAdapter.js","sourceRoot":"","sources":["../../../src/services/PlatformAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,eAAe,EAAgB,gBAAgB,EAAC,MAAM,UAAU,CAAC;AAKzE,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAE1C,MAAM,OAAgB,eAAe;IACnC;;OAEG;IACH,SAAS,CAAiB;IAC1B;;OAEG;IACH,MAAM,CAAa;IACnB,gBAAgB,CAAsB;IACtC,eAAe,CAAsB;CAsCtC;AAMD,gBAAgB,CAAC;IACf,OAAO,EAAE,eAAe;IACxB,IAAI,EAAE,CAAC,eAAe,CAAC;IACvB,QAAQ,EAAE,WAAW;CACtB,CAAC,CAAC","sourcesContent":["import {Type} from \"@tsed/core\";\nimport {InjectorService, ProviderOpts, registerProvider} from \"@tsed/di\";\nimport {PlatformHandlerMetadata, PlatformLayer} from \"@tsed/platform-router\";\nimport {IncomingMessage, ServerResponse} from \"http\";\nimport {PlatformMulter, PlatformMulterSettings} from \"../config/interfaces/PlatformMulterSettings\";\nimport {PlatformStaticsOptions} from \"../config/interfaces/PlatformStaticsSettings\";\nimport {FakeAdapter} from \"./FakeAdapter\";\n\nexport abstract class PlatformAdapter<App = TsED.Application> {\n /**\n * Load providers in top priority\n */\n providers: ProviderOpts[];\n /**\n * Called after the injector instantiation\n */\n onInit?: () => any;\n beforeLoadRoutes?: () => Promise<any>;\n afterLoadRoutes?: () => Promise<any>;\n /**\n * create initial context\n */\n abstract useContext: () => any;\n /**\n * Map router layer to the targeted framework\n */\n abstract mapLayers: (layer: PlatformLayer[]) => void;\n /**\n * Map handler to the targeted framework\n */\n abstract mapHandler: (handler: Function, layer: PlatformHandlerMetadata) => Function;\n\n /**\n * Return the app instance\n */\n abstract app(): {app: App; callback(): (req: IncomingMessage, res: ServerResponse) => void};\n\n /**\n * Return the statics middlewares\n * @param endpoint\n * @param options\n */\n abstract statics(endpoint: string, options: PlatformStaticsOptions): any;\n\n /**\n * Return the multipart middleware\n * @param options\n */\n abstract multipart(options: PlatformMulterSettings): PlatformMulter;\n\n /**\n * Return the body parser for the given\n * @param type\n * @param opts\n */\n abstract bodyParser(type: string, opts?: Record<string, any>): any;\n}\n\nexport interface PlatformBuilderSettings<App = TsED.Application> extends Partial<TsED.Configuration> {\n adapter?: Type<PlatformAdapter<App>>;\n}\n\nregisterProvider({\n provide: PlatformAdapter,\n deps: [InjectorService],\n useClass: FakeAdapter\n});\n"]}
@@ -1,7 +1,6 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
- import { Injectable, ProviderScope } from "@tsed/di";
3
- import { PlatformHandler } from "./PlatformHandler.js";
4
- import { PlatformRouter } from "./PlatformRouter.js";
2
+ import { Injectable, InjectorService, ProviderScope } from "@tsed/di";
3
+ import { PlatformRouter } from "@tsed/platform-router";
5
4
  import { PlatformAdapter } from "./PlatformAdapter.js";
6
5
  /**
7
6
  * `PlatformApplication` is used to provide all routes collected by annotation `@Controller`.
@@ -9,21 +8,36 @@ import { PlatformAdapter } from "./PlatformAdapter.js";
9
8
  * @platform
10
9
  */
11
10
  let PlatformApplication = class PlatformApplication extends PlatformRouter {
12
- constructor(platformHandler, adapter) {
13
- super(platformHandler, adapter);
11
+ adapter;
12
+ injector;
13
+ rawApp;
14
+ rawCallback;
15
+ constructor(adapter, injector) {
16
+ super(injector);
17
+ this.adapter = adapter;
18
+ this.injector = injector;
14
19
  const { app, callback } = adapter.app();
15
- this.rawApp = this.raw = app;
16
- this.callback = callback;
20
+ this.rawApp = app;
21
+ this.rawCallback = callback;
17
22
  }
18
23
  getApp() {
19
- return this.raw;
24
+ return this.rawApp;
25
+ }
26
+ multer(options) {
27
+ return this.adapter.multipart(options);
28
+ }
29
+ callback(req, res) {
30
+ if (req && res) {
31
+ return this.callback()(req, res);
32
+ }
33
+ return this.rawCallback();
20
34
  }
21
35
  };
22
36
  PlatformApplication = __decorate([
23
37
  Injectable({
24
38
  scope: ProviderScope.SINGLETON
25
39
  }),
26
- __metadata("design:paramtypes", [PlatformHandler, PlatformAdapter])
40
+ __metadata("design:paramtypes", [PlatformAdapter, InjectorService])
27
41
  ], PlatformApplication);
28
42
  export { PlatformApplication };
29
43
  //# sourceMappingURL=PlatformApplication.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlatformApplication.js","sourceRoot":"","sources":["../../../src/services/PlatformApplication.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,UAAU,EAAE,aAAa,EAAC,MAAM,UAAU,CAAC;AACnD,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AASlD;;;;GAIG;AAIH,IAAa,mBAAmB,GAAhC,MAAa,mBAAkE,SAAQ,cAA2B;IAKhH,YAAY,eAAgC,EAAE,OAAqC;QACjF,KAAK,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QAChC,MAAM,EAAC,GAAG,EAAE,QAAQ,EAAC,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAEtC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;CACF,CAAA;AAhBY,mBAAmB;IAH/B,UAAU,CAAC;QACV,KAAK,EAAE,aAAa,CAAC,SAAS;KAC/B,CAAC;qCAM6B,eAAe,EAAW,eAAe;GAL3D,mBAAmB,CAgB/B;SAhBY,mBAAmB","sourcesContent":["import {Injectable, ProviderScope} from \"@tsed/di\";\nimport {PlatformHandler} from \"./PlatformHandler\";\nimport {PlatformRouter} from \"./PlatformRouter\";\nimport {PlatformAdapter} from \"./PlatformAdapter\";\n\ndeclare global {\n namespace TsED {\n // @ts-ignore\n export interface Application {}\n }\n}\n\n/**\n * `PlatformApplication` is used to provide all routes collected by annotation `@Controller`.\n *\n * @platform\n */\n@Injectable({\n scope: ProviderScope.SINGLETON\n})\nexport class PlatformApplication<App = TsED.Application, Router = TsED.Router> extends PlatformRouter<App, Router> {\n raw: App;\n rawApp: App;\n declare rawRouter: Router;\n\n constructor(platformHandler: PlatformHandler, adapter: PlatformAdapter<App, Router>) {\n super(platformHandler, adapter);\n const {app, callback} = adapter.app();\n\n this.rawApp = this.raw = app;\n this.callback = callback;\n }\n\n getApp(): App {\n return this.raw;\n }\n}\n"]}
1
+ {"version":3,"file":"PlatformApplication.js","sourceRoot":"","sources":["../../../src/services/PlatformApplication.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,UAAU,EAAE,eAAe,EAAE,aAAa,EAAC,MAAM,UAAU,CAAC;AACpE,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAC;AAGrD,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AASlD;;;;GAIG;AAIH,IAAa,mBAAmB,GAAhC,MAAa,mBAA4C,SAAQ,cAAc;IAI1D;IAAsC;IAHzD,MAAM,CAAM;IACZ,WAAW,CAAY;IAEvB,YAAmB,OAA6B,EAAS,QAAyB;QAChF,KAAK,CAAC,QAAQ,CAAC,CAAC;QADC,YAAO,GAAP,OAAO,CAAsB;QAAS,aAAQ,GAAR,QAAQ,CAAiB;QAEhF,MAAM,EAAC,GAAG,EAAE,QAAQ,EAAC,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAEtC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;QAClB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,OAA+B;QACpC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAID,QAAQ,CAAC,GAAqB,EAAE,GAAoB;QAClD,IAAI,GAAG,IAAI,GAAG,EAAE;YACd,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;SAClC;QAED,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;CACF,CAAA;AA7BY,mBAAmB;IAH/B,UAAU,CAAC;QACV,KAAK,EAAE,aAAa,CAAC,SAAS;KAC/B,CAAC;qCAK4B,eAAe,EAAwB,eAAe;GAJvE,mBAAmB,CA6B/B;SA7BY,mBAAmB","sourcesContent":["import {Injectable, InjectorService, ProviderScope} from \"@tsed/di\";\nimport {PlatformRouter} from \"@tsed/platform-router\";\nimport {IncomingMessage, ServerResponse} from \"http\";\nimport {PlatformMulterSettings} from \"../config/interfaces/PlatformMulterSettings\";\nimport {PlatformAdapter} from \"./PlatformAdapter\";\n\ndeclare global {\n namespace TsED {\n // @ts-ignore\n export interface Application {}\n }\n}\n\n/**\n * `PlatformApplication` is used to provide all routes collected by annotation `@Controller`.\n *\n * @platform\n */\n@Injectable({\n scope: ProviderScope.SINGLETON\n})\nexport class PlatformApplication<App = TsED.Application> extends PlatformRouter {\n rawApp: App;\n rawCallback: () => any;\n\n constructor(public adapter: PlatformAdapter<App>, public injector: InjectorService) {\n super(injector);\n const {app, callback} = adapter.app();\n\n this.rawApp = app;\n this.rawCallback = callback;\n }\n\n getApp(): App {\n return this.rawApp;\n }\n\n multer(options: PlatformMulterSettings) {\n return this.adapter.multipart(options);\n }\n\n callback(): (req: IncomingMessage, res: ServerResponse) => any;\n callback(req: IncomingMessage, res: ServerResponse): any;\n callback(req?: IncomingMessage, res?: ServerResponse) {\n if (req && res) {\n return this.callback()(req, res);\n }\n\n return this.rawCallback();\n }\n}\n"]}
@@ -1,232 +1,173 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
- import { AnyToPromiseStatus, isFunction, isStream } from "@tsed/core";
3
- import { Inject, Injectable, InjectorService, ProviderScope, runInContext } from "@tsed/di";
2
+ import { AnyToPromiseResponseTypes, AnyToPromiseStatus, catchAsyncError, isFunction, isStream } from "@tsed/core";
3
+ import { Inject, Injectable, ProviderScope } from "@tsed/di";
4
4
  import { $log } from "@tsed/logger";
5
+ import { PlatformExceptions } from "@tsed/platform-exceptions";
5
6
  import { PlatformParams } from "@tsed/platform-params";
6
7
  import { PlatformResponseFilter } from "@tsed/platform-response-filter";
8
+ import { PlatformHandlerMetadata, PlatformHandlerType, PlatformRouters, useResponseHandler } from "@tsed/platform-router";
9
+ import { promisify } from "util";
7
10
  import { AnyToPromiseWithCtx } from "../domain/AnyToPromiseWithCtx.js";
8
- import { HandlerMetadata } from "../domain/HandlerMetadata.js";
9
- import { HandlerType } from "../interfaces/HandlerType.js";
10
- import { createHandlerMetadata } from "../utils/createHandlerMetadata.js";
11
11
  import { setResponseHeaders } from "../utils/setResponseHeaders.js";
12
+ import { PlatformApplication } from "./PlatformApplication.js";
13
+ import { PlatformMiddlewaresChain } from "./PlatformMiddlewaresChain.js";
12
14
  /**
13
15
  * Platform Handler abstraction layer. Wrap original class method to a pure platform handler (Express, Koa, etc...).
14
16
  * @platform
15
17
  */
16
18
  let PlatformHandler = class PlatformHandler {
17
- constructor(injector, params) {
18
- this.injector = injector;
19
- this.params = params;
19
+ platformRouters;
20
+ responseFilter;
21
+ platformParams;
22
+ platformExceptions;
23
+ platformApplication;
24
+ platformMiddlewaresChain;
25
+ constructor(platformRouters) {
26
+ this.platformRouters = platformRouters;
27
+ // configure the router module
28
+ platformRouters.hooks
29
+ .on("alterEndpointHandlers", (allMiddlewares, operationRoute) => {
30
+ allMiddlewares = this.platformMiddlewaresChain.get(allMiddlewares, operationRoute);
31
+ return [...allMiddlewares, useResponseHandler(this.onFinish.bind(this))];
32
+ })
33
+ .on("alterHandler", (handlerMetadata) => {
34
+ return this.platformApplication.adapter.mapHandler(this.createHandler(handlerMetadata), handlerMetadata);
35
+ });
20
36
  }
21
- /**
22
- * Create a native middleware based on the given metadata and return an instance of AnyToPromiseWithCtx
23
- * @param input
24
- * @param options
25
- */
26
- createHandler(input, options = {}) {
27
- return this.createRawHandler(createHandlerMetadata(this.injector, input, options));
37
+ createHandler(handlerMetadata) {
38
+ if (handlerMetadata.isInjectable()) {
39
+ const handler = this.platformParams.compileHandler(handlerMetadata);
40
+ return async ($ctx) => {
41
+ $ctx.handlerMetadata = handlerMetadata;
42
+ await catchAsyncError(() => this.onRequest(handler, $ctx));
43
+ return this.next($ctx);
44
+ };
45
+ }
46
+ return handlerMetadata.handler;
28
47
  }
29
48
  /**
30
- * Create injectable handler from the given provider
31
49
  * @param provider
32
50
  * @param propertyKey
33
51
  */
34
52
  createCustomHandler(provider, propertyKey) {
35
- const handler = this.compileHandler(new HandlerMetadata({
36
- token: provider.provide,
37
- target: provider.useClass,
38
- type: HandlerType.CUSTOM,
39
- scope: provider.scope,
53
+ const metadata = new PlatformHandlerMetadata({
54
+ provider,
55
+ type: PlatformHandlerType.CUSTOM,
40
56
  propertyKey
41
- }));
42
- return async ($ctx, next) => handler({
43
- $ctx,
44
- next
45
57
  });
58
+ const handler = this.platformParams.compileHandler(metadata.store);
59
+ return async ($ctx) => {
60
+ $ctx.handlerMetadata = metadata;
61
+ // @ts-ignore
62
+ return this.onRequest(handler, $ctx);
63
+ };
46
64
  }
47
65
  /**
48
66
  * Send the response to the consumer.
49
- * @param data
50
- * @param ctx
51
67
  * @protected
68
+ * @param $ctx
52
69
  */
53
- async flush(data, ctx) {
54
- const { response } = ctx;
55
- if (!response.isDone()) {
56
- data = await this.responseFilter.serialize(data, ctx);
57
- data = await this.responseFilter.transform(data, ctx);
70
+ async flush($ctx) {
71
+ const { response } = $ctx;
72
+ if (!$ctx.isDone()) {
73
+ let data = await this.responseFilter.serialize($ctx.data, $ctx);
74
+ data = await this.responseFilter.transform(data, $ctx);
58
75
  response.body(data);
59
76
  }
60
77
  }
61
- compileHandler(metadata) {
62
- if (metadata.type === HandlerType.CTX_FN) {
63
- return async (scope) => {
64
- // @ts-ignore
65
- return this.onCtxRequest({
66
- ...scope,
67
- handler: () => metadata.handler(scope.$ctx),
68
- metadata
69
- });
70
- };
78
+ /**
79
+ * @param $ctx
80
+ */
81
+ next($ctx) {
82
+ if (isStream($ctx.data) || $ctx.isDone()) {
83
+ return;
71
84
  }
72
- const promise = this.params.compileHandler({
73
- token: metadata.token,
74
- propertyKey: metadata.propertyKey,
75
- getCustomArgs: metadata.injectable ? undefined : this.getDefaultArgs(metadata)
76
- });
77
- return async (scope) => {
78
- const handler = await promise;
79
- // @ts-ignore
80
- return this.onRequest({
81
- ...scope,
82
- handler,
83
- metadata
84
- });
85
- };
86
- }
87
- async onCtxRequest(requestOptions) {
88
- await requestOptions.handler(requestOptions);
89
- return this.next(requestOptions);
85
+ return $ctx.error ? $ctx.next($ctx.error) : $ctx.next();
90
86
  }
91
87
  /**
92
88
  * Call handler when a request his handle
93
- * @param requestOptions
94
89
  */
95
- async onRequest(requestOptions) {
96
- const { $ctx, metadata, err, handler } = requestOptions;
97
- // istanbul ignore next
98
- if (!$ctx || $ctx.isDone()) {
90
+ async onRequest(handler, $ctx) {
91
+ if ($ctx.isDone()) {
99
92
  $log.error({
100
93
  name: "HEADERS_SENT",
101
- message: `An endpoint is called but the response is already send to the client. The call comes from the handler: ${metadata.toString()}`
94
+ message: `An endpoint is called but the response is already send to the client. The call comes from the handler: ${$ctx.handlerMetadata.toString()}`
102
95
  });
103
96
  return;
104
97
  }
105
- const resolver = new AnyToPromiseWithCtx({ $ctx, err });
106
- return runInContext($ctx, async () => {
107
- try {
108
- const { state, data, status, headers } = await resolver.call(handler);
109
- if (state === AnyToPromiseStatus.RESOLVED) {
110
- if (status) {
111
- $ctx.response.status(status);
98
+ if (($ctx.error instanceof Error && !$ctx.handlerMetadata.hasErrorParam) || ($ctx.handlerMetadata.hasErrorParam && !$ctx.error)) {
99
+ return;
100
+ }
101
+ try {
102
+ const { handlerMetadata } = $ctx;
103
+ if (handlerMetadata.type === PlatformHandlerType.CTX_FN) {
104
+ return await handler({ $ctx });
105
+ }
106
+ const resolver = new AnyToPromiseWithCtx($ctx);
107
+ const { state, type, data, status, headers } = await resolver.call(handler);
108
+ // Note: restore previous handler metadata (for OIDC)
109
+ $ctx.handlerMetadata = handlerMetadata;
110
+ if (state === AnyToPromiseStatus.RESOLVED) {
111
+ if (status) {
112
+ $ctx.response.status(status);
113
+ }
114
+ if (headers) {
115
+ $ctx.response.setHeaders(headers);
116
+ }
117
+ if (data !== undefined) {
118
+ $ctx.data = data;
119
+ }
120
+ if (!$ctx.isDone()) {
121
+ $ctx.error = null;
122
+ // set headers each times that an endpoint is called
123
+ if (handlerMetadata.isEndpoint()) {
124
+ setResponseHeaders($ctx);
112
125
  }
113
- if (headers) {
114
- $ctx.response.setHeaders(headers);
126
+ // call returned middleware
127
+ if (isFunction($ctx.data) && !isStream($ctx.data)) {
128
+ return promisify($ctx.data)($ctx.getRequest(), $ctx.getResponse());
115
129
  }
116
- if (data !== undefined) {
117
- $ctx.data = data;
130
+ if (type === AnyToPromiseResponseTypes.STREAM) {
131
+ return this.flush($ctx);
118
132
  }
119
- // Can be canceled by the handler itself
120
- return await this.onSuccess($ctx.data, requestOptions);
121
133
  }
122
134
  }
123
- catch (er) {
124
- return this.onError(er, requestOptions);
125
- }
126
- });
127
- }
128
- async onError(er, requestOptions) {
129
- const { next, $ctx, metadata } = requestOptions;
130
- if ($ctx) {
131
- $ctx.data = er;
132
135
  }
133
- if (!next) {
134
- throw er;
136
+ catch (error) {
137
+ $ctx.error = error;
138
+ throw error;
135
139
  }
136
- // istanbul ignore next
137
- if (!$ctx || $ctx.isDone()) {
138
- $log.warn({
139
- name: "HEADERS_SENT",
140
- message: `An error was caught after the headers were sent to the client. The error comes from the handler: ${metadata.toString()}`,
141
- stack: er.stack,
142
- origin: er,
143
- request_id: $ctx === null || $ctx === void 0 ? void 0 : $ctx.id
144
- });
145
- return;
146
- }
147
- return next(er);
148
140
  }
149
- /**
150
- * Manage success scenario
151
- * @param data
152
- * @param requestOptions
153
- * @protected
154
- */
155
- async onSuccess(data, requestOptions) {
156
- const { metadata, $ctx, next } = requestOptions;
157
- // istanbul ignore next
158
- if ($ctx === null || $ctx === void 0 ? void 0 : $ctx.isDone()) {
159
- return;
160
- }
161
- // set headers each times that an endpoint is called
162
- if (metadata.type === HandlerType.ENDPOINT) {
163
- this.setHeaders($ctx);
164
- }
165
- // call returned middleware
166
- if (isFunction(data) && !isStream(data)) {
167
- return this.callReturnedMiddleware(data, $ctx, next);
168
- }
169
- if (metadata.isFinal()) {
170
- return this.flush(data, $ctx);
171
- }
172
- return this.next(requestOptions);
173
- }
174
- /**
175
- * Call the returned middleware by the handler.
176
- * @param middleware
177
- * @param ctx
178
- * @param next
179
- * @protected
180
- */
181
- callReturnedMiddleware(middleware, ctx, next) {
182
- return middleware(ctx.getRequest(), ctx.getResponse(), next);
183
- }
184
- /**
185
- * create Raw handler
186
- * @param metadata
187
- */
188
- createRawHandler(metadata) {
189
- if ([HandlerType.RAW_ERR_FN, HandlerType.RAW_FN].includes(metadata.type)) {
190
- return metadata.handler;
191
- }
192
- const handler = this.compileHandler(metadata);
193
- return async (request, response, next) => {
194
- return handler({
195
- next,
196
- $ctx: request.$ctx
197
- });
198
- };
199
- }
200
- /**
201
- * Set response headers
202
- * @param ctx
203
- * @protected
204
- */
205
- setHeaders(ctx) {
206
- return setResponseHeaders(ctx);
207
- }
208
- next(requestOptions) {
209
- const { $ctx, next } = requestOptions;
210
- return !$ctx.response.isDone() && next && next();
211
- }
212
- getDefaultArgs(metadata) {
213
- return async (scope) => [
214
- metadata.hasErrorParam && scope.err,
215
- scope.$ctx.request.request,
216
- scope.$ctx.response.response,
217
- metadata.hasNextFunction && scope.next
218
- ].filter(Boolean);
141
+ async onFinish($ctx) {
142
+ $ctx.error = await catchAsyncError(() => this.flush($ctx));
143
+ return $ctx.error && this.platformExceptions.catch($ctx.error, $ctx);
219
144
  }
220
145
  };
221
146
  __decorate([
222
147
  Inject(),
223
148
  __metadata("design:type", PlatformResponseFilter)
224
149
  ], PlatformHandler.prototype, "responseFilter", void 0);
150
+ __decorate([
151
+ Inject(),
152
+ __metadata("design:type", PlatformParams)
153
+ ], PlatformHandler.prototype, "platformParams", void 0);
154
+ __decorate([
155
+ Inject(),
156
+ __metadata("design:type", PlatformExceptions)
157
+ ], PlatformHandler.prototype, "platformExceptions", void 0);
158
+ __decorate([
159
+ Inject(),
160
+ __metadata("design:type", PlatformApplication)
161
+ ], PlatformHandler.prototype, "platformApplication", void 0);
162
+ __decorate([
163
+ Inject(),
164
+ __metadata("design:type", PlatformMiddlewaresChain)
165
+ ], PlatformHandler.prototype, "platformMiddlewaresChain", void 0);
225
166
  PlatformHandler = __decorate([
226
167
  Injectable({
227
168
  scope: ProviderScope.SINGLETON
228
169
  }),
229
- __metadata("design:paramtypes", [InjectorService, PlatformParams])
170
+ __metadata("design:paramtypes", [PlatformRouters])
230
171
  ], PlatformHandler);
231
172
  export { PlatformHandler };
232
173
  //# sourceMappingURL=PlatformHandler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlatformHandler.js","sourceRoot":"","sources":["../../../src/services/PlatformHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import {AnyToPromiseStatus, isFunction, isStream} from \"@tsed/core\";\nimport {Inject, Injectable, InjectorService, Provider, ProviderScope, runInContext} from \"@tsed/di\";\nimport {$log} from \"@tsed/logger\";\nimport {ArgScope, HandlerWithScope, PlatformParams} from \"@tsed/platform-params\";\nimport {PlatformResponseFilter} from \"@tsed/platform-response-filter\";\nimport {EndpointMetadata} from \"@tsed/schema\";\nimport {AnyToPromiseWithCtx} from \"../domain/AnyToPromiseWithCtx\";\nimport {HandlerMetadata} from \"../domain/HandlerMetadata\";\nimport {PlatformContext} from \"../domain/PlatformContext\";\nimport {HandlerType} from \"../interfaces/HandlerType\";\nimport {PlatformRouteWithoutHandlers} from \"../interfaces/PlatformRouteOptions\";\nimport {createHandlerMetadata} from \"../utils/createHandlerMetadata\";\nimport {setResponseHeaders} from \"../utils/setResponseHeaders\";\n\nexport interface OnRequestOptions {\n $ctx: PlatformContext;\n metadata: HandlerMetadata;\n handler: HandlerWithScope;\n next?: any;\n err?: any;\n\n [key: string]: any;\n}\n\n/**\n * Platform Handler abstraction layer. Wrap original class method to a pure platform handler (Express, Koa, etc...).\n * @platform\n */\n@Injectable({\n scope: ProviderScope.SINGLETON\n})\nexport class PlatformHandler {\n @Inject()\n protected responseFilter: PlatformResponseFilter;\n\n constructor(protected injector: InjectorService, protected params: PlatformParams) {}\n\n /**\n * Create a native middleware based on the given metadata and return an instance of AnyToPromiseWithCtx\n * @param input\n * @param options\n */\n createHandler(input: EndpointMetadata | HandlerMetadata | any, options: PlatformRouteWithoutHandlers = {}) {\n return this.createRawHandler(createHandlerMetadata(this.injector, input, options));\n }\n\n /**\n * Create injectable handler from the given provider\n * @param provider\n * @param propertyKey\n */\n createCustomHandler(provider: Provider, propertyKey: string) {\n const handler = this.compileHandler(\n new HandlerMetadata({\n token: provider.provide,\n target: provider.useClass,\n type: HandlerType.CUSTOM,\n scope: provider.scope,\n propertyKey\n })\n );\n\n return async ($ctx: PlatformContext, next?: any) =>\n handler({\n $ctx,\n next\n });\n }\n\n /**\n * Send the response to the consumer.\n * @param data\n * @param ctx\n * @protected\n */\n async flush(data: any, ctx: PlatformContext) {\n const {response} = ctx;\n\n if (!response.isDone()) {\n data = await this.responseFilter.serialize(data, ctx);\n data = await this.responseFilter.transform(data, ctx);\n response.body(data);\n }\n }\n\n compileHandler(metadata: HandlerMetadata) {\n if (metadata.type === HandlerType.CTX_FN) {\n return async (scope: Record<string, any>) => {\n // @ts-ignore\n return this.onCtxRequest({\n ...scope,\n handler: () => metadata.handler(scope.$ctx),\n metadata\n });\n };\n }\n\n const promise = this.params.compileHandler<PlatformContext>({\n token: metadata.token,\n propertyKey: metadata.propertyKey,\n getCustomArgs: metadata.injectable ? undefined : this.getDefaultArgs(metadata)\n });\n\n return async (scope: Record<string, any>) => {\n const handler = await promise;\n // @ts-ignore\n return this.onRequest({\n ...scope,\n handler,\n metadata\n });\n };\n }\n\n protected async onCtxRequest(requestOptions: OnRequestOptions): Promise<any> {\n await requestOptions.handler(requestOptions);\n\n return this.next(requestOptions);\n }\n\n /**\n * Call handler when a request his handle\n * @param requestOptions\n */\n protected async onRequest(requestOptions: OnRequestOptions): Promise<any> {\n const {$ctx, metadata, err, handler} = requestOptions;\n // istanbul ignore next\n if (!$ctx || $ctx.isDone()) {\n $log.error({\n name: \"HEADERS_SENT\",\n message: `An endpoint is called but the response is already send to the client. The call comes from the handler: ${metadata.toString()}`\n });\n return;\n }\n\n const resolver = new AnyToPromiseWithCtx({$ctx, err});\n\n return runInContext($ctx, async () => {\n try {\n const {state, data, status, headers} = await resolver.call(handler);\n\n if (state === AnyToPromiseStatus.RESOLVED) {\n if (status) {\n $ctx.response.status(status);\n }\n\n if (headers) {\n $ctx.response.setHeaders(headers);\n }\n\n if (data !== undefined) {\n $ctx.data = data;\n }\n\n // Can be canceled by the handler itself\n return await this.onSuccess($ctx.data, requestOptions);\n }\n } catch (er) {\n return this.onError(er, requestOptions);\n }\n });\n }\n\n protected async onError(er: Error, requestOptions: OnRequestOptions) {\n const {next, $ctx, metadata} = requestOptions;\n\n if ($ctx) {\n $ctx.data = er;\n }\n\n if (!next) {\n throw er;\n }\n\n // istanbul ignore next\n if (!$ctx || $ctx.isDone()) {\n $log.warn({\n name: \"HEADERS_SENT\",\n message: `An error was caught after the headers were sent to the client. The error comes from the handler: ${metadata.toString()}`,\n stack: er.stack,\n origin: er,\n request_id: $ctx?.id\n });\n\n return;\n }\n\n return next(er);\n }\n\n /**\n * Manage success scenario\n * @param data\n * @param requestOptions\n * @protected\n */\n protected async onSuccess(data: any, requestOptions: OnRequestOptions) {\n const {metadata, $ctx, next} = requestOptions;\n\n // istanbul ignore next\n if ($ctx?.isDone()) {\n return;\n }\n\n // set headers each times that an endpoint is called\n if (metadata.type === HandlerType.ENDPOINT) {\n this.setHeaders($ctx);\n }\n\n // call returned middleware\n if (isFunction(data) && !isStream(data)) {\n return this.callReturnedMiddleware(data, $ctx, next);\n }\n\n if (metadata.isFinal()) {\n return this.flush(data, $ctx);\n }\n\n return this.next(requestOptions);\n }\n\n /**\n * Call the returned middleware by the handler.\n * @param middleware\n * @param ctx\n * @param next\n * @protected\n */\n protected callReturnedMiddleware(middleware: any, ctx: PlatformContext, next: any) {\n return middleware(ctx.getRequest(), ctx.getResponse(), next);\n }\n\n /**\n * create Raw handler\n * @param metadata\n */\n protected createRawHandler(metadata: HandlerMetadata) {\n if ([HandlerType.RAW_ERR_FN, HandlerType.RAW_FN].includes(metadata.type)) {\n return metadata.handler;\n }\n\n const handler = this.compileHandler(metadata);\n\n return async (request: any, response: any, next: any) => {\n return handler({\n next,\n $ctx: request.$ctx\n });\n };\n }\n\n /**\n * Set response headers\n * @param ctx\n * @protected\n */\n protected setHeaders(ctx: PlatformContext) {\n return setResponseHeaders(ctx);\n }\n\n protected next(requestOptions: OnRequestOptions) {\n const {$ctx, next} = requestOptions;\n\n return !$ctx.response.isDone() && next && next();\n }\n\n protected getDefaultArgs(metadata: HandlerMetadata) {\n return async (scope: ArgScope<PlatformContext>) =>\n [\n metadata.hasErrorParam && scope.err,\n scope.$ctx.request.request,\n scope.$ctx.response.response,\n metadata.hasNextFunction && scope.next\n ].filter(Boolean);\n }\n}\n"]}
1
+ {"version":3,"file":"PlatformHandler.js","sourceRoot":"","sources":["../../../src/services/PlatformHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import {AnyToPromiseResponseTypes, AnyToPromiseStatus, catchAsyncError, isFunction, isStream} from \"@tsed/core\";\nimport {Inject, Injectable, Provider, ProviderScope} from \"@tsed/di\";\nimport {$log} from \"@tsed/logger\";\nimport {PlatformExceptions} from \"@tsed/platform-exceptions\";\nimport {PlatformParams, PlatformParamsCallback} from \"@tsed/platform-params\";\nimport {PlatformResponseFilter} from \"@tsed/platform-response-filter\";\nimport {PlatformHandlerMetadata, PlatformHandlerType, PlatformRouters, useResponseHandler} from \"@tsed/platform-router\";\nimport {JsonOperationRoute} from \"@tsed/schema\";\nimport {promisify} from \"util\";\nimport {AnyToPromiseWithCtx} from \"../domain/AnyToPromiseWithCtx\";\nimport {PlatformContext} from \"../domain/PlatformContext\";\nimport {setResponseHeaders} from \"../utils/setResponseHeaders\";\nimport {PlatformApplication} from \"./PlatformApplication\";\nimport {PlatformMiddlewaresChain} from \"./PlatformMiddlewaresChain\";\n\n/**\n * Platform Handler abstraction layer. Wrap original class method to a pure platform handler (Express, Koa, etc...).\n * @platform\n */\n@Injectable({\n scope: ProviderScope.SINGLETON\n})\nexport class PlatformHandler {\n @Inject()\n protected responseFilter: PlatformResponseFilter;\n\n @Inject()\n protected platformParams: PlatformParams;\n\n @Inject()\n protected platformExceptions: PlatformExceptions;\n\n @Inject()\n protected platformApplication: PlatformApplication;\n\n @Inject()\n protected platformMiddlewaresChain: PlatformMiddlewaresChain;\n\n constructor(protected platformRouters: PlatformRouters) {\n // configure the router module\n platformRouters.hooks\n .on(\"alterEndpointHandlers\", (allMiddlewares: any[], operationRoute: JsonOperationRoute) => {\n allMiddlewares = this.platformMiddlewaresChain.get(allMiddlewares, operationRoute);\n\n return [...allMiddlewares, useResponseHandler(this.onFinish.bind(this))];\n })\n .on(\"alterHandler\", (handlerMetadata: PlatformHandlerMetadata) => {\n return this.platformApplication.adapter.mapHandler(this.createHandler(handlerMetadata), handlerMetadata);\n });\n }\n\n createHandler(handlerMetadata: PlatformHandlerMetadata): any {\n if (handlerMetadata.isInjectable()) {\n const handler = this.platformParams.compileHandler(handlerMetadata);\n\n return async ($ctx: PlatformContext) => {\n $ctx.handlerMetadata = handlerMetadata;\n\n await catchAsyncError(() => this.onRequest(handler, $ctx));\n\n return this.next($ctx);\n };\n }\n\n return handlerMetadata.handler;\n }\n\n /**\n * @param provider\n * @param propertyKey\n */\n createCustomHandler(provider: Provider, propertyKey: string) {\n const metadata = new PlatformHandlerMetadata({\n provider,\n type: PlatformHandlerType.CUSTOM,\n propertyKey\n });\n\n const handler = this.platformParams.compileHandler(metadata.store);\n\n return async ($ctx: PlatformContext) => {\n $ctx.handlerMetadata = metadata;\n\n // @ts-ignore\n return this.onRequest(handler, $ctx);\n };\n }\n\n /**\n * Send the response to the consumer.\n * @protected\n * @param $ctx\n */\n async flush($ctx: PlatformContext) {\n const {response} = $ctx;\n\n if (!$ctx.isDone()) {\n let data = await this.responseFilter.serialize($ctx.data, $ctx as any);\n data = await this.responseFilter.transform(data, $ctx as any);\n response.body(data);\n }\n }\n\n /**\n * @param $ctx\n */\n next($ctx: PlatformContext) {\n if (isStream($ctx.data) || $ctx.isDone()) {\n return;\n }\n\n return $ctx.error ? $ctx.next($ctx.error) : $ctx.next();\n }\n\n /**\n * Call handler when a request his handle\n */\n async onRequest(handler: PlatformParamsCallback, $ctx: PlatformContext): Promise<any> {\n if ($ctx.isDone()) {\n $log.error({\n name: \"HEADERS_SENT\",\n message: `An endpoint is called but the response is already send to the client. The call comes from the handler: ${$ctx.handlerMetadata.toString()}`\n });\n return;\n }\n\n if (($ctx.error instanceof Error && !$ctx.handlerMetadata.hasErrorParam) || ($ctx.handlerMetadata.hasErrorParam && !$ctx.error)) {\n return;\n }\n\n try {\n const {handlerMetadata} = $ctx;\n\n if (handlerMetadata.type === PlatformHandlerType.CTX_FN) {\n return await handler({$ctx});\n }\n\n const resolver = new AnyToPromiseWithCtx($ctx);\n\n const {state, type, data, status, headers} = await resolver.call(handler);\n\n // Note: restore previous handler metadata (for OIDC)\n $ctx.handlerMetadata = handlerMetadata;\n\n if (state === AnyToPromiseStatus.RESOLVED) {\n if (status) {\n $ctx.response.status(status);\n }\n\n if (headers) {\n $ctx.response.setHeaders(headers);\n }\n\n if (data !== undefined) {\n $ctx.data = data;\n }\n\n if (!$ctx.isDone()) {\n $ctx.error = null;\n\n // set headers each times that an endpoint is called\n if (handlerMetadata.isEndpoint()) {\n setResponseHeaders($ctx);\n }\n\n // call returned middleware\n if (isFunction($ctx.data) && !isStream($ctx.data)) {\n return promisify($ctx.data)($ctx.getRequest(), $ctx.getResponse());\n }\n\n if (type === AnyToPromiseResponseTypes.STREAM) {\n return this.flush($ctx);\n }\n }\n }\n } catch (error) {\n $ctx.error = error;\n\n throw error;\n }\n }\n\n async onFinish($ctx: PlatformContext) {\n $ctx.error = await catchAsyncError(() => this.flush($ctx));\n\n return $ctx.error && this.platformExceptions.catch($ctx.error, $ctx);\n }\n}\n"]}
@@ -1,31 +1,17 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
+ import { isClass } from "@tsed/core";
2
3
  import { Constant, Inject, Injectable } from "@tsed/di";
3
4
  import { ParamTypes } from "@tsed/platform-params";
4
5
  import { JsonEntityStore } from "@tsed/schema";
5
- import { bindEndpointMiddleware } from "../middlewares/bindEndpointMiddleware.js";
6
6
  import { PlatformAcceptMimesMiddleware } from "../middlewares/PlatformAcceptMimesMiddleware.js";
7
7
  import { PlatformMulterMiddleware } from "../middlewares/PlatformMulterMiddleware.js";
8
- import { useCtxHandler } from "../utils/useCtxHandler.js";
9
8
  import { PlatformAdapter } from "../services/PlatformAdapter.js";
10
- import { isClass } from "@tsed/core";
11
9
  let PlatformMiddlewaresChain = class PlatformMiddlewaresChain {
12
- get(provider, operationRoute, parentMiddlewares = []) {
13
- const { endpoint } = operationRoute;
14
- const { beforeMiddlewares, middlewares: mldwrs, afterMiddlewares } = endpoint;
15
- const { middlewares: { useBefore, use, useAfter } } = provider;
16
- const allMiddlewares = [
17
- ...parentMiddlewares,
18
- ...useBefore,
19
- ...beforeMiddlewares,
20
- ...use,
21
- ...mldwrs,
22
- endpoint,
23
- ...afterMiddlewares,
24
- ...useAfter
25
- ];
10
+ acceptMimes;
11
+ adapter;
12
+ get(allMiddlewares, operationRoute) {
26
13
  const { ACCEPT_MIMES, FILE, RAW_BODY, BODY } = this.getParamTypes(allMiddlewares, operationRoute);
27
14
  return [
28
- useCtxHandler(bindEndpointMiddleware(endpoint)),
29
15
  ACCEPT_MIMES && PlatformAcceptMimesMiddleware,
30
16
  FILE && PlatformMulterMiddleware,
31
17
  !FILE && RAW_BODY && this.adapter.bodyParser("raw"),
@@ -53,7 +39,7 @@ let PlatformMiddlewaresChain = class PlatformMiddlewaresChain {
53
39
  ACCEPT_MIMES: this.hasAcceptMimes(operationRoute),
54
40
  FILE: operationRoute.has(ParamTypes.FILES),
55
41
  RAW_BODY: operationRoute.has(ParamTypes.RAW_BODY),
56
- BODY: operationRoute.has(ParamTypes.BODY)
42
+ BODY: operationRoute.has(ParamTypes.BODY) || operationRoute.method === "ALL"
57
43
  });
58
44
  }
59
45
  };
@@ -1 +1 @@
1
- {"version":3,"file":"PlatformMiddlewaresChain.js","sourceRoot":"","sources":["../../../src/services/PlatformMiddlewaresChain.ts"],"names":[],"mappings":"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","sourcesContent":["import {Constant, Inject, Injectable} from \"@tsed/di\";\nimport {ParamTypes} from \"@tsed/platform-params\";\nimport {JsonEntityStore, JsonOperationRoute} from \"@tsed/schema\";\nimport {ControllerProvider} from \"../domain/ControllerProvider\";\nimport {bindEndpointMiddleware} from \"../middlewares/bindEndpointMiddleware\";\nimport {PlatformAcceptMimesMiddleware} from \"../middlewares/PlatformAcceptMimesMiddleware\";\nimport {PlatformMulterMiddleware} from \"../middlewares/PlatformMulterMiddleware\";\nimport {useCtxHandler} from \"../utils/useCtxHandler\";\nimport {PlatformAdapter} from \"../services/PlatformAdapter\";\nimport {isClass} from \"@tsed/core\";\n\n@Injectable()\nexport class PlatformMiddlewaresChain {\n @Constant(\"acceptMimes\", [])\n protected acceptMimes: string[];\n\n @Inject()\n protected adapter: PlatformAdapter;\n\n get(provider: ControllerProvider, operationRoute: JsonOperationRoute, parentMiddlewares: any[] = []) {\n const {endpoint} = operationRoute;\n const {beforeMiddlewares, middlewares: mldwrs, afterMiddlewares} = endpoint;\n\n const {\n middlewares: {useBefore, use, useAfter}\n } = provider;\n\n const allMiddlewares = [\n ...parentMiddlewares,\n ...useBefore,\n ...beforeMiddlewares,\n ...use,\n ...mldwrs,\n endpoint,\n ...afterMiddlewares,\n ...useAfter\n ];\n\n const {ACCEPT_MIMES, FILE, RAW_BODY, BODY} = this.getParamTypes(allMiddlewares, operationRoute);\n\n return [\n useCtxHandler(bindEndpointMiddleware(endpoint)),\n ACCEPT_MIMES && PlatformAcceptMimesMiddleware,\n FILE && PlatformMulterMiddleware,\n !FILE && RAW_BODY && this.adapter.bodyParser(\"raw\"),\n !FILE && !RAW_BODY && BODY && this.adapter.bodyParser(\"json\"),\n !FILE && !RAW_BODY && BODY && this.adapter.bodyParser(\"urlencoded\"),\n ...allMiddlewares\n ].filter(Boolean);\n }\n\n protected hasAcceptMimes(operationRoute: JsonOperationRoute) {\n return operationRoute.endpoint.acceptMimes.length || this.acceptMimes.length;\n }\n\n protected getParamTypes(middlewares: any[], operationRoute: JsonOperationRoute) {\n return middlewares.filter(isClass).reduce(\n (paramTypes, token) => {\n if (token !== operationRoute.endpoint) {\n const entity = JsonEntityStore.fromMethod(token, \"use\");\n\n if (entity.decoratorType === \"method\") {\n const {FILE, RAW_BODY, BODY} = entity.getParamTypes();\n paramTypes.FILE = paramTypes.FILE || FILE;\n paramTypes.RAW_BODY = paramTypes.RAW_BODY || RAW_BODY;\n paramTypes.BODY = paramTypes.BODY || BODY;\n }\n }\n\n return paramTypes;\n },\n {\n ACCEPT_MIMES: this.hasAcceptMimes(operationRoute),\n FILE: operationRoute.has(ParamTypes.FILES),\n RAW_BODY: operationRoute.has(ParamTypes.RAW_BODY),\n BODY: operationRoute.has(ParamTypes.BODY)\n }\n );\n }\n}\n"]}
1
+ {"version":3,"file":"PlatformMiddlewaresChain.js","sourceRoot":"","sources":["../../../src/services/PlatformMiddlewaresChain.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAC;AACnC,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAC,MAAM,UAAU,CAAC;AACtD,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAC,eAAe,EAAqB,MAAM,cAAc,CAAC;AACjE,OAAO,EAAC,6BAA6B,EAAC,MAAM,8CAA8C,CAAC;AAC3F,OAAO,EAAC,wBAAwB,EAAC,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAC,eAAe,EAAC,MAAM,6BAA6B,CAAC;AAG5D,IAAa,wBAAwB,GAArC,MAAa,wBAAwB;IAEzB,WAAW,CAAW;IAGtB,OAAO,CAAkB;IAEnC,GAAG,CAAC,cAAqB,EAAE,cAAkC;QAC3D,MAAM,EAAC,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAC,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QAEhG,OAAO;YACL,YAAY,IAAI,6BAA6B;YAC7C,IAAI,IAAI,wBAAwB;YAChC,CAAC,IAAI,IAAI,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;YACnD,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;YAC7D,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC;YACnE,GAAG,cAAc;SAClB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpB,CAAC;IAES,cAAc,CAAC,cAAkC;QACzD,OAAO,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;IAC/E,CAAC;IAES,aAAa,CAAC,WAAkB,EAAE,cAAkC;QAC5E,OAAO,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CACvC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE;YACpB,IAAI,KAAK,KAAK,cAAc,CAAC,QAAQ,EAAE;gBACrC,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAExD,IAAI,MAAM,CAAC,aAAa,KAAK,QAAQ,EAAE;oBACrC,MAAM,EAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAC,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;oBACtD,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,IAAI,IAAI,CAAC;oBAC1C,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,QAAQ,CAAC;oBACtD,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,IAAI,IAAI,CAAC;iBAC3C;aACF;YAED,OAAO,UAAU,CAAC;QACpB,CAAC,EACD;YACE,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC;YACjD,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;YAC1C,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;YACjD,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,KAAK;SAC7E,CACF,CAAC;IACJ,CAAC;CACF,CAAA;AA9CC;IADC,QAAQ,CAAC,aAAa,EAAE,EAAE,CAAC;;6DACI;AAGhC;IADC,MAAM,EAAE;8BACU,eAAe;yDAAC;AALxB,wBAAwB;IADpC,UAAU,EAAE;GACA,wBAAwB,CAgDpC;SAhDY,wBAAwB","sourcesContent":["import {isClass} from \"@tsed/core\";\nimport {Constant, Inject, Injectable} from \"@tsed/di\";\nimport {ParamTypes} from \"@tsed/platform-params\";\nimport {JsonEntityStore, JsonOperationRoute} from \"@tsed/schema\";\nimport {PlatformAcceptMimesMiddleware} from \"../middlewares/PlatformAcceptMimesMiddleware\";\nimport {PlatformMulterMiddleware} from \"../middlewares/PlatformMulterMiddleware\";\nimport {PlatformAdapter} from \"../services/PlatformAdapter\";\n\n@Injectable()\nexport class PlatformMiddlewaresChain {\n @Constant(\"acceptMimes\", [])\n protected acceptMimes: string[];\n\n @Inject()\n protected adapter: PlatformAdapter;\n\n get(allMiddlewares: any[], operationRoute: JsonOperationRoute) {\n const {ACCEPT_MIMES, FILE, RAW_BODY, BODY} = this.getParamTypes(allMiddlewares, operationRoute);\n\n return [\n ACCEPT_MIMES && PlatformAcceptMimesMiddleware,\n FILE && PlatformMulterMiddleware,\n !FILE && RAW_BODY && this.adapter.bodyParser(\"raw\"),\n !FILE && !RAW_BODY && BODY && this.adapter.bodyParser(\"json\"),\n !FILE && !RAW_BODY && BODY && this.adapter.bodyParser(\"urlencoded\"),\n ...allMiddlewares\n ].filter(Boolean);\n }\n\n protected hasAcceptMimes(operationRoute: JsonOperationRoute) {\n return operationRoute.endpoint.acceptMimes.length || this.acceptMimes.length;\n }\n\n protected getParamTypes(middlewares: any[], operationRoute: JsonOperationRoute) {\n return middlewares.filter(isClass).reduce(\n (paramTypes, token) => {\n if (token !== operationRoute.endpoint) {\n const entity = JsonEntityStore.fromMethod(token, \"use\");\n\n if (entity.decoratorType === \"method\") {\n const {FILE, RAW_BODY, BODY} = entity.getParamTypes();\n paramTypes.FILE = paramTypes.FILE || FILE;\n paramTypes.RAW_BODY = paramTypes.RAW_BODY || RAW_BODY;\n paramTypes.BODY = paramTypes.BODY || BODY;\n }\n }\n\n return paramTypes;\n },\n {\n ACCEPT_MIMES: this.hasAcceptMimes(operationRoute),\n FILE: operationRoute.has(ParamTypes.FILES),\n RAW_BODY: operationRoute.has(ParamTypes.RAW_BODY),\n BODY: operationRoute.has(ParamTypes.BODY) || operationRoute.method === \"ALL\"\n }\n );\n }\n}\n"]}