@expressots/adapter-express 3.0.0-beta.4.2 → 4.0.0-preview.1

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 (239) hide show
  1. package/README.md +39 -96
  2. package/lib/CHANGELOG.md +43 -0
  3. package/lib/README.md +39 -96
  4. package/lib/cjs/adapter-express/application-express.base.js +3 -1
  5. package/lib/cjs/adapter-express/application-express.js +1049 -85
  6. package/lib/cjs/adapter-express/express-utils/conditional-middleware.js +102 -0
  7. package/lib/cjs/adapter-express/express-utils/constants.js +17 -0
  8. package/lib/cjs/adapter-express/express-utils/content-negotiation-decorators.js +129 -0
  9. package/lib/cjs/adapter-express/express-utils/decorators.js +186 -49
  10. package/lib/cjs/adapter-express/express-utils/exception-filter-decorators.js +11 -0
  11. package/lib/cjs/adapter-express/express-utils/guard-context-factory.js +84 -0
  12. package/lib/cjs/adapter-express/express-utils/guard-middleware.js +115 -0
  13. package/lib/cjs/adapter-express/express-utils/guard-utils.js +18 -0
  14. package/lib/cjs/adapter-express/express-utils/http-context-store.js +15 -0
  15. package/lib/cjs/adapter-express/express-utils/http-status-middleware.js +37 -2
  16. package/lib/cjs/adapter-express/express-utils/index.js +67 -1
  17. package/lib/cjs/adapter-express/express-utils/interceptor-middleware.js +132 -0
  18. package/lib/cjs/adapter-express/express-utils/inversify-express-server.js +810 -63
  19. package/lib/cjs/adapter-express/express-utils/lazy-module-middleware.js +241 -0
  20. package/lib/cjs/adapter-express/express-utils/middleware-composition.js +95 -0
  21. package/lib/cjs/adapter-express/express-utils/permission-preloader.middleware.js +48 -0
  22. package/lib/cjs/adapter-express/express-utils/route-constraints.js +95 -0
  23. package/lib/cjs/adapter-express/express-utils/scope-extractor.interface.js +2 -0
  24. package/lib/cjs/adapter-express/express-utils/scope-extractor.js +66 -0
  25. package/lib/cjs/adapter-express/express-utils/setup-authorization.js +71 -0
  26. package/lib/cjs/adapter-express/express-utils/setup-event-system.js +113 -0
  27. package/lib/cjs/adapter-express/express-utils/setup-interceptors.js +103 -0
  28. package/lib/cjs/adapter-express/express-utils/setup-lazy-loading.js +228 -0
  29. package/lib/cjs/adapter-express/express-utils/utils.js +30 -12
  30. package/lib/cjs/adapter-express/express-utils/validation-decorators.js +205 -0
  31. package/lib/cjs/adapter-express/express-utils/validation-service.js +252 -0
  32. package/lib/cjs/adapter-express/index.js +7 -5
  33. package/lib/cjs/adapter-express/micro-api/application-express-micro-route.js +31 -1
  34. package/lib/cjs/adapter-express/micro-api/application-express-micro.js +11 -37
  35. package/lib/cjs/adapter-express/micro-api/gateway/circuit-breaker.js +174 -0
  36. package/lib/cjs/adapter-express/micro-api/gateway/index.js +11 -0
  37. package/lib/cjs/adapter-express/micro-api/gateway/service-proxy.js +214 -0
  38. package/lib/cjs/adapter-express/micro-api/index.js +27 -3
  39. package/lib/cjs/adapter-express/micro-api/micro.js +217 -0
  40. package/lib/cjs/adapter-express/micro-api/queue/index.js +8 -0
  41. package/lib/cjs/adapter-express/micro-api/queue/queue.interface.js +2 -0
  42. package/lib/cjs/adapter-express/micro-api/queue/rabbitmq-consumer.js +255 -0
  43. package/lib/cjs/adapter-express/micro-api/serverless/aws-lambda.adapter.js +183 -0
  44. package/lib/cjs/adapter-express/micro-api/serverless/cloudflare.adapter.js +158 -0
  45. package/lib/cjs/adapter-express/micro-api/serverless/index.js +12 -0
  46. package/lib/cjs/adapter-express/micro-api/serverless/vercel.adapter.js +102 -0
  47. package/lib/cjs/adapter-express/micro-api/service-mesh/index.js +10 -0
  48. package/lib/cjs/adapter-express/micro-api/service-mesh/service-client.js +194 -0
  49. package/lib/cjs/adapter-express/micro-api/service-mesh/service-discovery.js +261 -0
  50. package/lib/cjs/adapter-express/middleware/index.js +21 -0
  51. package/lib/cjs/adapter-express/middleware/request-logging.middleware.js +244 -0
  52. package/lib/cjs/adapter-express/render/engine.js +15 -15
  53. package/lib/cjs/adapter-express/render/index.js +5 -0
  54. package/lib/cjs/adapter-express/studio/index.js +9 -0
  55. package/lib/cjs/adapter-express/studio/studio-integration.js +214 -0
  56. package/lib/cjs/index.js +1 -1
  57. package/lib/cjs/types/adapter-express/application-express.base.d.ts +20 -7
  58. package/lib/cjs/types/adapter-express/application-express.d.ts +273 -32
  59. package/lib/cjs/types/adapter-express/express-utils/base-middleware.d.ts +2 -2
  60. package/lib/cjs/types/adapter-express/express-utils/conditional-middleware.d.ts +97 -0
  61. package/lib/cjs/types/adapter-express/express-utils/constants.d.ts +13 -0
  62. package/lib/cjs/types/adapter-express/express-utils/content-negotiation-decorators.d.ts +94 -0
  63. package/lib/cjs/types/adapter-express/express-utils/decorators.d.ts +54 -6
  64. package/lib/cjs/types/adapter-express/express-utils/exception-filter-decorators.d.ts +6 -0
  65. package/lib/cjs/types/adapter-express/express-utils/guard-context-factory.d.ts +17 -0
  66. package/lib/cjs/types/adapter-express/express-utils/guard-middleware.d.ts +22 -0
  67. package/lib/cjs/types/adapter-express/express-utils/guard-utils.d.ts +11 -0
  68. package/lib/cjs/types/adapter-express/express-utils/http-context-store.d.ts +20 -0
  69. package/lib/cjs/types/adapter-express/express-utils/httpResponseMessage.d.ts +1 -1
  70. package/lib/cjs/types/adapter-express/express-utils/index.d.ts +30 -2
  71. package/lib/cjs/types/adapter-express/express-utils/interceptor-middleware.d.ts +40 -0
  72. package/lib/cjs/types/adapter-express/express-utils/interfaces.d.ts +42 -5
  73. package/lib/cjs/types/adapter-express/express-utils/inversify-express-server.d.ts +114 -2
  74. package/lib/cjs/types/adapter-express/express-utils/lazy-module-middleware.d.ts +122 -0
  75. package/lib/cjs/types/adapter-express/express-utils/middleware-composition.d.ts +85 -0
  76. package/lib/cjs/types/adapter-express/express-utils/permission-preloader.middleware.d.ts +10 -0
  77. package/lib/cjs/types/adapter-express/express-utils/route-constraints.d.ts +89 -0
  78. package/lib/cjs/types/adapter-express/express-utils/scope-extractor.d.ts +21 -0
  79. package/lib/cjs/types/adapter-express/express-utils/scope-extractor.interface.d.ts +12 -0
  80. package/lib/cjs/types/adapter-express/express-utils/setup-authorization.d.ts +34 -0
  81. package/lib/cjs/types/adapter-express/express-utils/setup-event-system.d.ts +118 -0
  82. package/lib/cjs/types/adapter-express/express-utils/setup-interceptors.d.ts +115 -0
  83. package/lib/cjs/types/adapter-express/express-utils/setup-lazy-loading.d.ts +123 -0
  84. package/lib/cjs/types/adapter-express/express-utils/utils.d.ts +17 -2
  85. package/lib/cjs/types/adapter-express/express-utils/validation-decorators.d.ts +145 -0
  86. package/lib/cjs/types/adapter-express/express-utils/validation-service.d.ts +88 -0
  87. package/lib/cjs/types/adapter-express/index.d.ts +6 -4
  88. package/lib/cjs/types/adapter-express/micro-api/application-express-micro-route.d.ts +25 -14
  89. package/lib/cjs/types/adapter-express/micro-api/application-express-micro.d.ts +3 -10
  90. package/lib/cjs/types/adapter-express/micro-api/gateway/circuit-breaker.d.ts +111 -0
  91. package/lib/cjs/types/adapter-express/micro-api/gateway/index.d.ts +5 -0
  92. package/lib/cjs/types/adapter-express/micro-api/gateway/service-proxy.d.ts +83 -0
  93. package/lib/cjs/types/adapter-express/micro-api/index.d.ts +7 -1
  94. package/lib/cjs/types/adapter-express/micro-api/micro.d.ts +66 -0
  95. package/lib/cjs/types/adapter-express/micro-api/queue/index.d.ts +5 -0
  96. package/lib/cjs/types/adapter-express/micro-api/queue/queue.interface.d.ts +60 -0
  97. package/lib/cjs/types/adapter-express/micro-api/queue/rabbitmq-consumer.d.ts +86 -0
  98. package/lib/cjs/types/adapter-express/micro-api/serverless/aws-lambda.adapter.d.ts +77 -0
  99. package/lib/cjs/types/adapter-express/micro-api/serverless/cloudflare.adapter.d.ts +64 -0
  100. package/lib/cjs/types/adapter-express/micro-api/serverless/index.d.ts +6 -0
  101. package/lib/cjs/types/adapter-express/micro-api/serverless/vercel.adapter.d.ts +56 -0
  102. package/lib/cjs/types/adapter-express/micro-api/service-mesh/index.d.ts +5 -0
  103. package/lib/cjs/types/adapter-express/micro-api/service-mesh/service-client.d.ts +122 -0
  104. package/lib/cjs/types/adapter-express/micro-api/service-mesh/service-discovery.d.ts +150 -0
  105. package/lib/cjs/types/adapter-express/middleware/index.d.ts +5 -0
  106. package/lib/cjs/types/adapter-express/middleware/request-logging.middleware.d.ts +65 -0
  107. package/lib/cjs/types/adapter-express/render/index.d.ts +1 -0
  108. package/lib/cjs/types/adapter-express/studio/index.d.ts +1 -0
  109. package/lib/cjs/types/adapter-express/studio/studio-integration.d.ts +92 -0
  110. package/lib/cjs/types/index.d.ts +1 -1
  111. package/lib/esm/adapter-express/application-express.base.js +24 -0
  112. package/lib/esm/adapter-express/application-express.js +1300 -0
  113. package/lib/esm/adapter-express/application-express.types.js +1 -0
  114. package/lib/esm/adapter-express/express-utils/base-middleware.js +19 -0
  115. package/lib/esm/adapter-express/express-utils/conditional-middleware.js +96 -0
  116. package/lib/esm/adapter-express/express-utils/constants.js +63 -0
  117. package/lib/esm/adapter-express/express-utils/content/httpContent.js +6 -0
  118. package/lib/esm/adapter-express/express-utils/content-negotiation-decorators.js +120 -0
  119. package/lib/esm/adapter-express/express-utils/decorators.js +575 -0
  120. package/lib/esm/adapter-express/express-utils/exception-filter-decorators.js +6 -0
  121. package/lib/esm/adapter-express/express-utils/guard-context-factory.js +83 -0
  122. package/lib/esm/adapter-express/express-utils/guard-middleware.js +115 -0
  123. package/lib/esm/adapter-express/express-utils/guard-utils.js +14 -0
  124. package/lib/esm/adapter-express/express-utils/http-context-store.js +10 -0
  125. package/lib/esm/adapter-express/express-utils/http-status-middleware.js +116 -0
  126. package/lib/esm/adapter-express/express-utils/httpResponseMessage.js +29 -0
  127. package/lib/esm/adapter-express/express-utils/index.js +24 -0
  128. package/lib/esm/adapter-express/express-utils/interceptor-middleware.js +130 -0
  129. package/lib/esm/adapter-express/express-utils/interfaces.js +1 -0
  130. package/lib/esm/adapter-express/express-utils/inversify-express-server.js +1031 -0
  131. package/lib/esm/adapter-express/express-utils/lazy-module-middleware.js +236 -0
  132. package/lib/esm/adapter-express/express-utils/middleware-composition.js +89 -0
  133. package/lib/esm/adapter-express/express-utils/permission-preloader.middleware.js +45 -0
  134. package/lib/esm/adapter-express/express-utils/resolver-multer.js +30 -0
  135. package/lib/esm/adapter-express/express-utils/route-constraints.js +91 -0
  136. package/lib/esm/adapter-express/express-utils/scope-extractor.interface.js +1 -0
  137. package/lib/esm/adapter-express/express-utils/scope-extractor.js +63 -0
  138. package/lib/esm/adapter-express/express-utils/setup-authorization.js +68 -0
  139. package/lib/esm/adapter-express/express-utils/setup-event-system.js +110 -0
  140. package/lib/esm/adapter-express/express-utils/setup-interceptors.js +100 -0
  141. package/lib/esm/adapter-express/express-utils/setup-lazy-loading.js +225 -0
  142. package/lib/esm/adapter-express/express-utils/utils.js +68 -0
  143. package/lib/esm/adapter-express/express-utils/validation-decorators.js +199 -0
  144. package/lib/esm/adapter-express/express-utils/validation-service.js +251 -0
  145. package/lib/esm/adapter-express/index.js +7 -0
  146. package/lib/esm/adapter-express/micro-api/application-express-micro-container.js +48 -0
  147. package/lib/esm/adapter-express/micro-api/application-express-micro-route.js +128 -0
  148. package/lib/esm/adapter-express/micro-api/application-express-micro.js +161 -0
  149. package/lib/esm/adapter-express/micro-api/gateway/circuit-breaker.js +174 -0
  150. package/lib/esm/adapter-express/micro-api/gateway/index.js +5 -0
  151. package/lib/esm/adapter-express/micro-api/gateway/service-proxy.js +210 -0
  152. package/lib/esm/adapter-express/micro-api/index.js +10 -0
  153. package/lib/esm/adapter-express/micro-api/micro.js +211 -0
  154. package/lib/esm/adapter-express/micro-api/queue/index.js +4 -0
  155. package/lib/esm/adapter-express/micro-api/queue/queue.interface.js +1 -0
  156. package/lib/esm/adapter-express/micro-api/queue/rabbitmq-consumer.js +229 -0
  157. package/lib/esm/adapter-express/micro-api/serverless/aws-lambda.adapter.js +180 -0
  158. package/lib/esm/adapter-express/micro-api/serverless/cloudflare.adapter.js +155 -0
  159. package/lib/esm/adapter-express/micro-api/serverless/index.js +6 -0
  160. package/lib/esm/adapter-express/micro-api/serverless/vercel.adapter.js +99 -0
  161. package/lib/esm/adapter-express/micro-api/service-mesh/index.js +5 -0
  162. package/lib/esm/adapter-express/micro-api/service-mesh/service-client.js +191 -0
  163. package/lib/esm/adapter-express/micro-api/service-mesh/service-discovery.js +259 -0
  164. package/lib/esm/adapter-express/middleware/index.js +5 -0
  165. package/lib/esm/adapter-express/middleware/request-logging.middleware.js +239 -0
  166. package/lib/esm/adapter-express/render/constants.js +37 -0
  167. package/lib/esm/adapter-express/render/engine.js +51 -0
  168. package/lib/esm/adapter-express/render/index.js +1 -0
  169. package/lib/esm/adapter-express/render/resolve-render.js +30 -0
  170. package/lib/esm/adapter-express/studio/index.js +1 -0
  171. package/lib/esm/adapter-express/studio/studio-integration.js +184 -0
  172. package/lib/esm/index.mjs +1 -0
  173. package/lib/esm/package.json +3 -0
  174. package/lib/esm/types/adapter-express/application-express.base.d.ts +77 -0
  175. package/lib/esm/types/adapter-express/application-express.d.ts +411 -0
  176. package/lib/esm/types/adapter-express/application-express.types.d.ts +23 -0
  177. package/lib/esm/types/adapter-express/express-utils/base-middleware.d.ts +8 -0
  178. package/lib/esm/types/adapter-express/express-utils/conditional-middleware.d.ts +97 -0
  179. package/lib/esm/types/adapter-express/express-utils/constants.d.ts +57 -0
  180. package/lib/esm/types/adapter-express/express-utils/content/httpContent.d.ts +6 -0
  181. package/lib/esm/types/adapter-express/express-utils/content-negotiation-decorators.d.ts +94 -0
  182. package/lib/esm/types/adapter-express/express-utils/decorators.d.ts +257 -0
  183. package/lib/esm/types/adapter-express/express-utils/exception-filter-decorators.d.ts +6 -0
  184. package/lib/esm/types/adapter-express/express-utils/guard-context-factory.d.ts +17 -0
  185. package/lib/esm/types/adapter-express/express-utils/guard-middleware.d.ts +22 -0
  186. package/lib/esm/types/adapter-express/express-utils/guard-utils.d.ts +11 -0
  187. package/lib/esm/types/adapter-express/express-utils/http-context-store.d.ts +20 -0
  188. package/lib/esm/types/adapter-express/express-utils/http-status-middleware.d.ts +26 -0
  189. package/lib/esm/types/adapter-express/express-utils/httpResponseMessage.d.ts +14 -0
  190. package/lib/esm/types/adapter-express/express-utils/index.d.ts +30 -0
  191. package/lib/esm/types/adapter-express/express-utils/interceptor-middleware.d.ts +40 -0
  192. package/lib/esm/types/adapter-express/express-utils/interfaces.d.ts +115 -0
  193. package/lib/esm/types/adapter-express/express-utils/inversify-express-server.d.ts +172 -0
  194. package/lib/esm/types/adapter-express/express-utils/lazy-module-middleware.d.ts +122 -0
  195. package/lib/esm/types/adapter-express/express-utils/middleware-composition.d.ts +85 -0
  196. package/lib/esm/types/adapter-express/express-utils/permission-preloader.middleware.d.ts +10 -0
  197. package/lib/esm/types/adapter-express/express-utils/resolver-multer.d.ts +7 -0
  198. package/lib/esm/types/adapter-express/express-utils/route-constraints.d.ts +89 -0
  199. package/lib/esm/types/adapter-express/express-utils/scope-extractor.d.ts +21 -0
  200. package/lib/esm/types/adapter-express/express-utils/scope-extractor.interface.d.ts +12 -0
  201. package/lib/esm/types/adapter-express/express-utils/setup-authorization.d.ts +34 -0
  202. package/lib/esm/types/adapter-express/express-utils/setup-event-system.d.ts +118 -0
  203. package/lib/esm/types/adapter-express/express-utils/setup-interceptors.d.ts +115 -0
  204. package/lib/esm/types/adapter-express/express-utils/setup-lazy-loading.d.ts +123 -0
  205. package/lib/esm/types/adapter-express/express-utils/utils.d.ts +24 -0
  206. package/lib/esm/types/adapter-express/express-utils/validation-decorators.d.ts +145 -0
  207. package/lib/esm/types/adapter-express/express-utils/validation-service.d.ts +88 -0
  208. package/lib/esm/types/adapter-express/index.d.ts +7 -0
  209. package/lib/esm/types/adapter-express/micro-api/application-express-micro-container.d.ts +47 -0
  210. package/lib/esm/types/adapter-express/micro-api/application-express-micro-route.d.ts +104 -0
  211. package/lib/esm/types/adapter-express/micro-api/application-express-micro.d.ts +72 -0
  212. package/lib/esm/types/adapter-express/micro-api/gateway/circuit-breaker.d.ts +111 -0
  213. package/lib/esm/types/adapter-express/micro-api/gateway/index.d.ts +5 -0
  214. package/lib/esm/types/adapter-express/micro-api/gateway/service-proxy.d.ts +83 -0
  215. package/lib/esm/types/adapter-express/micro-api/index.d.ts +7 -0
  216. package/lib/esm/types/adapter-express/micro-api/micro.d.ts +66 -0
  217. package/lib/esm/types/adapter-express/micro-api/queue/index.d.ts +5 -0
  218. package/lib/esm/types/adapter-express/micro-api/queue/queue.interface.d.ts +60 -0
  219. package/lib/esm/types/adapter-express/micro-api/queue/rabbitmq-consumer.d.ts +86 -0
  220. package/lib/esm/types/adapter-express/micro-api/serverless/aws-lambda.adapter.d.ts +77 -0
  221. package/lib/esm/types/adapter-express/micro-api/serverless/cloudflare.adapter.d.ts +64 -0
  222. package/lib/esm/types/adapter-express/micro-api/serverless/index.d.ts +6 -0
  223. package/lib/esm/types/adapter-express/micro-api/serverless/vercel.adapter.d.ts +56 -0
  224. package/lib/esm/types/adapter-express/micro-api/service-mesh/index.d.ts +5 -0
  225. package/lib/esm/types/adapter-express/micro-api/service-mesh/service-client.d.ts +122 -0
  226. package/lib/esm/types/adapter-express/micro-api/service-mesh/service-discovery.d.ts +150 -0
  227. package/lib/esm/types/adapter-express/middleware/index.d.ts +5 -0
  228. package/lib/esm/types/adapter-express/middleware/request-logging.middleware.d.ts +65 -0
  229. package/lib/esm/types/adapter-express/render/constants.d.ts +26 -0
  230. package/lib/esm/types/adapter-express/render/engine.d.ts +20 -0
  231. package/lib/esm/types/adapter-express/render/index.d.ts +5 -0
  232. package/lib/esm/types/adapter-express/render/resolve-render.d.ts +7 -0
  233. package/lib/esm/types/adapter-express/studio/index.d.ts +1 -0
  234. package/lib/esm/types/adapter-express/studio/studio-integration.d.ts +92 -0
  235. package/lib/esm/types/index.d.ts +1 -0
  236. package/lib/package.json +156 -146
  237. package/package.json +156 -146
  238. package/lib/cjs/di/di.interfaces.js +0 -10
  239. package/lib/cjs/types/di/di.interfaces.d.ts +0 -289
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.GuardContextFactory = void 0;
16
+ require("reflect-metadata");
17
+ const core_1 = require("@expressots/core");
18
+ const http_context_store_js_1 = require("./http-context-store.js");
19
+ /**
20
+ * Factory for creating GuardContext from Express request/response
21
+ */
22
+ let GuardContextFactory = class GuardContextFactory {
23
+ constructor(container, scopeExtractor) {
24
+ this.container = container;
25
+ this.scopeExtractor = scopeExtractor;
26
+ }
27
+ /**
28
+ * Create GuardContext from Express request/response
29
+ */
30
+ async create(req, res) {
31
+ // Get HttpContext (created by InversifyExpressServer's first middleware
32
+ // and stored in a per-request WeakMap; see http-context-store.ts).
33
+ const httpContext = (0, http_context_store_js_1.getHttpContext)(req);
34
+ if (!httpContext) {
35
+ throw new Error("HttpContext not found on request. Ensure InversifyExpressServer is properly configured.");
36
+ }
37
+ // Extract scope information
38
+ const scope = await this.scopeExtractor.extract(req);
39
+ // Extract route metadata
40
+ const route = {
41
+ controller:
42
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
43
+ req.__expressotsControllerName || "unknown",
44
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
45
+ method: req.__expressotsMethod || "unknown",
46
+ path: req.path,
47
+ params: req.params,
48
+ query: req.query,
49
+ };
50
+ // Create guard context
51
+ // Note: httpContext.user is Principal from adapter-express, but GuardContext expects Principal from core
52
+ // They have the same structure, so this is compatible
53
+ // Note: httpContext.container is inversifyInterfaces.Container, but GuardContext expects Container from core
54
+ // They are compatible, so we cast it
55
+ const context = {
56
+ request: req,
57
+ response: res,
58
+ principal: httpContext.user, // Cast to core Principal type (same structure)
59
+ container: httpContext.container, // Request-scoped child container!
60
+ scope,
61
+ route,
62
+ getScoped: (identifier, scopeName) => {
63
+ // Resolve with scope awareness
64
+ // Note: scopeName is optional and can be used for custom scopes (e.g., tenant)
65
+ if (scopeName) {
66
+ // For custom scopes, use named binding or scope registry
67
+ // For now, fallback to regular get (can be enhanced later)
68
+ return httpContext.container.get(identifier);
69
+ }
70
+ return httpContext.container.get(identifier);
71
+ },
72
+ getTenantId: () => scope.tenant,
73
+ getRequestId: () => scope.request,
74
+ };
75
+ return context;
76
+ }
77
+ };
78
+ exports.GuardContextFactory = GuardContextFactory;
79
+ exports.GuardContextFactory = GuardContextFactory = __decorate([
80
+ (0, core_1.injectable)(),
81
+ __param(0, (0, core_1.inject)(core_1.Container)),
82
+ __param(1, (0, core_1.inject)("IScopeExtractor")),
83
+ __metadata("design:paramtypes", [Object, Object])
84
+ ], GuardContextFactory);
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.GuardMiddleware = void 0;
16
+ const core_1 = require("@expressots/core");
17
+ const core_2 = require("@expressots/core");
18
+ const guard_context_factory_js_1 = require("./guard-context-factory.js");
19
+ const core_3 = require("@expressots/core");
20
+ /**
21
+ * Express middleware that executes guards before route handler
22
+ */
23
+ let GuardMiddleware = class GuardMiddleware {
24
+ constructor(executor, contextFactory, container) {
25
+ this.executor = executor;
26
+ this.contextFactory = contextFactory;
27
+ this.container = container;
28
+ /**
29
+ * Express middleware function
30
+ */
31
+ this.execute = async (req, res, next) => {
32
+ // Get request ID for flow tracking
33
+ const requestContext = core_1.ContextManager.getCurrentContext();
34
+ const requestId = requestContext?.requestId;
35
+ const flowTracker = requestId ? (0, core_1.findFlowTracker)(requestId) : undefined;
36
+ // Extract guards from route metadata (controller + method level)
37
+ const guards = this.extractGuards(req);
38
+ if (guards.length === 0) {
39
+ return next(); // No guards, proceed
40
+ }
41
+ // Start tracking guard execution
42
+ const guardNames = guards.map((g) => {
43
+ if (typeof g === "function") {
44
+ return g.name || "UnknownGuard";
45
+ }
46
+ return g.constructor.name;
47
+ });
48
+ const guardStepName = `Guards: ${guardNames.join(", ")}`;
49
+ if (flowTracker?.isEnabled()) {
50
+ flowTracker.startStep("guard", guardStepName, {
51
+ guardCount: guards.length,
52
+ guardNames,
53
+ });
54
+ }
55
+ try {
56
+ // Create guard context
57
+ const context = await this.contextFactory.create(req, res);
58
+ // Execute guards
59
+ const result = await this.executor.execute(guards, context);
60
+ if (!result.allowed) {
61
+ // End guard step with failure
62
+ if (flowTracker?.isEnabled()) {
63
+ flowTracker.failStep(result.error);
64
+ }
65
+ // Throw error to be caught by exception handler
66
+ throw result.error || core_3.AppError.forbidden("Access denied");
67
+ }
68
+ // End guard step with success
69
+ if (flowTracker?.isEnabled()) {
70
+ flowTracker.endStep("success");
71
+ }
72
+ next();
73
+ }
74
+ catch (error) {
75
+ // Store error on request for flow tracking
76
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
77
+ req.__expressotsFlowError =
78
+ error instanceof Error ? error : new Error(String(error));
79
+ // End guard step with failure if not already ended
80
+ if (flowTracker?.isEnabled()) {
81
+ const currentFlow = flowTracker.getFlow();
82
+ const lastStep = currentFlow.steps[currentFlow.steps.length - 1];
83
+ if (lastStep && lastStep.name === guardStepName && lastStep.status === "success") {
84
+ // Step was already ended, don't end again
85
+ }
86
+ else {
87
+ flowTracker.failStep(error instanceof Error ? error : undefined);
88
+ }
89
+ }
90
+ next(error);
91
+ }
92
+ };
93
+ }
94
+ /**
95
+ * Extract guards from request metadata
96
+ * @private
97
+ */
98
+ extractGuards(req) {
99
+ // Extract from request metadata (set during route registration)
100
+ const reqWithGuards = req;
101
+ const controllerGuards = reqWithGuards.__expressotsControllerGuards || [];
102
+ const methodGuards = reqWithGuards.__expressotsMethodGuards || [];
103
+ return [...controllerGuards, ...methodGuards];
104
+ }
105
+ };
106
+ exports.GuardMiddleware = GuardMiddleware;
107
+ exports.GuardMiddleware = GuardMiddleware = __decorate([
108
+ (0, core_1.injectable)(),
109
+ __param(0, (0, core_1.inject)(core_2.GuardExecutor)),
110
+ __param(1, (0, core_1.inject)(guard_context_factory_js_1.GuardContextFactory)),
111
+ __param(2, (0, core_1.inject)(core_1.Container)),
112
+ __metadata("design:paramtypes", [core_2.GuardExecutor,
113
+ guard_context_factory_js_1.GuardContextFactory,
114
+ core_1.Container])
115
+ ], GuardMiddleware);
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getControllerGuards = getControllerGuards;
4
+ exports.getMethodGuards = getMethodGuards;
5
+ require("reflect-metadata");
6
+ const core_1 = require("@expressots/core");
7
+ /**
8
+ * Extract guards from controller metadata
9
+ */
10
+ function getControllerGuards(constructor) {
11
+ return (Reflect.getMetadata(core_1.GUARD_METADATA_KEY.controllerGuards, constructor) || []);
12
+ }
13
+ /**
14
+ * Extract guards from method metadata
15
+ */
16
+ function getMethodGuards(constructor, methodName) {
17
+ return (Reflect.getMetadata(core_1.GUARD_METADATA_KEY.methodGuards, constructor, methodName) || []);
18
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setHttpContext = setHttpContext;
4
+ exports.getHttpContext = getHttpContext;
5
+ exports.hasHttpContext = hasHttpContext;
6
+ const httpContextByRequest = new WeakMap();
7
+ function setHttpContext(req, ctx) {
8
+ httpContextByRequest.set(req, ctx);
9
+ }
10
+ function getHttpContext(req) {
11
+ return httpContextByRequest.get(req);
12
+ }
13
+ function hasHttpContext(req) {
14
+ return httpContextByRequest.has(req);
15
+ }
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.HttpStatusCodeMiddleware = void 0;
4
4
  require("reflect-metadata");
5
5
  const core_1 = require("@expressots/core");
6
- const constants_1 = require("./constants");
6
+ const constants_js_1 = require("./constants.js");
7
7
  /**
8
8
  * Middleware that applies the status code to the response.
9
9
  * @returns express.RequestHandler
@@ -14,7 +14,7 @@ class HttpStatusCodeMiddleware extends core_1.ExpressoMiddleware {
14
14
  this.globalPrefix = globalPrefix;
15
15
  }
16
16
  use(req, res, next) {
17
- const statusCodeMapping = Reflect.getMetadata(constants_1.HTTP_CODE_METADATA.httpCode, Reflect);
17
+ const statusCodeMapping = Reflect.getMetadata(constants_js_1.HTTP_CODE_METADATA.httpCode, Reflect);
18
18
  let path = req.path;
19
19
  if (this.globalPrefix !== "/" && path.startsWith(this.globalPrefix)) {
20
20
  path = path.slice(this.globalPrefix.length);
@@ -23,18 +23,53 @@ class HttpStatusCodeMiddleware extends core_1.ExpressoMiddleware {
23
23
  const formattedMethod = req.method.toLowerCase();
24
24
  path = `${path || "/"}/-${formattedMethod}`;
25
25
  const statusCode = statusCodeMapping[path];
26
+ let explicitStatus = null;
26
27
  if (statusCode) {
27
28
  res.status(statusCode);
29
+ explicitStatus = statusCode;
28
30
  }
29
31
  else {
30
32
  const patternMatchStatusCode = this.findMatchingParameterPath(path, statusCodeMapping);
31
33
  if (patternMatchStatusCode) {
32
34
  res.status(patternMatchStatusCode);
35
+ explicitStatus = patternMatchStatusCode;
33
36
  }
34
37
  else {
35
38
  this.setDefaultStatusCode(req, res);
36
39
  }
37
40
  }
41
+ /**
42
+ * When @Http(...) declares an explicit status, honor it even when the
43
+ * client sent conditional headers (If-None-Match / If-Modified-Since).
44
+ *
45
+ * Without this, Express's `res.send()` evaluates `req.fresh` (which is
46
+ * `true` for any 2xx status whose ETag matches the request's
47
+ * If-None-Match) and silently rewrites our 201/202/206/etc. into 304
48
+ * Not Modified. That makes @Http() unreliable in any caching
49
+ * environment — including a developer hitting refresh in their
50
+ * browser. We override `req.fresh` to always return `false` for this
51
+ * one response so the explicit status wins.
52
+ *
53
+ * For the 200 default we leave Express's freshness behavior alone, so
54
+ * normal GET caching still works as expected.
55
+ */
56
+ if (explicitStatus !== null && explicitStatus !== 200) {
57
+ try {
58
+ Object.defineProperty(req, "fresh", {
59
+ configurable: true,
60
+ enumerable: true,
61
+ get: () => false,
62
+ });
63
+ }
64
+ catch {
65
+ // Some proxied / decorated request objects make this property
66
+ // non-configurable. In that case we fall back to stripping the
67
+ // conditional headers entirely, which has the same effect on
68
+ // Express's freshness check.
69
+ delete req.headers["if-none-match"];
70
+ delete req.headers["if-modified-since"];
71
+ }
72
+ }
38
73
  next();
39
74
  }
