@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
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.principal = exports.next = exports.cookies = exports.headers = exports.body = exports.query = exports.param = exports.response = exports.request = exports.injectHttpContext = void 0;
4
4
  exports.controller = controller;
5
5
  exports.Http = Http;
6
+ exports.Version = Version;
6
7
  exports.All = All;
7
8
  exports.Get = Get;
8
9
  exports.Post = Post;
@@ -17,10 +18,14 @@ exports.getRenderMetadata = getRenderMetadata;
17
18
  exports.FileUpload = FileUpload;
18
19
  require("reflect-metadata");
19
20
  const core_1 = require("@expressots/core");
20
- const constants_1 = require("./constants");
21
- const resolver_multer_1 = require("./resolver-multer");
21
+ const constants_js_1 = require("./constants.js");
22
+ const resolver_multer_js_1 = require("./resolver-multer.js");
22
23
  const core_2 = require("@expressots/core");
23
- exports.injectHttpContext = (0, core_1.inject)(constants_1.TYPE.HttpContext);
24
+ const path_pattern_compat_js_1 = require("./path-pattern-compat.js");
25
+ // Explicit type annotation: without this, the inferred type pulls a
26
+ // non-portable path from @expressots/core's internal decorator_utils,
27
+ // which TS2742 rejects under NodeNext when emitting .d.ts files.
28
+ exports.injectHttpContext = (0, core_1.inject)(constants_js_1.TYPE.HttpContext);
24
29
  /**
25
30
  * Controller decorator to define a new controller
26
31
  * @param path route path
@@ -29,29 +34,57 @@ exports.injectHttpContext = (0, core_1.inject)(constants_1.TYPE.HttpContext);
29
34
  */
30
35
  function controller(path, ...middleware) {
31
36
  return (target) => {
37
+ // Check for version metadata on the controller class
38
+ const controllerVersion = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.version, target);
39
+ // Translate any inline regex constraints in the controller-level
40
+ // prefix (`@controller("/users/:tenant(\\d+)")`) into a
41
+ // request-time validator. Keeps `@controller("/")` and the common
42
+ // case allocation-free.
43
+ const split = (0, path_pattern_compat_js_1.splitPathConstraints)(path);
44
+ const constraintMiddleware = (0, path_pattern_compat_js_1.createPathConstraintMiddleware)(split.constraints);
45
+ const effectivePath = split.path;
46
+ const effectiveMiddleware = constraintMiddleware
47
+ ? [constraintMiddleware, ...middleware]
48
+ : middleware;
32
49
  const currentMetadata = {
33
- middleware,
34
- path,
35
- target,
50
+ middleware: effectiveMiddleware,
51
+ path: effectivePath,
52
+ target: target,
53
+ version: controllerVersion,
36
54
  };
37
- const pathMetadata = Reflect.getOwnMetadata(constants_1.HTTP_CODE_METADATA.path, Reflect) || {};
38
- const statusCodeMetadata = Reflect.getOwnMetadata(constants_1.HTTP_CODE_METADATA.statusCode, Reflect) || {};
39
- const statusCodePathMapping = Reflect.getOwnMetadata(constants_1.HTTP_CODE_METADATA.httpCode, Reflect) || {};
55
+ const pathMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.path, Reflect) || {};
56
+ const statusCodeMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.statusCode, Reflect) || {};
57
+ const statusCodePathMapping = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.httpCode, Reflect) || {};
40
58
  for (const key in pathMetadata) {
41
59
  if (statusCodeMetadata && statusCodeMetadata[key]) {
42
- const realPath = pathMetadata[key]["path"] === "/" ? path : `${path}${pathMetadata[key]["path"]}`;
60
+ const methodPath = pathMetadata[key]["path"];
61
+ // Properly join controller and method paths. The controller
62
+ // path is the v8-cleaned `effectivePath` so the mapping key is
63
+ // consistent with what gets registered on Express.
64
+ let realPath;
65
+ if (methodPath === "/" || methodPath === "") {
66
+ realPath = effectivePath;
67
+ }
68
+ else if (effectivePath === "/" || effectivePath === "") {
69
+ realPath = methodPath.startsWith("/") ? methodPath : `/${methodPath}`;
70
+ }
71
+ else {
72
+ const basePath = effectivePath.endsWith("/") ? effectivePath.slice(0, -1) : effectivePath;
73
+ const subPath = methodPath.startsWith("/") ? methodPath : `/${methodPath}`;
74
+ realPath = `${basePath}${subPath}`;
75
+ }
43
76
  statusCodePathMapping[`${realPath}/-${pathMetadata[key]["method"].toLowerCase()}`] =
44
77
  statusCodeMetadata[key];
45
78
  }
46
79
  }
