@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,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupEventSystemForExpress = setupEventSystemForExpress;
4
+ const core_1 = require("@expressots/core");
5
+ /**
6
+ * Set up the ExpressoTS Event System with zero boilerplate.
7
+ *
8
+ * This function:
9
+ * 1. Registers all event system services (EventRegistry, EventEmitter, EventRecorder, EventFlowTracker)
10
+ * 2. Auto-discovers and registers all @OnEvent decorated handlers
11
+ * 3. Configures recording and flow tracking based on environment
12
+ * 4. Sets up replay emitter for development debugging
13
+ *
14
+ * @param container - The DI container
15
+ * @param options - Configuration options for the event system
16
+ * @returns Setup result with references to all event system services
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * export class App extends AppExpress {
21
+ * async configureServices(): Promise<void> {
22
+ * // Simple setup with defaults (recommended)
23
+ * const { handlersDiscovered } = setupEventSystemForExpress(
24
+ * this.config.Container
25
+ * );
26
+ * console.log(`Discovered ${handlersDiscovered} event handlers`);
27
+ *
28
+ * // Or with custom options
29
+ * setupEventSystemForExpress(this.config.Container, {
30
+ * enableRecording: true,
31
+ * maxRecordedEvents: 500,
32
+ * defaultTimeout: 10000,
33
+ * onError: (error, event, handler) => {
34
+ * console.error(`Handler ${handler} failed:`, error);
35
+ * }
36
+ * });
37
+ * }
38
+ * }
39
+ * ```
40
+ *
41
+ * @public API
42
+ */
43
+ function setupEventSystemForExpress(container, options = {}) {
44
+ const isDev = process.env.NODE_ENV === "development" || process.env.NODE_ENV === undefined;
45
+ // Default options
46
+ const config = {
47
+ enableRecording: isDev,
48
+ enableFlowTracking: isDev,
49
+ maxRecordedEvents: 1000,
50
+ defaultTimeout: 30000,
51
+ autoDiscover: true,
52
+ ...options,
53
+ };
54
+ // Register EventRegistry (singleton)
55
+ if (!container.isBound(core_1.EventRegistry)) {
56
+ container.bind(core_1.EventRegistry).toSelf().inSingletonScope();
57
+ }
58
+ // Register EventEmitter (singleton)
59
+ if (!container.isBound(core_1.EventEmitter)) {
60
+ container.bind(core_1.EventEmitter).toSelf().inSingletonScope();
61
+ }
62
+ // Register EventRecorder (singleton)
63
+ if (!container.isBound(core_1.EventRecorder)) {
64
+ container.bind(core_1.EventRecorder).toSelf().inSingletonScope();
65
+ }
66
+ // Register EventFlowTracker (singleton)
67
+ if (!container.isBound(core_1.EventFlowTracker)) {
68
+ container.bind(core_1.EventFlowTracker).toSelf().inSingletonScope();
69
+ }
70
+ // Get instances
71
+ const registry = container.get(core_1.EventRegistry);
72
+ const emitter = container.get(core_1.EventEmitter);
73
+ const recorder = container.get(core_1.EventRecorder);
74
+ const flowTracker = container.get(core_1.EventFlowTracker);
75
+ // Auto-discover event handlers
76
+ let handlersDiscovered = 0;
77
+ if (config.autoDiscover) {
78
+ handlersDiscovered = registry.discoverHandlers(container);
79
+ }
80
+ // Configure emitter
81
+ const emitterConfig = {
82
+ enableRecording: config.enableRecording,
83
+ enableFlowTracking: config.enableFlowTracking,
84
+ maxRecordedEvents: config.maxRecordedEvents,
85
+ defaultTimeout: config.defaultTimeout,
86
+ };
87
+ if (config.onEmit) {
88
+ emitterConfig.onEmit = config.onEmit;
89
+ }
90
+ if (config.onHandlerComplete) {
91
+ emitterConfig.onHandlerComplete = config.onHandlerComplete;
92
+ }
93
+ if (config.onError) {
94
+ emitterConfig.onError = config.onError;
95
+ }
96
+ emitter.configure(emitterConfig);
97
+ // Configure recorder
98
+ recorder.configure({
99
+ maxEvents: config.maxRecordedEvents || 1000,
100
+ autoStart: config.enableRecording,
101
+ });
102
+ // Set up replay emitter (so recorded events can be replayed)
103
+ recorder.setReplayEmitter(async (event) => {
104
+ await emitter.emit(event);
105
+ });
106
+ return {
107
+ registry,
108
+ emitter,
109
+ recorder,
110
+ flowTracker,
111
+ handlersDiscovered,
112
+ };
113
+ }
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupInterceptorsForExpress = setupInterceptorsForExpress;
4
+ const core_1 = require("@expressots/core");
5
+ /**
6
+ * Set up the ExpressoTS Interceptor System with zero boilerplate.
7
+ *
8
+ * This function:
9
+ * 1. Registers all interceptor infrastructure (InterceptorRegistry, InterceptorExecutor)
10
+ * 2. Optionally enables built-in interceptors (Performance, Logging, Timeout)
11
+ * 3. Registers custom interceptor classes
12
+ * 4. Initializes the interceptor registry
13
+ *
14
+ * @param container - The DI container
15
+ * @param options - Configuration options for the interceptor system
16
+ * @returns Setup result with references to interceptor services
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * export class App extends AppExpress {
21
+ * async configureServices(): Promise<void> {
22
+ * // Simple setup with performance interceptor
23
+ * setupInterceptorsForExpress(this.config.Container, {
24
+ * builtIn: { performance: true }
25
+ * });
26
+ *
27
+ * // Full setup with custom interceptors
28
+ * setupInterceptorsForExpress(this.config.Container, {
29
+ * builtIn: {
30
+ * performance: true,
31
+ * logging: true,
32
+ * timeout: { defaultTimeout: 5000 }
33
+ * },
34
+ * customInterceptors: [CacheInterceptor, AuditInterceptor]
35
+ * });
36
+ * }
37
+ * }
38
+ * ```
39
+ *
40
+ * @public API
41
+ */
42
+ function setupInterceptorsForExpress(container, options = {}) {
43
+ // Default options
44
+ const config = {
45
+ autoDiscover: true,
46
+ ...options,
47
+ };
48
+ let interceptorsRegistered = 0;
49
+ // Register InterceptorRegistry (singleton)
50
+ if (!container.isBound(core_1.InterceptorRegistry)) {
51
+ container.bind(core_1.InterceptorRegistry).toSelf().inSingletonScope();
52
+ }
53
+ // Register InterceptorExecutor (singleton)
54
+ if (!container.isBound(core_1.InterceptorExecutor)) {
55
+ container.bind(core_1.InterceptorExecutor).toSelf().inSingletonScope();
56
+ }
57
+ // Register PerformanceInterceptorService (needed by PerformanceInterceptor)
58
+ if (!container.isBound(core_1.PerformanceInterceptorService)) {
59
+ container.bind(core_1.PerformanceInterceptorService).toSelf().inSingletonScope();
60
+ }
61
+ // Register built-in interceptors if enabled
62
+ if (config.builtIn?.performance) {
63
+ if (!container.isBound(core_1.PerformanceInterceptor)) {
64
+ container.bind(core_1.PerformanceInterceptor).toSelf().inSingletonScope();
65
+ interceptorsRegistered++;
66
+ }
67
+ }
68
+ if (config.builtIn?.logging) {
69
+ if (!container.isBound(core_1.LoggingInterceptor)) {
70
+ container.bind(core_1.LoggingInterceptor).toSelf().inSingletonScope();
71
+ interceptorsRegistered++;
72
+ }
73
+ }
74
+ if (config.builtIn?.timeout) {
75
+ if (!container.isBound(core_1.TimeoutInterceptor)) {
76
+ container.bind(core_1.TimeoutInterceptor).toSelf().inSingletonScope();
77
+ interceptorsRegistered++;
78
+ }
79
+ }
80
+ // Register custom interceptors
81
+ if (config.customInterceptors && config.customInterceptors.length > 0) {
82
+ for (const interceptorClass of config.customInterceptors) {
83
+ if (!container.isBound(interceptorClass)) {
84
+ container.bind(interceptorClass).toSelf().inSingletonScope();
85
+ interceptorsRegistered++;
86
+ }
87
+ }
88
+ }
89
+ // Get instances
90
+ const registry = container.get(core_1.InterceptorRegistry);
91
+ const executor = container.get(core_1.InterceptorExecutor);
92
+ // Initialize registry (auto-discovers interceptors from container bindings)
93
+ if (config.autoDiscover) {
94
+ registry.initialize();
95
+ // Update count from registry
96
+ interceptorsRegistered = registry.getAll().length;
97
+ }
98
+ return {
99
+ registry,
100
+ executor,
101
+ interceptorsRegistered,
102
+ };
103
+ }
@@ -0,0 +1,228 @@
1
+ "use strict";
2
+ /**
3
+ * Setup Lazy Loading for Express
4
+ *
5
+ * One-liner helper function to configure the lazy loading system.
6
+ *
7
+ * @module adapter-express
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.setupLazyLoadingForExpress = setupLazyLoadingForExpress;
11
+ const core_1 = require("@expressots/core");
12
+ const lazy_module_middleware_js_1 = require("./lazy-module-middleware.js");
13
+ // ============================================================================
14
+ // Setup Function
15
+ // ============================================================================
16
+ /**
17
+ * Set up the lazy loading system with one function call.
18
+ *
19
+ * @layer public
20
+ * @audience application-developers
21
+ * @concept lazy-loading
22
+ *
23
+ * UNIQUE: Zero-configuration lazy loading!
24
+ * - Auto-detects routes from @controller() decorators
25
+ * - Creates middleware for automatic module loading
26
+ * - Optional metrics and background warmup
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * // 1. Define lazy modules (routes auto-detected from @controller)
31
+ * // lazy-modules.ts
32
+ * export const AdminModule = CreateLazyModule([AdminController]);
33
+ * // Routes auto-detected: ["/admin"] from @controller("/admin")
34
+ *
35
+ * export const ReportsModule = CreateLazyModule([ReportsController]);
36
+ * // Routes auto-detected: ["/reports"] from @controller("/reports")
37
+ *
38
+ * // 2. Setup in app.ts (just pass the modules!)
39
+ * export class App extends AppExpress {
40
+ * async configureServices(): Promise<void> {
41
+ * const { middleware } = setupLazyLoadingForExpress(
42
+ * this.config.Container,
43
+ * {
44
+ * lazyModules: [AdminModule, ReportsModule],
45
+ * globalPrefix: "/api" // Optional
46
+ * }
47
+ * );
48
+ *
49
+ * // Add middleware - that's it!
50
+ * if (middleware) {
51
+ * this.Middleware.addMiddleware(middleware);
52
+ * }
53
+ * }
54
+ * }
55
+ *
56
+ * // Now:
57
+ * // - GET /api/admin/* → AdminModule auto-loads
58
+ * // - GET /api/reports/* → ReportsModule auto-loads
59
+ * // - No manual route mapping needed!
60
+ * ```
61
+ *
62
+ * @param container - The DI container
63
+ * @param options - Configuration options
64
+ * @returns Setup result with loader, manager, and middleware
65
+ *
66
+ * @public API
67
+ */
68
+ function setupLazyLoadingForExpress(container, options = {}) {
69
+ const isDev = process.env.NODE_ENV === "development";
70
+ // Get or create provider manager
71
+ let provider;
72
+ try {
73
+ provider = container.get(core_1.ProviderManager);
74
+ }
75
+ catch {
76
+ // ProviderManager not available, create bindings manually
77
+ provider = null;
78
+ }
79
+ // ============================================
80
+ // Register Services
81
+ // ============================================
82
+ // Register LazyModuleLoader if not already bound
83
+ if (!container.isBound(core_1.LazyModuleLoader)) {
84
+ if (provider) {
85
+ provider.register(core_1.LazyModuleLoader, core_1.Scope.Singleton);
86
+ }
87
+ else {
88
+ container.bind(core_1.LazyModuleLoader).toSelf().inSingletonScope();
89
+ }
90
+ }
91
+ // Register LazyModuleManager if not already bound
92
+ if (!container.isBound(core_1.LazyModuleManager)) {
93
+ if (provider) {
94
+ provider.register(core_1.LazyModuleManager, core_1.Scope.Singleton);
95
+ }
96
+ else {
97
+ container.bind(core_1.LazyModuleManager).toSelf().inSingletonScope();
98
+ }
99
+ }
100
+ // Register LazyLoadMetrics if enabled
101
+ const enableMetrics = options.enableMetrics ?? isDev;
102
+ if (enableMetrics && !container.isBound(core_1.LazyLoadMetrics)) {
103
+ if (provider) {
104
+ provider.register(core_1.LazyLoadMetrics, core_1.Scope.Singleton);
105
+ }
106
+ else {
107
+ container.bind(core_1.LazyLoadMetrics).toSelf().inSingletonScope();
108
+ }
109
+ }
110
+ // Register LazyModuleWarmup if enabled
111
+ const enableWarmup = options.enableWarmup ?? true;
112
+ if (enableWarmup && !container.isBound(core_1.LazyModuleWarmup)) {
113
+ if (provider) {
114
+ provider.register(core_1.LazyModuleWarmup, core_1.Scope.Singleton);
115
+ }
116
+ else {
117
+ container.bind(core_1.LazyModuleWarmup).toSelf().inSingletonScope();
118
+ }
119
+ }
120
+ // ============================================
121
+ // Get Service Instances
122
+ // ============================================
123
+ const loader = container.get(core_1.LazyModuleLoader);
124
+ loader.setContainer(container);
125
+ const manager = container.get(core_1.LazyModuleManager);
126
+ const metrics = enableMetrics ? container.get(core_1.LazyLoadMetrics) : undefined;
127
+ const warmup = enableWarmup ? container.get(core_1.LazyModuleWarmup) : undefined;
128
+ // ============================================
129
+ // Register Lazy Modules
130
+ // ============================================
131
+ const lazyModules = options.lazyModules || [];
132
+ let lazyCount = 0;
133
+ let eagerCount = 0;
134
+ for (const lazyModule of lazyModules) {
135
+ // Check if module should always be loaded eagerly
136
+ const alwaysLoad = options.alwaysLoad || [];
137
+ const neverLoad = options.neverLoad || [];
138
+ if (alwaysLoad.includes(lazyModule.name)) {
139
+ // Load immediately
140
+ lazyModule.load().catch((err) => {
141
+ console.warn(`[Lazy Loading] Failed to eager-load ${lazyModule.name}:`, err);
142
+ });
143
+ eagerCount++;
144
+ }
145
+ else if (!neverLoad.includes(lazyModule.name)) {
146
+ // Register for lazy loading
147
+ loader.register(lazyModule);
148
+ lazyCount++;
149
+ }
150
+ }
151
+ // ============================================
152
+ // Log Summary
153
+ // ============================================
154
+ const logLevel = options.logLevel ?? "info";
155
+ if (logLevel !== "none") {
156
+ let logger;
157
+ try {
158
+ logger = container.get(core_1.Logger);
159
+ }
160
+ catch {
161
+ // Logger not available
162
+ }
163
+ const message = `[Lazy Loading] Registered ${lazyCount} lazy modules, ${eagerCount} eager modules`;
164
+ if (logger) {
165
+ logger.info(message);
166
+ }
167
+ else if (logLevel === "debug" || logLevel === "info") {
168
+ console.log(message);
169
+ }
170
+ }
171
+ // ============================================
172
+ // Start Warmup if Enabled
173
+ // ============================================
174
+ if (warmup && options.warmupConfig) {
175
+ // Schedule warmup to start after a delay
176
+ const warmupDelay = options.warmupConfig.delay ?? 5000;
177
+ setTimeout(() => {
178
+ warmup.start(options.warmupConfig).catch((err) => {
179
+ console.warn("[Lazy Loading] Warmup failed:", err);
180
+ });
181
+ }, warmupDelay);
182
+ }
183
+ // ============================================
184
+ // Create Auto-Load Middleware
185
+ // ============================================
186
+ let middleware;
187
+ let routeMappings = [];
188
+ if (lazyCount > 0 && options.enableAutoLoad !== false) {
189
+ // Create route mappings from lazy modules
190
+ routeMappings = (0, lazy_module_middleware_js_1.createRouteMappings)(lazyModules.filter((m) => !options.alwaysLoad?.includes(m.name)), options.routePrefixes);
191
+ // Create the middleware
192
+ middleware = (0, lazy_module_middleware_js_1.createLazyModuleMiddleware)({
193
+ routes: routeMappings,
194
+ loader,
195
+ globalPrefix: options.globalPrefix || "",
196
+ onLoadStart: (moduleName, path) => {
197
+ if (options.logLevel !== "none") {
198
+ console.log(`[Lazy Loading] Loading '${moduleName}' (triggered by ${path})...`);
199
+ }
200
+ },
201
+ onLoadComplete: (moduleName, loadTimeMs) => {
202
+ metrics?.recordLoadTime(moduleName, loadTimeMs);
203
+ },
204
+ onLoadError: (moduleName, error) => {
205
+ console.error(`[Lazy Loading] Failed to load '${moduleName}':`, error.message);
206
+ },
207
+ });
208
+ if (options.logLevel !== "none") {
209
+ const routes = routeMappings
210
+ .map((r) => `${options.globalPrefix || ""}${r.prefix}`)
211
+ .join(", ");
212
+ console.log(`[Lazy Loading] Auto-load middleware active for routes: ${routes}`);
213
+ }
214
+ }
215
+ // ============================================
216
+ // Return Result
217
+ // ============================================
218
+ return {
219
+ loader,
220
+ manager,
221
+ metrics,
222
+ warmup,
223
+ middleware,
224
+ routeMappings,
225
+ lazyModulesCount: lazyCount,
226
+ eagerModulesCount: eagerCount,
227
+ };
228
+ }
@@ -7,32 +7,33 @@ exports.getControllerMethodMetadata = getControllerMethodMetadata;
7
7
  exports.getControllerParameterMetadata = getControllerParameterMetadata;
