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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/README.md +39 -96
  2. package/lib/CHANGELOG.md +31 -5
  3. package/lib/README.md +39 -96
  4. package/lib/cjs/adapter-express/application-express.base.js +3 -1
  5. package/lib/cjs/adapter-express/application-express.js +1049 -85
  6. package/lib/cjs/adapter-express/express-utils/conditional-middleware.js +102 -0
  7. package/lib/cjs/adapter-express/express-utils/constants.js +17 -0
  8. package/lib/cjs/adapter-express/express-utils/content-negotiation-decorators.js +129 -0
  9. package/lib/cjs/adapter-express/express-utils/decorators.js +186 -49
  10. package/lib/cjs/adapter-express/express-utils/exception-filter-decorators.js +11 -0
  11. package/lib/cjs/adapter-express/express-utils/guard-context-factory.js +84 -0
  12. package/lib/cjs/adapter-express/express-utils/guard-middleware.js +115 -0
  13. package/lib/cjs/adapter-express/express-utils/guard-utils.js +18 -0
  14. package/lib/cjs/adapter-express/express-utils/http-context-store.js +15 -0
  15. package/lib/cjs/adapter-express/express-utils/http-status-middleware.js +37 -2
  16. package/lib/cjs/adapter-express/express-utils/index.js +67 -1
  17. package/lib/cjs/adapter-express/express-utils/interceptor-middleware.js +132 -0
  18. package/lib/cjs/adapter-express/express-utils/inversify-express-server.js +810 -63
  19. package/lib/cjs/adapter-express/express-utils/lazy-module-middleware.js +241 -0
  20. package/lib/cjs/adapter-express/express-utils/middleware-composition.js +95 -0
  21. package/lib/cjs/adapter-express/express-utils/permission-preloader.middleware.js +48 -0
  22. package/lib/cjs/adapter-express/express-utils/route-constraints.js +95 -0
  23. package/lib/cjs/adapter-express/express-utils/scope-extractor.interface.js +2 -0
  24. package/lib/cjs/adapter-express/express-utils/scope-extractor.js +66 -0
  25. package/lib/cjs/adapter-express/express-utils/setup-authorization.js +71 -0
  26. package/lib/cjs/adapter-express/express-utils/setup-event-system.js +113 -0
  27. package/lib/cjs/adapter-express/express-utils/setup-interceptors.js +103 -0
  28. package/lib/cjs/adapter-express/express-utils/setup-lazy-loading.js +228 -0
  29. package/lib/cjs/adapter-express/express-utils/utils.js +30 -12
  30. package/lib/cjs/adapter-express/express-utils/validation-decorators.js +205 -0
  31. package/lib/cjs/adapter-express/express-utils/validation-service.js +252 -0
  32. package/lib/cjs/adapter-express/index.js +7 -5
  33. package/lib/cjs/adapter-express/micro-api/application-express-micro-route.js +31 -1
  34. package/lib/cjs/adapter-express/micro-api/application-express-micro.js +11 -37
  35. package/lib/cjs/adapter-express/micro-api/gateway/circuit-breaker.js +174 -0
  36. package/lib/cjs/adapter-express/micro-api/gateway/index.js +11 -0
  37. package/lib/cjs/adapter-express/micro-api/gateway/service-proxy.js +214 -0
  38. package/lib/cjs/adapter-express/micro-api/index.js +27 -3
  39. package/lib/cjs/adapter-express/micro-api/micro.js +217 -0
  40. package/lib/cjs/adapter-express/micro-api/queue/index.js +8 -0
  41. package/lib/cjs/adapter-express/micro-api/queue/queue.interface.js +2 -0
  42. package/lib/cjs/adapter-express/micro-api/queue/rabbitmq-consumer.js +255 -0
  43. package/lib/cjs/adapter-express/micro-api/serverless/aws-lambda.adapter.js +183 -0
  44. package/lib/cjs/adapter-express/micro-api/serverless/cloudflare.adapter.js +158 -0
  45. package/lib/cjs/adapter-express/micro-api/serverless/index.js +12 -0
  46. package/lib/cjs/adapter-express/micro-api/serverless/vercel.adapter.js +102 -0
  47. package/lib/cjs/adapter-express/micro-api/service-mesh/index.js +10 -0
  48. package/lib/cjs/adapter-express/micro-api/service-mesh/service-client.js +194 -0
  49. package/lib/cjs/adapter-express/micro-api/service-mesh/service-discovery.js +261 -0
  50. package/lib/cjs/adapter-express/middleware/index.js +21 -0
  51. package/lib/cjs/adapter-express/middleware/request-logging.middleware.js +244 -0
  52. package/lib/cjs/adapter-express/render/engine.js +15 -15
  53. package/lib/cjs/adapter-express/render/index.js +5 -0
  54. package/lib/cjs/adapter-express/studio/index.js +9 -0
  55. package/lib/cjs/adapter-express/studio/studio-integration.js +214 -0
  56. package/lib/cjs/index.js +1 -1
  57. package/lib/cjs/types/adapter-express/application-express.base.d.ts +20 -7
  58. package/lib/cjs/types/adapter-express/application-express.d.ts +273 -32
  59. package/lib/cjs/types/adapter-express/express-utils/base-middleware.d.ts +2 -2
  60. package/lib/cjs/types/adapter-express/express-utils/conditional-middleware.d.ts +97 -0
  61. package/lib/cjs/types/adapter-express/express-utils/constants.d.ts +13 -0
  62. package/lib/cjs/types/adapter-express/express-utils/content-negotiation-decorators.d.ts +94 -0
  63. package/lib/cjs/types/adapter-express/express-utils/decorators.d.ts +54 -6
  64. package/lib/cjs/types/adapter-express/express-utils/exception-filter-decorators.d.ts +6 -0
  65. package/lib/cjs/types/adapter-express/express-utils/guard-context-factory.d.ts +17 -0
  66. package/lib/cjs/types/adapter-express/express-utils/guard-middleware.d.ts +22 -0
  67. package/lib/cjs/types/adapter-express/express-utils/guard-utils.d.ts +11 -0
  68. package/lib/cjs/types/adapter-express/express-utils/http-context-store.d.ts +20 -0
  69. package/lib/cjs/types/adapter-express/express-utils/httpResponseMessage.d.ts +1 -1
  70. package/lib/cjs/types/adapter-express/express-utils/index.d.ts +30 -2
  71. package/lib/cjs/types/adapter-express/express-utils/interceptor-middleware.d.ts +40 -0
  72. package/lib/cjs/types/adapter-express/express-utils/interfaces.d.ts +42 -5
  73. package/lib/cjs/types/adapter-express/express-utils/inversify-express-server.d.ts +114 -2
  74. package/lib/cjs/types/adapter-express/express-utils/lazy-module-middleware.d.ts +122 -0
  75. package/lib/cjs/types/adapter-express/express-utils/middleware-composition.d.ts +85 -0
  76. package/lib/cjs/types/adapter-express/express-utils/permission-preloader.middleware.d.ts +10 -0
  77. package/lib/cjs/types/adapter-express/express-utils/route-constraints.d.ts +89 -0
  78. package/lib/cjs/types/adapter-express/express-utils/scope-extractor.d.ts +21 -0
  79. package/lib/cjs/types/adapter-express/express-utils/scope-extractor.interface.d.ts +12 -0
  80. package/lib/cjs/types/adapter-express/express-utils/setup-authorization.d.ts +34 -0
  81. package/lib/cjs/types/adapter-express/express-utils/setup-event-system.d.ts +118 -0
  82. package/lib/cjs/types/adapter-express/express-utils/setup-interceptors.d.ts +115 -0
  83. package/lib/cjs/types/adapter-express/express-utils/setup-lazy-loading.d.ts +123 -0
  84. package/lib/cjs/types/adapter-express/express-utils/utils.d.ts +17 -2
  85. package/lib/cjs/types/adapter-express/express-utils/validation-decorators.d.ts +145 -0
  86. package/lib/cjs/types/adapter-express/express-utils/validation-service.d.ts +88 -0
  87. package/lib/cjs/types/adapter-express/index.d.ts +6 -4
  88. package/lib/cjs/types/adapter-express/micro-api/application-express-micro-route.d.ts +25 -14
  89. package/lib/cjs/types/adapter-express/micro-api/application-express-micro.d.ts +3 -10
  90. package/lib/cjs/types/adapter-express/micro-api/gateway/circuit-breaker.d.ts +111 -0
  91. package/lib/cjs/types/adapter-express/micro-api/gateway/index.d.ts +5 -0
  92. package/lib/cjs/types/adapter-express/micro-api/gateway/service-proxy.d.ts +83 -0
  93. package/lib/cjs/types/adapter-express/micro-api/index.d.ts +7 -1
  94. package/lib/cjs/types/adapter-express/micro-api/micro.d.ts +66 -0
  95. package/lib/cjs/types/adapter-express/micro-api/queue/index.d.ts +5 -0
  96. package/lib/cjs/types/adapter-express/micro-api/queue/queue.interface.d.ts +60 -0
  97. package/lib/cjs/types/adapter-express/micro-api/queue/rabbitmq-consumer.d.ts +86 -0
  98. package/lib/cjs/types/adapter-express/micro-api/serverless/aws-lambda.adapter.d.ts +77 -0
  99. package/lib/cjs/types/adapter-express/micro-api/serverless/cloudflare.adapter.d.ts +64 -0
  100. package/lib/cjs/types/adapter-express/micro-api/serverless/index.d.ts +6 -0
  101. package/lib/cjs/types/adapter-express/micro-api/serverless/vercel.adapter.d.ts +56 -0
  102. package/lib/cjs/types/adapter-express/micro-api/service-mesh/index.d.ts +5 -0
  103. package/lib/cjs/types/adapter-express/micro-api/service-mesh/service-client.d.ts +122 -0
  104. package/lib/cjs/types/adapter-express/micro-api/service-mesh/service-discovery.d.ts +150 -0
  105. package/lib/cjs/types/adapter-express/middleware/index.d.ts +5 -0
  106. package/lib/cjs/types/adapter-express/middleware/request-logging.middleware.d.ts +65 -0
  107. package/lib/cjs/types/adapter-express/render/index.d.ts +1 -0
  108. package/lib/cjs/types/adapter-express/studio/index.d.ts +1 -0
  109. package/lib/cjs/types/adapter-express/studio/studio-integration.d.ts +92 -0
  110. package/lib/cjs/types/index.d.ts +1 -1
  111. package/lib/esm/adapter-express/application-express.base.js +24 -0
  112. package/lib/esm/adapter-express/application-express.js +1300 -0
  113. package/lib/esm/adapter-express/application-express.types.js +1 -0
  114. package/lib/esm/adapter-express/express-utils/base-middleware.js +19 -0
  115. package/lib/esm/adapter-express/express-utils/conditional-middleware.js +96 -0
  116. package/lib/esm/adapter-express/express-utils/constants.js +63 -0
  117. package/lib/esm/adapter-express/express-utils/content/httpContent.js +6 -0
  118. package/lib/esm/adapter-express/express-utils/content-negotiation-decorators.js +120 -0
  119. package/lib/esm/adapter-express/express-utils/decorators.js +575 -0
  120. package/lib/esm/adapter-express/express-utils/exception-filter-decorators.js +6 -0
  121. package/lib/esm/adapter-express/express-utils/guard-context-factory.js +83 -0
  122. package/lib/esm/adapter-express/express-utils/guard-middleware.js +115 -0
  123. package/lib/esm/adapter-express/express-utils/guard-utils.js +14 -0
  124. package/lib/esm/adapter-express/express-utils/http-context-store.js +10 -0
  125. package/lib/esm/adapter-express/express-utils/http-status-middleware.js +116 -0
  126. package/lib/esm/adapter-express/express-utils/httpResponseMessage.js +29 -0
  127. package/lib/esm/adapter-express/express-utils/index.js +24 -0
  128. package/lib/esm/adapter-express/express-utils/interceptor-middleware.js +130 -0
  129. package/lib/esm/adapter-express/express-utils/interfaces.js +1 -0
  130. package/lib/esm/adapter-express/express-utils/inversify-express-server.js +1031 -0
  131. package/lib/esm/adapter-express/express-utils/lazy-module-middleware.js +236 -0
  132. package/lib/esm/adapter-express/express-utils/middleware-composition.js +89 -0
  133. package/lib/esm/adapter-express/express-utils/permission-preloader.middleware.js +45 -0
  134. package/lib/esm/adapter-express/express-utils/resolver-multer.js +30 -0
  135. package/lib/esm/adapter-express/express-utils/route-constraints.js +91 -0
  136. package/lib/esm/adapter-express/express-utils/scope-extractor.interface.js +1 -0
  137. package/lib/esm/adapter-express/express-utils/scope-extractor.js +63 -0
  138. package/lib/esm/adapter-express/express-utils/setup-authorization.js +68 -0
  139. package/lib/esm/adapter-express/express-utils/setup-event-system.js +110 -0
  140. package/lib/esm/adapter-express/express-utils/setup-interceptors.js +100 -0
  141. package/lib/esm/adapter-express/express-utils/setup-lazy-loading.js +225 -0
  142. package/lib/esm/adapter-express/express-utils/utils.js +68 -0
  143. package/lib/esm/adapter-express/express-utils/validation-decorators.js +199 -0
  144. package/lib/esm/adapter-express/express-utils/validation-service.js +251 -0
  145. package/lib/esm/adapter-express/index.js +7 -0
  146. package/lib/esm/adapter-express/micro-api/application-express-micro-container.js +48 -0
  147. package/lib/esm/adapter-express/micro-api/application-express-micro-route.js +128 -0
  148. package/lib/esm/adapter-express/micro-api/application-express-micro.js +161 -0
  149. package/lib/esm/adapter-express/micro-api/gateway/circuit-breaker.js +174 -0
  150. package/lib/esm/adapter-express/micro-api/gateway/index.js +5 -0
  151. package/lib/esm/adapter-express/micro-api/gateway/service-proxy.js +210 -0
  152. package/lib/esm/adapter-express/micro-api/index.js +10 -0
  153. package/lib/esm/adapter-express/micro-api/micro.js +211 -0
  154. package/lib/esm/adapter-express/micro-api/queue/index.js +4 -0
  155. package/lib/esm/adapter-express/micro-api/queue/queue.interface.js +1 -0
  156. package/lib/esm/adapter-express/micro-api/queue/rabbitmq-consumer.js +229 -0
  157. package/lib/esm/adapter-express/micro-api/serverless/aws-lambda.adapter.js +180 -0
  158. package/lib/esm/adapter-express/micro-api/serverless/cloudflare.adapter.js +155 -0
  159. package/lib/esm/adapter-express/micro-api/serverless/index.js +6 -0
  160. package/lib/esm/adapter-express/micro-api/serverless/vercel.adapter.js +99 -0
  161. package/lib/esm/adapter-express/micro-api/service-mesh/index.js +5 -0
  162. package/lib/esm/adapter-express/micro-api/service-mesh/service-client.js +191 -0
  163. package/lib/esm/adapter-express/micro-api/service-mesh/service-discovery.js +259 -0
  164. package/lib/esm/adapter-express/middleware/index.js +5 -0
  165. package/lib/esm/adapter-express/middleware/request-logging.middleware.js +239 -0
  166. package/lib/esm/adapter-express/render/constants.js +37 -0
  167. package/lib/esm/adapter-express/render/engine.js +51 -0
  168. package/lib/esm/adapter-express/render/index.js +1 -0
  169. package/lib/esm/adapter-express/render/resolve-render.js +30 -0
  170. package/lib/esm/adapter-express/studio/index.js +1 -0
  171. package/lib/esm/adapter-express/studio/studio-integration.js +184 -0
  172. package/lib/esm/index.mjs +1 -0
  173. package/lib/esm/package.json +3 -0
  174. package/lib/esm/types/adapter-express/application-express.base.d.ts +77 -0
  175. package/lib/esm/types/adapter-express/application-express.d.ts +411 -0
  176. package/lib/esm/types/adapter-express/application-express.types.d.ts +23 -0
  177. package/lib/esm/types/adapter-express/express-utils/base-middleware.d.ts +8 -0
  178. package/lib/esm/types/adapter-express/express-utils/conditional-middleware.d.ts +97 -0
  179. package/lib/esm/types/adapter-express/express-utils/constants.d.ts +57 -0
  180. package/lib/esm/types/adapter-express/express-utils/content/httpContent.d.ts +6 -0
  181. package/lib/esm/types/adapter-express/express-utils/content-negotiation-decorators.d.ts +94 -0
  182. package/lib/esm/types/adapter-express/express-utils/decorators.d.ts +257 -0
  183. package/lib/esm/types/adapter-express/express-utils/exception-filter-decorators.d.ts +6 -0
  184. package/lib/esm/types/adapter-express/express-utils/guard-context-factory.d.ts +17 -0
  185. package/lib/esm/types/adapter-express/express-utils/guard-middleware.d.ts +22 -0
  186. package/lib/esm/types/adapter-express/express-utils/guard-utils.d.ts +11 -0
  187. package/lib/esm/types/adapter-express/express-utils/http-context-store.d.ts +20 -0
  188. package/lib/esm/types/adapter-express/express-utils/http-status-middleware.d.ts +26 -0
  189. package/lib/esm/types/adapter-express/express-utils/httpResponseMessage.d.ts +14 -0
  190. package/lib/esm/types/adapter-express/express-utils/index.d.ts +30 -0
  191. package/lib/esm/types/adapter-express/express-utils/interceptor-middleware.d.ts +40 -0
  192. package/lib/esm/types/adapter-express/express-utils/interfaces.d.ts +115 -0
  193. package/lib/esm/types/adapter-express/express-utils/inversify-express-server.d.ts +172 -0
  194. package/lib/esm/types/adapter-express/express-utils/lazy-module-middleware.d.ts +122 -0
  195. package/lib/esm/types/adapter-express/express-utils/middleware-composition.d.ts +85 -0
  196. package/lib/esm/types/adapter-express/express-utils/permission-preloader.middleware.d.ts +10 -0
  197. package/lib/esm/types/adapter-express/express-utils/resolver-multer.d.ts +7 -0
  198. package/lib/esm/types/adapter-express/express-utils/route-constraints.d.ts +89 -0
  199. package/lib/esm/types/adapter-express/express-utils/scope-extractor.d.ts +21 -0
  200. package/lib/esm/types/adapter-express/express-utils/scope-extractor.interface.d.ts +12 -0
  201. package/lib/esm/types/adapter-express/express-utils/setup-authorization.d.ts +34 -0
  202. package/lib/esm/types/adapter-express/express-utils/setup-event-system.d.ts +118 -0
  203. package/lib/esm/types/adapter-express/express-utils/setup-interceptors.d.ts +115 -0
  204. package/lib/esm/types/adapter-express/express-utils/setup-lazy-loading.d.ts +123 -0
  205. package/lib/esm/types/adapter-express/express-utils/utils.d.ts +24 -0
  206. package/lib/esm/types/adapter-express/express-utils/validation-decorators.d.ts +145 -0
  207. package/lib/esm/types/adapter-express/express-utils/validation-service.d.ts +88 -0
  208. package/lib/esm/types/adapter-express/index.d.ts +7 -0
  209. package/lib/esm/types/adapter-express/micro-api/application-express-micro-container.d.ts +47 -0
  210. package/lib/esm/types/adapter-express/micro-api/application-express-micro-route.d.ts +104 -0
  211. package/lib/esm/types/adapter-express/micro-api/application-express-micro.d.ts +72 -0
  212. package/lib/esm/types/adapter-express/micro-api/gateway/circuit-breaker.d.ts +111 -0
  213. package/lib/esm/types/adapter-express/micro-api/gateway/index.d.ts +5 -0
  214. package/lib/esm/types/adapter-express/micro-api/gateway/service-proxy.d.ts +83 -0
  215. package/lib/esm/types/adapter-express/micro-api/index.d.ts +7 -0
  216. package/lib/esm/types/adapter-express/micro-api/micro.d.ts +66 -0
  217. package/lib/esm/types/adapter-express/micro-api/queue/index.d.ts +5 -0
  218. package/lib/esm/types/adapter-express/micro-api/queue/queue.interface.d.ts +60 -0
  219. package/lib/esm/types/adapter-express/micro-api/queue/rabbitmq-consumer.d.ts +86 -0
  220. package/lib/esm/types/adapter-express/micro-api/serverless/aws-lambda.adapter.d.ts +77 -0
  221. package/lib/esm/types/adapter-express/micro-api/serverless/cloudflare.adapter.d.ts +64 -0
  222. package/lib/esm/types/adapter-express/micro-api/serverless/index.d.ts +6 -0
  223. package/lib/esm/types/adapter-express/micro-api/serverless/vercel.adapter.d.ts +56 -0
  224. package/lib/esm/types/adapter-express/micro-api/service-mesh/index.d.ts +5 -0
  225. package/lib/esm/types/adapter-express/micro-api/service-mesh/service-client.d.ts +122 -0
  226. package/lib/esm/types/adapter-express/micro-api/service-mesh/service-discovery.d.ts +150 -0
  227. package/lib/esm/types/adapter-express/middleware/index.d.ts +5 -0
  228. package/lib/esm/types/adapter-express/middleware/request-logging.middleware.d.ts +65 -0
  229. package/lib/esm/types/adapter-express/render/constants.d.ts +26 -0
  230. package/lib/esm/types/adapter-express/render/engine.d.ts +20 -0
  231. package/lib/esm/types/adapter-express/render/index.d.ts +5 -0
  232. package/lib/esm/types/adapter-express/render/resolve-render.d.ts +7 -0
  233. package/lib/esm/types/adapter-express/studio/index.d.ts +1 -0
  234. package/lib/esm/types/adapter-express/studio/studio-integration.d.ts +92 -0
  235. package/lib/esm/types/index.d.ts +1 -0
  236. package/lib/package.json +156 -146
  237. package/package.json +156 -146
  238. package/lib/cjs/di/di.interfaces.js +0 -10
  239. package/lib/cjs/types/di/di.interfaces.d.ts +0 -289
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CONDITIONAL_MIDDLEWARE_SYMBOL = void 0;
4
+ exports.isConditionalMiddleware = isConditionalMiddleware;
5
+ exports.when = when;
6
+ exports.unless = unless;
7
+ /**
8
+ * Symbol to identify conditional middleware configuration objects.
9
+ * Used internally for type checking.
10
+ */
11
+ exports.CONDITIONAL_MIDDLEWARE_SYMBOL = Symbol("ConditionalMiddleware");
12
+ /**
13
+ * Type guard to check if an object is a ConditionalMiddlewareConfig.
14
+ */
15
+ function isConditionalMiddleware(item) {
16
+ return (typeof item === "object" &&
17
+ item !== null &&
18
+ "condition" in item &&
19
+ "middleware" in item &&
20
+ typeof item.condition === "function");
21
+ }
22
+ /**
23
+ * Creates a conditional middleware configuration that executes the middleware
24
+ * when the condition evaluates to true.
25
+ *
26
+ * @param condition - Function that receives the Request and returns boolean or Promise<boolean>
27
+ * @param middleware - The middleware to execute when condition is true
28
+ * @returns ConditionalMiddlewareConfig object
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * // Phase 2: Class reference support - no 'new' keyword needed
33
+ * @Get("/admin",
34
+ * when(req => req.hostname.startsWith("admin."), AdminMiddleware),
35
+ * AuthMiddleware
36
+ * )
37
+ * async adminHandler() {}
38
+ * ```
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * // Async condition with class reference (Phase 2)
43
+ * @Get("/api",
44
+ * when(async req => {
45
+ * const user = await getUser(req);
46
+ * return user.isAdmin;
47
+ * }, AdminMiddleware)
48
+ * )
49
+ * async apiHandler() {}
50
+ * ```
51
+ */
52
+ function when(condition,
53
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
54
+ middleware) {
55
+ return {
56
+ condition,
57
+ middleware: middleware,
58
+ skipOnFalse: true,
59
+ };
60
+ }
61
+ /**
62
+ * Creates a conditional middleware configuration that executes the middleware
63
+ * when the condition evaluates to false (inverse of `when`).
64
+ *
65
+ * @param condition - Function that receives the Request and returns boolean or Promise<boolean>
66
+ * @param middleware - The middleware to execute when condition is false
67
+ * @returns ConditionalMiddlewareConfig object
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * // Phase 2: Class reference support - no 'new' keyword needed
72
+ * @Get("/public",
73
+ * unless(req => req.headers.authorization, AuthMiddleware)
74
+ * )
75
+ * async publicHandler() {}
76
+ * ```
77
+ *
78
+ * @example
79
+ * ```typescript
80
+ * // Skip authentication for public routes (Phase 2: class reference)
81
+ * @Get("/health",
82
+ * unless(req => req.path.startsWith("/api"), AuthMiddleware)
83
+ * )
84
+ * async healthCheck() {}
85
+ * ```
86
+ */
87
+ function unless(condition,
88
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
89
+ middleware) {
90
+ return {
91
+ condition: (req) => {
92
+ const result = condition(req);
93
+ // Invert the condition: if condition returns Promise, return inverted Promise
94
+ if (result instanceof Promise) {
95
+ return result.then((value) => !value);
96
+ }
97
+ return !result;
98
+ },
99
+ middleware: middleware,
100
+ skipOnFalse: true,
101
+ };
102
+ }
@@ -6,11 +6,28 @@ exports.TYPE = {
6
6
  Controller: Symbol.for("Controller"),
7
7
  HttpContext: Symbol.for("HttpContext"),
8
8
  };