47
- Reflect.defineMetadata(constants_1.HTTP_CODE_METADATA.httpCode, statusCodePathMapping, Reflect);
48
- Reflect.deleteMetadata(constants_1.HTTP_CODE_METADATA.statusCode, Reflect);
49
- Reflect.deleteMetadata(constants_1.HTTP_CODE_METADATA.path, Reflect);
80
+ Reflect.defineMetadata(constants_js_1.HTTP_CODE_METADATA.httpCode, statusCodePathMapping, Reflect);
81
+ Reflect.deleteMetadata(constants_js_1.HTTP_CODE_METADATA.statusCode, Reflect);
82
+ Reflect.deleteMetadata(constants_js_1.HTTP_CODE_METADATA.path, Reflect);
50
83
  (0, core_1.decorate)((0, core_1.injectable)(), target);
51
- Reflect.defineMetadata(constants_1.METADATA_KEY.controller, currentMetadata, target);
52
- const previousMetadata = Reflect.getMetadata(constants_1.METADATA_KEY.controller, Reflect) || [];
84
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.controller, currentMetadata, target);
85
+ const previousMetadata = Reflect.getMetadata(constants_js_1.METADATA_KEY.controller, Reflect) || [];
53
86
  const newMetadata = [currentMetadata, ...previousMetadata];
54
- Reflect.defineMetadata(constants_1.METADATA_KEY.controller, newMetadata, Reflect);
87
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.controller, newMetadata, Reflect);
55
88
  };
56
89
  }
57
90
  /**
@@ -70,7 +103,7 @@ function controller(path, ...middleware) {
70
103
  function Http(code) {
71
104
  // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
72
105
  return (target, key, descriptor) => {
73
- let httpCodeMetadata = Reflect.getOwnMetadata(constants_1.HTTP_CODE_METADATA.statusCode, Reflect);
106
+ let httpCodeMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.statusCode, Reflect);
74
107
  if (httpCodeMetadata) {
75
108
  httpCodeMetadata[key] = code;
76
109
  }
@@ -78,7 +111,55 @@ function Http(code) {
78
111
  httpCodeMetadata = {};
79
112
  httpCodeMetadata[key] = code;
80
113
  }
81
- Reflect.defineMetadata(constants_1.HTTP_CODE_METADATA.statusCode, httpCodeMetadata, Reflect);
114
+ Reflect.defineMetadata(constants_js_1.HTTP_CODE_METADATA.statusCode, httpCodeMetadata, Reflect);
115
+ };
116
+ }
117
+ /**
118
+ * Version decorator to define the API version for a controller or route method
119
+ * @param version API version (e.g., "1", "1.0", "v1", or 1)
120
+ * @returns ClassDecorator | MethodDecorator
121
+ * @example ```typescript
122
+ * @Version("1")
123
+ * @controller("/users")
124
+ * class UserController {}
125
+ *
126
+ * // Or at method level:
127
+ * @Version("2")
128
+ * @Get("/")
129
+ * getUsers() {
130
+ * return "v2 users";
131
+ * }
132
+ * ```
133
+ * @public API
134
+ */
135
+ function Version(version) {
136
+ // Normalize version to string format (e.g., "v1" or "1" -> "v1")
137
+ const normalizedVersion = typeof version === "number" ? `v${version}` : version.startsWith("v") ? version : `v${version}`;
138
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
139
+ return (target, key, descriptor) => {
140
+ if (key !== undefined && descriptor !== undefined) {
141
+ // Method decorator - store version metadata for the method
142
+ // This will be read by enhancedHttpMethod/Method when they create metadata
143
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.version, normalizedVersion, target, key);
144
+ // Also update existing metadata if it exists
145
+ const metadataList = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor);
146
+ if (metadataList) {
147
+ const methodMetadata = metadataList.find((m) => m.key === key);
148
+ if (methodMetadata) {
149
+ methodMetadata.version = normalizedVersion;
150
+ }
151
+ }
152
+ }
153
+ else {
154
+ // Class decorator - store version metadata for the controller
155
+ // This will be read by controller decorator when it creates metadata
156
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.version, normalizedVersion, target);
157
+ // Also update existing metadata if it exists
158
+ const controllerMetadata = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controller, target);
159
+ if (controllerMetadata) {
160
+ controllerMetadata.version = normalizedVersion;
161
+ }
162
+ }
82
163
  };