8
8
  exports.cleanUpMetadata = cleanUpMetadata;
9
9
  exports.instanceOfIHttpActionResult = instanceOfIHttpActionResult;
10
+ exports.getContentNegotiationMetadata = getContentNegotiationMetadata;
10
11
  const core_1 = require("@expressots/core");
11
- const constants_1 = require("./constants");
12
+ const constants_js_1 = require("./constants.js");
12
13
  function getControllersFromContainer(container, forceControllers) {
13
- if (container.isBound(constants_1.TYPE.Controller)) {
14
- return container.getAll(constants_1.TYPE.Controller);
14
+ if (container.isBound(constants_js_1.TYPE.Controller)) {
15
+ return container.getAll(constants_js_1.TYPE.Controller);
15
16
  }
16
17
  if (forceControllers) {
17
18
  const logger = new core_1.Logger();
18
- logger.error(constants_1.NO_CONTROLLERS_FOUND, "adapter-express");
19
- throw new Error(constants_1.NO_CONTROLLERS_FOUND);
19
+ logger.error(constants_js_1.NO_CONTROLLERS_FOUND, "adapter-express");
20
+ throw new Error(constants_js_1.NO_CONTROLLERS_FOUND);
20
21
  }
21
22
  else {
22
23
  return [];
23
24
  }
24
25
  }
25
26
  function getControllersFromMetadata() {
26
- const arrayOfControllerMetadata = Reflect.getMetadata(constants_1.METADATA_KEY.controller, Reflect) || [];
27
+ const arrayOfControllerMetadata = Reflect.getMetadata(constants_js_1.METADATA_KEY.controller, Reflect) || [];
27
28
  return arrayOfControllerMetadata.map((metadata) => metadata.target);
28
29
  }
29
30
  function getControllerMetadata(constructor) {
30
- const controllerMetadata = Reflect.getOwnMetadata(constants_1.METADATA_KEY.controller, constructor);
31
+ const controllerMetadata = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controller, constructor);
31
32
  return controllerMetadata;
32
33
  }