9
+ // Import exception filter metadata keys from core to maintain compatibility
10
+ const core_1 = require("@expressots/core");
9
11
  exports.METADATA_KEY = {
10
12
  controller: "inversify-express-utils:controller",
11
13
  controllerMethod: "inversify-express-utils:controller-method",
12
14
  controllerParameter: "inversify-express-utils:controller-parameter",
13
15
  httpContext: "inversify-express-utils:httpcontext",
16
+ version: "inversify-express-utils:version",
17
+ accept: "inversify-express-utils:accept",
18
+ consumes: "inversify-express-utils:consumes",
19
+ produces: "inversify-express-utils:produces",
20
+ csvOptions: "inversify-express-utils:csv-options",
21
+ xmlOptions: "inversify-express-utils:xml-options",
22
+ yamlOptions: "inversify-express-utils:yaml-options",
23
+ streamResponse: "inversify-express-utils:stream-response",
24
+ // Validation metadata
25
+ validationSchema: "inversify-express-utils:validation-schema",
26
+ validationOptions: "inversify-express-utils:validation-options",
27
+ // Re-export exception filter metadata keys from core for backward compatibility
28
+ exceptionFilter: core_1.EXCEPTION_FILTER_METADATA_KEY.exceptionFilter,
29
+ controllerExceptionFilters: core_1.EXCEPTION_FILTER_METADATA_KEY.controllerExceptionFilters,
30
+ methodExceptionFilters: core_1.EXCEPTION_FILTER_METADATA_KEY.methodExceptionFilters,
14
31
  };