83
164
  }
84
165
  /**
@@ -151,34 +232,47 @@ function Delete(path, ...middleware) {
151
232
  */
152
233
  function enhancedHttpMethod(method, path, ...middleware) {
153
234
  return (target, key) => {
235
+ // Check for version metadata on the method
236
+ const methodVersion = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.version, target, key);
237
+ // Express 5 / path-to-regexp v8 dropped inline regex constraints
238
+ // (`:id(\\d+)`). Split them out into a v8-compatible path + a
239
+ // request-time validator middleware so existing routes — and our
240
+ // {@link Patterns} / {@link pattern} public API — keep working.
241
+ const split = (0, path_pattern_compat_js_1.splitPathConstraints)(path);
242
+ const constraintMiddleware = (0, path_pattern_compat_js_1.createPathConstraintMiddleware)(split.constraints);
243
+ const effectivePath = split.path;
244
+ const effectiveMiddleware = constraintMiddleware
245
+ ? [constraintMiddleware, ...middleware]
246
+ : middleware;
154
247
  const metadata = {
155
- key,
248
+ key: String(key),
156
249
  method,
157
- middleware,
158
- path,
159
- target,
250
+ middleware: effectiveMiddleware,
251
+ path: effectivePath,
252
+ target: target,
253
+ version: methodVersion,
160
254
  };
161
255
  let metadataList = [];
162
- let pathMetadata = Reflect.getOwnMetadata(constants_1.HTTP_CODE_METADATA.path, Reflect);
256
+ let pathMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.path, Reflect);
163
257
  if (pathMetadata) {
164
258
  pathMetadata[key] = {
165
- path,
259
+ path: effectivePath,
166
260
  method,
167
261
  };
168
262
  }
169
263
  else {
170
264
  pathMetadata = {};
171
265
  pathMetadata[key] = {
172
- path,
266
+ path: effectivePath,
173
267
  method,
174
268
  };
175
269
  }
176
- Reflect.defineMetadata(constants_1.HTTP_CODE_METADATA.path, pathMetadata, Reflect);
177
- if (!Reflect.hasOwnMetadata(constants_1.METADATA_KEY.controllerMethod, target.constructor)) {
178
- Reflect.defineMetadata(constants_1.METADATA_KEY.controllerMethod, metadataList, target.constructor);
270
+ Reflect.defineMetadata(constants_js_1.HTTP_CODE_METADATA.path, pathMetadata, Reflect);
271
+ if (!Reflect.hasOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor)) {
272
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.controllerMethod, metadataList, target.constructor);
179
273
  }
180
274
  else {
181
- metadataList = Reflect.getOwnMetadata(constants_1.METADATA_KEY.controllerMethod, target.constructor);
275
+ metadataList = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor);
182
276
  }
183
277
  metadataList.push(metadata);
