@expressots/adapter-express 3.0.0 → 4.0.0-preview.3

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 (244) hide show
  1. package/LICENSE.md +21 -21
  2. package/README.md +61 -118
  3. package/lib/CHANGELOG.md +36 -5
  4. package/lib/README.md +61 -118
  5. package/lib/cjs/adapter-express/application-express.base.js +3 -1
  6. package/lib/cjs/adapter-express/application-express.js +1405 -85
  7. package/lib/cjs/adapter-express/express-utils/conditional-middleware.js +102 -0
  8. package/lib/cjs/adapter-express/express-utils/constants.js +17 -0
  9. package/lib/cjs/adapter-express/express-utils/content-negotiation-decorators.js +129 -0
  10. package/lib/cjs/adapter-express/express-utils/decorators.js +225 -59
  11. package/lib/cjs/adapter-express/express-utils/exception-filter-decorators.js +11 -0
  12. package/lib/cjs/adapter-express/express-utils/guard-context-factory.js +84 -0
  13. package/lib/cjs/adapter-express/express-utils/guard-middleware.js +115 -0
  14. package/lib/cjs/adapter-express/express-utils/guard-utils.js +18 -0
  15. package/lib/cjs/adapter-express/express-utils/http-context-store.js +15 -0
  16. package/lib/cjs/adapter-express/express-utils/http-status-middleware.js +37 -2
  17. package/lib/cjs/adapter-express/express-utils/index.js +67 -1
  18. package/lib/cjs/adapter-express/express-utils/interceptor-middleware.js +132 -0
  19. package/lib/cjs/adapter-express/express-utils/inversify-express-server.js +827 -64
  20. package/lib/cjs/adapter-express/express-utils/lazy-module-middleware.js +241 -0
  21. package/lib/cjs/adapter-express/express-utils/middleware-composition.js +95 -0
  22. package/lib/cjs/adapter-express/express-utils/path-pattern-compat.js +129 -0
  23. package/lib/cjs/adapter-express/express-utils/permission-preloader.middleware.js +48 -0
  24. package/lib/cjs/adapter-express/express-utils/route-constraints.js +104 -0
  25. package/lib/cjs/adapter-express/express-utils/scope-extractor.interface.js +2 -0
  26. package/lib/cjs/adapter-express/express-utils/scope-extractor.js +66 -0
  27. package/lib/cjs/adapter-express/express-utils/setup-authorization.js +71 -0
  28. package/lib/cjs/adapter-express/express-utils/setup-event-system.js +113 -0
  29. package/lib/cjs/adapter-express/express-utils/setup-interceptors.js +103 -0
  30. package/lib/cjs/adapter-express/express-utils/setup-lazy-loading.js +228 -0
  31. package/lib/cjs/adapter-express/express-utils/utils.js +30 -12
  32. package/lib/cjs/adapter-express/express-utils/validation-decorators.js +205 -0
  33. package/lib/cjs/adapter-express/express-utils/validation-service.js +252 -0
  34. package/lib/cjs/adapter-express/index.js +7 -5
  35. package/lib/cjs/adapter-express/micro-api/application-express-micro-route.js +31 -1
  36. package/lib/cjs/adapter-express/micro-api/application-express-micro.js +8 -38
  37. package/lib/cjs/adapter-express/micro-api/gateway/circuit-breaker.js +174 -0
  38. package/lib/cjs/adapter-express/micro-api/gateway/index.js +11 -0
  39. package/lib/cjs/adapter-express/micro-api/gateway/service-proxy.js +214 -0
  40. package/lib/cjs/adapter-express/micro-api/index.js +27 -3
  41. package/lib/cjs/adapter-express/micro-api/micro.js +272 -0
  42. package/lib/cjs/adapter-express/micro-api/queue/index.js +8 -0
  43. package/lib/cjs/adapter-express/micro-api/queue/queue.interface.js +2 -0
  44. package/lib/cjs/adapter-express/micro-api/queue/rabbitmq-consumer.js +255 -0
  45. package/lib/cjs/adapter-express/micro-api/serverless/aws-lambda.adapter.js +183 -0
  46. package/lib/cjs/adapter-express/micro-api/serverless/cloudflare.adapter.js +158 -0
  47. package/lib/cjs/adapter-express/micro-api/serverless/index.js +12 -0
  48. package/lib/cjs/adapter-express/micro-api/serverless/vercel.adapter.js +102 -0
  49. package/lib/cjs/adapter-express/micro-api/service-mesh/index.js +10 -0
  50. package/lib/cjs/adapter-express/micro-api/service-mesh/service-client.js +194 -0
  51. package/lib/cjs/adapter-express/micro-api/service-mesh/service-discovery.js +261 -0
  52. package/lib/cjs/adapter-express/middleware/index.js +21 -0
  53. package/lib/cjs/adapter-express/middleware/request-logging.middleware.js +244 -0
  54. package/lib/cjs/adapter-express/render/engine.js +15 -15
  55. package/lib/cjs/adapter-express/render/index.js +5 -0
  56. package/lib/cjs/adapter-express/studio/index.js +10 -0
  57. package/lib/cjs/adapter-express/studio/studio-integration.js +267 -0
  58. package/lib/cjs/index.js +1 -1
  59. package/lib/cjs/types/adapter-express/application-express.base.d.ts +20 -7
  60. package/lib/cjs/types/adapter-express/application-express.d.ts +316 -33
  61. package/lib/cjs/types/adapter-express/express-utils/base-middleware.d.ts +2 -2
  62. package/lib/cjs/types/adapter-express/express-utils/conditional-middleware.d.ts +97 -0
  63. package/lib/cjs/types/adapter-express/express-utils/constants.d.ts +13 -0
  64. package/lib/cjs/types/adapter-express/express-utils/content-negotiation-decorators.d.ts +94 -0
  65. package/lib/cjs/types/adapter-express/express-utils/decorators.d.ts +54 -6
  66. package/lib/cjs/types/adapter-express/express-utils/exception-filter-decorators.d.ts +6 -0
  67. package/lib/cjs/types/adapter-express/express-utils/guard-context-factory.d.ts +17 -0
  68. package/lib/cjs/types/adapter-express/express-utils/guard-middleware.d.ts +22 -0
  69. package/lib/cjs/types/adapter-express/express-utils/guard-utils.d.ts +11 -0
  70. package/lib/cjs/types/adapter-express/express-utils/http-context-store.d.ts +20 -0
  71. package/lib/cjs/types/adapter-express/express-utils/httpResponseMessage.d.ts +1 -1
  72. package/lib/cjs/types/adapter-express/express-utils/index.d.ts +30 -2
  73. package/lib/cjs/types/adapter-express/express-utils/interceptor-middleware.d.ts +40 -0
  74. package/lib/cjs/types/adapter-express/express-utils/interfaces.d.ts +42 -5
  75. package/lib/cjs/types/adapter-express/express-utils/inversify-express-server.d.ts +114 -2
  76. package/lib/cjs/types/adapter-express/express-utils/lazy-module-middleware.d.ts +122 -0
  77. package/lib/cjs/types/adapter-express/express-utils/middleware-composition.d.ts +85 -0
  78. package/lib/cjs/types/adapter-express/express-utils/path-pattern-compat.d.ts +66 -0
  79. package/lib/cjs/types/adapter-express/express-utils/permission-preloader.middleware.d.ts +10 -0
  80. package/lib/cjs/types/adapter-express/express-utils/route-constraints.d.ts +98 -0
  81. package/lib/cjs/types/adapter-express/express-utils/scope-extractor.d.ts +21 -0
  82. package/lib/cjs/types/adapter-express/express-utils/scope-extractor.interface.d.ts +12 -0
  83. package/lib/cjs/types/adapter-express/express-utils/setup-authorization.d.ts +34 -0
  84. package/lib/cjs/types/adapter-express/express-utils/setup-event-system.d.ts +118 -0
  85. package/lib/cjs/types/adapter-express/express-utils/setup-interceptors.d.ts +115 -0
  86. package/lib/cjs/types/adapter-express/express-utils/setup-lazy-loading.d.ts +123 -0
  87. package/lib/cjs/types/adapter-express/express-utils/utils.d.ts +17 -2
  88. package/lib/cjs/types/adapter-express/express-utils/validation-decorators.d.ts +145 -0
  89. package/lib/cjs/types/adapter-express/express-utils/validation-service.d.ts +88 -0
  90. package/lib/cjs/types/adapter-express/index.d.ts +6 -4
  91. package/lib/cjs/types/adapter-express/micro-api/application-express-micro-route.d.ts +25 -14
  92. package/lib/cjs/types/adapter-express/micro-api/application-express-micro.d.ts +3 -10
  93. package/lib/cjs/types/adapter-express/micro-api/gateway/circuit-breaker.d.ts +111 -0
  94. package/lib/cjs/types/adapter-express/micro-api/gateway/index.d.ts +5 -0
  95. package/lib/cjs/types/adapter-express/micro-api/gateway/service-proxy.d.ts +83 -0
  96. package/lib/cjs/types/adapter-express/micro-api/index.d.ts +7 -1
  97. package/lib/cjs/types/adapter-express/micro-api/micro.d.ts +83 -0
  98. package/lib/cjs/types/adapter-express/micro-api/queue/index.d.ts +5 -0
  99. package/lib/cjs/types/adapter-express/micro-api/queue/queue.interface.d.ts +60 -0
  100. package/lib/cjs/types/adapter-express/micro-api/queue/rabbitmq-consumer.d.ts +86 -0
  101. package/lib/cjs/types/adapter-express/micro-api/serverless/aws-lambda.adapter.d.ts +77 -0
  102. package/lib/cjs/types/adapter-express/micro-api/serverless/cloudflare.adapter.d.ts +64 -0
  103. package/lib/cjs/types/adapter-express/micro-api/serverless/index.d.ts +6 -0
  104. package/lib/cjs/types/adapter-express/micro-api/serverless/vercel.adapter.d.ts +56 -0
  105. package/lib/cjs/types/adapter-express/micro-api/service-mesh/index.d.ts +5 -0
  106. package/lib/cjs/types/adapter-express/micro-api/service-mesh/service-client.d.ts +122 -0
  107. package/lib/cjs/types/adapter-express/micro-api/service-mesh/service-discovery.d.ts +150 -0
  108. package/lib/cjs/types/adapter-express/middleware/index.d.ts +5 -0
  109. package/lib/cjs/types/adapter-express/middleware/request-logging.middleware.d.ts +65 -0
  110. package/lib/cjs/types/adapter-express/render/index.d.ts +1 -0
  111. package/lib/cjs/types/adapter-express/studio/index.d.ts +1 -0
  112. package/lib/cjs/types/adapter-express/studio/studio-integration.d.ts +170 -0
  113. package/lib/cjs/types/index.d.ts +1 -1
  114. package/lib/esm/adapter-express/application-express.base.js +24 -0
  115. package/lib/esm/adapter-express/application-express.js +1656 -0
  116. package/lib/esm/adapter-express/application-express.types.js +1 -0
  117. package/lib/esm/adapter-express/express-utils/base-middleware.js +19 -0
  118. package/lib/esm/adapter-express/express-utils/conditional-middleware.js +96 -0
  119. package/lib/esm/adapter-express/express-utils/constants.js +63 -0
  120. package/lib/esm/adapter-express/express-utils/content/httpContent.js +6 -0
  121. package/lib/esm/adapter-express/express-utils/content-negotiation-decorators.js +120 -0
  122. package/lib/esm/adapter-express/express-utils/decorators.js +604 -0
  123. package/lib/esm/adapter-express/express-utils/exception-filter-decorators.js +6 -0
  124. package/lib/esm/adapter-express/express-utils/guard-context-factory.js +83 -0
  125. package/lib/esm/adapter-express/express-utils/guard-middleware.js +115 -0
  126. package/lib/esm/adapter-express/express-utils/guard-utils.js +14 -0
  127. package/lib/esm/adapter-express/express-utils/http-context-store.js +10 -0
  128. package/lib/esm/adapter-express/express-utils/http-status-middleware.js +116 -0
  129. package/lib/esm/adapter-express/express-utils/httpResponseMessage.js +29 -0
  130. package/lib/esm/adapter-express/express-utils/index.js +24 -0
  131. package/lib/esm/adapter-express/express-utils/interceptor-middleware.js +130 -0
  132. package/lib/esm/adapter-express/express-utils/interfaces.js +1 -0
  133. package/lib/esm/adapter-express/express-utils/inversify-express-server.js +1047 -0
  134. package/lib/esm/adapter-express/express-utils/lazy-module-middleware.js +236 -0
  135. package/lib/esm/adapter-express/express-utils/middleware-composition.js +89 -0
  136. package/lib/esm/adapter-express/express-utils/path-pattern-compat.js +125 -0
  137. package/lib/esm/adapter-express/express-utils/permission-preloader.middleware.js +45 -0
  138. package/lib/esm/adapter-express/express-utils/resolver-multer.js +30 -0
  139. package/lib/esm/adapter-express/express-utils/route-constraints.js +100 -0
  140. package/lib/esm/adapter-express/express-utils/scope-extractor.interface.js +1 -0
  141. package/lib/esm/adapter-express/express-utils/scope-extractor.js +63 -0
  142. package/lib/esm/adapter-express/express-utils/setup-authorization.js +68 -0
  143. package/lib/esm/adapter-express/express-utils/setup-event-system.js +110 -0
  144. package/lib/esm/adapter-express/express-utils/setup-interceptors.js +100 -0
  145. package/lib/esm/adapter-express/express-utils/setup-lazy-loading.js +225 -0
  146. package/lib/esm/adapter-express/express-utils/utils.js +68 -0
  147. package/lib/esm/adapter-express/express-utils/validation-decorators.js +199 -0
  148. package/lib/esm/adapter-express/express-utils/validation-service.js +251 -0
  149. package/lib/esm/adapter-express/index.js +7 -0
  150. package/lib/esm/adapter-express/micro-api/application-express-micro-container.js +48 -0
  151. package/lib/esm/adapter-express/micro-api/application-express-micro-route.js +128 -0
  152. package/lib/esm/adapter-express/micro-api/application-express-micro.js +157 -0
  153. package/lib/esm/adapter-express/micro-api/gateway/circuit-breaker.js +174 -0
  154. package/lib/esm/adapter-express/micro-api/gateway/index.js +5 -0
  155. package/lib/esm/adapter-express/micro-api/gateway/service-proxy.js +210 -0
  156. package/lib/esm/adapter-express/micro-api/index.js +10 -0
  157. package/lib/esm/adapter-express/micro-api/micro.js +266 -0
  158. package/lib/esm/adapter-express/micro-api/queue/index.js +4 -0
  159. package/lib/esm/adapter-express/micro-api/queue/queue.interface.js +1 -0
  160. package/lib/esm/adapter-express/micro-api/queue/rabbitmq-consumer.js +229 -0
  161. package/lib/esm/adapter-express/micro-api/serverless/aws-lambda.adapter.js +180 -0
  162. package/lib/esm/adapter-express/micro-api/serverless/cloudflare.adapter.js +155 -0
  163. package/lib/esm/adapter-express/micro-api/serverless/index.js +6 -0
  164. package/lib/esm/adapter-express/micro-api/serverless/vercel.adapter.js +99 -0
  165. package/lib/esm/adapter-express/micro-api/service-mesh/index.js +5 -0
  166. package/lib/esm/adapter-express/micro-api/service-mesh/service-client.js +191 -0
  167. package/lib/esm/adapter-express/micro-api/service-mesh/service-discovery.js +259 -0
  168. package/lib/esm/adapter-express/middleware/index.js +5 -0
  169. package/lib/esm/adapter-express/middleware/request-logging.middleware.js +239 -0
  170. package/lib/esm/adapter-express/render/constants.js +37 -0
  171. package/lib/esm/adapter-express/render/engine.js +51 -0
  172. package/lib/esm/adapter-express/render/index.js +1 -0
  173. package/lib/esm/adapter-express/render/resolve-render.js +30 -0
  174. package/lib/esm/adapter-express/studio/index.js +1 -0
  175. package/lib/esm/adapter-express/studio/studio-integration.js +236 -0
  176. package/lib/esm/index.mjs +1 -0
  177. package/lib/esm/package.json +3 -0
  178. package/lib/esm/types/adapter-express/application-express.base.d.ts +77 -0
  179. package/lib/esm/types/adapter-express/application-express.d.ts +453 -0
  180. package/lib/esm/types/adapter-express/application-express.types.d.ts +23 -0
  181. package/lib/esm/types/adapter-express/express-utils/base-middleware.d.ts +8 -0
  182. package/lib/esm/types/adapter-express/express-utils/conditional-middleware.d.ts +97 -0
  183. package/lib/esm/types/adapter-express/express-utils/constants.d.ts +57 -0
  184. package/lib/esm/types/adapter-express/express-utils/content/httpContent.d.ts +6 -0
  185. package/lib/esm/types/adapter-express/express-utils/content-negotiation-decorators.d.ts +94 -0
  186. package/lib/esm/types/adapter-express/express-utils/decorators.d.ts +257 -0
  187. package/lib/esm/types/adapter-express/express-utils/exception-filter-decorators.d.ts +6 -0
  188. package/lib/esm/types/adapter-express/express-utils/guard-context-factory.d.ts +17 -0
  189. package/lib/esm/types/adapter-express/express-utils/guard-middleware.d.ts +22 -0
  190. package/lib/esm/types/adapter-express/express-utils/guard-utils.d.ts +11 -0
  191. package/lib/esm/types/adapter-express/express-utils/http-context-store.d.ts +20 -0
  192. package/lib/esm/types/adapter-express/express-utils/http-status-middleware.d.ts +26 -0
  193. package/lib/esm/types/adapter-express/express-utils/httpResponseMessage.d.ts +14 -0
  194. package/lib/esm/types/adapter-express/express-utils/index.d.ts +30 -0
  195. package/lib/esm/types/adapter-express/express-utils/interceptor-middleware.d.ts +40 -0
  196. package/lib/esm/types/adapter-express/express-utils/interfaces.d.ts +115 -0
  197. package/lib/esm/types/adapter-express/express-utils/inversify-express-server.d.ts +172 -0
  198. package/lib/esm/types/adapter-express/express-utils/lazy-module-middleware.d.ts +122 -0
  199. package/lib/esm/types/adapter-express/express-utils/middleware-composition.d.ts +85 -0
  200. package/lib/esm/types/adapter-express/express-utils/path-pattern-compat.d.ts +66 -0
  201. package/lib/esm/types/adapter-express/express-utils/permission-preloader.middleware.d.ts +10 -0
  202. package/lib/esm/types/adapter-express/express-utils/resolver-multer.d.ts +7 -0
  203. package/lib/esm/types/adapter-express/express-utils/route-constraints.d.ts +98 -0
  204. package/lib/esm/types/adapter-express/express-utils/scope-extractor.d.ts +21 -0
  205. package/lib/esm/types/adapter-express/express-utils/scope-extractor.interface.d.ts +12 -0
  206. package/lib/esm/types/adapter-express/express-utils/setup-authorization.d.ts +34 -0
  207. package/lib/esm/types/adapter-express/express-utils/setup-event-system.d.ts +118 -0
  208. package/lib/esm/types/adapter-express/express-utils/setup-interceptors.d.ts +115 -0
  209. package/lib/esm/types/adapter-express/express-utils/setup-lazy-loading.d.ts +123 -0
  210. package/lib/esm/types/adapter-express/express-utils/utils.d.ts +24 -0
  211. package/lib/esm/types/adapter-express/express-utils/validation-decorators.d.ts +145 -0
  212. package/lib/esm/types/adapter-express/express-utils/validation-service.d.ts +88 -0
  213. package/lib/esm/types/adapter-express/index.d.ts +7 -0
  214. package/lib/esm/types/adapter-express/micro-api/application-express-micro-container.d.ts +47 -0
  215. package/lib/esm/types/adapter-express/micro-api/application-express-micro-route.d.ts +104 -0
  216. package/lib/esm/types/adapter-express/micro-api/application-express-micro.d.ts +72 -0
  217. package/lib/esm/types/adapter-express/micro-api/gateway/circuit-breaker.d.ts +111 -0
  218. package/lib/esm/types/adapter-express/micro-api/gateway/index.d.ts +5 -0
  219. package/lib/esm/types/adapter-express/micro-api/gateway/service-proxy.d.ts +83 -0
  220. package/lib/esm/types/adapter-express/micro-api/index.d.ts +7 -0
  221. package/lib/esm/types/adapter-express/micro-api/micro.d.ts +83 -0
  222. package/lib/esm/types/adapter-express/micro-api/queue/index.d.ts +5 -0
  223. package/lib/esm/types/adapter-express/micro-api/queue/queue.interface.d.ts +60 -0
  224. package/lib/esm/types/adapter-express/micro-api/queue/rabbitmq-consumer.d.ts +86 -0
  225. package/lib/esm/types/adapter-express/micro-api/serverless/aws-lambda.adapter.d.ts +77 -0
  226. package/lib/esm/types/adapter-express/micro-api/serverless/cloudflare.adapter.d.ts +64 -0
  227. package/lib/esm/types/adapter-express/micro-api/serverless/index.d.ts +6 -0
  228. package/lib/esm/types/adapter-express/micro-api/serverless/vercel.adapter.d.ts +56 -0
  229. package/lib/esm/types/adapter-express/micro-api/service-mesh/index.d.ts +5 -0
  230. package/lib/esm/types/adapter-express/micro-api/service-mesh/service-client.d.ts +122 -0
  231. package/lib/esm/types/adapter-express/micro-api/service-mesh/service-discovery.d.ts +150 -0
  232. package/lib/esm/types/adapter-express/middleware/index.d.ts +5 -0
  233. package/lib/esm/types/adapter-express/middleware/request-logging.middleware.d.ts +65 -0
  234. package/lib/esm/types/adapter-express/render/constants.d.ts +26 -0
  235. package/lib/esm/types/adapter-express/render/engine.d.ts +20 -0
  236. package/lib/esm/types/adapter-express/render/index.d.ts +5 -0
  237. package/lib/esm/types/adapter-express/render/resolve-render.d.ts +7 -0
  238. package/lib/esm/types/adapter-express/studio/index.d.ts +1 -0
  239. package/lib/esm/types/adapter-express/studio/studio-integration.d.ts +170 -0
  240. package/lib/esm/types/index.d.ts +1 -0
  241. package/lib/package.json +170 -146
  242. package/package.json +170 -146
  243. package/lib/cjs/di/di.interfaces.js +0 -10
  244. package/lib/cjs/types/di/di.interfaces.d.ts +0 -289