15
32
  exports.HTTP_CODE_METADATA = {
16
33
  httpCode: "inversify-express-utils:httpcode",
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Accept = Accept;
4
+ exports.Consumes = Consumes;
5
+ exports.Produces = Produces;
6
+ exports.CsvOptions = CsvOptions;
7
+ exports.XmlOptions = XmlOptions;
8
+ exports.YamlOptions = YamlOptions;
9
+ exports.StreamResponse = StreamResponse;
10
+ require("reflect-metadata");
11
+ const constants_js_1 = require("./constants.js");
12
+ /**
13
+ * Accept decorator to specify which content types this route accepts for responses.
14
+ * Used for content negotiation based on Accept header.
15
+ * @param contentTypes - Array of accepted content types (e.g., ["application/json", "application/xml"])
16
+ * @returns MethodDecorator
17
+ * @example
18
+ * ```typescript
19
+ * @Accept("application/json", "application/xml")
20
+ * @Get("/users")
21
+ * getUsers() {
22
+ * return [{ id: 1, name: "John" }];
23
+ * }
24
+ * ```
25
+ * @public API
26
+ */
27
+ function Accept(...contentTypes) {
28
+ return (target, key) => {
29
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.accept, contentTypes, target, key);
30
+ };
31
+ }
32
+ /**
33
+ * Consumes decorator to specify which content types this route consumes for requests.
34
+ * Used for content negotiation based on Content-Type header.
35
+ * @param contentTypes - Array of consumed content types (e.g., ["application/json", "application/xml"])
36
+ * @returns MethodDecorator
37
+ * @example
38
+ * ```typescript
39
+ * @Consumes("application/json", "application/xml")
40
+ * @Post("/users")
41
+ * createUser(@body() user: UserDto) {
42
+ * return this.userService.create(user);
43
+ * }
44
+ * ```
45
+ * @public API
46
+ */
47
+ function Consumes(...contentTypes) {
48
+ return (target, key) => {
49
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.consumes, contentTypes, target, key);
50
+ };
51
+ }
52
+ /**
53
+ * Produces decorator to specify which content types this route produces for responses.
54
+ * Alias for @Accept() decorator.
55
+ * @param contentTypes - Array of produced content types
56
+ * @returns MethodDecorator
57
+ * @public API
58
+ */
59
+ function Produces(...contentTypes) {
60
+ return Accept(...contentTypes);
61
+ }
62
+ /**
63
+ * CsvOptions decorator to configure CSV formatting options for a route.
64
+ * @param options - CSV formatting options
65
+ * @returns MethodDecorator
66
+ * @example
67
+ * ```typescript
68
+ * @CsvOptions({ fields: ["id", "name"], includeHeaders: true })
69
+ * @Get("/users")
70
+ * getUsers() {
71
+ * return [{ id: 1, name: "John", email: "john@example.com" }];
72
+ * }
73
+ * ```
74
+ * @public API
75
+ */
76
+ function CsvOptions(options) {
77
+ return (target, key) => {
78
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.csvOptions, options, target, key);
79
+ };
80
+ }
81
+ /**
82
+ * XmlOptions decorator to configure XML formatting options for a route.
83
+ * @param options - XML formatting options
84
+ * @returns MethodDecorator
85
+ * @example
86
+ * ```typescript
87
+ * @XmlOptions({ rootElement: "users", itemElement: "user", prettyPrint: true })
88
+ * @Get("/users")
89
+ * getUsers() {
90
+ * return [{ id: 1, name: "John" }];
91
+ * }
92
+ * ```
93
+ * @public API
94
+ */
95
+ function XmlOptions(options) {
96
+ return (target, key) => {
97
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.xmlOptions, options, target, key);
98
+ };
99
+ }
100
+ /**
101
+ * YamlOptions decorator to configure YAML formatting options for a route.
102
+ * @param options - YAML formatting options
103
+ * @returns MethodDecorator
104
+ * @public API
105
+ */
106
+ function YamlOptions(options) {
107
+ return (target, key) => {
108
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.yamlOptions, options, target, key);
109
+ };
110
+ }
111
+ /**
112
+ * StreamResponse decorator to indicate that the response should be streamed.
113
+ * Useful for large datasets.
114
+ * @returns MethodDecorator
115
+ * @example
116
+ * ```typescript
117
+ * @StreamResponse()
118
+ * @Get("/large-dataset")
119
+ * getLargeDataset() {
120
+ * return this.dataService.streamLargeDataset(); // Returns async iterator
121
+ * }
122
+ * ```
123
+ * @public API
124
+ */
125
+ function StreamResponse() {
126
+ return (target, key) => {
127
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.streamResponse, true, target, key);
128
+ };
129
+ }
@@ -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,13 @@ 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
+ // Explicit type annotation: without this, the inferred type pulls a
25
+ // non-portable path from @expressots/core's internal decorator_utils,
26
+ // which TS2742 rejects under NodeNext when emitting .d.ts files.
27
+ exports.injectHttpContext = (0, core_1.inject)(constants_js_1.TYPE.HttpContext);
24
28
  /**
25
29
  * Controller decorator to define a new controller
26
30
  * @param path route path
@@ -29,29 +33,46 @@ exports.injectHttpContext = (0, core_1.inject)(constants_1.TYPE.HttpContext);
29
33
  */