184
278
  const paramsInfo = Reflect.getMetadata("design:paramtypes", target, key) || [];
@@ -203,34 +297,44 @@ function enhancedHttpMethod(method, path, ...middleware) {
203
297
  */
204
298
  function Method(method, path, ...middleware) {
205
299
  return (target, key) => {
300
+ // Check for version metadata on the method
301
+ const methodVersion = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.version, target, key);
302
+ // Same path-to-regexp v8 compatibility shim as `enhancedHttpMethod`.
303
+ const split = (0, path_pattern_compat_js_1.splitPathConstraints)(path);
304
+ const constraintMiddleware = (0, path_pattern_compat_js_1.createPathConstraintMiddleware)(split.constraints);
305
+ const effectivePath = split.path;
306
+ const effectiveMiddleware = constraintMiddleware
307
+ ? [constraintMiddleware, ...middleware]
308
+ : middleware;
206
309
  const metadata = {
207
- key,
310
+ key: String(key),
208
311
  method,
209
- middleware,
210
- path,
211
- target,
312
+ middleware: effectiveMiddleware,
313
+ path: effectivePath,
314
+ target: target,
315
+ version: methodVersion,
212
316
  };
213
317
  let metadataList = [];
214
- let pathMetadata = Reflect.getOwnMetadata(constants_1.HTTP_CODE_METADATA.path, Reflect);
318
+ let pathMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.path, Reflect);
215
319
  if (pathMetadata) {
216
320
  pathMetadata[key] = {
217
- path,
321
+ path: effectivePath,
218
322
  method,
219
323
  };
220
324
  }
221
325
  else {
222
326
  pathMetadata = {};
223
327
  pathMetadata[key] = {
224
- path,
328
+ path: effectivePath,
225
329
  method,
226
330
  };
227
331
  }
228
- Reflect.defineMetadata(constants_1.HTTP_CODE_METADATA.path, pathMetadata, Reflect);
229
- if (!Reflect.hasOwnMetadata(constants_1.METADATA_KEY.controllerMethod, target.constructor)) {
230
- Reflect.defineMetadata(constants_1.METADATA_KEY.controllerMethod, metadataList, target.constructor);
332
+ Reflect.defineMetadata(constants_js_1.HTTP_CODE_METADATA.path, pathMetadata, Reflect);
333
+ if (!Reflect.hasOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor)) {
334
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.controllerMethod, metadataList, target.constructor);
231
335
  }
232
336
  else {
233
- metadataList = Reflect.getOwnMetadata(constants_1.METADATA_KEY.controllerMethod, target.constructor);
337
+ metadataList = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor);
234
338
  }
235
339
  metadataList.push(metadata);
236
340
  };
@@ -239,47 +343,47 @@ function Method(method, path, ...middleware) {
239
343
  * Parameter decorator to inject the request object
240
344
  * @returns ParameterDecorator
241
345
  */
242
- exports.request = paramDecoratorFactory(constants_1.PARAMETER_TYPE.REQUEST);
346
+ exports.request = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.REQUEST);
243
347
  /**
244
348
  * Parameter decorator to inject the response object
245
349
  * @returns ParameterDecorator
246
350
  */
247
- exports.response = paramDecoratorFactory(constants_1.PARAMETER_TYPE.RESPONSE);
351
+ exports.response = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.RESPONSE);
248
352
  /**
249
353
  * Parameter decorator to inject parameters from the route
250
354
  * @returns ParameterDecorator
251
355
  */
252
- exports.param = paramDecoratorFactory(constants_1.PARAMETER_TYPE.PARAMS);
356
+ exports.param = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.PARAMS);
253
357
  /**
254
358
  * Parameter decorator to inject query parameters
255
359
  * @returns ParameterDecorator
256
360
  */
257
- exports.query = paramDecoratorFactory(constants_1.PARAMETER_TYPE.QUERY);
361
+ exports.query = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.QUERY);
258
362
  /**
259
363
  * Parameter decorator to inject the request body
260
364
  * @returns ParameterDecorator
261
365
  */
