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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/README.md +39 -96
  2. package/lib/CHANGELOG.md +43 -0
  3. package/lib/README.md +39 -96
  4. package/lib/cjs/adapter-express/application-express.base.js +3 -1
  5. package/lib/cjs/adapter-express/application-express.js +1049 -85
  6. package/lib/cjs/adapter-express/express-utils/conditional-middleware.js +102 -0
  7. package/lib/cjs/adapter-express/express-utils/constants.js +17 -0
  8. package/lib/cjs/adapter-express/express-utils/content-negotiation-decorators.js +129 -0
  9. package/lib/cjs/adapter-express/express-utils/decorators.js +186 -49
  10. package/lib/cjs/adapter-express/express-utils/exception-filter-decorators.js +11 -0
  11. package/lib/cjs/adapter-express/express-utils/guard-context-factory.js +84 -0
  12. package/lib/cjs/adapter-express/express-utils/guard-middleware.js +115 -0
  13. package/lib/cjs/adapter-express/express-utils/guard-utils.js +18 -0
  14. package/lib/cjs/adapter-express/express-utils/http-context-store.js +15 -0
  15. package/lib/cjs/adapter-express/express-utils/http-status-middleware.js +37 -2
  16. package/lib/cjs/adapter-express/express-utils/index.js +67 -1
  17. package/lib/cjs/adapter-express/express-utils/interceptor-middleware.js +132 -0
  18. package/lib/cjs/adapter-express/express-utils/inversify-express-server.js +810 -63
  19. package/lib/cjs/adapter-express/express-utils/lazy-module-middleware.js +241 -0
  20. package/lib/cjs/adapter-express/express-utils/middleware-composition.js +95 -0
  21. package/lib/cjs/adapter-express/express-utils/permission-preloader.middleware.js +48 -0
  22. package/lib/cjs/adapter-express/express-utils/route-constraints.js +95 -0
  23. package/lib/cjs/adapter-express/express-utils/scope-extractor.interface.js +2 -0
  24. package/lib/cjs/adapter-express/express-utils/scope-extractor.js +66 -0
  25. package/lib/cjs/adapter-express/express-utils/setup-authorization.js +71 -0
  26. package/lib/cjs/adapter-express/express-utils/setup-event-system.js +113 -0
  27. package/lib/cjs/adapter-express/express-utils/setup-interceptors.js +103 -0
  28. package/lib/cjs/adapter-express/express-utils/setup-lazy-loading.js +228 -0
  29. package/lib/cjs/adapter-express/express-utils/utils.js +30 -12
  30. package/lib/cjs/adapter-express/express-utils/validation-decorators.js +205 -0
  31. package/lib/cjs/adapter-express/express-utils/validation-service.js +252 -0
  32. package/lib/cjs/adapter-express/index.js +7 -5
  33. package/lib/cjs/adapter-express/micro-api/application-express-micro-route.js +31 -1
  34. package/lib/cjs/adapter-express/micro-api/application-express-micro.js +11 -37
  35. package/lib/cjs/adapter-express/micro-api/gateway/circuit-breaker.js +174 -0
  36. package/lib/cjs/adapter-express/micro-api/gateway/index.js +11 -0
  37. package/lib/cjs/adapter-express/micro-api/gateway/service-proxy.js +214 -0
  38. package/lib/cjs/adapter-express/micro-api/index.js +27 -3
  39. package/lib/cjs/adapter-express/micro-api/micro.js +217 -0
  40. package/lib/cjs/adapter-express/micro-api/queue/index.js +8 -0
  41. package/lib/cjs/adapter-express/micro-api/queue/queue.interface.js +2 -0
  42. package/lib/cjs/adapter-express/micro-api/queue/rabbitmq-consumer.js +255 -0
  43. package/lib/cjs/adapter-express/micro-api/serverless/aws-lambda.adapter.js +183 -0
  44. package/lib/cjs/adapter-express/micro-api/serverless/cloudflare.adapter.js +158 -0
  45. package/lib/cjs/adapter-express/micro-api/serverless/index.js +12 -0
  46. package/lib/cjs/adapter-express/micro-api/serverless/vercel.adapter.js +102 -0
  47. package/lib/cjs/adapter-express/micro-api/service-mesh/index.js +10 -0
  48. package/lib/cjs/adapter-express/micro-api/service-mesh/service-client.js +194 -0
  49. package/lib/cjs/adapter-express/micro-api/service-mesh/service-discovery.js +261 -0
  50. package/lib/cjs/adapter-express/middleware/index.js +21 -0
  51. package/lib/cjs/adapter-express/middleware/request-logging.middleware.js +244 -0
  52. package/lib/cjs/adapter-express/render/engine.js +15 -15
  53. package/lib/cjs/adapter-express/render/index.js +5 -0
  54. package/lib/cjs/adapter-express/studio/index.js +9 -0
  55. package/lib/cjs/adapter-express/studio/studio-integration.js +214 -0
  56. package/lib/cjs/index.js +1 -1
  57. package/lib/cjs/types/adapter-express/application-express.base.d.ts +20 -7
  58. package/lib/cjs/types/adapter-express/application-express.d.ts +273 -32
  59. package/lib/cjs/types/adapter-express/express-utils/base-middleware.d.ts +2 -2
  60. package/lib/cjs/types/adapter-express/express-utils/conditional-middleware.d.ts +97 -0
  61. package/lib/cjs/types/adapter-express/express-utils/constants.d.ts +13 -0
  62. package/lib/cjs/types/adapter-express/express-utils/content-negotiation-decorators.d.ts +94 -0
  63. package/lib/cjs/types/adapter-express/express-utils/decorators.d.ts +54 -6
  64. package/lib/cjs/types/adapter-express/express-utils/exception-filter-decorators.d.ts +6 -0
  65. package/lib/cjs/types/adapter-express/express-utils/guard-context-factory.d.ts +17 -0
  66. package/lib/cjs/types/adapter-express/express-utils/guard-middleware.d.ts +22 -0
  67. package/lib/cjs/types/adapter-express/express-utils/guard-utils.d.ts +11 -0
  68. package/lib/cjs/types/adapter-express/express-utils/http-context-store.d.ts +20 -0
  69. package/lib/cjs/types/adapter-express/express-utils/httpResponseMessage.d.ts +1 -1
  70. package/lib/cjs/types/adapter-express/express-utils/index.d.ts +30 -2
  71. package/lib/cjs/types/adapter-express/express-utils/interceptor-middleware.d.ts +40 -0
  72. package/lib/cjs/types/adapter-express/express-utils/interfaces.d.ts +42 -5
  73. package/lib/cjs/types/adapter-express/express-utils/inversify-express-server.d.ts +114 -2
  74. package/lib/cjs/types/adapter-express/express-utils/lazy-module-middleware.d.ts +122 -0
  75. package/lib/cjs/types/adapter-express/express-utils/middleware-composition.d.ts +85 -0
  76. package/lib/cjs/types/adapter-express/express-utils/permission-preloader.middleware.d.ts +10 -0
  77. package/lib/cjs/types/adapter-express/express-utils/route-constraints.d.ts +89 -0
  78. package/lib/cjs/types/adapter-express/express-utils/scope-extractor.d.ts +21 -0
  79. package/lib/cjs/types/adapter-express/express-utils/scope-extractor.interface.d.ts +12 -0
  80. package/lib/cjs/types/adapter-express/express-utils/setup-authorization.d.ts +34 -0
  81. package/lib/cjs/types/adapter-express/express-utils/setup-event-system.d.ts +118 -0
  82. package/lib/cjs/types/adapter-express/express-utils/setup-interceptors.d.ts +115 -0
  83. package/lib/cjs/types/adapter-express/express-utils/setup-lazy-loading.d.ts +123 -0
  84. package/lib/cjs/types/adapter-express/express-utils/utils.d.ts +17 -2
  85. package/lib/cjs/types/adapter-express/express-utils/validation-decorators.d.ts +145 -0
  86. package/lib/cjs/types/adapter-express/express-utils/validation-service.d.ts +88 -0
  87. package/lib/cjs/types/adapter-express/index.d.ts +6 -4
  88. package/lib/cjs/types/adapter-express/micro-api/application-express-micro-route.d.ts +25 -14
  89. package/lib/cjs/types/adapter-express/micro-api/application-express-micro.d.ts +3 -10
  90. package/lib/cjs/types/adapter-express/micro-api/gateway/circuit-breaker.d.ts +111 -0
  91. package/lib/cjs/types/adapter-express/micro-api/gateway/index.d.ts +5 -0
  92. package/lib/cjs/types/adapter-express/micro-api/gateway/service-proxy.d.ts +83 -0
  93. package/lib/cjs/types/adapter-express/micro-api/index.d.ts +7 -1
  94. package/lib/cjs/types/adapter-express/micro-api/micro.d.ts +66 -0
  95. package/lib/cjs/types/adapter-express/micro-api/queue/index.d.ts +5 -0
  96. package/lib/cjs/types/adapter-express/micro-api/queue/queue.interface.d.ts +60 -0
  97. package/lib/cjs/types/adapter-express/micro-api/queue/rabbitmq-consumer.d.ts +86 -0
  98. package/lib/cjs/types/adapter-express/micro-api/serverless/aws-lambda.adapter.d.ts +77 -0
  99. package/lib/cjs/types/adapter-express/micro-api/serverless/cloudflare.adapter.d.ts +64 -0
  100. package/lib/cjs/types/adapter-express/micro-api/serverless/index.d.ts +6 -0
  101. package/lib/cjs/types/adapter-express/micro-api/serverless/vercel.adapter.d.ts +56 -0
  102. package/lib/cjs/types/adapter-express/micro-api/service-mesh/index.d.ts +5 -0
  103. package/lib/cjs/types/adapter-express/micro-api/service-mesh/service-client.d.ts +122 -0
  104. package/lib/cjs/types/adapter-express/micro-api/service-mesh/service-discovery.d.ts +150 -0
  105. package/lib/cjs/types/adapter-express/middleware/index.d.ts +5 -0
  106. package/lib/cjs/types/adapter-express/middleware/request-logging.middleware.d.ts +65 -0
  107. package/lib/cjs/types/adapter-express/render/index.d.ts +1 -0
  108. package/lib/cjs/types/adapter-express/studio/index.d.ts +1 -0
  109. package/lib/cjs/types/adapter-express/studio/studio-integration.d.ts +92 -0
  110. package/lib/cjs/types/index.d.ts +1 -1
  111. package/lib/esm/adapter-express/application-express.base.js +24 -0
  112. package/lib/esm/adapter-express/application-express.js +1300 -0
  113. package/lib/esm/adapter-express/application-express.types.js +1 -0
  114. package/lib/esm/adapter-express/express-utils/base-middleware.js +19 -0
  115. package/lib/esm/adapter-express/express-utils/conditional-middleware.js +96 -0
  116. package/lib/esm/adapter-express/express-utils/constants.js +63 -0
  117. package/lib/esm/adapter-express/express-utils/content/httpContent.js +6 -0
  118. package/lib/esm/adapter-express/express-utils/content-negotiation-decorators.js +120 -0
  119. package/lib/esm/adapter-express/express-utils/decorators.js +575 -0
  120. package/lib/esm/adapter-express/express-utils/exception-filter-decorators.js +6 -0
  121. package/lib/esm/adapter-express/express-utils/guard-context-factory.js +83 -0
  122. package/lib/esm/adapter-express/express-utils/guard-middleware.js +115 -0
  123. package/lib/esm/adapter-express/express-utils/guard-utils.js +14 -0
  124. package/lib/esm/adapter-express/express-utils/http-context-store.js +10 -0
  125. package/lib/esm/adapter-express/express-utils/http-status-middleware.js +116 -0
  126. package/lib/esm/adapter-express/express-utils/httpResponseMessage.js +29 -0
  127. package/lib/esm/adapter-express/express-utils/index.js +24 -0
  128. package/lib/esm/adapter-express/express-utils/interceptor-middleware.js +130 -0
  129. package/lib/esm/adapter-express/express-utils/interfaces.js +1 -0
  130. package/lib/esm/adapter-express/express-utils/inversify-express-server.js +1031 -0
  131. package/lib/esm/adapter-express/express-utils/lazy-module-middleware.js +236 -0
  132. package/lib/esm/adapter-express/express-utils/middleware-composition.js +89 -0
  133. package/lib/esm/adapter-express/express-utils/permission-preloader.middleware.js +45 -0
  134. package/lib/esm/adapter-express/express-utils/resolver-multer.js +30 -0
  135. package/lib/esm/adapter-express/express-utils/route-constraints.js +91 -0
  136. package/lib/esm/adapter-express/express-utils/scope-extractor.interface.js +1 -0
  137. package/lib/esm/adapter-express/express-utils/scope-extractor.js +63 -0
  138. package/lib/esm/adapter-express/express-utils/setup-authorization.js +68 -0
  139. package/lib/esm/adapter-express/express-utils/setup-event-system.js +110 -0
  140. package/lib/esm/adapter-express/express-utils/setup-interceptors.js +100 -0
  141. package/lib/esm/adapter-express/express-utils/setup-lazy-loading.js +225 -0
  142. package/lib/esm/adapter-express/express-utils/utils.js +68 -0
  143. package/lib/esm/adapter-express/express-utils/validation-decorators.js +199 -0
  144. package/lib/esm/adapter-express/express-utils/validation-service.js +251 -0
  145. package/lib/esm/adapter-express/index.js +7 -0
  146. package/lib/esm/adapter-express/micro-api/application-express-micro-container.js +48 -0
  147. package/lib/esm/adapter-express/micro-api/application-express-micro-route.js +128 -0
  148. package/lib/esm/adapter-express/micro-api/application-express-micro.js +161 -0
  149. package/lib/esm/adapter-express/micro-api/gateway/circuit-breaker.js +174 -0
  150. package/lib/esm/adapter-express/micro-api/gateway/index.js +5 -0
  151. package/lib/esm/adapter-express/micro-api/gateway/service-proxy.js +210 -0
  152. package/lib/esm/adapter-express/micro-api/index.js +10 -0
  153. package/lib/esm/adapter-express/micro-api/micro.js +211 -0
  154. package/lib/esm/adapter-express/micro-api/queue/index.js +4 -0
  155. package/lib/esm/adapter-express/micro-api/queue/queue.interface.js +1 -0
  156. package/lib/esm/adapter-express/micro-api/queue/rabbitmq-consumer.js +229 -0
  157. package/lib/esm/adapter-express/micro-api/serverless/aws-lambda.adapter.js +180 -0
  158. package/lib/esm/adapter-express/micro-api/serverless/cloudflare.adapter.js +155 -0
  159. package/lib/esm/adapter-express/micro-api/serverless/index.js +6 -0
  160. package/lib/esm/adapter-express/micro-api/serverless/vercel.adapter.js +99 -0
  161. package/lib/esm/adapter-express/micro-api/service-mesh/index.js +5 -0
  162. package/lib/esm/adapter-express/micro-api/service-mesh/service-client.js +191 -0
  163. package/lib/esm/adapter-express/micro-api/service-mesh/service-discovery.js +259 -0
  164. package/lib/esm/adapter-express/middleware/index.js +5 -0
  165. package/lib/esm/adapter-express/middleware/request-logging.middleware.js +239 -0
  166. package/lib/esm/adapter-express/render/constants.js +37 -0
  167. package/lib/esm/adapter-express/render/engine.js +51 -0
  168. package/lib/esm/adapter-express/render/index.js +1 -0
  169. package/lib/esm/adapter-express/render/resolve-render.js +30 -0
  170. package/lib/esm/adapter-express/studio/index.js +1 -0
  171. package/lib/esm/adapter-express/studio/studio-integration.js +184 -0
  172. package/lib/esm/index.mjs +1 -0
  173. package/lib/esm/package.json +3 -0
  174. package/lib/esm/types/adapter-express/application-express.base.d.ts +77 -0
  175. package/lib/esm/types/adapter-express/application-express.d.ts +411 -0
  176. package/lib/esm/types/adapter-express/application-express.types.d.ts +23 -0
  177. package/lib/esm/types/adapter-express/express-utils/base-middleware.d.ts +8 -0
  178. package/lib/esm/types/adapter-express/express-utils/conditional-middleware.d.ts +97 -0
  179. package/lib/esm/types/adapter-express/express-utils/constants.d.ts +57 -0
  180. package/lib/esm/types/adapter-express/express-utils/content/httpContent.d.ts +6 -0
  181. package/lib/esm/types/adapter-express/express-utils/content-negotiation-decorators.d.ts +94 -0
  182. package/lib/esm/types/adapter-express/express-utils/decorators.d.ts +257 -0
  183. package/lib/esm/types/adapter-express/express-utils/exception-filter-decorators.d.ts +6 -0
  184. package/lib/esm/types/adapter-express/express-utils/guard-context-factory.d.ts +17 -0
  185. package/lib/esm/types/adapter-express/express-utils/guard-middleware.d.ts +22 -0
  186. package/lib/esm/types/adapter-express/express-utils/guard-utils.d.ts +11 -0
  187. package/lib/esm/types/adapter-express/express-utils/http-context-store.d.ts +20 -0
  188. package/lib/esm/types/adapter-express/express-utils/http-status-middleware.d.ts +26 -0
  189. package/lib/esm/types/adapter-express/express-utils/httpResponseMessage.d.ts +14 -0
  190. package/lib/esm/types/adapter-express/express-utils/index.d.ts +30 -0
  191. package/lib/esm/types/adapter-express/express-utils/interceptor-middleware.d.ts +40 -0
  192. package/lib/esm/types/adapter-express/express-utils/interfaces.d.ts +115 -0
  193. package/lib/esm/types/adapter-express/express-utils/inversify-express-server.d.ts +172 -0
  194. package/lib/esm/types/adapter-express/express-utils/lazy-module-middleware.d.ts +122 -0
  195. package/lib/esm/types/adapter-express/express-utils/middleware-composition.d.ts +85 -0
  196. package/lib/esm/types/adapter-express/express-utils/permission-preloader.middleware.d.ts +10 -0
  197. package/lib/esm/types/adapter-express/express-utils/resolver-multer.d.ts +7 -0
  198. package/lib/esm/types/adapter-express/express-utils/route-constraints.d.ts +89 -0
  199. package/lib/esm/types/adapter-express/express-utils/scope-extractor.d.ts +21 -0
  200. package/lib/esm/types/adapter-express/express-utils/scope-extractor.interface.d.ts +12 -0
  201. package/lib/esm/types/adapter-express/express-utils/setup-authorization.d.ts +34 -0
  202. package/lib/esm/types/adapter-express/express-utils/setup-event-system.d.ts +118 -0
  203. package/lib/esm/types/adapter-express/express-utils/setup-interceptors.d.ts +115 -0
  204. package/lib/esm/types/adapter-express/express-utils/setup-lazy-loading.d.ts +123 -0
  205. package/lib/esm/types/adapter-express/express-utils/utils.d.ts +24 -0
  206. package/lib/esm/types/adapter-express/express-utils/validation-decorators.d.ts +145 -0
  207. package/lib/esm/types/adapter-express/express-utils/validation-service.d.ts +88 -0
  208. package/lib/esm/types/adapter-express/index.d.ts +7 -0
  209. package/lib/esm/types/adapter-express/micro-api/application-express-micro-container.d.ts +47 -0
  210. package/lib/esm/types/adapter-express/micro-api/application-express-micro-route.d.ts +104 -0
  211. package/lib/esm/types/adapter-express/micro-api/application-express-micro.d.ts +72 -0
  212. package/lib/esm/types/adapter-express/micro-api/gateway/circuit-breaker.d.ts +111 -0
  213. package/lib/esm/types/adapter-express/micro-api/gateway/index.d.ts +5 -0
  214. package/lib/esm/types/adapter-express/micro-api/gateway/service-proxy.d.ts +83 -0
  215. package/lib/esm/types/adapter-express/micro-api/index.d.ts +7 -0
  216. package/lib/esm/types/adapter-express/micro-api/micro.d.ts +66 -0
  217. package/lib/esm/types/adapter-express/micro-api/queue/index.d.ts +5 -0
  218. package/lib/esm/types/adapter-express/micro-api/queue/queue.interface.d.ts +60 -0
  219. package/lib/esm/types/adapter-express/micro-api/queue/rabbitmq-consumer.d.ts +86 -0
  220. package/lib/esm/types/adapter-express/micro-api/serverless/aws-lambda.adapter.d.ts +77 -0
  221. package/lib/esm/types/adapter-express/micro-api/serverless/cloudflare.adapter.d.ts +64 -0
  222. package/lib/esm/types/adapter-express/micro-api/serverless/index.d.ts +6 -0
  223. package/lib/esm/types/adapter-express/micro-api/serverless/vercel.adapter.d.ts +56 -0
  224. package/lib/esm/types/adapter-express/micro-api/service-mesh/index.d.ts +5 -0
  225. package/lib/esm/types/adapter-express/micro-api/service-mesh/service-client.d.ts +122 -0
  226. package/lib/esm/types/adapter-express/micro-api/service-mesh/service-discovery.d.ts +150 -0
  227. package/lib/esm/types/adapter-express/middleware/index.d.ts +5 -0
  228. package/lib/esm/types/adapter-express/middleware/request-logging.middleware.d.ts +65 -0
  229. package/lib/esm/types/adapter-express/render/constants.d.ts +26 -0
  230. package/lib/esm/types/adapter-express/render/engine.d.ts +20 -0
  231. package/lib/esm/types/adapter-express/render/index.d.ts +5 -0
  232. package/lib/esm/types/adapter-express/render/resolve-render.d.ts +7 -0
  233. package/lib/esm/types/adapter-express/studio/index.d.ts +1 -0
  234. package/lib/esm/types/adapter-express/studio/studio-integration.d.ts +92 -0
  235. package/lib/esm/types/index.d.ts +1 -0
  236. package/lib/package.json +156 -146
  237. package/package.json +156 -146
  238. package/lib/cjs/di/di.interfaces.js +0 -10
  239. package/lib/cjs/types/di/di.interfaces.d.ts +0 -289
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ /**
3
+ * Validation Decorators
4
+ * @module @expressots/adapter-express
5
+ *
6
+ * Enhanced parameter decorators with validation support.
7
+ * These decorators extend the standard @body, @query, @param, @headers
8
+ * to accept optional schema for automatic validation.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.validatedHeaders = exports.validatedParam = exports.validatedQuery = exports.validatedBody = void 0;
12
+ exports.getValidationMetadata = getValidationMetadata;
13
+ exports.hasValidationMetadata = hasValidationMetadata;
14
+ exports.Validate = Validate;
15
+ require("reflect-metadata");
16
+ const constants_js_1 = require("./constants.js");
17
+ /**
18
+ * Create a validated parameter decorator
19
+ * @param source - Parameter source type
20
+ * @param parameterType - The PARAMETER_TYPE enum value
21
+ */
22
+ function createValidatedParamDecorator(source, parameterType) {
23
+ return function (nameOrSchema) {
24
+ return function (target, propertyKey, parameterIndex) {
25
+ let paramName;
26
+ let schema;
27
+ let options;
28
+ // Parse arguments based on type
29
+ if (nameOrSchema === undefined) {
30
+ // No arguments - just inject the whole object
31
+ }
32
+ else if (typeof nameOrSchema === "string") {
33
+ // String argument - it's a parameter name (for query, params, headers)
34
+ paramName = nameOrSchema;
35
+ }
36
+ else if (typeof nameOrSchema === "function") {
37
+ // Function (class constructor) - it's a schema
38
+ schema = nameOrSchema;
39
+ }
40
+ else if (typeof nameOrSchema === "object") {
41
+ // Object - could be schema (Zod, etc.) or options
42
+ if ("group" in nameOrSchema || "partial" in nameOrSchema || "adapter" in nameOrSchema) {
43
+ // It's options
44
+ options = nameOrSchema;
45
+ }
46
+ else {
47
+ // It's a schema (like Zod schema)
48
+ schema = nameOrSchema;
49
+ }
50
+ }
51
+ // Store basic parameter metadata using existing pattern
52
+ const controller = target.constructor;
53
+ let metadataList = {};
54
+ if (!Reflect.hasOwnMetadata(constants_js_1.METADATA_KEY.controllerParameter, controller)) {
55
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.controllerParameter, metadataList, controller);
56
+ }
57
+ else {
58
+ metadataList = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controllerParameter, controller);
59
+ }
60
+ const methodName = propertyKey;
61
+ if (!metadataList[methodName]) {
62
+ metadataList[methodName] = [];
63
+ }
64
+ metadataList[methodName].unshift({
65
+ index: parameterIndex,
66
+ injectRoot: paramName === undefined,
67
+ parameterName: paramName,
68
+ type: parameterType,
69
+ });
70
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.controllerParameter, metadataList, controller);
71
+ // Store validation schema metadata if provided
72
+ if (schema) {
73
+ const validationMetadata = {
74
+ index: parameterIndex,
75
+ source,
76
+ schema,
77
+ options,
78
+ };
79
+ // Get existing validation metadata for this method
80
+ let validationList = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.validationSchema, controller, propertyKey) || [];
81
+ // Add new validation metadata
82
+ validationList = [...validationList, validationMetadata];
83
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.validationSchema, validationList, controller, propertyKey);
84
+ }
85
+ };
86
+ };
87
+ }
88
+ /**
89
+ * Enhanced body decorator with validation support
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * // Without validation (backward compatible)
94
+ * @Post("/users")
95
+ * createUser(@body() user: CreateUserDTO) {}
96
+ *
97
+ * // With class-validator schema
98
+ * @Post("/users")
99
+ * createUser(@body(CreateUserDTO) user: CreateUserDTO) {}
100
+ *
101
+ * // With Zod schema
102
+ * const UserSchema = z.object({ email: z.string().email() });
103
+ * @Post("/users")
104
+ * createUser(@body(UserSchema) user: z.infer<typeof UserSchema>) {}
105
+ *
106
+ * // With validation options
107
+ * @Post("/users")
108
+ * createUser(@body({ group: "create", partial: false }) user: CreateUserDTO) {}
109
+ * ```
110
+ */
111
+ exports.validatedBody = createValidatedParamDecorator("body", constants_js_1.PARAMETER_TYPE.BODY);
112
+ /**
113
+ * Enhanced query decorator with validation support
114
+ *
115
+ * @example
116
+ * ```typescript
117
+ * // Extract single query param (backward compatible)
118
+ * @Get("/search")
119
+ * search(@query("page") page: number) {}
120
+ *
121
+ * // Extract all query params with validation
122
+ * @Get("/search")
123
+ * search(@query(SearchQueryDTO) query: SearchQueryDTO) {}
124
+ * ```
125
+ */
126
+ exports.validatedQuery = createValidatedParamDecorator("query", constants_js_1.PARAMETER_TYPE.QUERY);
127
+ /**
128
+ * Enhanced param decorator with validation support
129
+ *
130
+ * @example
131
+ * ```typescript
132
+ * // Extract single route param (backward compatible)
133
+ * @Get("/:id")
134
+ * getUser(@param("id") id: string) {}
135
+ *
136
+ * // Extract all route params with validation
137
+ * @Get("/:userId/posts/:postId")
138
+ * getPost(@param(RouteParamsDTO) params: RouteParamsDTO) {}
139
+ * ```
140
+ */
141
+ exports.validatedParam = createValidatedParamDecorator("params", constants_js_1.PARAMETER_TYPE.PARAMS);
142
+ /**
143
+ * Enhanced headers decorator with validation support
144
+ *
145
+ * @example
146
+ * ```typescript
147
+ * // Extract single header (backward compatible)
148
+ * @Get("/")
149
+ * handle(@headers("authorization") auth: string) {}
150
+ *
151
+ * // Extract all headers with validation
152
+ * @Get("/")
153
+ * handle(@headers(RequiredHeadersDTO) headers: RequiredHeadersDTO) {}
154
+ * ```
155
+ */
156
+ exports.validatedHeaders = createValidatedParamDecorator("headers", constants_js_1.PARAMETER_TYPE.HEADERS);
157
+ /**
158
+ * Get validation schema metadata for a method
159
+ * @param target - Controller constructor
160
+ * @param methodName - Method name
161
+ * @returns Array of validation metadata
162
+ */
163
+ function getValidationMetadata(target, methodName) {
164
+ return Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.validationSchema, target, methodName) || [];
165
+ }
166
+ /**
167
+ * Check if a method has validation metadata
168
+ * @param target - Controller constructor
169
+ * @param methodName - Method name
170
+ * @returns true if validation is configured
171
+ */
172
+ function hasValidationMetadata(target, methodName) {
173
+ const metadata = getValidationMetadata(target, methodName);
174
+ return metadata.length > 0;
175
+ }
176
+ /**
177
+ * @Validate decorator - marks a parameter for auto-validation
178
+ * Can be used with any parameter decorator
179
+ *
180
+ * @example
181
+ * ```typescript
182
+ * @Post("/users")
183
+ * createUser(
184
+ * @Validate(CreateUserDTO)
185
+ * @body() user: CreateUserDTO
186
+ * ) {}
187
+ * ```
188
+ */
189
+ function Validate(schema, options) {
190
+ return function (target, propertyKey, parameterIndex) {
191
+ const controller = target.constructor;
192
+ const validationMetadata = {
193
+ index: parameterIndex,
194
+ source: "body", // Default, can be overridden by combining with @body/@query/etc
195
+ schema,
196
+ options,
197
+ };
198
+ // Get existing validation metadata for this method
199
+ let validationList = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.validationSchema, controller, propertyKey) ||
200
+ [];
201
+ // Add new validation metadata
202
+ validationList = [...validationList, validationMetadata];
203
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.validationSchema, validationList, controller, propertyKey);
204
+ };
205
+ }
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+ /**
3
+ * Validation Service
4
+ * @module @expressots/adapter-express
5
+ *
6
+ * Service for validating request parameters using the Smart Validation System.
7
+ * Integrates with the route handler to automatically validate parameters.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.ValidationService = void 0;
11
+ const core_1 = require("@expressots/core");
12
+ const validation_decorators_js_1 = require("./validation-decorators.js");
13
+ /**
14
+ * Validation Service
15
+ *
16
+ * Handles validation of request parameters (body, query, params, headers)
17
+ * using the configured validation adapters and smart field detection.
18
+ */
19
+ class ValidationService {
20
+ constructor() {
21
+ this.enabled = false;
22
+ this.config = {};
23
+ this.registry = new core_1.ValidationRegistry();
24
+ this.smartDetector = new core_1.SmartFieldDetector();
25
+ this.errorFormatter = new core_1.HelpfulErrorFormatter();
26
+ }
27
+ /**
28
+ * Enable the validation service with the given configuration
29
+ * @param config - Validation configuration
30
+ */
31
+ enable(config = {}) {
32
+ this.enabled = true;
33
+ this.config = config;
34
+ this.registry.configure(config);
35
+ // Register built-in adapters automatically
36
+ this.registerBuiltInAdapters();
37
+ // Set smart detection
38
+ if (config.smartDetection !== undefined) {
39
+ this.smartDetector.setEnabled(config.smartDetection);
40
+ }
41
+ }
42
+ /**
43
+ * Register built-in validation adapters
44
+ * Additional adapters (Zod, Yup, Joi) can be registered via config.adapters
45
+ * @private
46
+ */
47
+ registerBuiltInAdapters() {
48
+ // Register class-validator adapter (built-in)
49
+ try {
50
+ const classValidatorAdapter = new core_1.ClassValidatorAdapter();
51
+ this.registry.register(classValidatorAdapter);
52
+ }
53
+ catch {
54
+ // class-validator may not be installed
55
+ }
56
+ // Register user-provided adapters from config
57
+ if (this.config.adapters) {
58
+ for (const AdapterClass of this.config.adapters) {
59
+ try {
60
+ const adapter = new AdapterClass();
61
+ this.registry.register(adapter);
62
+ }
63
+ catch {
64
+ // Adapter instantiation failed
65
+ }
66
+ }
67
+ }
68
+ }
69
+ /**
70
+ * Disable the validation service
71
+ */
72
+ disable() {
73
+ this.enabled = false;
74
+ }
75
+ /**
76
+ * Check if validation is enabled
77
+ */
78
+ isEnabled() {
79
+ return this.enabled;
80
+ }
81
+ /**
82
+ * Get the validation registry for adapter management
83
+ */
84
+ getRegistry() {
85
+ return this.registry;
86
+ }
87
+ /**
88
+ * Get the smart field detector
89
+ */
90
+ getSmartDetector() {
91
+ return this.smartDetector;
92
+ }
93
+ /**
94
+ * Get the error formatter
95
+ */
96
+ getErrorFormatter() {
97
+ return this.errorFormatter;
98
+ }
99
+ /**
100
+ * Validate request parameters based on controller method metadata
101
+ * @param req - Express request
102
+ * @param res - Express response
103
+ * @param controllerConstructor - Controller class constructor
104
+ * @param methodName - Method name
105
+ * @param args - Current parameter values
106
+ * @returns Validated and transformed arguments, or null if validation failed (response sent)
107
+ */
108
+ async validateParameters(req, res, controllerConstructor, methodName, args) {
109
+ if (!this.enabled) {
110
+ return args;
111
+ }
112
+ // Get validation metadata for the method
113
+ let validationMetadata = (0, validation_decorators_js_1.getValidationMetadata)(controllerConstructor, methodName);
114
+ // TypeScript-First Auto-Detection: If no explicit validation schema,
115
+ // try to infer from TypeScript type metadata
116
+ if (validationMetadata.length === 0 && this.config.autoDetection !== false) {
117
+ validationMetadata = await this.inferValidationFromTypes(controllerConstructor, methodName, args);
118
+ }
119
+ if (validationMetadata.length === 0) {
120
+ // No explicit validation - try smart detection if enabled
121
+ if (this.smartDetector.isEnabled()) {
122
+ const smartErrors = await this.validateWithSmartDetection(req);
123
+ if (smartErrors.length > 0) {
124
+ this.sendValidationError(res, smartErrors);
125
+ return null;
126
+ }
127
+ }
128
+ return args;
129
+ }
130
+ // Validate each parameter with schema
131
+ const validatedArgs = [...args];
132
+ const allErrors = [];
133
+ for (const metadata of validationMetadata) {
134
+ const paramValue = this.getParameterValue(req, metadata);
135
+ const result = await this.validateValue(paramValue, metadata);
136
+ if (!result.success) {
137
+ allErrors.push(...(result.errors || []));
138
+ }
139
+ else {
140
+ // Update argument with validated/transformed data
141
+ validatedArgs[metadata.index] = result.data;
142
+ }
143
+ }
144
+ if (allErrors.length > 0) {
145
+ this.sendValidationError(res, allErrors);
146
+ return null;
147
+ }
148
+ return validatedArgs;
149
+ }
150
+ /**
151
+ * Infer validation metadata from TypeScript type information
152
+ * Uses reflect-metadata to get parameter types and automatically
153
+ * detect class-validator DTOs or Zod schemas
154
+ */
155
+ async inferValidationFromTypes(controllerConstructor, methodName, args) {
156
+ const inferredMetadata = [];
157
+ for (let i = 0; i < args.length; i++) {
158
+ const typeInfo = (0, core_1.getParameterType)(controllerConstructor.prototype, methodName, i);
159
+ if (!typeInfo || !typeInfo.type)
160
+ continue;
161
+ const schemaType = (0, core_1.detectSchemaType)(typeInfo.type);
162
+ // Only infer validation for class-validator DTOs or Zod schemas
163
+ if (schemaType === "class-validator" || schemaType === "zod") {
164
+ inferredMetadata.push({
165
+ index: i,
166
+ source: "body", // Default to body for inferred types
167
+ schema: typeInfo.type,
168
+ inferred: true, // Mark as auto-inferred
169
+ });
170
+ }
171
+ else if (schemaType === "class" && (0, core_1.hasClassValidatorDecorators)(typeInfo.type)) {
172
+ // Double-check for class-validator decorators
173
+ inferredMetadata.push({
174
+ index: i,
175
+ source: "body",
176
+ schema: typeInfo.type,
177
+ inferred: true,
178
+ });
179
+ }
180
+ }
181
+ return inferredMetadata;
182
+ }
183
+ /**
184
+ * Validate a single value against a schema
185
+ */
186
+ async validateValue(value, metadata) {
187
+ if (!metadata.schema) {
188
+ return { success: true, data: value };
189
+ }
190
+ const result = await this.registry.validate(value, metadata.schema, {
191
+ ...this.config.defaultOptions,
192
+ ...metadata.options,
193
+ });
194
+ // If validation passed and smart detection is enabled, also run smart detection
195
+ if (result.success &&
196
+ this.smartDetector.isEnabled() &&
197
+ typeof result.data === "object" &&
198
+ result.data !== null) {
199
+ const smartErrors = this.smartDetector.validateObject(result.data);
200
+ if (smartErrors.length > 0) {
201
+ return {
202
+ success: false,
203
+ errors: smartErrors,
204
+ };
205
+ }
206
+ }
207
+ return result;
208
+ }
209
+ /**
210
+ * Get the parameter value from the request
211
+ */
212
+ getParameterValue(req, metadata) {
213
+ switch (metadata.source) {
214
+ case "body":
215
+ return req.body;
216
+ case "query":
217
+ return req.query;
218
+ case "params":
219
+ return req.params;
220
+ case "headers":
221
+ return req.headers;
222
+ default:
223
+ return undefined;
224
+ }
225
+ }
226
+ /**
227
+ * Validate request data using smart field detection
228
+ */
229
+ async validateWithSmartDetection(req) {
230
+ const errors = [];
231
+ // Validate body if present
232
+ if (req.body && typeof req.body === "object") {
233
+ const bodyErrors = this.smartDetector.validateObject(req.body);
234
+ errors.push(...bodyErrors);
235
+ }
236
+ // Validate query if present
237
+ if (req.query && typeof req.query === "object") {
238
+ const queryErrors = this.smartDetector.validateObject(req.query);
239
+ errors.push(...queryErrors);
240
+ }
241
+ return errors;
242
+ }
243
+ /**
244
+ * Send validation error response
245
+ */
246
+ sendValidationError(res, errors) {
247
+ const format = this.config.errorFormat || "helpful";
248
+ const formattedErrors = this.errorFormatter.format(errors, format);
249
+ res.status(400).json(formattedErrors);
250
+ }
251
+ }
252
+ exports.ValidationService = ValidationService;
@@ -15,10 +15,12 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.RenderEngine = exports.AppExpress = void 0;
18
- __exportStar(require("./express-utils"), exports);
19
- var application_express_1 = require("./application-express");
20
- Object.defineProperty(exports, "AppExpress", { enumerable: true, get: function () { return application_express_1.AppExpress; } });
21
- __exportStar(require("./micro-api"), exports);
18
+ __exportStar(require("./express-utils/index.js"), exports);
19
+ var application_express_js_1 = require("./application-express.js");
20
+ Object.defineProperty(exports, "AppExpress", { enumerable: true, get: function () { return application_express_js_1.AppExpress; } });
21
+ __exportStar(require("./micro-api/index.js"), exports);
22
22
  var shared_1 = require("@expressots/shared");