30
34
  function controller(path, ...middleware) {
31
35
  return (target) => {
36
+ // Check for version metadata on the controller class
37
+ const controllerVersion = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.version, target);
32
38
  const currentMetadata = {
33
39
  middleware,
34
40
  path,
35
- target,
41
+ target: target,
42
+ version: controllerVersion,
36
43
  };
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) || {};
44
+ const pathMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.path, Reflect) || {};
45
+ const statusCodeMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.statusCode, Reflect) || {};
46
+ const statusCodePathMapping = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.httpCode, Reflect) || {};
40
47
  for (const key in pathMetadata) {
41
48
  if (statusCodeMetadata && statusCodeMetadata[key]) {
42
- const realPath = pathMetadata[key]["path"] === "/" ? path : `${path}${pathMetadata[key]["path"]}`;
49
+ const methodPath = pathMetadata[key]["path"];
50
+ // Properly join controller and method paths
51
+ let realPath;
52
+ if (methodPath === "/" || methodPath === "") {
53
+ realPath = path;
54
+ }
55
+ else if (path === "/" || path === "") {
56
+ realPath = methodPath.startsWith("/") ? methodPath : `/${methodPath}`;
57
+ }
58
+ else {
59
+ // Normalize: remove trailing slash from controller, ensure method has leading slash
60
+ const basePath = path.endsWith("/") ? path.slice(0, -1) : path;
61
+ const subPath = methodPath.startsWith("/") ? methodPath : `/${methodPath}`;
62
+ realPath = `${basePath}${subPath}`;
63
+ }
43
64
  statusCodePathMapping[`${realPath}/-${pathMetadata[key]["method"].toLowerCase()}`] =
44
65
  statusCodeMetadata[key];
45
66
  }
46
67
  }
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);
68
+ Reflect.defineMetadata(constants_js_1.HTTP_CODE_METADATA.httpCode, statusCodePathMapping, Reflect);
69
+ Reflect.deleteMetadata(constants_js_1.HTTP_CODE_METADATA.statusCode, Reflect);
70
+ Reflect.deleteMetadata(constants_js_1.HTTP_CODE_METADATA.path, Reflect);
50
71
  (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) || [];