262
- exports.body = paramDecoratorFactory(constants_1.PARAMETER_TYPE.BODY);
366
+ exports.body = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.BODY);
263
367
  /**
264
368
  * Parameter decorator to inject the request headers
265
369
  * @returns ParameterDecorator
266
370
  */
267
- exports.headers = paramDecoratorFactory(constants_1.PARAMETER_TYPE.HEADERS);
371
+ exports.headers = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.HEADERS);
268
372
  /**
269
373
  * Parameter decorator to inject the request cookies
270
374
  * @returns ParameterDecorator
271
375
  */
272
- exports.cookies = paramDecoratorFactory(constants_1.PARAMETER_TYPE.COOKIES);
376
+ exports.cookies = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.COOKIES);
273
377
  /**
274
378
  * Parameter decorator next function
275
379
  * @returns ParameterDecorator
276
380
  */
277
- exports.next = paramDecoratorFactory(constants_1.PARAMETER_TYPE.NEXT);
381
+ exports.next = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.NEXT);
278
382
  /**
279
383
  * Parameter decorator to inject the principal object obtained from AuthProvider
280
384
  * @returns ParameterDecorator
281
385
  */
282
- exports.principal = paramDecoratorFactory(constants_1.PARAMETER_TYPE.PRINCIPAL);
386
+ exports.principal = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.PRINCIPAL);
283
387
  /**
284
388
  * Parameter decorator to inject the request user object
285
389
  * @returns ParameterDecorator
@@ -304,18 +408,18 @@ function params(type, parameterName) {
304
408
  parameterName,
305
409
  type,
306
410
  };
307
- if (!Reflect.hasOwnMetadata(constants_1.METADATA_KEY.controllerParameter, target.constructor)) {
411
+ if (!Reflect.hasOwnMetadata(constants_js_1.METADATA_KEY.controllerParameter, target.constructor)) {
308
412
  parameterMetadataList.unshift(parameterMetadata);
309
413
  }
310
414
  else {
311
- metadataList = Reflect.getOwnMetadata(constants_1.METADATA_KEY.controllerParameter, target.constructor);
415
+ metadataList = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controllerParameter, target.constructor);
312
416
  if (metadataList[methodName]) {
313
417
  parameterMetadataList = metadataList[methodName] || [];
314
418
  }
315
419
  parameterMetadataList.unshift(parameterMetadata);
316
420
  }
317
421
  metadataList[methodName] = parameterMetadataList;
318
- Reflect.defineMetadata(constants_1.METADATA_KEY.controllerParameter, metadataList, target.constructor);
422
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.controllerParameter, metadataList, target.constructor);
319
423
  };
320
424
  }
321
425
  /**
@@ -328,11 +432,11 @@ function params(type, parameterName) {
328
432
  function Render(template, defaultData) {
329
433
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
330
434
  return (target, propertyKey, descriptor) => {
331
- Reflect.defineMetadata(constants_1.RENDER_METADATA_KEY, { template, defaultData }, target, propertyKey);
435
+ Reflect.defineMetadata(constants_js_1.RENDER_METADATA_KEY, { template, defaultData }, target, propertyKey);
332
436
  };
333
437
  }
334
438
  function getRenderMetadata(target, propertyKey) {
335
- return Reflect.getMetadata(constants_1.RENDER_METADATA_KEY, target, propertyKey) || {};
439
+ return Reflect.getMetadata(constants_js_1.RENDER_METADATA_KEY, target, propertyKey) || {};
336
440
  }
337
441
  /**
338
442
  * Converts a string value to the specified type.
@@ -365,15 +469,44 @@ function isResponse(obj) {
365
469
  return (typeof obj === "object" && obj !== null && "status" in obj && "json" in obj && "send" in obj);
366
470
  }
367
471
  /**
368
- * File upload decorator to handle file uploads
369
- * @param options
370
- * @param multerOptions
472
+ * File upload decorator to handle file uploads.
473
+ *
474
+ * This decorator integrates with the global upload configuration
475
+ * set via `Middleware.upload()` in app.ts. If global config exists,
476
+ * it will be used as defaults, with local options taking precedence.
477
+ *
478
+ * @param options - Field configuration (fieldName, maxCount, none, any)
479
+ * @param multerOptions - Optional multer options (overrides global config)
371
480
  * @default { none: true }
372
481
  * @returns MethodDecorator
482
+ *
483
+ * @example
484
+ * ```typescript
485
+ * // In app.ts - configure globally (optional)
486
+ * this.Middleware.upload({
487
+ * destination: './uploads',
488
+ * limits: { fileSize: 10 * 1024 * 1024 }
489
+ * });
490
+ *
491
+ * // In controller - uses global config automatically
492
+ * @Post('avatar')
493
+ * @FileUpload({ fieldName: 'avatar' })
494
+ * uploadAvatar(req: Request) {
495
+ * return req.file;
496
+ * }
497
+ *
498
+ * // Override global config for specific endpoint
499
+ * @Post('document')
500
+ * @FileUpload({ fieldName: 'doc' }, { limits: { fileSize: 50 * 1024 * 1024 } })
501
+ * uploadDocument(req: Request) {
502
+ * return req.file;
503
+ * }
504
+ * ```
505
+ *
373
506
  * @public API
374
507
  */
