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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/LICENSE.md +21 -21
  2. package/README.md +61 -118
  3. package/lib/CHANGELOG.md +36 -5
  4. package/lib/README.md +61 -118
  5. package/lib/cjs/adapter-express/application-express.base.js +3 -1
  6. package/lib/cjs/adapter-express/application-express.js +1405 -85
  7. package/lib/cjs/adapter-express/express-utils/conditional-middleware.js +102 -0
  8. package/lib/cjs/adapter-express/express-utils/constants.js +17 -0
  9. package/lib/cjs/adapter-express/express-utils/content-negotiation-decorators.js +129 -0
  10. package/lib/cjs/adapter-express/express-utils/decorators.js +225 -59
  11. package/lib/cjs/adapter-express/express-utils/exception-filter-decorators.js +11 -0
  12. package/lib/cjs/adapter-express/express-utils/guard-context-factory.js +84 -0
  13. package/lib/cjs/adapter-express/express-utils/guard-middleware.js +115 -0
  14. package/lib/cjs/adapter-express/express-utils/guard-utils.js +18 -0
  15. package/lib/cjs/adapter-express/express-utils/http-context-store.js +15 -0
  16. package/lib/cjs/adapter-express/express-utils/http-status-middleware.js +37 -2
  17. package/lib/cjs/adapter-express/express-utils/index.js +67 -1
  18. package/lib/cjs/adapter-express/express-utils/interceptor-middleware.js +132 -0
  19. package/lib/cjs/adapter-express/express-utils/inversify-express-server.js +827 -64
  20. package/lib/cjs/adapter-express/express-utils/lazy-module-middleware.js +241 -0
  21. package/lib/cjs/adapter-express/express-utils/middleware-composition.js +95 -0
  22. package/lib/cjs/adapter-express/express-utils/path-pattern-compat.js +129 -0
  23. package/lib/cjs/adapter-express/express-utils/permission-preloader.middleware.js +48 -0
  24. package/lib/cjs/adapter-express/express-utils/route-constraints.js +104 -0
  25. package/lib/cjs/adapter-express/express-utils/scope-extractor.interface.js +2 -0
  26. package/lib/cjs/adapter-express/express-utils/scope-extractor.js +66 -0
  27. package/lib/cjs/adapter-express/express-utils/setup-authorization.js +71 -0
  28. package/lib/cjs/adapter-express/express-utils/setup-event-system.js +113 -0
  29. package/lib/cjs/adapter-express/express-utils/setup-interceptors.js +103 -0
  30. package/lib/cjs/adapter-express/express-utils/setup-lazy-loading.js +228 -0
  31. package/lib/cjs/adapter-express/express-utils/utils.js +30 -12
  32. package/lib/cjs/adapter-express/express-utils/validation-decorators.js +205 -0
  33. package/lib/cjs/adapter-express/express-utils/validation-service.js +252 -0
  34. package/lib/cjs/adapter-express/index.js +7 -5
  35. package/lib/cjs/adapter-express/micro-api/application-express-micro-route.js +31 -1
  36. package/lib/cjs/adapter-express/micro-api/application-express-micro.js +8 -38
  37. package/lib/cjs/adapter-express/micro-api/gateway/circuit-breaker.js +174 -0
  38. package/lib/cjs/adapter-express/micro-api/gateway/index.js +11 -0
  39. package/lib/cjs/adapter-express/micro-api/gateway/service-proxy.js +214 -0
  40. package/lib/cjs/adapter-express/micro-api/index.js +27 -3
  41. package/lib/cjs/adapter-express/micro-api/micro.js +272 -0
  42. package/lib/cjs/adapter-express/micro-api/queue/index.js +8 -0
  43. package/lib/cjs/adapter-express/micro-api/queue/queue.interface.js +2 -0
  44. package/lib/cjs/adapter-express/micro-api/queue/rabbitmq-consumer.js +255 -0
  45. package/lib/cjs/adapter-express/micro-api/serverless/aws-lambda.adapter.js +183 -0
  46. package/lib/cjs/adapter-express/micro-api/serverless/cloudflare.adapter.js +158 -0
  47. package/lib/cjs/adapter-express/micro-api/serverless/index.js +12 -0
  48. package/lib/cjs/adapter-express/micro-api/serverless/vercel.adapter.js +102 -0
  49. package/lib/cjs/adapter-express/micro-api/service-mesh/index.js +10 -0
  50. package/lib/cjs/adapter-express/micro-api/service-mesh/service-client.js +194 -0
  51. package/lib/cjs/adapter-express/micro-api/service-mesh/service-discovery.js +261 -0
  52. package/lib/cjs/adapter-express/middleware/index.js +21 -0
  53. package/lib/cjs/adapter-express/middleware/request-logging.middleware.js +244 -0
  54. package/lib/cjs/adapter-express/render/engine.js +15 -15
  55. package/lib/cjs/adapter-express/render/index.js +5 -0
  56. package/lib/cjs/adapter-express/studio/index.js +10 -0
  57. package/lib/cjs/adapter-express/studio/studio-integration.js +267 -0
  58. package/lib/cjs/index.js +1 -1
  59. package/lib/cjs/types/adapter-express/application-express.base.d.ts +20 -7
  60. package/lib/cjs/types/adapter-express/application-express.d.ts +316 -33
  61. package/lib/cjs/types/adapter-express/express-utils/base-middleware.d.ts +2 -2
  62. package/lib/cjs/types/adapter-express/express-utils/conditional-middleware.d.ts +97 -0
  63. package/lib/cjs/types/adapter-express/express-utils/constants.d.ts +13 -0
  64. package/lib/cjs/types/adapter-express/express-utils/content-negotiation-decorators.d.ts +94 -0
  65. package/lib/cjs/types/adapter-express/express-utils/decorators.d.ts +54 -6
  66. package/lib/cjs/types/adapter-express/express-utils/exception-filter-decorators.d.ts +6 -0
  67. package/lib/cjs/types/adapter-express/express-utils/guard-context-factory.d.ts +17 -0
  68. package/lib/cjs/types/adapter-express/express-utils/guard-middleware.d.ts +22 -0
  69. package/lib/cjs/types/adapter-express/express-utils/guard-utils.d.ts +11 -0
  70. package/lib/cjs/types/adapter-express/express-utils/http-context-store.d.ts +20 -0
  71. package/lib/cjs/types/adapter-express/express-utils/httpResponseMessage.d.ts +1 -1
  72. package/lib/cjs/types/adapter-express/express-utils/index.d.ts +30 -2
  73. package/lib/cjs/types/adapter-express/express-utils/interceptor-middleware.d.ts +40 -0
  74. package/lib/cjs/types/adapter-express/express-utils/interfaces.d.ts +42 -5
  75. package/lib/cjs/types/adapter-express/express-utils/inversify-express-server.d.ts +114 -2
  76. package/lib/cjs/types/adapter-express/express-utils/lazy-module-middleware.d.ts +122 -0
  77. package/lib/cjs/types/adapter-express/express-utils/middleware-composition.d.ts +85 -0
  78. package/lib/cjs/types/adapter-express/express-utils/path-pattern-compat.d.ts +66 -0
  79. package/lib/cjs/types/adapter-express/express-utils/permission-preloader.middleware.d.ts +10 -0
  80. package/lib/cjs/types/adapter-express/express-utils/route-constraints.d.ts +98 -0
  81. package/lib/cjs/types/adapter-express/express-utils/scope-extractor.d.ts +21 -0
  82. package/lib/cjs/types/adapter-express/express-utils/scope-extractor.interface.d.ts +12 -0
  83. package/lib/cjs/types/adapter-express/express-utils/setup-authorization.d.ts +34 -0
  84. package/lib/cjs/types/adapter-express/express-utils/setup-event-system.d.ts +118 -0
  85. package/lib/cjs/types/adapter-express/express-utils/setup-interceptors.d.ts +115 -0
  86. package/lib/cjs/types/adapter-express/express-utils/setup-lazy-loading.d.ts +123 -0
  87. package/lib/cjs/types/adapter-express/express-utils/utils.d.ts +17 -2
  88. package/lib/cjs/types/adapter-express/express-utils/validation-decorators.d.ts +145 -0
  89. package/lib/cjs/types/adapter-express/express-utils/validation-service.d.ts +88 -0
  90. package/lib/cjs/types/adapter-express/index.d.ts +6 -4
  91. package/lib/cjs/types/adapter-express/micro-api/application-express-micro-route.d.ts +25 -14
  92. package/lib/cjs/types/adapter-express/micro-api/application-express-micro.d.ts +3 -10
  93. package/lib/cjs/types/adapter-express/micro-api/gateway/circuit-breaker.d.ts +111 -0
  94. package/lib/cjs/types/adapter-express/micro-api/gateway/index.d.ts +5 -0
  95. package/lib/cjs/types/adapter-express/micro-api/gateway/service-proxy.d.ts +83 -0
  96. package/lib/cjs/types/adapter-express/micro-api/index.d.ts +7 -1
  97. package/lib/cjs/types/adapter-express/micro-api/micro.d.ts +83 -0
  98. package/lib/cjs/types/adapter-express/micro-api/queue/index.d.ts +5 -0
  99. package/lib/cjs/types/adapter-express/micro-api/queue/queue.interface.d.ts +60 -0
  100. package/lib/cjs/types/adapter-express/micro-api/queue/rabbitmq-consumer.d.ts +86 -0
  101. package/lib/cjs/types/adapter-express/micro-api/serverless/aws-lambda.adapter.d.ts +77 -0
  102. package/lib/cjs/types/adapter-express/micro-api/serverless/cloudflare.adapter.d.ts +64 -0
  103. package/lib/cjs/types/adapter-express/micro-api/serverless/index.d.ts +6 -0
  104. package/lib/cjs/types/adapter-express/micro-api/serverless/vercel.adapter.d.ts +56 -0
  105. package/lib/cjs/types/adapter-express/micro-api/service-mesh/index.d.ts +5 -0
  106. package/lib/cjs/types/adapter-express/micro-api/service-mesh/service-client.d.ts +122 -0
  107. package/lib/cjs/types/adapter-express/micro-api/service-mesh/service-discovery.d.ts +150 -0
  108. package/lib/cjs/types/adapter-express/middleware/index.d.ts +5 -0
  109. package/lib/cjs/types/adapter-express/middleware/request-logging.middleware.d.ts +65 -0
  110. package/lib/cjs/types/adapter-express/render/index.d.ts +1 -0
  111. package/lib/cjs/types/adapter-express/studio/index.d.ts +1 -0
  112. package/lib/cjs/types/adapter-express/studio/studio-integration.d.ts +170 -0
  113. package/lib/cjs/types/index.d.ts +1 -1
  114. package/lib/esm/adapter-express/application-express.base.js +24 -0
  115. package/lib/esm/adapter-express/application-express.js +1656 -0
  116. package/lib/esm/adapter-express/application-express.types.js +1 -0
  117. package/lib/esm/adapter-express/express-utils/base-middleware.js +19 -0
  118. package/lib/esm/adapter-express/express-utils/conditional-middleware.js +96 -0
  119. package/lib/esm/adapter-express/express-utils/constants.js +63 -0
  120. package/lib/esm/adapter-express/express-utils/content/httpContent.js +6 -0
  121. package/lib/esm/adapter-express/express-utils/content-negotiation-decorators.js +120 -0
  122. package/lib/esm/adapter-express/express-utils/decorators.js +604 -0
  123. package/lib/esm/adapter-express/express-utils/exception-filter-decorators.js +6 -0
  124. package/lib/esm/adapter-express/express-utils/guard-context-factory.js +83 -0
  125. package/lib/esm/adapter-express/express-utils/guard-middleware.js +115 -0
  126. package/lib/esm/adapter-express/express-utils/guard-utils.js +14 -0
  127. package/lib/esm/adapter-express/express-utils/http-context-store.js +10 -0
  128. package/lib/esm/adapter-express/express-utils/http-status-middleware.js +116 -0
  129. package/lib/esm/adapter-express/express-utils/httpResponseMessage.js +29 -0
  130. package/lib/esm/adapter-express/express-utils/index.js +24 -0
  131. package/lib/esm/adapter-express/express-utils/interceptor-middleware.js +130 -0
  132. package/lib/esm/adapter-express/express-utils/interfaces.js +1 -0
  133. package/lib/esm/adapter-express/express-utils/inversify-express-server.js +1047 -0
  134. package/lib/esm/adapter-express/express-utils/lazy-module-middleware.js +236 -0
  135. package/lib/esm/adapter-express/express-utils/middleware-composition.js +89 -0
  136. package/lib/esm/adapter-express/express-utils/path-pattern-compat.js +125 -0
  137. package/lib/esm/adapter-express/express-utils/permission-preloader.middleware.js +45 -0
  138. package/lib/esm/adapter-express/express-utils/resolver-multer.js +30 -0
  139. package/lib/esm/adapter-express/express-utils/route-constraints.js +100 -0
  140. package/lib/esm/adapter-express/express-utils/scope-extractor.interface.js +1 -0
  141. package/lib/esm/adapter-express/express-utils/scope-extractor.js +63 -0
  142. package/lib/esm/adapter-express/express-utils/setup-authorization.js +68 -0
  143. package/lib/esm/adapter-express/express-utils/setup-event-system.js +110 -0
  144. package/lib/esm/adapter-express/express-utils/setup-interceptors.js +100 -0
  145. package/lib/esm/adapter-express/express-utils/setup-lazy-loading.js +225 -0
  146. package/lib/esm/adapter-express/express-utils/utils.js +68 -0
  147. package/lib/esm/adapter-express/express-utils/validation-decorators.js +199 -0
  148. package/lib/esm/adapter-express/express-utils/validation-service.js +251 -0
  149. package/lib/esm/adapter-express/index.js +7 -0
  150. package/lib/esm/adapter-express/micro-api/application-express-micro-container.js +48 -0
  151. package/lib/esm/adapter-express/micro-api/application-express-micro-route.js +128 -0
  152. package/lib/esm/adapter-express/micro-api/application-express-micro.js +157 -0
  153. package/lib/esm/adapter-express/micro-api/gateway/circuit-breaker.js +174 -0
  154. package/lib/esm/adapter-express/micro-api/gateway/index.js +5 -0
  155. package/lib/esm/adapter-express/micro-api/gateway/service-proxy.js +210 -0
  156. package/lib/esm/adapter-express/micro-api/index.js +10 -0
  157. package/lib/esm/adapter-express/micro-api/micro.js +266 -0
  158. package/lib/esm/adapter-express/micro-api/queue/index.js +4 -0
  159. package/lib/esm/adapter-express/micro-api/queue/queue.interface.js +1 -0
  160. package/lib/esm/adapter-express/micro-api/queue/rabbitmq-consumer.js +229 -0
  161. package/lib/esm/adapter-express/micro-api/serverless/aws-lambda.adapter.js +180 -0
  162. package/lib/esm/adapter-express/micro-api/serverless/cloudflare.adapter.js +155 -0
  163. package/lib/esm/adapter-express/micro-api/serverless/index.js +6 -0
  164. package/lib/esm/adapter-express/micro-api/serverless/vercel.adapter.js +99 -0
  165. package/lib/esm/adapter-express/micro-api/service-mesh/index.js +5 -0
  166. package/lib/esm/adapter-express/micro-api/service-mesh/service-client.js +191 -0
  167. package/lib/esm/adapter-express/micro-api/service-mesh/service-discovery.js +259 -0
  168. package/lib/esm/adapter-express/middleware/index.js +5 -0
  169. package/lib/esm/adapter-express/middleware/request-logging.middleware.js +239 -0
  170. package/lib/esm/adapter-express/render/constants.js +37 -0
  171. package/lib/esm/adapter-express/render/engine.js +51 -0
  172. package/lib/esm/adapter-express/render/index.js +1 -0
  173. package/lib/esm/adapter-express/render/resolve-render.js +30 -0
  174. package/lib/esm/adapter-express/studio/index.js +1 -0
  175. package/lib/esm/adapter-express/studio/studio-integration.js +236 -0
  176. package/lib/esm/index.mjs +1 -0
  177. package/lib/esm/package.json +3 -0
  178. package/lib/esm/types/adapter-express/application-express.base.d.ts +77 -0
  179. package/lib/esm/types/adapter-express/application-express.d.ts +453 -0
  180. package/lib/esm/types/adapter-express/application-express.types.d.ts +23 -0
  181. package/lib/esm/types/adapter-express/express-utils/base-middleware.d.ts +8 -0
  182. package/lib/esm/types/adapter-express/express-utils/conditional-middleware.d.ts +97 -0
  183. package/lib/esm/types/adapter-express/express-utils/constants.d.ts +57 -0
  184. package/lib/esm/types/adapter-express/express-utils/content/httpContent.d.ts +6 -0
  185. package/lib/esm/types/adapter-express/express-utils/content-negotiation-decorators.d.ts +94 -0
  186. package/lib/esm/types/adapter-express/express-utils/decorators.d.ts +257 -0
  187. package/lib/esm/types/adapter-express/express-utils/exception-filter-decorators.d.ts +6 -0
  188. package/lib/esm/types/adapter-express/express-utils/guard-context-factory.d.ts +17 -0
  189. package/lib/esm/types/adapter-express/express-utils/guard-middleware.d.ts +22 -0
  190. package/lib/esm/types/adapter-express/express-utils/guard-utils.d.ts +11 -0
  191. package/lib/esm/types/adapter-express/express-utils/http-context-store.d.ts +20 -0
  192. package/lib/esm/types/adapter-express/express-utils/http-status-middleware.d.ts +26 -0
  193. package/lib/esm/types/adapter-express/express-utils/httpResponseMessage.d.ts +14 -0
  194. package/lib/esm/types/adapter-express/express-utils/index.d.ts +30 -0
  195. package/lib/esm/types/adapter-express/express-utils/interceptor-middleware.d.ts +40 -0
  196. package/lib/esm/types/adapter-express/express-utils/interfaces.d.ts +115 -0
  197. package/lib/esm/types/adapter-express/express-utils/inversify-express-server.d.ts +172 -0
  198. package/lib/esm/types/adapter-express/express-utils/lazy-module-middleware.d.ts +122 -0
  199. package/lib/esm/types/adapter-express/express-utils/middleware-composition.d.ts +85 -0
  200. package/lib/esm/types/adapter-express/express-utils/path-pattern-compat.d.ts +66 -0
  201. package/lib/esm/types/adapter-express/express-utils/permission-preloader.middleware.d.ts +10 -0
  202. package/lib/esm/types/adapter-express/express-utils/resolver-multer.d.ts +7 -0
  203. package/lib/esm/types/adapter-express/express-utils/route-constraints.d.ts +98 -0
  204. package/lib/esm/types/adapter-express/express-utils/scope-extractor.d.ts +21 -0
  205. package/lib/esm/types/adapter-express/express-utils/scope-extractor.interface.d.ts +12 -0
  206. package/lib/esm/types/adapter-express/express-utils/setup-authorization.d.ts +34 -0
  207. package/lib/esm/types/adapter-express/express-utils/setup-event-system.d.ts +118 -0
  208. package/lib/esm/types/adapter-express/express-utils/setup-interceptors.d.ts +115 -0
  209. package/lib/esm/types/adapter-express/express-utils/setup-lazy-loading.d.ts +123 -0
  210. package/lib/esm/types/adapter-express/express-utils/utils.d.ts +24 -0
  211. package/lib/esm/types/adapter-express/express-utils/validation-decorators.d.ts +145 -0
  212. package/lib/esm/types/adapter-express/express-utils/validation-service.d.ts +88 -0
  213. package/lib/esm/types/adapter-express/index.d.ts +7 -0
  214. package/lib/esm/types/adapter-express/micro-api/application-express-micro-container.d.ts +47 -0
  215. package/lib/esm/types/adapter-express/micro-api/application-express-micro-route.d.ts +104 -0
  216. package/lib/esm/types/adapter-express/micro-api/application-express-micro.d.ts +72 -0
  217. package/lib/esm/types/adapter-express/micro-api/gateway/circuit-breaker.d.ts +111 -0
  218. package/lib/esm/types/adapter-express/micro-api/gateway/index.d.ts +5 -0
  219. package/lib/esm/types/adapter-express/micro-api/gateway/service-proxy.d.ts +83 -0
  220. package/lib/esm/types/adapter-express/micro-api/index.d.ts +7 -0
  221. package/lib/esm/types/adapter-express/micro-api/micro.d.ts +83 -0
  222. package/lib/esm/types/adapter-express/micro-api/queue/index.d.ts +5 -0
  223. package/lib/esm/types/adapter-express/micro-api/queue/queue.interface.d.ts +60 -0
  224. package/lib/esm/types/adapter-express/micro-api/queue/rabbitmq-consumer.d.ts +86 -0
  225. package/lib/esm/types/adapter-express/micro-api/serverless/aws-lambda.adapter.d.ts +77 -0
  226. package/lib/esm/types/adapter-express/micro-api/serverless/cloudflare.adapter.d.ts +64 -0
  227. package/lib/esm/types/adapter-express/micro-api/serverless/index.d.ts +6 -0
  228. package/lib/esm/types/adapter-express/micro-api/serverless/vercel.adapter.d.ts +56 -0
  229. package/lib/esm/types/adapter-express/micro-api/service-mesh/index.d.ts +5 -0
  230. package/lib/esm/types/adapter-express/micro-api/service-mesh/service-client.d.ts +122 -0
  231. package/lib/esm/types/adapter-express/micro-api/service-mesh/service-discovery.d.ts +150 -0
  232. package/lib/esm/types/adapter-express/middleware/index.d.ts +5 -0
  233. package/lib/esm/types/adapter-express/middleware/request-logging.middleware.d.ts +65 -0
  234. package/lib/esm/types/adapter-express/render/constants.d.ts +26 -0
  235. package/lib/esm/types/adapter-express/render/engine.d.ts +20 -0
  236. package/lib/esm/types/adapter-express/render/index.d.ts +5 -0
  237. package/lib/esm/types/adapter-express/render/resolve-render.d.ts +7 -0
  238. package/lib/esm/types/adapter-express/studio/index.d.ts +1 -0
  239. package/lib/esm/types/adapter-express/studio/studio-integration.d.ts +170 -0
  240. package/lib/esm/types/index.d.ts +1 -0
  241. package/lib/package.json +170 -146
  242. package/package.json +170 -146
  243. package/lib/cjs/di/di.interfaces.js +0 -10
  244. package/lib/cjs/types/di/di.interfaces.d.ts +0 -289