72
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.controller, currentMetadata, target);
73
+ const previousMetadata = Reflect.getMetadata(constants_js_1.METADATA_KEY.controller, Reflect) || [];
53
74
  const newMetadata = [currentMetadata, ...previousMetadata];
54
- Reflect.defineMetadata(constants_1.METADATA_KEY.controller, newMetadata, Reflect);
75
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.controller, newMetadata, Reflect);
55
76
  };
56
77
  }
57
78
  /**
@@ -70,7 +91,7 @@ function controller(path, ...middleware) {
70
91
  function Http(code) {
71
92
  // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any
72
93
  return (target, key, descriptor) => {
73
- let httpCodeMetadata = Reflect.getOwnMetadata(constants_1.HTTP_CODE_METADATA.statusCode, Reflect);
94
+ let httpCodeMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.statusCode, Reflect);
74
95
  if (httpCodeMetadata) {
75
96
  httpCodeMetadata[key] = code;
76
97
  }
@@ -78,7 +99,55 @@ function Http(code) {
78
99
  httpCodeMetadata = {};
79
100
  httpCodeMetadata[key] = code;
80
101
  }
81
- Reflect.defineMetadata(constants_1.HTTP_CODE_METADATA.statusCode, httpCodeMetadata, Reflect);
102
+ Reflect.defineMetadata(constants_js_1.HTTP_CODE_METADATA.statusCode, httpCodeMetadata, Reflect);
103
+ };
104
+ }
105
+ /**
106
+ * Version decorator to define the API version for a controller or route method
107
+ * @param version API version (e.g., "1", "1.0", "v1", or 1)
108
+ * @returns ClassDecorator | MethodDecorator
109
+ * @example ```typescript
110
+ * @Version("1")
111
+ * @controller("/users")
112
+ * class UserController {}
113
+ *
114
+ * // Or at method level:
115
+ * @Version("2")
116
+ * @Get("/")
117
+ * getUsers() {
118
+ * return "v2 users";
119
+ * }
120
+ * ```
121
+ * @public API
122
+ */
123
+ function Version(version) {
124
+ // Normalize version to string format (e.g., "v1" or "1" -> "v1")
125
+ const normalizedVersion = typeof version === "number" ? `v${version}` : version.startsWith("v") ? version : `v${version}`;
126
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
127
+ return (target, key, descriptor) => {
128
+ if (key !== undefined && descriptor !== undefined) {
129
+ // Method decorator - store version metadata for the method
130
+ // This will be read by enhancedHttpMethod/Method when they create metadata
131
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.version, normalizedVersion, target, key);
132
+ // Also update existing metadata if it exists
133
+ const metadataList = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor);
134
+ if (metadataList) {
135
+ const methodMetadata = metadataList.find((m) => m.key === key);
136
+ if (methodMetadata) {
137
+ methodMetadata.version = normalizedVersion;
138
+ }
139
+ }
140
+ }
141
+ else {
142
+ // Class decorator - store version metadata for the controller
143
+ // This will be read by controller decorator when it creates metadata
144
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.version, normalizedVersion, target);
145
+ // Also update existing metadata if it exists
146
+ const controllerMetadata = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controller, target);
147
+ if (controllerMetadata) {
148
+ controllerMetadata.version = normalizedVersion;
149
+ }
150
+ }
82
151
  };