375
508
  function FileUpload(options, multerOptions) {
376
- const multer = (0, resolver_multer_1.packageResolver)("multer");
509
+ const multer = (0, resolver_multer_js_1.packageResolver)("multer");
377
510
  /* eslint-disable @typescript-eslint/no-explicit-any */
378
511
  let upload;
379
512
  let method = "none";
@@ -381,7 +514,40 @@ function FileUpload(options, multerOptions) {
381
514
  if (options === undefined) {
382
515
  options = { none: true };
383
516
  }
384
- upload = multer(multerOptions);
517
+ // Get global upload configuration (set via Middleware.upload())
518
+ const globalConfig = (0, core_1.getGlobalUploadConfig)();
519
+ // Build final multer options, merging global config with local options
520
+ // Local options always take precedence over global config
521
+ const finalMulterOptions = {};
522
+ // Apply global config as defaults
523
+ if (globalConfig) {
524
+ if (globalConfig.destination) {
525
+ finalMulterOptions.dest = globalConfig.destination;
526
+ }
527
+ if (globalConfig.limits) {
528
+ finalMulterOptions.limits = globalConfig.limits;
529
+ }
530
+ }
531
+ // Apply local options (overrides global)
532
+ if (multerOptions) {
533
+ if (multerOptions.dest) {
534
+ finalMulterOptions.dest = multerOptions.dest;
535
+ }
536
+ if (multerOptions.limits) {
537
+ // Merge limits - local takes precedence
538
+ finalMulterOptions.limits = {
539
+ ...finalMulterOptions.limits,
540
+ ...multerOptions.limits,
541
+ };
542
+ }
543
+ if (multerOptions.storage) {
544
+ finalMulterOptions.storage = multerOptions.storage;
545
+ }
546
+ if (multerOptions.fileFilter) {
547
+ finalMulterOptions.fileFilter = multerOptions.fileFilter;
548
+ }
549
+ }
550
+ upload = multer(finalMulterOptions);
385
551
  method = inferMulterMethod(options);
386
552
  }
387
553
  return function (target, propertyKey, descriptor) {
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UseFilters = exports.Catch = void 0;
4
+ /**
5
+ * Re-export exception filter decorators from core for backward compatibility
6
+ * These decorators are now part of @expressots/core to avoid circular dependencies
7
+ * @public API
8
+ */
9
+ var core_1 = require("@expressots/core");
10
+ Object.defineProperty(exports, "Catch", { enumerable: true, get: function () { return core_1.Catch; } });
11
+ Object.defineProperty(exports, "UseFilters", { enumerable: true, get: function () { return core_1.UseFilters; } });
@@ -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);