@@ -0,0 +1,604 @@
1
+ import "reflect-metadata";
2
+ import { inject, injectable, decorate, getGlobalUploadConfig } from "@expressots/core";
3
+ import { TYPE, METADATA_KEY, PARAMETER_TYPE, HTTP_CODE_METADATA, RENDER_METADATA_KEY, } from "./constants.js";
4
+ import { packageResolver } from "./resolver-multer.js";
5
+ import { Report, StatusCode } from "@expressots/core";
6
+ import { splitPathConstraints, createPathConstraintMiddleware } from "./path-pattern-compat.js";
7
+ // Explicit type annotation: without this, the inferred type pulls a
8
+ // non-portable path from @expressots/core's internal decorator_utils,
9
+ // which TS2742 rejects under NodeNext when emitting .d.ts files.
10
+ export const injectHttpContext = inject(TYPE.HttpContext);
11
+ /**
12
+ * Controller decorator to define a new controller
13
+ * @param path route path
14
+ * @param middleware array of middleware to be applied to all routes in the controller
15
+ * @public API
16
+ */
17
+ export function controller(path, ...middleware) {
18
+ return (target) => {
19
+ // Check for version metadata on the controller class
20
+ const controllerVersion = Reflect.getOwnMetadata(METADATA_KEY.version, target);
21
+ // Translate any inline regex constraints in the controller-level
22
+ // prefix (`@controller("/users/:tenant(\\d+)")`) into a
23
+ // request-time validator. Keeps `@controller("/")` and the common
24
+ // case allocation-free.
25
+ const split = splitPathConstraints(path);
26
+ const constraintMiddleware = createPathConstraintMiddleware(split.constraints);
27
+ const effectivePath = split.path;
28
+ const effectiveMiddleware = constraintMiddleware
29
+ ? [constraintMiddleware, ...middleware]
30
+ : middleware;
31
+ const currentMetadata = {
32
+ middleware: effectiveMiddleware,
33
+ path: effectivePath,
34
+ target: target,
35
+ version: controllerVersion,
36
+ };
37
+ const pathMetadata = Reflect.getOwnMetadata(HTTP_CODE_METADATA.path, Reflect) || {};
38
+ const statusCodeMetadata = Reflect.getOwnMetadata(HTTP_CODE_METADATA.statusCode, Reflect) || {};
39
+ const statusCodePathMapping = Reflect.getOwnMetadata(HTTP_CODE_METADATA.httpCode, Reflect) || {};
40
+ for (const key in pathMetadata) {
41
+ if (statusCodeMetadata && statusCodeMetadata[key]) {
42
+ const methodPath = pathMetadata[key]["path"];
43
+ // Properly join controller and method paths. The controller
44
+ // path is the v8-cleaned `effectivePath` so the mapping key is
45
+ // consistent with what gets registered on Express.
46
+ let realPath;
47
+ if (methodPath === "/" || methodPath === "") {
48
+ realPath = effectivePath;
49
+ }
50
+ else if (effectivePath === "/" || effectivePath === "") {
51
+ realPath = methodPath.startsWith("/") ? methodPath : `/${methodPath}`;
52
+ }
53
+ else {
54
+ const basePath = effectivePath.endsWith("/") ? effectivePath.slice(0, -1) : effectivePath;
55
+ const subPath = methodPath.startsWith("/") ? methodPath : `/${methodPath}`;
56
+ realPath = `${basePath}${subPath}`;
57
+ }
58
+ statusCodePathMapping[`${realPath}/-${pathMetadata[key]["method"].toLowerCase()}`] =
59
+ statusCodeMetadata[key];
60
+ }
61
+ }
62
+ Reflect.defineMetadata(HTTP_CODE_METADATA.httpCode, statusCodePathMapping, Reflect);
63
+ Reflect.deleteMetadata(HTTP_CODE_METADATA.statusCode, Reflect);
64
+ Reflect.deleteMetadata(HTTP_CODE_METADATA.path, Reflect);
65
+ decorate(injectable(), target);
66
+ Reflect.defineMetadata(METADATA_KEY.controller, currentMetadata, target);
67
+ const previousMetadata = Reflect.getMetadata(METADATA_KEY.controller, Reflect) || [];
68
+ const newMetadata = [currentMetadata, ...previousMetadata];
69
+ Reflect.defineMetadata(METADATA_KEY.controller, newMetadata, Reflect);
70
+ };
71
+ }
72
+ /**
73
+ * Http decorator to define the status code for a route
74
+ * @param code
75
+ * @returns MethodDecorator
76
+ * @example ```typescript
77
+ * @Http(200)
78
+ * @Get("/")
79
+ * hello() {
80
+ * return "Hello World";
81
+ * }
82
+ * ```
83
+ * @public API
84
+ */
85
+ export function Http(code) {
86
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
87
+ return (target, key, descriptor) => {
88
+ let httpCodeMetadata = Reflect.getOwnMetadata(HTTP_CODE_METADATA.statusCode, Reflect);
89
+ if (httpCodeMetadata) {
90
+ httpCodeMetadata[key] = code;
91
+ }
92
+ else {
93
+ httpCodeMetadata = {};
94
+ httpCodeMetadata[key] = code;
95
+ }
96
+ Reflect.defineMetadata(HTTP_CODE_METADATA.statusCode, httpCodeMetadata, Reflect);
97
+ };
98
+ }
99
+ /**
100
+ * Version decorator to define the API version for a controller or route method
101
+ * @param version API version (e.g., "1", "1.0", "v1", or 1)
102
+ * @returns ClassDecorator | MethodDecorator
103
+ * @example ```typescript
104
+ * @Version("1")
105
+ * @controller("/users")
106
+ * class UserController {}
107
+ *
108
+ * // Or at method level:
109
+ * @Version("2")
110
+ * @Get("/")
111
+ * getUsers() {
112
+ * return "v2 users";
113
+ * }
114
+ * ```
115
+ * @public API
116
+ */
117
+ export function Version(version) {
118
+ // Normalize version to string format (e.g., "v1" or "1" -> "v1")
119
+ const normalizedVersion = typeof version === "number" ? `v${version}` : version.startsWith("v") ? version : `v${version}`;
120
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
121
+ return (target, key, descriptor) => {
122
+ if (key !== undefined && descriptor !== undefined) {
123
+ // Method decorator - store version metadata for the method
124
+ // This will be read by enhancedHttpMethod/Method when they create metadata
125
+ Reflect.defineMetadata(METADATA_KEY.version, normalizedVersion, target, key);
126
+ // Also update existing metadata if it exists
127
+ const metadataList = Reflect.getOwnMetadata(METADATA_KEY.controllerMethod, target.constructor);
128
+ if (metadataList) {
129
+ const methodMetadata = metadataList.find((m) => m.key === key);
130
+ if (methodMetadata) {
131
+ methodMetadata.version = normalizedVersion;
132
+ }
133
+ }
134
+ }
135
+ else {
136
+ // Class decorator - store version metadata for the controller
137
+ // This will be read by controller decorator when it creates metadata
138
+ Reflect.defineMetadata(METADATA_KEY.version, normalizedVersion, target);
139
+ // Also update existing metadata if it exists
140
+ const controllerMetadata = Reflect.getOwnMetadata(METADATA_KEY.controller, target);
141
+ if (controllerMetadata) {
142
+ controllerMetadata.version = normalizedVersion;
143
+ }
144
+ }
145
+ };
146
+ }
147
+ /**
148
+ * Decorator to allow accept all HTTP methods
149
+ * @param path route path, wildcard
150
+ * @param middleware array of middleware to be applied to all routes defined in path logic
151
+ * @public API
152
+ */
153
+ export function All(path, ...middleware) {
154
+ return Method("all", path, ...middleware);
155
+ }
156
+ /**
157
+ * Decorator to allow GET HTTP method
158
+ * @param path route path
159
+ * @param middleware array of middleware to be applied to the route
160
+ * @public API
161
+ */
162
+ export function Get(path, ...middleware) {
163
+ return enhancedHttpMethod("get", path, ...middleware);
164
+ }
165
+ /**
166
+ * Decorator to allow POST HTTP method
167
+ * @param path route path
168
+ * @param middleware array of middleware to be applied to the route
169
+ * @public API
170
+ */
171
+ export function Post(path, ...middleware) {
172
+ return Method("post", path, ...middleware);
173
+ }
174
+ /**
175
+ * Decorator to allow PUT HTTP method
176
+ * @param path route path
177
+ * @param middleware array of middleware to be applied to the route
178
+ * @public API
179
+ */
180
+ export function Put(path, ...middleware) {
181
+ return enhancedHttpMethod("put", path, ...middleware);
182
+ }
183
+ /**
184
+ * Decorator to allow PATCH HTTP method
185
+ * @param path route path
186
+ * @param middleware array of middleware to be applied to the route
187
+ * @public API
188
+ */
189
+ export function Patch(path, ...middleware) {
190
+ return enhancedHttpMethod("patch", path, ...middleware);
191
+ }
192
+ /**
193
+ * Decorator to allow HEAD HTTP method
194
+ * @param path route path
195
+ * @param middleware array of middleware to be applied to the route
196
+ * @public API
197
+ */
198
+ export function Head(path, ...middleware) {
199
+ return Method("head", path, ...middleware);
200
+ }
201
+ /**
202
+ * Decorator to allow DELETE HTTP method
203
+ * @param path route path
204
+ * @param middleware array of middleware to be applied to the route
205
+ * @public API
206
+ */
207
+ export function Delete(path, ...middleware) {
208
+ return enhancedHttpMethod("delete", path, ...middleware);
209
+ }
210
+ /**
211
+ * Decorator to allow OPTIONS HTTP method
212
+ * @param path route path
213
+ * @param middleware array of middleware to be applied to the route
214
+ */
215
+ function enhancedHttpMethod(method, path, ...middleware) {
216
+ return (target, key) => {
217
+ // Check for version metadata on the method
218
+ const methodVersion = Reflect.getOwnMetadata(METADATA_KEY.version, target, key);
219
+ // Express 5 / path-to-regexp v8 dropped inline regex constraints
220
+ // (`:id(\\d+)`). Split them out into a v8-compatible path + a
221
+ // request-time validator middleware so existing routes — and our
222
+ // {@link Patterns} / {@link pattern} public API — keep working.
223
+ const split = splitPathConstraints(path);
224
+ const constraintMiddleware = createPathConstraintMiddleware(split.constraints);
225
+ const effectivePath = split.path;
226
+ const effectiveMiddleware = constraintMiddleware
227
+ ? [constraintMiddleware, ...middleware]
228
+ : middleware;
229
+ const metadata = {
230
+ key: String(key),
231
+ method,
232
+ middleware: effectiveMiddleware,
233
+ path: effectivePath,
234
+ target: target,
235
+ version: methodVersion,
236
+ };
237
+ let metadataList = [];
238
+ let pathMetadata = Reflect.getOwnMetadata(HTTP_CODE_METADATA.path, Reflect);
239
+ if (pathMetadata) {
240
+ pathMetadata[key] = {
241
+ path: effectivePath,
242
+ method,
243
+ };
244
+ }
245
+ else {
246
+ pathMetadata = {};
247
+ pathMetadata[key] = {
248
+ path: effectivePath,
249
+ method,
250
+ };
251
+ }
252
+ Reflect.defineMetadata(HTTP_CODE_METADATA.path, pathMetadata, Reflect);
253
+ if (!Reflect.hasOwnMetadata(METADATA_KEY.controllerMethod, target.constructor)) {
254
+ Reflect.defineMetadata(METADATA_KEY.controllerMethod, metadataList, target.constructor);
255
+ }
256
+ else {
257
+ metadataList = Reflect.getOwnMetadata(METADATA_KEY.controllerMethod, target.constructor);
258
+ }
259
+ metadataList.push(metadata);
260
+ const paramsInfo = Reflect.getMetadata("design:paramtypes", target, key) || [];
261
+ metadataList.forEach((m) => {
262
+ m.middleware.unshift((req, res, next) => {
263
+ req.params &&
264
+ Object.keys(req.params).forEach((param, idx) => {
265
+ const type = paramsInfo[idx];
266
+ req.params[param] = convertToType(req.params[param], type);
267
+ });
268
+ next();
269
+ });
270
+ });
271
+ };
272
+ }
273
+ /**
274
+ * Decorator to allow custom HTTP method
275
+ * @param method custom HTTP method
276
+ * @param path route path
277
+ * @param middleware array of middleware to be applied to the route
278
+ * @public API
279
+ */
280
+ export function Method(method, path, ...middleware) {
281
+ return (target, key) => {
282
+ // Check for version metadata on the method
283
+ const methodVersion = Reflect.getOwnMetadata(METADATA_KEY.version, target, key);
284
+ // Same path-to-regexp v8 compatibility shim as `enhancedHttpMethod`.
285
+ const split = splitPathConstraints(path);
286
+ const constraintMiddleware = createPathConstraintMiddleware(split.constraints);
287
+ const effectivePath = split.path;
288
+ const effectiveMiddleware = constraintMiddleware
289
+ ? [constraintMiddleware, ...middleware]
290
+ : middleware;
291
+ const metadata = {
292
+ key: String(key),
293
+ method,
294
+ middleware: effectiveMiddleware,
295
+ path: effectivePath,
296
+ target: target,
297
+ version: methodVersion,
298
+ };
299
+ let metadataList = [];
300
+ let pathMetadata = Reflect.getOwnMetadata(HTTP_CODE_METADATA.path, Reflect);
301
+ if (pathMetadata) {
302
+ pathMetadata[key] = {
303
+ path: effectivePath,
304
+ method,
305
+ };
306
+ }
307
+ else {
308
+ pathMetadata = {};
309
+ pathMetadata[key] = {
310
+ path: effectivePath,
311
+ method,
312
+ };
313
+ }
314
+ Reflect.defineMetadata(HTTP_CODE_METADATA.path, pathMetadata, Reflect);
315
+ if (!Reflect.hasOwnMetadata(METADATA_KEY.controllerMethod, target.constructor)) {
316
+ Reflect.defineMetadata(METADATA_KEY.controllerMethod, metadataList, target.constructor);
317
+ }
318
+ else {
319
+ metadataList = Reflect.getOwnMetadata(METADATA_KEY.controllerMethod, target.constructor);
320
+ }
321
+ metadataList.push(metadata);
322
+ };
323
+ }
324
+ /**
325
+ * Parameter decorator to inject the request object
326
+ * @returns ParameterDecorator
327
+ */
328
+ export const request = paramDecoratorFactory(PARAMETER_TYPE.REQUEST);
329
+ /**
330
+ * Parameter decorator to inject the response object
331
+ * @returns ParameterDecorator
332
+ */
333
+ export const response = paramDecoratorFactory(PARAMETER_TYPE.RESPONSE);
334
+ /**
335
+ * Parameter decorator to inject parameters from the route
336
+ * @returns ParameterDecorator
337
+ */
338
+ export const param = paramDecoratorFactory(PARAMETER_TYPE.PARAMS);
339
+ /**
340
+ * Parameter decorator to inject query parameters
341
+ * @returns ParameterDecorator
342
+ */
343
+ export const query = paramDecoratorFactory(PARAMETER_TYPE.QUERY);
344
+ /**
345
+ * Parameter decorator to inject the request body
346
+ * @returns ParameterDecorator
347
+ */
348
+ export const body = paramDecoratorFactory(PARAMETER_TYPE.BODY);
349
+ /**
350
+ * Parameter decorator to inject the request headers
351
+ * @returns ParameterDecorator
352
+ */
353
+ export const headers = paramDecoratorFactory(PARAMETER_TYPE.HEADERS);
354
+ /**
355
+ * Parameter decorator to inject the request cookies
356
+ * @returns ParameterDecorator
357
+ */
358
+ export const cookies = paramDecoratorFactory(PARAMETER_TYPE.COOKIES);
359
+ /**
360
+ * Parameter decorator next function
361
+ * @returns ParameterDecorator
362
+ */
363
+ export const next = paramDecoratorFactory(PARAMETER_TYPE.NEXT);
364
+ /**
365
+ * Parameter decorator to inject the principal object obtained from AuthProvider
366
+ * @returns ParameterDecorator
367
+ */
368
+ export const principal = paramDecoratorFactory(PARAMETER_TYPE.PRINCIPAL);
369
+ /**
370
+ * Parameter decorator to inject the request user object
371
+ * @returns ParameterDecorator
372
+ */
373
+ function paramDecoratorFactory(parameterType) {
374
+ return (name) => params(parameterType, name);
375
+ }
376
+ /**
377
+ * Parameter decorator to inject the request object
378
+ * @returns ParameterDecorator
379
+ * @param type - The type of parameter to inject
380
+ * @param parameterName - The name of the parameter to inject
381
+ * @public API
382
+ */
383
+ export function params(type, parameterName) {
384
+ return (target, methodName, index) => {
385
+ let metadataList = {};
386
+ let parameterMetadataList = [];
387
+ const parameterMetadata = {
388
+ index,
389
+ injectRoot: parameterName === undefined,
390
+ parameterName,
391
+ type,
392
+ };
393
+ if (!Reflect.hasOwnMetadata(METADATA_KEY.controllerParameter, target.constructor)) {
394
+ parameterMetadataList.unshift(parameterMetadata);
395
+ }
396
+ else {
397
+ metadataList = Reflect.getOwnMetadata(METADATA_KEY.controllerParameter, target.constructor);
398
+ if (metadataList[methodName]) {
399
+ parameterMetadataList = metadataList[methodName] || [];
400
+ }
401
+ parameterMetadataList.unshift(parameterMetadata);
402
+ }
403
+ metadataList[methodName] = parameterMetadataList;
404
+ Reflect.defineMetadata(METADATA_KEY.controllerParameter, metadataList, target.constructor);
405
+ };
406
+ }
407
+ /**
408
+ * Render decorator to define the template and default data for a route
409
+ * @param template The template to render
410
+ * @param defaultData The default data to pass to the template
411
+ * @returns MethodDecorator
412
+ * @public API
413
+ */
414
+ export function Render(template, defaultData) {
415
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
416
+ return (target, propertyKey, descriptor) => {
417
+ Reflect.defineMetadata(RENDER_METADATA_KEY, { template, defaultData }, target, propertyKey);
418
+ };
419
+ }
420
+ export function getRenderMetadata(target, propertyKey) {
421
+ return Reflect.getMetadata(RENDER_METADATA_KEY, target, propertyKey) || {};
422
+ }
423
+ /**
424
+ * Converts a string value to the specified type.
425
+ * @param value The value to convert.
426
+ * @param type The type to convert the value to.
427
+ * @returns The converted value.
428
+ */
429
+ function convertToType(value, type) {
430
+ if (type === Number) {
431
+ return Number(value);
432
+ }
433
+ else if (type === String) {
434
+ return value;
435
+ }
436
+ else if (type === Boolean) {
437
+ return value === "true" || value === "1";
438
+ }
439
+ return value;
440
+ }
441
+ /**
442
+ * Type guard to check if an object is a Request
443
+ */
444
+ function isRequest(obj) {
445
+ return (typeof obj === "object" && obj !== null && "method" in obj && "headers" in obj && "url" in obj);
446
+ }
447
+ /**
448
+ * Type guard to check if an object is a Response
449
+ */
450
+ function isResponse(obj) {
451
+ return (typeof obj === "object" && obj !== null && "status" in obj && "json" in obj && "send" in obj);
452
+ }
453
+ /**
454
+ * File upload decorator to handle file uploads.
455
+ *
456
+ * This decorator integrates with the global upload configuration
457
+ * set via `Middleware.upload()` in app.ts. If global config exists,
458
+ * it will be used as defaults, with local options taking precedence.
459
+ *
460
+ * @param options - Field configuration (fieldName, maxCount, none, any)
461
+ * @param multerOptions - Optional multer options (overrides global config)
462
+ * @default { none: true }
463
+ * @returns MethodDecorator
464
+ *
465
+ * @example
466
+ * ```typescript
467
+ * // In app.ts - configure globally (optional)
468
+ * this.Middleware.upload({
469
+ * destination: './uploads',
470
+ * limits: { fileSize: 10 * 1024 * 1024 }
471
+ * });
472
+ *
473
+ * // In controller - uses global config automatically
474
+ * @Post('avatar')
475
+ * @FileUpload({ fieldName: 'avatar' })
476
+ * uploadAvatar(req: Request) {
477
+ * return req.file;
478
+ * }
479
+ *
480
+ * // Override global config for specific endpoint
481
+ * @Post('document')
482
+ * @FileUpload({ fieldName: 'doc' }, { limits: { fileSize: 50 * 1024 * 1024 } })
483
+ * uploadDocument(req: Request) {
484
+ * return req.file;
485
+ * }
486
+ * ```
487
+ *
488
+ * @public API
489
+ */
490
+ export function FileUpload(options, multerOptions) {
491
+ const multer = packageResolver("multer");
492
+ /* eslint-disable @typescript-eslint/no-explicit-any */
493
+ let upload;
494
+ let method = "none";
495
+ if (multer) {
496
+ if (options === undefined) {
497
+ options = { none: true };
498
+ }
499
+ // Get global upload configuration (set via Middleware.upload())
500
+ const globalConfig = getGlobalUploadConfig();
501
+ // Build final multer options, merging global config with local options
502
+ // Local options always take precedence over global config
503
+ const finalMulterOptions = {};
504
+ // Apply global config as defaults
505
+ if (globalConfig) {
506
+ if (globalConfig.destination) {
507
+ finalMulterOptions.dest = globalConfig.destination;
508
+ }
509
+ if (globalConfig.limits) {
510
+ finalMulterOptions.limits = globalConfig.limits;
511
+ }
512
+ }
513
+ // Apply local options (overrides global)
514
+ if (multerOptions) {
515
+ if (multerOptions.dest) {
516
+ finalMulterOptions.dest = multerOptions.dest;
517
+ }
518
+ if (multerOptions.limits) {
519
+ // Merge limits - local takes precedence
520
+ finalMulterOptions.limits = {
521
+ ...finalMulterOptions.limits,
522
+ ...multerOptions.limits,
523
+ };
524
+ }
525
+ if (multerOptions.storage) {
526
+ finalMulterOptions.storage = multerOptions.storage;
527
+ }
528
+ if (multerOptions.fileFilter) {
529
+ finalMulterOptions.fileFilter = multerOptions.fileFilter;
530
+ }
531
+ }
532
+ upload = multer(finalMulterOptions);
533
+ method = inferMulterMethod(options);
534
+ }
535
+ return function (target, propertyKey, descriptor) {
536
+ const originalMethod = descriptor.value;
537
+ descriptor.value = function (...args) {
538
+ const req = args.find(isRequest);
539
+ const res = args.find(isResponse);
540
+ const multerMiddleware = getMulterMiddleware(upload, options, method);
541
+ multerMiddleware(req, res, (err) => {
542
+ if (err) {
543
+ return res.status(400).json({ error: err.message });
544
+ }
545
+ const result = originalMethod.apply(this, args);
546
+ if (res &&
547
+ result &&
548
+ typeof result != "undefined" &&
549
+ !isRequest(result) &&
550
+ !isResponse(result)) {
551
+ return res.send(result);
552
+ }
553
+ });
554
+ };
555
+ };
556
+ }
557
+ /**
558
+ * Infer the multer method to use based on the provided options
559
+ * @param options
560
+ * @returns
561
+ */
562
+ function inferMulterMethod(options) {
563
+ const report = new Report();
564
+ if (options.none)
565
+ return "none";
566
+ if (options.any)
567
+ return "any";
568
+ if (Array.isArray(options))
569
+ return "fields";
570
+ if (options.fieldName && options.maxCount !== undefined)
571
+ return "array";
572
+ if (options.fieldName)
573
+ return "single";
574
+ throw report.error("Invalid options provided for FileUpload.", StatusCode.InternalServerError, "multer-decorator");
575
+ }
576
+ /**
577
+ * Get the multer middleware based on the method
578
+ * @param upload
579
+ * @param options
580
+ * @param method
581
+ * @returns RequestHandler
582
+ */
583
+ function getMulterMiddleware(upload, options, method) {
584
+ const report = new Report();
585
+ switch (method) {
586
+ case "single":
587
+ return upload.single(options.fieldName);
588
+ case "array":
589
+ return upload.array(options.fieldName, options.maxCount);
590
+ case "fields": {
591
+ const fieldsOptions = options.map((opt) => ({
592
+ name: opt.fieldName,
593
+ maxCount: opt.maxCount,
594
+ }));
595
+ return upload.fields(fieldsOptions);
596
+ }
597
+ case "none":
598
+ return upload.none();
599
+ case "any":
600
+ return upload.any();
601
+ default:
602
+ throw report.error(`Unsupported Multer method: ${method}`, StatusCode.InternalServerError, "multer-decorator");
603
+ }
604
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Re-export exception filter decorators from core for backward compatibility
3
+ * These decorators are now part of @expressots/core to avoid circular dependencies
4
+ * @public API
5
+ */
6
+ export { Catch, UseFilters } from "@expressots/core";
@@ -0,0 +1,83 @@
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 "reflect-metadata";
14
+ import { inject, injectable, Container } from "@expressots/core";
15
+ import { getHttpContext } from "./http-context-store.js";
16
+ /**
17
+ * Factory for creating GuardContext from Express request/response
18
+ */
19
+ let GuardContextFactory = class GuardContextFactory {
20
+ container;
21
+ scopeExtractor;
22
+ constructor(container, scopeExtractor) {
23
+ this.container = container;
24
+ this.scopeExtractor = scopeExtractor;
25
+ }
26
+ /**
27
+ * Create GuardContext from Express request/response
28
+ */
29
+ async create(req, res) {
30
+ // Get HttpContext (created by InversifyExpressServer's first middleware
31
+ // and stored in a per-request WeakMap; see http-context-store.ts).
32
+ const httpContext = getHttpContext(req);
33
+ if (!httpContext) {
34
+ throw new Error("HttpContext not found on request. Ensure InversifyExpressServer is properly configured.");
35
+ }
36
+ // Extract scope information
37
+ const scope = await this.scopeExtractor.extract(req);
38
+ // Extract route metadata
39
+ const route = {
40
+ controller:
41
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
42
+ req.__expressotsControllerName || "unknown",
43
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
44
+ method: req.__expressotsMethod || "unknown",
45
+ path: req.path,
46
+ params: req.params,
47
+ query: req.query,
48
+ };
49
+ // Create guard context
50
+ // Note: httpContext.user is Principal from adapter-express, but GuardContext expects Principal from core
51
+ // They have the same structure, so this is compatible
52
+ // Note: httpContext.container is inversifyInterfaces.Container, but GuardContext expects Container from core
53
+ // They are compatible, so we cast it
54
+ const context = {
55
+ request: req,
56
+ response: res,
57
+ principal: httpContext.user, // Cast to core Principal type (same structure)
58
+ container: httpContext.container, // Request-scoped child container!
59
+ scope,
60
+ route,
61
+ getScoped: (identifier, scopeName) => {
62
+ // Resolve with scope awareness
63
+ // Note: scopeName is optional and can be used for custom scopes (e.g., tenant)
64
+ if (scopeName) {
65
+ // For custom scopes, use named binding or scope registry
66
+ // For now, fallback to regular get (can be enhanced later)
67
+ return httpContext.container.get(identifier);
68
+ }
69
+ return httpContext.container.get(identifier);
70
+ },
71
+ getTenantId: () => scope.tenant,
72
+ getRequestId: () => scope.request,
73
+ };
74
+ return context;
75
+ }
76
+ };
77
+ GuardContextFactory = __decorate([
78
+ injectable(),
79
+ __param(0, inject(Container)),
80
+ __param(1, inject("IScopeExtractor")),
81
+ __metadata("design:paramtypes", [Object, Object])
82
+ ], GuardContextFactory);
83
+ export { GuardContextFactory };