83
152
  }
84
153
  /**
@@ -151,15 +220,18 @@ function Delete(path, ...middleware) {
151
220
  */
152
221
  function enhancedHttpMethod(method, path, ...middleware) {
153
222
  return (target, key) => {
223
+ // Check for version metadata on the method
224
+ const methodVersion = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.version, target, key);
154
225
  const metadata = {
155
- key,
226
+ key: String(key),
156
227
  method,
157
228
  middleware,
158
229
  path,
159
- target,
230
+ target: target,
231
+ version: methodVersion,
160
232
  };
161
233
  let metadataList = [];
162
- let pathMetadata = Reflect.getOwnMetadata(constants_1.HTTP_CODE_METADATA.path, Reflect);
234
+ let pathMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.path, Reflect);
163
235
  if (pathMetadata) {
164
236
  pathMetadata[key] = {
165
237
  path,
@@ -173,12 +245,12 @@ function enhancedHttpMethod(method, path, ...middleware) {
173
245
  method,
174
246
  };
175
247
  }
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);
248
+ Reflect.defineMetadata(constants_js_1.HTTP_CODE_METADATA.path, pathMetadata, Reflect);
249
+ if (!Reflect.hasOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor)) {
250
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.controllerMethod, metadataList, target.constructor);
179
251
  }