33
34
  function getControllerMethodMetadata(constructor) {
34
- const methodMetadata = Reflect.getOwnMetadata(constants_1.METADATA_KEY.controllerMethod, constructor);
35
- const genericMetadata = Reflect.getMetadata(constants_1.METADATA_KEY.controllerMethod, Reflect.getPrototypeOf(constructor));
35
+ const methodMetadata = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controllerMethod, constructor);
36
+ const genericMetadata = Reflect.getMetadata(constants_js_1.METADATA_KEY.controllerMethod, Reflect.getPrototypeOf(constructor));
36
37
  if (genericMetadata !== undefined && methodMetadata !== undefined) {
37
38
  return methodMetadata.concat(genericMetadata);
38
39
  }
@@ -42,8 +43,8 @@ function getControllerMethodMetadata(constructor) {
42
43
  return methodMetadata;
43
44
  }
44
45
  function getControllerParameterMetadata(constructor) {
45
- const parameterMetadata = Reflect.getOwnMetadata(constants_1.METADATA_KEY.controllerParameter, constructor);
46
- const genericMetadata = Reflect.getMetadata(constants_1.METADATA_KEY.controllerParameter, Reflect.getPrototypeOf(constructor));
46
+ const parameterMetadata = Reflect.getOwnMetadata(constants_js_1.METADATA_KEY.controllerParameter, constructor);
47
+ const genericMetadata = Reflect.getMetadata(constants_js_1.METADATA_KEY.controllerParameter, Reflect.getPrototypeOf(constructor));
47
48
  if (genericMetadata !== undefined && parameterMetadata !== undefined) {
48
49
  return { ...parameterMetadata, ...genericMetadata };
49
50
  }
@@ -53,8 +54,25 @@ function getControllerParameterMetadata(constructor) {
53
54
  return parameterMetadata;
54
55
  }
55
56
  function cleanUpMetadata() {
56
- Reflect.defineMetadata(constants_1.METADATA_KEY.controller, [], Reflect);
57
+ Reflect.defineMetadata(constants_js_1.METADATA_KEY.controller, [], Reflect);
57
58
  }
58
59
  function instanceOfIHttpActionResult(value) {
59
60
  return value != null && typeof value.executeAsync === "function";
60
61
  }
62
+ /**
63
+ * Gets content negotiation metadata from a controller method.
64
+ * @param target - Controller instance
65
+ * @param propertyKey - Method name
66
+ * @returns Content negotiation metadata
67
+ */
68
+ function getContentNegotiationMetadata(target, propertyKey) {
69
+ return {
70
+ accept: Reflect.getMetadata(constants_js_1.METADATA_KEY.accept, target, propertyKey),
71
+ consumes: Reflect.getMetadata(constants_js_1.METADATA_KEY.consumes, target, propertyKey),
72
+ produces: Reflect.getMetadata(constants_js_1.METADATA_KEY.produces, target, propertyKey),
73
+ csvOptions: Reflect.getMetadata(constants_js_1.METADATA_KEY.csvOptions, target, propertyKey),
74
+ xmlOptions: Reflect.getMetadata(constants_js_1.METADATA_KEY.xmlOptions, target, propertyKey),
75
+ yamlOptions: Reflect.getMetadata(constants_js_1.METADATA_KEY.yamlOptions, target, propertyKey),
76
+ streamResponse: Reflect.getMetadata(constants_js_1.METADATA_KEY.streamResponse, target, propertyKey),
77
+ };
78
+ }