@expressots/adapter-express 3.0.0 → 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 +31 -5
  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,115 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { inject, injectable, Container, ContextManager, findFlowTracker } from "@expressots/core";
14
+ import { GuardExecutor } from "@expressots/core";
15
+ import { GuardContextFactory } from "./guard-context-factory.js";
16
+ import { AppError } from "@expressots/core";
17
+ /**
18
+ * Express middleware that executes guards before route handler
19
+ */
20
+ let GuardMiddleware = class GuardMiddleware {
21
+ executor;
22
+ contextFactory;
23
+ container;
24
+ constructor(executor, contextFactory, container) {
25
+ this.executor = executor;
26
+ this.contextFactory = contextFactory;
27
+ this.container = container;
28
+ }
29
+ /**
30
+ * Express middleware function
31
+ */
32
+ execute = async (req, res, next) => {
33
+ // Get request ID for flow tracking
34
+ const requestContext = ContextManager.getCurrentContext();
35
+ const requestId = requestContext?.requestId;
36
+ const flowTracker = requestId ? findFlowTracker(requestId) : undefined;
37
+ // Extract guards from route metadata (controller + method level)
38
+ const guards = this.extractGuards(req);
39
+ if (guards.length === 0) {
40
+ return next(); // No guards, proceed
41
+ }
42
+ // Start tracking guard execution
43
+ const guardNames = guards.map((g) => {
44
+ if (typeof g === "function") {
45
+ return g.name || "UnknownGuard";
46
+ }
47
+ return g.constructor.name;
48
+ });
49
+ const guardStepName = `Guards: ${guardNames.join(", ")}`;
50
+ if (flowTracker?.isEnabled()) {
51
+ flowTracker.startStep("guard", guardStepName, {
52
+ guardCount: guards.length,
53
+ guardNames,
54
+ });
55
+ }
56
+ try {
57
+ // Create guard context
58
+ const context = await this.contextFactory.create(req, res);
59
+ // Execute guards
60
+ const result = await this.executor.execute(guards, context);
61
+ if (!result.allowed) {
62
+ // End guard step with failure
63
+ if (flowTracker?.isEnabled()) {
64
+ flowTracker.failStep(result.error);
65
+ }
66
+ // Throw error to be caught by exception handler
67
+ throw result.error || AppError.forbidden("Access denied");
68
+ }
69
+ // End guard step with success
70
+ if (flowTracker?.isEnabled()) {
71
+ flowTracker.endStep("success");
72
+ }
73
+ next();
74
+ }
75
+ catch (error) {
76
+ // Store error on request for flow tracking
77
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
78
+ req.__expressotsFlowError =
79
+ error instanceof Error ? error : new Error(String(error));
80
+ // End guard step with failure if not already ended
81
+ if (flowTracker?.isEnabled()) {
82
+ const currentFlow = flowTracker.getFlow();
83
+ const lastStep = currentFlow.steps[currentFlow.steps.length - 1];
84
+ if (lastStep && lastStep.name === guardStepName && lastStep.status === "success") {
85
+ // Step was already ended, don't end again
86
+ }
87
+ else {
88
+ flowTracker.failStep(error instanceof Error ? error : undefined);
89
+ }
90
+ }
91
+ next(error);
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
+ GuardMiddleware = __decorate([
107
+ injectable(),
108
+ __param(0, inject(GuardExecutor)),
109
+ __param(1, inject(GuardContextFactory)),
110
+ __param(2, inject(Container)),
111
+ __metadata("design:paramtypes", [GuardExecutor,
112
+ GuardContextFactory,
113
+ Container])
114
+ ], GuardMiddleware);
115
+ export { GuardMiddleware };
@@ -0,0 +1,14 @@
1
+ import "reflect-metadata";
2
+ import { GUARD_METADATA_KEY } from "@expressots/core";
3
+ /**
4
+ * Extract guards from controller metadata
5
+ */
6
+ export function getControllerGuards(constructor) {
7
+ return (Reflect.getMetadata(GUARD_METADATA_KEY.controllerGuards, constructor) || []);
8
+ }
9
+ /**
10
+ * Extract guards from method metadata
11
+ */
12
+ export function getMethodGuards(constructor, methodName) {
13
+ return (Reflect.getMetadata(GUARD_METADATA_KEY.methodGuards, constructor, methodName) || []);
14
+ }
@@ -0,0 +1,10 @@
1
+ const httpContextByRequest = new WeakMap();
2
+ export function setHttpContext(req, ctx) {
3
+ httpContextByRequest.set(req, ctx);
4
+ }
5
+ export function getHttpContext(req) {
6
+ return httpContextByRequest.get(req);
7
+ }
8
+ export function hasHttpContext(req) {
9
+ return httpContextByRequest.has(req);
10
+ }
@@ -0,0 +1,116 @@
1
+ import "reflect-metadata";
2
+ import { ExpressoMiddleware } from "@expressots/core";
3
+ import { HTTP_CODE_METADATA } from "./constants.js";
4
+ /**
5
+ * Middleware that applies the status code to the response.
6
+ * @returns express.RequestHandler
7
+ */
8
+ export class HttpStatusCodeMiddleware extends ExpressoMiddleware {
9
+ globalPrefix;
10
+ constructor(globalPrefix = "/") {
11
+ super();
12
+ this.globalPrefix = globalPrefix;
13
+ }
14
+ use(req, res, next) {
15
+ const statusCodeMapping = Reflect.getMetadata(HTTP_CODE_METADATA.httpCode, Reflect);
16
+ let path = req.path;
17
+ if (this.globalPrefix !== "/" && path.startsWith(this.globalPrefix)) {
18
+ path = path.slice(this.globalPrefix.length);
19
+ }
20
+ path = path.endsWith("/") ? path.slice(0, -1) : path;
21
+ const formattedMethod = req.method.toLowerCase();
22
+ path = `${path || "/"}/-${formattedMethod}`;
23
+ const statusCode = statusCodeMapping[path];
24
+ let explicitStatus = null;
25
+ if (statusCode) {
26
+ res.status(statusCode);
27
+ explicitStatus = statusCode;
28
+ }
29
+ else {
30
+ const patternMatchStatusCode = this.findMatchingParameterPath(path, statusCodeMapping);
31
+ if (patternMatchStatusCode) {
32
+ res.status(patternMatchStatusCode);
33
+ explicitStatus = patternMatchStatusCode;
34
+ }
35
+ else {
36
+ this.setDefaultStatusCode(req, res);
37
+ }
38
+ }
39
+ /**
40
+ * When @Http(...) declares an explicit status, honor it even when the
41
+ * client sent conditional headers (If-None-Match / If-Modified-Since).
42
+ *
43
+ * Without this, Express's `res.send()` evaluates `req.fresh` (which is
44
+ * `true` for any 2xx status whose ETag matches the request's
45
+ * If-None-Match) and silently rewrites our 201/202/206/etc. into 304
46
+ * Not Modified. That makes @Http() unreliable in any caching
47
+ * environment — including a developer hitting refresh in their
48
+ * browser. We override `req.fresh` to always return `false` for this
49
+ * one response so the explicit status wins.
50
+ *
51
+ * For the 200 default we leave Express's freshness behavior alone, so
52
+ * normal GET caching still works as expected.
53
+ */
54
+ if (explicitStatus !== null && explicitStatus !== 200) {
55
+ try {
56
+ Object.defineProperty(req, "fresh", {
57
+ configurable: true,
58
+ enumerable: true,
59
+ get: () => false,
60
+ });
61
+ }
62
+ catch {
63
+ // Some proxied / decorated request objects make this property
64
+ // non-configurable. In that case we fall back to stripping the
65
+ // conditional headers entirely, which has the same effect on
66
+ // Express's freshness check.
67
+ delete req.headers["if-none-match"];
68
+ delete req.headers["if-modified-since"];
69
+ }
70
+ }
71
+ next();
72
+ }
73
+ /**
74
+ * Find the matching parameter path.
75
+ * @param path - The path to match.
76
+ * @param mapping - The mapping to check.
77
+ * @param method - The method to check.
78
+ * @returns The status code if found, otherwise null.
79
+ **/
80
+ findMatchingParameterPath(path, mapping) {
81
+ for (const pathCode in mapping) {
82
+ const patternCheck = new RegExp("^" + pathCode.replace(/:[^\s/]+/g, "([^/]+)") + "$");
83
+ if (patternCheck.test(path)) {
84
+ return mapping[pathCode];
85
+ }
86
+ }
87
+ return null;
88
+ }
89
+ /**
90
+ * Set the default status code based on the request method.
91
+ * @param req - The request object.
92
+ * @param res - The response object.
93
+ **/
94
+ setDefaultStatusCode(req, res) {
95
+ switch (req.method.toLowerCase()) {
96
+ case "get":
97
+ res.statusCode = 200;
98
+ break;
99
+ case "post":
100
+ res.statusCode = 201;
101
+ break;
102
+ case "put":
103
+ res.statusCode = 204;
104
+ break;
105
+ case "patch":
106
+ res.statusCode = 204;
107
+ break;
108
+ case "delete":
109
+ res.statusCode = 204;
110
+ break;
111
+ default:
112
+ res.statusCode = 200;
113
+ break;
114
+ }
115
+ }
116
+ }
@@ -0,0 +1,29 @@
1
+ export class HttpResponseMessage {
2
+ _content;
3
+ _headers = {};
4
+ get headers() {
5
+ return this._headers;
6
+ }
7
+ set headers(headers) {
8
+ this._headers = headers;
9
+ }
10
+ get content() {
11
+ return this._content;
12
+ }
13
+ set content(value) {
14
+ this._content = value;
15
+ }
16
+ _statusCode;
17
+ get statusCode() {
18
+ return this._statusCode;
19
+ }
20
+ set statusCode(code) {
21
+ if (code < 0 || code > 999) {
22
+ throw new Error(`${code} is not a valid status code`);
23
+ }
24
+ this._statusCode = code;
25
+ }
26
+ constructor(statusCode = 200) {
27
+ this.statusCode = statusCode;
28
+ }
29
+ }
@@ -0,0 +1,24 @@
1
+ export * from "./decorators.js";
2
+ export { Accept, Consumes, Produces, CsvOptions, XmlOptions, YamlOptions, StreamResponse, } from "./content-negotiation-decorators.js";
3
+ export { Patterns, pattern } from "./route-constraints.js";
4
+ export { when, unless, isConditionalMiddleware } from "./conditional-middleware.js";
5
+ export { combine, sequence, isComposedMiddleware } from "./middleware-composition.js";
6
+ export { Catch, UseFilters } from "./exception-filter-decorators.js";
7
+ export { getControllerGuards, getMethodGuards } from "./guard-utils.js";
8
+ export { GuardContextFactory } from "./guard-context-factory.js";
9
+ export { GuardMiddleware } from "./guard-middleware.js";
10
+ export { InterceptorMiddleware, createInterceptorMiddleware } from "./interceptor-middleware.js";
11
+ export { ScopeExtractor } from "./scope-extractor.js";
12
+ export { PermissionPreloaderMiddleware } from "./permission-preloader.middleware.js";
13
+ export { TYPE } from "./constants.js";
14
+ export { setupAuthorizationForExpress } from "./setup-authorization.js";
15
+ export { setupEventSystemForExpress } from "./setup-event-system.js";
16
+ export { setupInterceptorsForExpress } from "./setup-interceptors.js";
17
+ export { setupLazyLoadingForExpress } from "./setup-lazy-loading.js";
18
+ export { createLazyModuleMiddleware, createRouteMappings } from "./lazy-module-middleware.js";
19
+ // Validation decorators
20
+ export { validatedBody, validatedQuery, validatedParam, validatedHeaders, Validate, getValidationMetadata, hasValidationMetadata, } from "./validation-decorators.js";
21
+ // Validation service
22
+ export { ValidationService } from "./validation-service.js";
23
+ // Per-request HttpContext (replaces reflect-metadata for hot path)
24
+ export { getHttpContext, hasHttpContext } from "./http-context-store.js";
@@ -0,0 +1,130 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { inject, injectable, Container, ContextManager, findFlowTracker, InterceptorExecutor, createExecutionContext, } from "@expressots/core";
14
+ import { INTERCEPTOR_METADATA_KEY } from "@expressots/core";
15
+ import "reflect-metadata";
16
+ /**
17
+ * Express middleware that executes interceptors around route handler
18
+ *
19
+ * @layer internal
20
+ * @audience framework-developers
21
+ *
22
+ * @summary Quick Start
23
+ * InterceptorMiddleware integrates the interceptor system with Express.
24
+ * It wraps the route handler with interceptors defined via @UseInterceptors().
25
+ *
26
+ * @internal
27
+ */
28
+ let InterceptorMiddleware = class InterceptorMiddleware {
29
+ executor;
30
+ container;
31
+ constructor(executor, container) {
32
+ this.executor = executor;
33
+ this.container = container;
34
+ }
35
+ /**
36
+ * Create middleware for a specific controller and method
37
+ * @param controllerClass - Controller class
38
+ * @param methodName - Method name
39
+ * @param handler - Original route handler
40
+ */
41
+ createMiddleware(controllerClass, methodName, handler) {
42
+ return async (req, res, next) => {
43
+ // Get request ID for flow tracking
44
+ const requestContext = ContextManager.getCurrentContext();
45
+ const requestId = requestContext?.requestId;
46
+ const flowTracker = requestId ? findFlowTracker(requestId) : undefined;
47
+ // Extract interceptors from metadata
48
+ const interceptors = this.extractInterceptors(controllerClass, methodName);
49
+ if (interceptors.length === 0) {
50
+ // No interceptors, proceed directly
51
+ return handler(req, res, next)
52
+ .then(() => { })
53
+ .catch(next);
54
+ }
55
+ // Get interceptor names for tracking
56
+ const interceptorNames = interceptors.map((i) => {
57
+ if (typeof i === "function") {
58
+ return i.name || "UnknownInterceptor";
59
+ }
60
+ return i.constructor.name;
61
+ });
62
+ const interceptorStepName = `Interceptors: ${interceptorNames.join(", ")}`;
63
+ // Start tracking interceptor execution (using "middleware" type as interceptors are part of request pipeline)
64
+ if (flowTracker?.isEnabled()) {
65
+ flowTracker.startStep("middleware", interceptorStepName, {
66
+ interceptorCount: interceptors.length,
67
+ interceptorNames,
68
+ });
69
+ }
70
+ try {
71
+ // Create execution context
72
+ const context = createExecutionContext(req, res, this.container, controllerClass, String(methodName));
73
+ // Execute interceptors with handler
74
+ const result = await this.executor.execute(interceptors, context, async () => {
75
+ // This is the actual handler execution
76
+ const handlerResult = await handler(req, res, next);
77
+ return handlerResult;
78
+ });
79
+ // End interceptor step with success
80
+ if (flowTracker?.isEnabled()) {
81
+ flowTracker.endStep("success");
82
+ }
83
+ // If handler hasn't sent response and we have a result, set it
84
+ if (!res.headersSent && result !== undefined) {
85
+ // Store result for response handling
86
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
87
+ req.__expressotsInterceptorResult = result;
88
+ }
89
+ }
90
+ catch (error) {
91
+ // End interceptor step with failure
92
+ if (flowTracker?.isEnabled()) {
93
+ flowTracker.failStep(error instanceof Error ? error : undefined);
94
+ }
95
+ next(error);
96
+ }
97
+ };
98
+ }
99
+ /**
100
+ * Extract interceptors from controller and method metadata
101
+ * @private
102
+ */
103
+ extractInterceptors(controllerClass, methodName) {
104
+ // Get controller-level interceptors
105
+ const controllerInterceptors = Reflect.getMetadata(INTERCEPTOR_METADATA_KEY.controllerInterceptors, controllerClass) || [];
106
+ // Get method-level interceptors
107
+ const methodInterceptors = Reflect.getMetadata(INTERCEPTOR_METADATA_KEY.methodInterceptors, controllerClass, methodName) || [];
108
+ // Combine: controller + method level
109
+ return [...controllerInterceptors, ...methodInterceptors];
110
+ }
111
+ };
112
+ InterceptorMiddleware = __decorate([
113
+ injectable(),
114
+ __param(0, inject(InterceptorExecutor)),
115
+ __param(1, inject(Container)),
116
+ __metadata("design:paramtypes", [InterceptorExecutor,
117
+ Container])
118
+ ], InterceptorMiddleware);
119
+ export { InterceptorMiddleware };
120
+ /**
121
+ * Factory function to create interceptor middleware
122
+ * @param container - DI container
123
+ * @param controllerClass - Controller class
124
+ * @param methodName - Method name
125
+ * @param handler - Original handler
126
+ */
127
+ export function createInterceptorMiddleware(container, controllerClass, methodName, handler) {
128
+ const middleware = container.get(InterceptorMiddleware);
129
+ return middleware.createMiddleware(controllerClass, methodName, handler);
130
+ }