180
252
  else {
181
- metadataList = Reflect.getOwnMetadata(constants_1.METADATA_KEY.controllerMethod, target.constructor);
253
+ metadataList = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor);
182
254
  }
183
255
  metadataList.push(metadata);
184
256
  const paramsInfo = Reflect.getMetadata("design:paramtypes", target, key) || [];
@@ -203,15 +275,18 @@ function enhancedHttpMethod(method, path, ...middleware) {
203
275
  */
204
276
  function Method(method, path, ...middleware) {
205
277
  return (target, key) => {
278
+ // Check for version metadata on the method
279
+ const methodVersion = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.version, target, key);
206
280
  const metadata = {
207
- key,
281
+ key: String(key),
208
282
  method,
209
283
  middleware,
210
284
  path,
211
- target,
285
+ target: target,
286
+ version: methodVersion,
212
287
  };
213
288
  let metadataList = [];
214
- let pathMetadata = Reflect.getOwnMetadata(constants_1.HTTP_CODE_METADATA.path, Reflect);
289
+ let pathMetadata = Reflect.getOwnMetadata(constants_js_1.HTTP_CODE_METADATA.path, Reflect);
215
290
  if (pathMetadata) {
216
291
  pathMetadata[key] = {
217
292
  path,
@@ -225,12 +300,12 @@ function Method(method, path, ...middleware) {
225
300
  method,
226
301
  };
227
302
  }
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);
303
+ Reflect.defineMetadata(constants_js_1.HTTP_CODE_METADATA.path, pathMetadata, Reflect);
304
+ if (!Reflect.hasOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor)) {
305
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.controllerMethod, metadataList, target.constructor);
231
306
  }
232
307
  else {
233
- metadataList = Reflect.getOwnMetadata(constants_1.METADATA_KEY.controllerMethod, target.constructor);
308
+ metadataList = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, target.constructor);
234
309
  }
235
310
  metadataList.push(metadata);
236
311
  };
@@ -239,47 +314,47 @@ function Method(method, path, ...middleware) {
239
314
  * Parameter decorator to inject the request object
240
315
  * @returns ParameterDecorator
241
316
  */
242
- exports.request = paramDecoratorFactory(constants_1.PARAMETER_TYPE.REQUEST);
317
+ exports.request = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.REQUEST);
243
318
  /**
244
319
  * Parameter decorator to inject the response object
245
320
  * @returns ParameterDecorator
246
321
  */
247
- exports.response = paramDecoratorFactory(constants_1.PARAMETER_TYPE.RESPONSE);
322
+ exports.response = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.RESPONSE);
248
323
  /**
249
324
  * Parameter decorator to inject parameters from the route
250
325
  * @returns ParameterDecorator
251
326
  */
252
- exports.param = paramDecoratorFactory(constants_1.PARAMETER_TYPE.PARAMS);
327
+ exports.param = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.PARAMS);
253
328
  /**
254
329
  * Parameter decorator to inject query parameters
255
330
  * @returns ParameterDecorator
256
331
  */
257
- exports.query = paramDecoratorFactory(constants_1.PARAMETER_TYPE.QUERY);
332
+ exports.query = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.QUERY);
258
333
  /**
259
334
  * Parameter decorator to inject the request body
260
335
  * @returns ParameterDecorator
261
336
  */
262
- exports.body = paramDecoratorFactory(constants_1.PARAMETER_TYPE.BODY);
337
+ exports.body = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.BODY);
263
338
  /**
264
339
  * Parameter decorator to inject the request headers
265
340
  * @returns ParameterDecorator
266
341
  */
267
- exports.headers = paramDecoratorFactory(constants_1.PARAMETER_TYPE.HEADERS);
342
+ exports.headers = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.HEADERS);
268
343
  /**
269
344
  * Parameter decorator to inject the request cookies
270
345
  * @returns ParameterDecorator
271
346
  */
272
- exports.cookies = paramDecoratorFactory(constants_1.PARAMETER_TYPE.COOKIES);
347
+ exports.cookies = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.COOKIES);
273
348
  /**
274
349
  * Parameter decorator next function
275
350
  * @returns ParameterDecorator
276
351
  */
277
- exports.next = paramDecoratorFactory(constants_1.PARAMETER_TYPE.NEXT);
352
+ exports.next = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.NEXT);
278
353
  /**
279
354
  * Parameter decorator to inject the principal object obtained from AuthProvider
280
355
  * @returns ParameterDecorator
281
356
  */