@@ -0,0 +1,172 @@
1
+ import express, { Application, Router } from "express";
2
+ import { interfaces, ContentNegotiationService } from "@expressots/core";
3
+ import type { AuthProvider, ConfigFunction, RoutingConfig } from "./interfaces.js";
4
+ import { ValidationService } from "./validation-service.js";
5
+ export declare class InversifyExpressServer {
6
+ private _router;
7
+ private _container;
8
+ private _app;
9
+ private _configFn;
10
+ private _errorConfigFn;
11
+ private _routingConfig;
12
+ private _AuthProvider;
13
+ private _forceControllers;
14
+ private _contentNegotiationService?;
15
+ private _validationService?;
16
+ /**
17
+ * Wrapper for the express server.
18
+ *
19
+ * @param container Container loaded with all controllers and their dependencies.
20
+ * @param customRouter optional express.Router custom router
21
+ * @param routingConfig optional interfaces.RoutingConfig routing config
22
+ * @param customApp optional express.Application custom app
23
+ * @param authProvider optional interfaces.AuthProvider auth provider
24
+ * @param forceControllers optional boolean setting to force controllers (defaults do true)
25
+ */
26
+ constructor(container: interfaces.Container, customRouter?: Router | null, routingConfig?: RoutingConfig | null, customApp?: Application | null, authProvider?: (new () => AuthProvider) | null, forceControllers?: boolean);
27
+ /**
28
+ * Sets the configuration function to be applied to the application.
29
+ * Note that the config function is not actually executed until a call to
30
+ * InversifyExpresServer.build().
31
+ *
32
+ * This method is chainable.
33
+ *
34
+ * @param fn Function in which app-level middleware can be registered.
35
+ */
36
+ setConfig(fn: ConfigFunction): InversifyExpressServer;
37
+ /**
38
+ * Sets the error handler configuration function to be applied to the application.
39
+ * Note that the error config function is not actually executed until a call to
40
+ * InversifyExpressServer.build().
41
+ *
42
+ * This method is chainable.
43
+ *
44
+ * @param fn Function in which app-level error handlers can be registered.
45
+ */
46
+ setErrorConfig(fn: ConfigFunction): InversifyExpressServer;
47
+ /**
48
+ * Applies all routes and configuration to the server, returning the express application.
49
+ */
50
+ build(): express.Application;
51
+ /**
52
+ * Install a catch-all 404 handler that runs after every registered route.
53
+ *
54
+ * When the user has the suggestions feature enabled (default in development),
55
+ * this consults the route registry, computes "Did you mean ...?" suggestions
56
+ * via `getErrorHints` from `@expressots/core`, logs them through the framework
57
+ * Logger, and returns a structured RFC-7807-style JSON 404 instead of the
58
+ * default Express HTML.
59
+ *
60
+ * Users who want the legacy Express HTML 404 can opt out by configuring the
61
+ * Logger with `suggestions.enabled = false` (this also disables the JSON
62
+ * envelope so they can install their own 404 handler in the error-config fn).
63
+ *
64
+ * @private
65
+ */
66
+ private registerNotFoundHandler;
67
+ /**
68
+ * Resolve the user-configured suggestions config, falling back to the
69
+ * env-aware default when the Logger is not bound or has no overrides.
70
+ *
71
+ * @private
72
+ */
73
+ private resolveSuggestionsConfig;
74
+ /**
75
+ * Resolve the framework Logger from DI when available.
76
+ *
77
+ * @private
78
+ */
79
+ private resolveLogger;
80
+ private registerControllers;
81
+ /**
82
+ * Initialize the interceptor system by binding required components
83
+ * @private
84
+ */
85
+ private initializeInterceptorSystem;
86
+ /**
87
+ * Check if the interceptor system is properly initialized
88
+ * @private
89
+ */
90
+ private isInterceptorSystemReady;
91
+ /**
92
+ * Extract interceptors from controller and method metadata
93
+ * @private
94
+ */
95
+ private extractInterceptors;
96
+ /**
97
+ * Wrap a handler with interceptor middleware
98
+ * @private
99
+ */
100
+ private wrapWithInterceptors;
101
+ /**
102
+ * Checks if a middleware item is a class constructor (not an instance).
103
+ * Handles classes that extend ExpressoMiddleware (which has abstract use method).
104
+ * Note: Abstract methods don't exist at runtime, so we check for concrete implementations.
105
+ */
106
+ private isMiddlewareClass;
107
+ private isExpressoMiddleware;
108
+ private resolveMiddleware;
109
+ /**
110
+ * Creates a lazy middleware handler for class constructors.
111
+ * Supports both container-bound middleware (via @provide()) and direct instantiation.
112
+ *
113
+ * Performance: Instances are created per-request to support request-scoped state.
114
+ * For better performance with stateless middleware, use container-bound middleware
115
+ * with proper scoping (singleton/request scope) via @provide().
116
+ *
117
+ * Note: If container resolution fails (e.g., base class missing @injectable()),
118
+ * falls back to direct instantiation for backward compatibility.
119
+ */
120
+ private createLazyMiddlewareHandler;
121
+ /**
122
+ * Creates a request handler for conditional middleware.
123
+ * Evaluates the condition and executes the wrapped middleware if condition is true.
124
+ */
125
+ private createConditionalMiddlewareHandler;
126
+ /**
127
+ * Creates a request handler for composed middleware (Phase 3: Middleware Composition).
128
+ * Executes all middleware in the composition sequentially.
129
+ * Both 'combine' and 'sequence' types behave the same way - they execute middleware
130
+ * sequentially and propagate errors normally (Express handles errors via next(error)).
131
+ *
132
+ * @param config - ComposedMiddlewareConfig containing the middleware array and type
133
+ * @returns Express RequestHandler
134
+ */
135
+ private createComposedMiddlewareHandler;
136
+ /**
137
+ * Executes a chain of middleware handlers sequentially.
138
+ * Each middleware calls next() to proceed to the next one.
139
+ * Handles both synchronous and asynchronous middleware.
140
+ */
141
+ private executeMiddlewareChain;
142
+ private copyHeadersTo;
143
+ private handleHttpResponseMessage;
144
+ private handlerFactory;
145
+ private executeRouteHandler;
146
+ private _getHttpContext;
147
+ /**
148
+ * Sets the content negotiation service instance.
149
+ * @param service - Content negotiation service instance
150
+ */
151
+ setContentNegotiationService(service: ContentNegotiationService): void;
152
+ /**
153
+ * Gets the content negotiation service if available.
154
+ * @returns Content negotiation service or undefined
155
+ */
156
+ private getContentNegotiationService;
157
+ /**
158
+ * Sets the validation service instance.
159
+ * @param service - Validation service instance
160
+ */
161
+ setValidationService(service: ValidationService): void;
162
+ /**
163
+ * Gets the validation service if available.
164
+ * @returns Validation service or undefined
165
+ */
166
+ private getValidationService;
167
+ private _createHttpContext;
168
+ private _getCurrentUser;
169
+ private extractParameters;
170
+ private getParam;
171
+ private _getPrincipal;
172
+ }
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Lazy Module Auto-Load Middleware
3
+ *
4
+ * Automatically loads lazy modules when their routes are accessed.
5
+ * This provides seamless lazy loading without 404 errors.
6
+ *
7
+ * @module adapter-express
8
+ */
9
+ import { RequestHandler, Router, Express } from "express";
10
+ import { LazyModuleLoader, ILazyModule } from "@expressots/core";
11
+ /**
12
+ * Route prefix mapping for lazy modules.
13
+ * Maps route prefixes to module names for auto-loading.
14
+ */
15
+ export interface LazyRouteMapping {
16
+ /** Route prefix (e.g., "/admin", "/reports") */
17
+ prefix: string;
18
+ /** Module name to load when this prefix is accessed */
19
+ moduleName: string;
20
+ /** Whether the module is currently loaded */
21
+ loaded: boolean;
22
+ }
23
+ /**
24
+ * Configuration for the lazy module middleware.
25
+ */
26
+ export interface LazyModuleMiddlewareConfig {
27
+ /** Route mappings */
28
+ routes: Array<LazyRouteMapping>;
29
+ /** The lazy module loader instance */
30
+ loader: LazyModuleLoader;
31
+ /** Global route prefix (e.g., "/api") */
32
+ globalPrefix?: string;
33
+ /** Callback when a module starts loading */
34
+ onLoadStart?: (moduleName: string, path: string) => void;
35
+ /** Callback when a module finishes loading */
36
+ onLoadComplete?: (moduleName: string, loadTimeMs: number) => void;
37
+ /** Callback when module loading fails */
38
+ onLoadError?: (moduleName: string, error: Error) => void;
39
+ /**
40
+ * Express app or router for dynamic route registration.
41
+ * When provided, routes are registered dynamically after module load,
42
+ * eliminating the need for 307 redirects.
43
+ */
44
+ expressApp?: Express | Router;
45
+ /**
46
+ * Callback to register lazy module routes after loading.
47
+ * When provided, this is called to register the module's routes dynamically.
48
+ * If not provided and expressApp is set, default registration is attempted.
49
+ */
50
+ onRegisterRoutes?: (moduleName: string, router: Router) => void;
51
+ }
52
+ /**
53
+ * Create middleware that auto-loads lazy modules when their routes are accessed.
54
+ *
55
+ * @layer public
56
+ * @audience application-developers
57
+ * @concept lazy-loading
58
+ *
59
+ * UNIQUE: Seamless lazy loading - no 404s! Modules load automatically
60
+ * when their routes are accessed for the first time.
61
+ *
62
+ * @example
63
+ * ```typescript
64
+ * const middleware = createLazyModuleMiddleware({
65
+ * routes: [
66
+ * { prefix: "/admin", moduleName: "AdminModule", loaded: false },
67
+ * { prefix: "/reports", moduleName: "ReportsModule", loaded: false }
68
+ * ],
69
+ * loader: lazyModuleLoader,
70
+ * globalPrefix: "/api"
71
+ * });
72
+ *
73
+ * app.use(middleware);
74
+ * ```
75
+ *
76
+ * @param config - Middleware configuration
77
+ * @returns Express middleware function
78
+ *
79
+ * @public API
80
+ */
81
+ export declare function createLazyModuleMiddleware(config: LazyModuleMiddlewareConfig): RequestHandler;
82
+ /**
83
+ * Extract route prefixes from a lazy module.
84
+ *
85
+ * Uses auto-detected routes from CreateLazyModule (which analyzes @controller decorators),
86
+ * falls back to prefetchOn config, and finally infers from module name.
87
+ *
88
+ * @param lazyModule - The lazy module to analyze
89
+ * @returns Detected route prefixes
90
+ *
91
+ * @public API
92
+ */
93
+ export declare function extractRoutePrefixes(lazyModule: ILazyModule): Array<string>;
94
+ /**
95
+ * Create route mappings from lazy modules.
96
+ *
97
+ * Route detection priority:
98
+ * 1. Manual routePrefixMap (if provided)
99
+ * 2. Auto-detected from @controller() decorators (via CreateLazyModule)
100
+ * 3. prefetchOn config
101
+ * 4. Inferred from module name
102
+ *
103
+ * @param lazyModules - Array of lazy modules
104
+ * @param routePrefixMap - Optional manual prefix mappings { moduleName: prefix }
105
+ * @returns Array of route mappings
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * // Zero-config: routes auto-detected from controllers!
110
+ * const mappings = createRouteMappings([AdminModule, ReportsModule]);
111
+ * // Automatically maps @controller("/admin") -> /admin
112
+ *
113
+ * // Or with manual overrides
114
+ * const mappings = createRouteMappings(
115
+ * [AdminModule, ReportsModule],
116
+ * { "AdminModule": "/admin-panel" } // Override auto-detection
117
+ * );
118
+ * ```
119
+ *
120
+ * @public API
121
+ */
122
+ export declare function createRouteMappings(lazyModules: Array<ILazyModule>, routePrefixMap?: Record<string, string>): Array<LazyRouteMapping>;
@@ -0,0 +1,85 @@
1
+ import type { Middleware } from "./interfaces.js";
2
+ /**
3
+ * Configuration object for composed middleware.
4
+ * Represents a group of middleware that should be executed together.
5
+ */
6
+ export interface ComposedMiddlewareConfig {
7
+ /**
8
+ * Array of middleware to execute.
9
+ * Can be any valid ExpressoTS middleware type (function, class instance, class reference, or container-bound).
10
+ */
11
+ middleware: Array<Middleware>;
12
+ /**
13
+ * Composition type: 'combine' or 'sequence'.
14
+ * - 'combine': All middleware execute sequentially, errors propagate normally
15
+ * - 'sequence': Middleware execute sequentially, execution stops on error
16
+ */
17
+ type: "combine" | "sequence";
18
+ /**
19
+ * Symbol to identify composed middleware configuration objects.
20
+ * Used internally for type checking.
21
+ */
22
+ [COMPOSED_MIDDLEWARE_SYMBOL]: true;
23
+ }
24
+ /**
25
+ * Symbol to identify composed middleware configuration objects.
26
+ * Used internally for type checking.
27
+ */
28
+ export declare const COMPOSED_MIDDLEWARE_SYMBOL: unique symbol;
29
+ /**
30
+ * Type guard to check if an object is a ComposedMiddlewareConfig.
31
+ */
32
+ export declare function isComposedMiddleware(item: unknown): item is ComposedMiddlewareConfig;
33
+ /**
34
+ * Combines multiple middleware into a single middleware that executes all of them sequentially.
35
+ * All middleware will execute in order. If any middleware calls `next(error)`, the error
36
+ * is propagated to Express's error handling system.
37
+ *
38
+ * @param middleware - Array of middleware to combine
39
+ * @returns ComposedMiddlewareConfig object
40
+ *
41
+ * @example
42
+ * ```typescript
43
+ * // Combine multiple middleware into a reusable group
44
+ * @Get("/api", combine(AuthMiddleware, LoggingMiddleware, RateLimitMiddleware))
45
+ * async apiHandler() {}
46
+ * ```
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * // Combine with conditional middleware (Phase 3)
51
+ * @Get("/admin",
52
+ * when(req => req.method === "POST", combine(BodyParser, ValidationMiddleware)),
53
+ * combine(AuthMiddleware, LoggingMiddleware)
54
+ * )
55
+ * async adminHandler() {}
56
+ * ```
57
+ */
58
+ export declare function combine(...middleware: Array<Middleware>): ComposedMiddlewareConfig;
59
+ /**
60
+ * Sequences multiple middleware that execute one after another.
61
+ * Similar to `combine()`, but semantically indicates sequential execution
62
+ * where each middleware depends on the previous one completing successfully.
63
+ * If any middleware calls `next(error)`, execution stops and the error is propagated.
64
+ *
65
+ * @param middleware - Array of middleware to sequence
66
+ * @returns ComposedMiddlewareConfig object
67
+ *
68
+ * @example
69
+ * ```typescript
70
+ * // Sequence middleware where each depends on the previous
71
+ * @Get("/api", sequence(ValidateMiddleware, TransformMiddleware, ProcessMiddleware))
72
+ * async apiHandler() {}
73
+ * ```
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * // Sequence with conditional middleware
78
+ * @Get("/data",
79
+ * when(req => req.method === "POST", sequence(BodyParser, ValidateMiddleware)),
80
+ * sequence(AuthMiddleware, ProcessMiddleware)
81
+ * )
82
+ * async dataHandler() {}
83
+ * ```
84
+ */
85
+ export declare function sequence(...middleware: Array<Middleware>): ComposedMiddlewareConfig;
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Express 5 / path-to-regexp v8 compatibility for the `:name(regex)`
3
+ * inline-constraint syntax.
4
+ *
5
+ * `path-to-regexp` v8 (the parser Express 5 ships with) removed the
6
+ * inline regex form entirely — `/users/:id(\\d+)` now throws
7
+ *
8
+ * Unexpected ( at index 10: /users/:id(\\d+)
9
+ *
10
+ * That breaks two things we ship as public API:
11
+ *
12
+ * 1. The {@link Patterns} / {@link pattern} helpers in
13
+ * `route-constraints.ts`, which were introduced specifically to
14
+ * encourage that pattern.
15
+ * 2. Hand-written controller routes upgraded from v3, where users
16
+ * relied on Express 4 inline regex.
17
+ *
18
+ * Rather than break those at the surface of preview-3, we keep the
19
+ * authoring-time syntax and translate it at decorator time:
20
+ *
21
+ * - {@link splitPathConstraints} parses the path into a
22
+ * plain-`:name`-only form plus a list of `(name, regex)` pairs.
23
+ * - {@link createPathConstraintMiddleware} returns a middleware that
24
+ * runs at request time and 404s when any captured `req.params[name]`
25
+ * fails to match its constraint.
26
+ *
27
+ * The middleware emits an HTTP 404 (not 400) so the behaviour matches
28
+ * Express 4's "no route matched" semantics — under v6 of path-to-regexp,
29
+ * a non-matching `:id(\\d+)` simply meant the route wasn't selected and
30
+ * the request fell through to the framework's NotFound handler.
31
+ */
32
+ import type { RequestHandler } from "express";
33
+ export interface PathConstraint {
34
+ /** The `:name` placeholder, without the leading colon. */
35
+ paramName: string;
36
+ /** Compiled regex. Anchored with `^...$` to match the whole segment. */
37
+ regex: RegExp;
38
+ /** The original raw regex text, for diagnostics. */
39
+ rawPattern: string;
40
+ }
41
+ export interface SplitPath {
42
+ /** Path string ready to hand to Express 5 / path-to-regexp v8. */
43
+ path: string;
44
+ /** Param-level regex constraints, in path declaration order. */
45
+ constraints: Array<PathConstraint>;
46
+ }
47
+ /**
48
+ * Split `:name(regex)` segments out of an Express-style route path.
49
+ *
50
+ * The walker honours balanced parens inside the regex (e.g.
51
+ * `(\\d{4})` or `((a|b)+)`), which is more forgiving than a naive
52
+ * single-pass regex match would be. Returns the original path and an
53
+ * empty constraints list when no inline patterns are found, so this is
54
+ * a no-op for the common case.
55
+ */
56
+ export declare function splitPathConstraints(path: string): SplitPath;
57
+ /**
58
+ * Build a middleware that enforces the given param-level regex
59
+ * constraints on `req.params`. Returns `null` when the list is empty
60
+ * (so callers can avoid wiring an unnecessary middleware).
61
+ *
62
+ * When a constraint fails, the middleware delegates to `next()` without
63
+ * a value; the framework's NotFound handler then converts that into a
64
+ * 404 — same observable behaviour as Express 4's "no route matched".
65
+ */
66
+ export declare function createPathConstraintMiddleware(constraints: Array<PathConstraint>): RequestHandler | null;
@@ -0,0 +1,10 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ import { BaseMiddleware } from "./base-middleware.js";
3
+ /**
4
+ * Middleware that preloads permissions for authenticated users
5
+ * Caches permissions in request-scoped SecurityContext
6
+ */
7
+ export declare class PermissionPreloaderMiddleware extends BaseMiddleware {
8
+ private securityContext?;
9
+ handler(req: Request, res: Response, next: NextFunction): Promise<void>;
10
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Resolve package from the current working directory.
3
+ * @param packageName
4
+ * @param options
5
+ * @returns
6
+ */
7
+ export declare function packageResolver(packageName: string): any;
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Route parameter patterns for common use cases.
3
+ *
4
+ * Express 5 / path-to-regexp v8 dropped the inline-regex form
5
+ * (`:id(\\d+)`), so the framework no longer hands these patterns to
6
+ * the underlying matcher verbatim. Instead, the HTTP-method decorators
7
+ * (`@Get`, `@Post`, …) parse the constraint out of the path at decorator
8
+ * time, register the route under a plain `:id` placeholder, and inject
9
+ * a small validator middleware that 404s when the captured value
10
+ * doesn't match. The user-facing semantics are unchanged: a path that
11
+ * uses `Patterns.NUMERIC_ID` still rejects `/users/abc` and only
12
+ * dispatches the handler for matches like `/users/123`.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * import { Patterns, pattern } from "@expressots/adapter-express";
17
+ *
18
+ * @Get(`/users/${pattern("id", Patterns.NUMERIC_ID)}`)
19
+ * getUserById(@param("id") id: number) {
20
+ * // Only dispatches for numeric IDs like /users/123
21
+ * }
22
+ *
23
+ * @Get(`/documents/${pattern("uuid", Patterns.UUID)}`)
24
+ * getDocument(@param("uuid") uuid: string) {
25
+ * // Only dispatches for valid UUIDs
26
+ * }
27
+ * ```
28
+ *
29
+ * @public API
30
+ */
31
+ export declare const Patterns: {
32
+ /**
33
+ * Matches one or more digits (numeric ID)
34
+ * Example: /users/123 ✅, /users/abc ❌
35
+ */
36
+ readonly NUMERIC_ID: "(\\d+)";
37
+ /**
38
+ * Matches a valid UUID v4 format
39
+ * Example: /documents/550e8400-e29b-41d4-a716-446655440000 ✅
40
+ */
41
+ readonly UUID: "([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})";
42
+ /**
43
+ * Matches lowercase letters, numbers, and hyphens (URL-friendly slug)
44
+ * Example: /posts/my-awesome-post ✅, /posts/My_Post ❌
45
+ */
46
+ readonly SLUG: "([a-z0-9-]+)";
47
+ /**
48
+ * Matches alphanumeric characters (letters and numbers only)
49
+ * Example: /codes/ABC123 ✅, /codes/ABC-123 ❌
50
+ */
51
+ readonly ALPHANUMERIC: "([a-zA-Z0-9]+)";
52
+ /**
53
+ * Matches lowercase letters only
54
+ * Example: /tags/javascript ✅, /tags/JavaScript ❌
55
+ */
56
+ readonly LOWERCASE: "([a-z]+)";
57
+ /**
58
+ * Matches uppercase letters only
59
+ * Example: /codes/USD ✅, /codes/usd ❌
60
+ */
61
+ readonly UPPERCASE: "([A-Z]+)";
62
+ /**
63
+ * Matches email format (basic validation)
64
+ * Example: /users/user@example.com ✅
65
+ */
66
+ readonly EMAIL: "([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})";
67
+ /**
68
+ * Matches hexadecimal string (e.g., color codes, hash)
69
+ * Example: /colors/ff5733 ✅, /colors/xyz ❌
70
+ */
71
+ readonly HEXADECIMAL: "([0-9a-fA-F]+)";
72
+ /**
73
+ * Matches MongoDB ObjectId format (24 hex characters)
74
+ * Example: /documents/507f1f77bcf86cd799439011 ✅
75
+ */
76
+ readonly MONGO_ID: "([0-9a-fA-F]{24})";
77
+ };
78
+ /**
79
+ * Helper function to build route parameter patterns.
80
+ * This is optional - you can also use Patterns directly in template strings.
81
+ *
82
+ * @param paramName - The parameter name (e.g., "id", "uuid")
83
+ * @param pattern - The pattern from Patterns
84
+ * @returns The formatted route parameter with pattern
85
+ *
86
+ * @example
87
+ * ```typescript
88
+ * import { pattern, Patterns } from "@expressots/adapter-express";
89
+ *
90
+ * @Get(`/users/${pattern("id", Patterns.NUMERIC_ID)}`)
91
+ * getUserById(@param("id") id: number) {
92
+ * // Route: /users/:id(\\d+)
93
+ * }
94
+ * ```
95
+ *
96
+ * @public API
97
+ */
98
+ export declare function pattern(paramName: string, patternValue: string): string;
@@ -0,0 +1,21 @@
1
+ import { Request } from "express";
2
+ import type { GuardScope } from "@expressots/core";
3
+ import type { IScopeExtractor } from "./scope-extractor.interface.js";
4
+ /**
5
+ * Extracts scope information from requests
6
+ * Supports tenant extraction from subdomain, header, or param
7
+ * Note: This is bound manually in setupAuthorizationForExpress() to allow user overrides
8
+ */
9
+ export declare class ScopeExtractor implements IScopeExtractor {
10
+ extract(req: Request): Promise<GuardScope>;
11
+ /**
12
+ * Extract tenant ID from multiple sources
13
+ * @private
14
+ */
15
+ private extractTenant;
16
+ /**
17
+ * Generate or retrieve request ID
18
+ * @private
19
+ */
20
+ private generateRequestId;
21
+ }
@@ -0,0 +1,12 @@
1
+ import { Request } from "express";
2
+ import type { GuardScope } from "@expressots/core";
3
+ /**
4
+ * Interface for extracting scope information from requests
5
+ */
6
+ export interface IScopeExtractor {
7
+ /**
8
+ * Extract scope information from request
9
+ * @param req - Express request
10
+ */
11
+ extract(req: Request): Promise<GuardScope>;
12
+ }
@@ -0,0 +1,34 @@
1
+ import { interfaces } from "@expressots/core";
2
+ import { type AuthorizationConfig } from "@expressots/core";
3
+ import type { AuthProvider } from "./interfaces.js";
4
+ import type { IMiddleware } from "@expressots/core";
5
+ /**
6
+ * Express-specific authorization setup
7
+ * Automatically registers all adapter-specific services and middleware
8
+ *
9
+ * @param container - DI container
10
+ * @param config - Authorization configuration
11
+ * @param middleware - Optional middleware manager to add PermissionPreloaderMiddleware
12
+ * @param authProvider - Optional AuthProvider class (if not already bound)
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * export class App extends AppExpress {
17
+ * async configureServices(): Promise<void> {
18
+ * setupAuthorizationForExpress(
19
+ * this.config.Container,
20
+ * {
21
+ * enablePreloading: true,
22
+ * enableCaching: true,
23
+ * permissionHierarchy: {
24
+ * admin: ["moderator", "user"],
25
+ * moderator: ["user"],
26
+ * },
27
+ * },
28
+ * this.Middleware,
29
+ * );
30
+ * }
31
+ * }
32
+ * ```
33
+ */
34
+ export declare function setupAuthorizationForExpress(container: interfaces.Container, config?: AuthorizationConfig, middleware?: IMiddleware, authProvider?: new () => AuthProvider): void;