23
23
  Object.defineProperty(exports, "RenderEngine", { enumerable: true, get: function () { return shared_1.RenderEngine; } });
24
- __exportStar(require("./render"), exports);
24
+ __exportStar(require("./render/index.js"), exports);
25
+ __exportStar(require("./middleware/index.js"), exports);
26
+ __exportStar(require("./studio/index.js"), exports);
@@ -80,13 +80,43 @@ class Route {
80
80
  patch(path, handler, ...middleware) {
81
81
  this.define("patch", path, handler, ...middleware);
82
82
  }
83
+ /**
84
+ * Wrap a handler to automatically send return values as response
85
+ * @param handler - The original handler
86
+ * @returns Wrapped Express request handler
87
+ * @private
88
+ */
89
+ wrapHandler(handler) {
90
+ return async (req, res, next) => {
91
+ try {
92
+ const result = await handler(req, res, next);
93
+ // If the response has already been sent, don't send again
94
+ if (res.headersSent) {
95
+ return;
96
+ }
97
+ // If handler returned a value, send it as response
98
+ if (result !== undefined) {
99
+ if (typeof result === "string") {
100
+ res.send(result);
101
+ }
102
+ else {
103
+ res.json(result);
104
+ }
105
+ }
106
+ }
107
+ catch (error) {
108
+ next(error);
109
+ }
110
+ };
111
+ }
83
112
  /**
84
113
  * Apply the routes to the Express application
85
114
  */
86
115
  applyRoutes() {
87
116
  this.routes.forEach(({ method, path, handler, middleware }) => {
117
+ const wrappedHandler = this.wrapHandler(handler);
88
118
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
89
- this.app[method](path, ...middleware, handler);
119
+ this.app[method](path, ...middleware, wrappedHandler);
90
120
  });
91
121
  }
92
122
  /**
@@ -5,11 +5,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.createMicroAPI = createMicroAPI;
7
7
  const core_1 = require("@expressots/core");
8
- const shared_1 = require("@expressots/shared");
9
8
  const express_1 = __importDefault(require("express"));
10
- const fs_1 = __importDefault(require("fs"));
11
- const application_express_micro_container_1 = require("./application-express-micro-container");
12
- const application_express_micro_route_1 = require("./application-express-micro-route");
9
+ const application_express_micro_container_js_1 = require("./application-express-micro-container.js");
10
+ const application_express_micro_route_js_1 = require("./application-express-micro-route.js");
13
11
  class AppExpressMicro {
14
12
  constructor() {
15
13
  this.logger = new core_1.Logger();
@@ -55,34 +53,6 @@ class AppExpressMicro {
55
53
  setGlobalRoutePrefix(prefix) {
56
54
  this.globalPrefix = prefix;
57
55
  }
58
- /**
59
- * Initialize the environment for the application
60
- * @param environment - The environment to initialize
61
- * @param options - Options for the environment initialization
62
- * @public API
63
- */
64
- initEnvironment(environment, options) {
65
- this.environment = environment;
66
- if (options === undefined) {
67
- (0, shared_1.config)({ path: ".env" });
68
- }
69
- else {
70
- if (!options.env[environment]) {
71
- this.logger.error(`Environment configuration for [${environment}] does not exist.`, "adapter-express");
72
- process.exit(1);
73
- }
74
- else {
75
- const envFileName = options.env[environment];
76
- if (!fs_1.default.existsSync(envFileName)) {
77
- this.logger.error(`Environment file [${envFileName}] does not exist.`, "adapter-express");
78
- process.exit(1);
79
- }
80
- else {
81
- (0, shared_1.config)({ path: envFileName });
82
- }
83
- }
84
- }
85
- }
86
56
  /**
87
57
  * Get the Middleware instance
88
58
  * @returns IMiddleware
@@ -123,8 +93,8 @@ class AppExpressMicro {
123
93
  */
124
94
  create(config) {
125
95
  this.app = (0, express_1.default)();
126
- this.routeManager = new application_express_micro_route_1.Route(this.app);
127
- this.container = new application_express_micro_container_1.IOC(config?.containerOptions);
96
+ this.routeManager = new application_express_micro_route_js_1.Route(this.app);
97
+ this.container = new application_express_micro_container_js_1.IOC(config?.containerOptions);
128
98
  this.middlewareManager = new core_1.Middleware();
129
99
  this.environment = "development";
130
100
  return this;
@@ -146,6 +116,7 @@ class AppExpressMicro {
146
116
  */
147
117
  async listen(port, appInfo) {
148
118
  const logger = new core_1.Logger();
119
+ const console = new core_1.Console();
149
120
  const normalizedPort = typeof port === "string" ? parseInt(port, 10) : port;
150
121
  this.configureMiddleware();
151
122
  this.routeManager.applyRoutes();
@@ -153,7 +124,7 @@ class AppExpressMicro {
153
124
  this.app.use(this.Middleware.getErrorHandler());
154
125
  }
155
126
  return new Promise((resolve, reject) => {
156
- this.httpServer = this.app.listen(normalizedPort, () => {
127
+ this.httpServer = this.app.listen(normalizedPort, async () => {
157
128
  const address = this.httpServer.address();
158
129
  if (typeof address === "object" && address?.port) {
159
130
  this.port = address.port;
@@ -161,8 +132,11 @@ class AppExpressMicro {
161
132
  else {
162
133
  this.port = normalizedPort;
163
134
  }
164
- const appInfoNormalized = appInfo ? `${appInfo?.appName} - ${appInfo?.appVersion} ` : "";
165
- logger.info(`${appInfoNormalized}[${this.port}:${this.environment}]`, "MicroAPI");
135
+ // Display startup message using Console class
136
+ await console.messageServer(this.port, this.environment, {
137
+ appName: appInfo?.appName || "ExpressoTS Micro",
138
+ appVersion: appInfo?.appVersion || "1.0.0",
139
+ });
166
140
  ["SIGTERM", "SIGHUP", "SIGBREAK", "SIGQUIT", "SIGINT"].forEach((signal) => {
167
141
  process.on(signal, this.handleExit.bind(this));
168
142
  });