282
- exports.principal = paramDecoratorFactory(constants_1.PARAMETER_TYPE.PRINCIPAL);
357
+ exports.principal = paramDecoratorFactory(constants_js_1.PARAMETER_TYPE.PRINCIPAL);
283
358
  /**
284
359
  * Parameter decorator to inject the request user object
285
360
  * @returns ParameterDecorator
@@ -304,18 +379,18 @@ function params(type, parameterName) {
304
379
  parameterName,
305
380
  type,
306
381
  };
307
- if (!Reflect.hasOwnMetadata(constants_1.METADATA_KEY.controllerParameter, target.constructor)) {
382
+ if (!Reflect.hasOwnMetadata(constants_js_1.METADATA_KEY.controllerParameter, target.constructor)) {
308
383
  parameterMetadataList.unshift(parameterMetadata);
309
384
  }
310
385
  else {
311
- metadataList = Reflect.getOwnMetadata(constants_1.METADATA_KEY.controllerParameter, target.constructor);
386
+ metadataList = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controllerParameter, target.constructor);
312
387
  if (metadataList[methodName]) {
313
388
  parameterMetadataList = metadataList[methodName] || [];
314
389
  }
315
390
  parameterMetadataList.unshift(parameterMetadata);
316
391
  }
317
392
  metadataList[methodName] = parameterMetadataList;
318
- Reflect.defineMetadata(constants_1.METADATA_KEY.controllerParameter, metadataList, target.constructor);
393
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.controllerParameter, metadataList, target.constructor);
319
394
  };
320
395
  }
321
396
  /**
@@ -328,11 +403,11 @@ function params(type, parameterName) {
328
403
  function Render(template, defaultData) {
329
404
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
330
405
  return (target, propertyKey, descriptor) => {
331
- Reflect.defineMetadata(constants_1.RENDER_METADATA_KEY, { template, defaultData }, target, propertyKey);
406
+ Reflect.defineMetadata(constants_js_1.RENDER_METADATA_KEY, { template, defaultData }, target, propertyKey);
332
407
  };
333
408
  }
334
409
  function getRenderMetadata(target, propertyKey) {
335
- return Reflect.getMetadata(constants_1.RENDER_METADATA_KEY, target, propertyKey) || {};
410
+ return Reflect.getMetadata(constants_js_1.RENDER_METADATA_KEY, target, propertyKey) || {};
336
411
  }
337
412
  /**
338
413
  * Converts a string value to the specified type.
@@ -365,15 +440,44 @@ function isResponse(obj) {
365
440
  return (typeof obj === "object" && obj !== null && "status" in obj && "json" in obj && "send" in obj);
366
441
  }
367
442
  /**
368
- * File upload decorator to handle file uploads
369
- * @param options
370
- * @param multerOptions
443
+ * File upload decorator to handle file uploads.
444
+ *
445
+ * This decorator integrates with the global upload configuration
446
+ * set via `Middleware.upload()` in app.ts. If global config exists,
447
+ * it will be used as defaults, with local options taking precedence.
448
+ *
449
+ * @param options - Field configuration (fieldName, maxCount, none, any)
450
+ * @param multerOptions - Optional multer options (overrides global config)
371
451
  * @default { none: true }
372
452
  * @returns MethodDecorator
453
+ *
454
+ * @example
455
+ * ```typescript
456
+ * // In app.ts - configure globally (optional)
457
+ * this.Middleware.upload({
458
+ * destination: './uploads',
459
+ * limits: { fileSize: 10 * 1024 * 1024 }
460
+ * });
461
+ *
462
+ * // In controller - uses global config automatically
463
+ * @Post('avatar')
464
+ * @FileUpload({ fieldName: 'avatar' })
465
+ * uploadAvatar(req: Request) {
466
+ * return req.file;
467
+ * }
468
+ *
469
+ * // Override global config for specific endpoint
470
+ * @Post('document')
471
+ * @FileUpload({ fieldName: 'doc' }, { limits: { fileSize: 50 * 1024 * 1024 } })
472
+ * uploadDocument(req: Request) {
473
+ * return req.file;
474
+ * }
475
+ * ```
476
+ *
373
477
  * @public API
374
478
  */
375
479
  function FileUpload(options, multerOptions) {
376
- const multer = (0, resolver_multer_1.packageResolver)("multer");
480
+ const multer = (0, resolver_multer_js_1.packageResolver)("multer");
377
481
  /* eslint-disable @typescript-eslint/no-explicit-any */
378
482
  let upload;
379
483
  let method = "none";
@@ -381,7 +485,40 @@ function FileUpload(options, multerOptions) {
381
485
  if (options === undefined) {
382
486
  options = { none: true };
383
487
  }
384
- upload = multer(multerOptions);
488
+ // Get global upload configuration (set via Middleware.upload())
489
+ const globalConfig = (0, core_1.getGlobalUploadConfig)();
490
+ // Build final multer options, merging global config with local options
491
+ // Local options always take precedence over global config
492
+ const finalMulterOptions = {};
493
+ // Apply global config as defaults
494
+ if (globalConfig) {
495
+ if (globalConfig.destination) {
496
+ finalMulterOptions.dest = globalConfig.destination;
497
+ }
498
+ if (globalConfig.limits) {
499
+ finalMulterOptions.limits = globalConfig.limits;
500
+ }
501
+ }
502
+ // Apply local options (overrides global)
503
+ if (multerOptions) {
504
+ if (multerOptions.dest) {
505
+ finalMulterOptions.dest = multerOptions.dest;
506
+ }
507
+ if (multerOptions.limits) {
508
+ // Merge limits - local takes precedence
509
+ finalMulterOptions.limits = {
510
+ ...finalMulterOptions.limits,
511
+ ...multerOptions.limits,
512
+ };
513
+ }
514
+ if (multerOptions.storage) {
515
+ finalMulterOptions.storage = multerOptions.storage;
516
+ }
517
+ if (multerOptions.fileFilter) {
518
+ finalMulterOptions.fileFilter = multerOptions.fileFilter;
519
+ }
520
+ }
521
+ upload = multer(finalMulterOptions);
385
522
  method = inferMulterMethod(options);
386
523
  }
387
524
  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; } });