40
75
  /**
@@ -14,4 +14,70 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./decorators"), exports);
17
+ exports.hasHttpContext = exports.getHttpContext = exports.ValidationService = exports.hasValidationMetadata = exports.getValidationMetadata = exports.Validate = exports.validatedHeaders = exports.validatedParam = exports.validatedQuery = exports.validatedBody = exports.createRouteMappings = exports.createLazyModuleMiddleware = exports.setupLazyLoadingForExpress = exports.setupInterceptorsForExpress = exports.setupEventSystemForExpress = exports.setupAuthorizationForExpress = exports.TYPE = exports.PermissionPreloaderMiddleware = exports.ScopeExtractor = exports.createInterceptorMiddleware = exports.InterceptorMiddleware = exports.GuardMiddleware = exports.GuardContextFactory = exports.getMethodGuards = exports.getControllerGuards = exports.UseFilters = exports.Catch = exports.isComposedMiddleware = exports.sequence = exports.combine = exports.isConditionalMiddleware = exports.unless = exports.when = exports.pattern = exports.Patterns = exports.StreamResponse = exports.YamlOptions = exports.XmlOptions = exports.CsvOptions = exports.Produces = exports.Consumes = exports.Accept = void 0;
18
+ __exportStar(require("./decorators.js"), exports);
19
+ var content_negotiation_decorators_js_1 = require("./content-negotiation-decorators.js");
20
+ Object.defineProperty(exports, "Accept", { enumerable: true, get: function () { return content_negotiation_decorators_js_1.Accept; } });
21
+ Object.defineProperty(exports, "Consumes", { enumerable: true, get: function () { return content_negotiation_decorators_js_1.Consumes; } });
22
+ Object.defineProperty(exports, "Produces", { enumerable: true, get: function () { return content_negotiation_decorators_js_1.Produces; } });
23
+ Object.defineProperty(exports, "CsvOptions", { enumerable: true, get: function () { return content_negotiation_decorators_js_1.CsvOptions; } });
24
+ Object.defineProperty(exports, "XmlOptions", { enumerable: true, get: function () { return content_negotiation_decorators_js_1.XmlOptions; } });
25
+ Object.defineProperty(exports, "YamlOptions", { enumerable: true, get: function () { return content_negotiation_decorators_js_1.YamlOptions; } });
26
+ Object.defineProperty(exports, "StreamResponse", { enumerable: true, get: function () { return content_negotiation_decorators_js_1.StreamResponse; } });
27
+ var route_constraints_js_1 = require("./route-constraints.js");
28
+ Object.defineProperty(exports, "Patterns", { enumerable: true, get: function () { return route_constraints_js_1.Patterns; } });
29
+ Object.defineProperty(exports, "pattern", { enumerable: true, get: function () { return route_constraints_js_1.pattern; } });
30
+ var conditional_middleware_js_1 = require("./conditional-middleware.js");
31
+ Object.defineProperty(exports, "when", { enumerable: true, get: function () { return conditional_middleware_js_1.when; } });
32
+ Object.defineProperty(exports, "unless", { enumerable: true, get: function () { return conditional_middleware_js_1.unless; } });
33
+ Object.defineProperty(exports, "isConditionalMiddleware", { enumerable: true, get: function () { return conditional_middleware_js_1.isConditionalMiddleware; } });
34
+ var middleware_composition_js_1 = require("./middleware-composition.js");
35
+ Object.defineProperty(exports, "combine", { enumerable: true, get: function () { return middleware_composition_js_1.combine; } });
36
+ Object.defineProperty(exports, "sequence", { enumerable: true, get: function () { return middleware_composition_js_1.sequence; } });
37
+ Object.defineProperty(exports, "isComposedMiddleware", { enumerable: true, get: function () { return middleware_composition_js_1.isComposedMiddleware; } });
38
+ var exception_filter_decorators_js_1 = require("./exception-filter-decorators.js");
39
+ Object.defineProperty(exports, "Catch", { enumerable: true, get: function () { return exception_filter_decorators_js_1.Catch; } });
40
+ Object.defineProperty(exports, "UseFilters", { enumerable: true, get: function () { return exception_filter_decorators_js_1.UseFilters; } });
41
+ var guard_utils_js_1 = require("./guard-utils.js");
42
+ Object.defineProperty(exports, "getControllerGuards", { enumerable: true, get: function () { return guard_utils_js_1.getControllerGuards; } });
43
+ Object.defineProperty(exports, "getMethodGuards", { enumerable: true, get: function () { return guard_utils_js_1.getMethodGuards; } });
44
+ var guard_context_factory_js_1 = require("./guard-context-factory.js");
45
+ Object.defineProperty(exports, "GuardContextFactory", { enumerable: true, get: function () { return guard_context_factory_js_1.GuardContextFactory; } });
46
+ var guard_middleware_js_1 = require("./guard-middleware.js");
47
+ Object.defineProperty(exports, "GuardMiddleware", { enumerable: true, get: function () { return guard_middleware_js_1.GuardMiddleware; } });
48
+ var interceptor_middleware_js_1 = require("./interceptor-middleware.js");
49
+ Object.defineProperty(exports, "InterceptorMiddleware", { enumerable: true, get: function () { return interceptor_middleware_js_1.InterceptorMiddleware; } });
50
+ Object.defineProperty(exports, "createInterceptorMiddleware", { enumerable: true, get: function () { return interceptor_middleware_js_1.createInterceptorMiddleware; } });
51
+ var scope_extractor_js_1 = require("./scope-extractor.js");
52
+ Object.defineProperty(exports, "ScopeExtractor", { enumerable: true, get: function () { return scope_extractor_js_1.ScopeExtractor; } });
53
+ var permission_preloader_middleware_js_1 = require("./permission-preloader.middleware.js");
54
+ Object.defineProperty(exports, "PermissionPreloaderMiddleware", { enumerable: true, get: function () { return permission_preloader_middleware_js_1.PermissionPreloaderMiddleware; } });
55
+ var constants_js_1 = require("./constants.js");
56
+ Object.defineProperty(exports, "TYPE", { enumerable: true, get: function () { return constants_js_1.TYPE; } });
57
+ var setup_authorization_js_1 = require("./setup-authorization.js");
58
+ Object.defineProperty(exports, "setupAuthorizationForExpress", { enumerable: true, get: function () { return setup_authorization_js_1.setupAuthorizationForExpress; } });
59
+ var setup_event_system_js_1 = require("./setup-event-system.js");
60
+ Object.defineProperty(exports, "setupEventSystemForExpress", { enumerable: true, get: function () { return setup_event_system_js_1.setupEventSystemForExpress; } });
61
+ var setup_interceptors_js_1 = require("./setup-interceptors.js");
62
+ Object.defineProperty(exports, "setupInterceptorsForExpress", { enumerable: true, get: function () { return setup_interceptors_js_1.setupInterceptorsForExpress; } });
63
+ var setup_lazy_loading_js_1 = require("./setup-lazy-loading.js");
64
+ Object.defineProperty(exports, "setupLazyLoadingForExpress", { enumerable: true, get: function () { return setup_lazy_loading_js_1.setupLazyLoadingForExpress; } });
65
+ var lazy_module_middleware_js_1 = require("./lazy-module-middleware.js");
66
+ Object.defineProperty(exports, "createLazyModuleMiddleware", { enumerable: true, get: function () { return lazy_module_middleware_js_1.createLazyModuleMiddleware; } });
67
+ Object.defineProperty(exports, "createRouteMappings", { enumerable: true, get: function () { return lazy_module_middleware_js_1.createRouteMappings; } });
68
+ // Validation decorators
69
+ var validation_decorators_js_1 = require("./validation-decorators.js");
70
+ Object.defineProperty(exports, "validatedBody", { enumerable: true, get: function () { return validation_decorators_js_1.validatedBody; } });
71
+ Object.defineProperty(exports, "validatedQuery", { enumerable: true, get: function () { return validation_decorators_js_1.validatedQuery; } });
72
+ Object.defineProperty(exports, "validatedParam", { enumerable: true, get: function () { return validation_decorators_js_1.validatedParam; } });
73
+ Object.defineProperty(exports, "validatedHeaders", { enumerable: true, get: function () { return validation_decorators_js_1.validatedHeaders; } });
74
+ Object.defineProperty(exports, "Validate", { enumerable: true, get: function () { return validation_decorators_js_1.Validate; } });
75
+ Object.defineProperty(exports, "getValidationMetadata", { enumerable: true, get: function () { return validation_decorators_js_1.getValidationMetadata; } });
76
+ Object.defineProperty(exports, "hasValidationMetadata", { enumerable: true, get: function () { return validation_decorators_js_1.hasValidationMetadata; } });
77
+ // Validation service
78
+ var validation_service_js_1 = require("./validation-service.js");
79
+ Object.defineProperty(exports, "ValidationService", { enumerable: true, get: function () { return validation_service_js_1.ValidationService; } });
80
+ // Per-request HttpContext (replaces reflect-metadata for hot path)
81
+ var http_context_store_js_1 = require("./http-context-store.js");
82
+ Object.defineProperty(exports, "getHttpContext", { enumerable: true, get: function () { return http_context_store_js_1.getHttpContext; } });
83
+ Object.defineProperty(exports, "hasHttpContext", { enumerable: true, get: function () { return http_context_store_js_1.hasHttpContext; } });
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.InterceptorMiddleware = void 0;
16
+ exports.createInterceptorMiddleware = createInterceptorMiddleware;
17
+ const core_1 = require("@expressots/core");
18
+ const core_2 = require("@expressots/core");
19
+ require("reflect-metadata");
20
+ /**
21
+ * Express middleware that executes interceptors around route handler
22
+ *
23
+ * @layer internal
24
+ * @audience framework-developers
25
+ *
26
+ * @summary Quick Start
27
+ * InterceptorMiddleware integrates the interceptor system with Express.
28
+ * It wraps the route handler with interceptors defined via @UseInterceptors().
29
+ *
30
+ * @internal
31
+ */
32
+ let InterceptorMiddleware = class InterceptorMiddleware {
33
+ constructor(executor, container) {
34
+ this.executor = executor;
35
+ this.container = container;
36
+ }
37
+ /**
38
+ * Create middleware for a specific controller and method
39
+ * @param controllerClass - Controller class
40
+ * @param methodName - Method name
41
+ * @param handler - Original route handler
42
+ */
43
+ createMiddleware(controllerClass, methodName, handler) {
44
+ return async (req, res, next) => {
45
+ // Get request ID for flow tracking
46
+ const requestContext = core_1.ContextManager.getCurrentContext();
47
+ const requestId = requestContext?.requestId;
48
+ const flowTracker = requestId ? (0, core_1.findFlowTracker)(requestId) : undefined;
49
+ // Extract interceptors from metadata
50
+ const interceptors = this.extractInterceptors(controllerClass, methodName);
51
+ if (interceptors.length === 0) {
52
+ // No interceptors, proceed directly
53
+ return handler(req, res, next)
54
+ .then(() => { })
55
+ .catch(next);
56
+ }
57
+ // Get interceptor names for tracking
58
+ const interceptorNames = interceptors.map((i) => {
59
+ if (typeof i === "function") {
60
+ return i.name || "UnknownInterceptor";
61
+ }
62
+ return i.constructor.name;
63
+ });
64
+ const interceptorStepName = `Interceptors: ${interceptorNames.join(", ")}`;
65
+ // Start tracking interceptor execution (using "middleware" type as interceptors are part of request pipeline)
66
+ if (flowTracker?.isEnabled()) {
67
+ flowTracker.startStep("middleware", interceptorStepName, {
68
+ interceptorCount: interceptors.length,
69
+ interceptorNames,
70
+ });
71
+ }
72
+ try {
73
+ // Create execution context
74
+ const context = (0, core_1.createExecutionContext)(req, res, this.container, controllerClass, String(methodName));
75
+ // Execute interceptors with handler
76
+ const result = await this.executor.execute(interceptors, context, async () => {
77
+ // This is the actual handler execution
78
+ const handlerResult = await handler(req, res, next);
79
+ return handlerResult;
80
+ });
81
+ // End interceptor step with success
82
+ if (flowTracker?.isEnabled()) {
83
+ flowTracker.endStep("success");
84
+ }
85
+ // If handler hasn't sent response and we have a result, set it
86
+ if (!res.headersSent && result !== undefined) {
87
+ // Store result for response handling
88
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
89
+ req.__expressotsInterceptorResult = result;
90
+ }
91
+ }
92
+ catch (error) {
93
+ // End interceptor step with failure
94
+ if (flowTracker?.isEnabled()) {
95
+ flowTracker.failStep(error instanceof Error ? error : undefined);
96
+ }
97
+ next(error);
98
+ }
99
+ };
100
+ }
101
+ /**
102
+ * Extract interceptors from controller and method metadata
103
+ * @private
104
+ */
105
+ extractInterceptors(controllerClass, methodName) {
106
+ // Get controller-level interceptors
107
+ const controllerInterceptors = Reflect.getMetadata(core_2.INTERCEPTOR_METADATA_KEY.controllerInterceptors, controllerClass) || [];
108
+ // Get method-level interceptors
109
+ const methodInterceptors = Reflect.getMetadata(core_2.INTERCEPTOR_METADATA_KEY.methodInterceptors, controllerClass, methodName) || [];
110
+ // Combine: controller + method level
111
+ return [...controllerInterceptors, ...methodInterceptors];
112
+ }
113
+ };
114
+ exports.InterceptorMiddleware = InterceptorMiddleware;
115
+ exports.InterceptorMiddleware = InterceptorMiddleware = __decorate([
116
+ (0, core_1.injectable)(),
117
+ __param(0, (0, core_1.inject)(core_1.InterceptorExecutor)),
118
+ __param(1, (0, core_1.inject)(core_1.Container)),
119
+ __metadata("design:paramtypes", [core_1.InterceptorExecutor,
120
+ core_1.Container])
121
+ ], InterceptorMiddleware);
122
+ /**
123
+ * Factory function to create interceptor middleware
124
+ * @param container - DI container
125
+ * @param controllerClass - Controller class
126
+ * @param methodName - Method name
127
+ * @param handler - Original handler
128
+ */
129
+ function createInterceptorMiddleware(container, controllerClass, methodName, handler) {
130
+ const middleware = container.get(InterceptorMiddleware);
131
+ return middleware.createMiddleware(controllerClass, methodName, handler);
132
+ }