@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,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,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;
@@ -0,0 +1,118 @@
1
+ import { interfaces, EventRegistry, EventEmitter, EventRecorder, EventFlowTracker } from "@expressots/core";
2
+ /**
3
+ * Configuration options for the event system setup.
4
+ *
5
+ * @public API
6
+ */
7
+ export interface EventSystemOptions {
8
+ /**
9
+ * Enable event recording for debugging.
10
+ * When true, all emitted events are recorded for later inspection or replay.
11
+ * @default true in development, false in production
12
+ */
13
+ enableRecording?: boolean;
14
+ /**
15
+ * Enable flow tracking for event visualization.
16
+ * When true, tracks the flow of events through handlers.
17
+ * @default true in development, false in production
18
+ */
19
+ enableFlowTracking?: boolean;
20
+ /**
21
+ * Maximum number of events to keep in the recording buffer.
22
+ * @default 1000
23
+ */
24
+ maxRecordedEvents?: number;
25
+ /**
26
+ * Default timeout for handler execution in milliseconds.
27
+ * @default 30000
28
+ */
29
+ defaultTimeout?: number;
30
+ /**
31
+ * Auto-discover event handlers from the container.
32
+ * When true, scans the container for @OnEvent decorated handlers.
33
+ * @default true
34
+ */
35
+ autoDiscover?: boolean;
36
+ /**
37
+ * Callback when an event is emitted.
38
+ */
39
+ onEmit?: (event: unknown) => void;
40
+ /**
41
+ * Callback when a handler completes execution.
42
+ */
43
+ onHandlerComplete?: (result: {
44
+ handler: string;
45
+ success: boolean;
46
+ duration: number;
47
+ }) => void;
48
+ /**
49
+ * Custom error handler for handler failures.
50
+ */
51
+ onError?: (error: Error, event: unknown, handlerName: string) => void;
52
+ }
53
+ /**
54
+ * Result of event system setup.
55
+ *
56
+ * @public API
57
+ */
58
+ export interface EventSystemSetupResult {
59
+ /**
60
+ * The event registry instance.
61
+ */
62
+ registry: EventRegistry;
63
+ /**
64
+ * The event emitter instance.
65
+ */
66
+ emitter: EventEmitter;
67
+ /**
68
+ * The event recorder instance (if recording is enabled).
69
+ */
70
+ recorder: EventRecorder;
71
+ /**
72
+ * The flow tracker instance (if flow tracking is enabled).
73
+ */
74
+ flowTracker: EventFlowTracker;
75
+ /**
76
+ * Number of event handlers discovered.
77
+ */
78
+ handlersDiscovered: number;
79
+ }
80
+ /**
81
+ * Set up the ExpressoTS Event System with zero boilerplate.
82
+ *
83
+ * This function:
84
+ * 1. Registers all event system services (EventRegistry, EventEmitter, EventRecorder, EventFlowTracker)
85
+ * 2. Auto-discovers and registers all @OnEvent decorated handlers
86
+ * 3. Configures recording and flow tracking based on environment
87
+ * 4. Sets up replay emitter for development debugging
88
+ *
89
+ * @param container - The DI container
90
+ * @param options - Configuration options for the event system
91
+ * @returns Setup result with references to all event system services
92
+ *
93
+ * @example
94
+ * ```typescript
95
+ * export class App extends AppExpress {
96
+ * async configureServices(): Promise<void> {
97
+ * // Simple setup with defaults (recommended)
98
+ * const { handlersDiscovered } = setupEventSystemForExpress(
99
+ * this.config.Container
100
+ * );
101
+ * console.log(`Discovered ${handlersDiscovered} event handlers`);
102
+ *
103
+ * // Or with custom options
104
+ * setupEventSystemForExpress(this.config.Container, {
105
+ * enableRecording: true,
106
+ * maxRecordedEvents: 500,
107
+ * defaultTimeout: 10000,
108
+ * onError: (error, event, handler) => {
109
+ * console.error(`Handler ${handler} failed:`, error);
110
+ * }
111
+ * });
112
+ * }
113
+ * }
114
+ * ```
115
+ *
116
+ * @public API
117
+ */
118
+ export declare function setupEventSystemForExpress(container: interfaces.Container, options?: EventSystemOptions): EventSystemSetupResult;
@@ -0,0 +1,115 @@
1
+ import { interfaces } from "@expressots/core";
2
+ import { InterceptorRegistry, InterceptorExecutor, IInterceptor } from "@expressots/core";
3
+ /**
4
+ * Type for interceptor classes that can be registered.
5
+ * Accepts any class constructor, including those with DI-injected dependencies.
6
+ * The DI container resolves constructor parameters at runtime.
7
+ */
8
+ export type InterceptorClass = new (...args: Array<any>) => IInterceptor;
9
+ /**
10
+ * Built-in interceptor types that can be enabled via configuration.
11
+ *
12
+ * @public API
13
+ */
14
+ export type BuiltInInterceptor = "performance" | "logging" | "timeout";
15
+ /**
16
+ * Configuration options for the interceptor system setup.
17
+ *
18
+ * @public API
19
+ */
20
+ export interface InterceptorSystemOptions {
21
+ /**
22
+ * Enable and configure built-in interceptors.
23
+ * Set to true to enable with defaults, or provide configuration object.
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * {
28
+ * performance: true, // Enable with defaults
29
+ * logging: { logResponse: true }, // Enable with custom config
30
+ * timeout: { defaultTimeout: 5000 }
31
+ * }
32
+ * ```
33
+ */
34
+ builtIn?: {
35
+ performance?: boolean;
36
+ logging?: boolean;
37
+ timeout?: boolean | {
38
+ defaultTimeout?: number;
39
+ };
40
+ };
41
+ /**
42
+ * Custom interceptor classes to register.
43
+ * These will be bound as singletons and auto-discovered.
44
+ * Supports classes with DI-injected constructor dependencies.
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * customInterceptors: [CacheInterceptor, AuditInterceptor]
49
+ * ```
50
+ */
51
+ customInterceptors?: Array<InterceptorClass>;
52
+ /**
53
+ * Auto-discover interceptors from the container.
54
+ * When true, scans the container for @UseInterceptor decorated controllers/methods.
55
+ * @default true
56
+ */
57
+ autoDiscover?: boolean;
58
+ }
59
+ /**
60
+ * Result of interceptor system setup.
61
+ *
62
+ * @public API
63
+ */
64
+ export interface InterceptorSystemSetupResult {
65
+ /**
66
+ * The interceptor registry instance.
67
+ */
68
+ registry: InterceptorRegistry;
69
+ /**
70
+ * The interceptor executor instance.
71
+ */
72
+ executor: InterceptorExecutor;
73
+ /**
74
+ * Number of interceptors registered.
75
+ */
76
+ interceptorsRegistered: number;
77
+ }
78
+ /**
79
+ * Set up the ExpressoTS Interceptor System with zero boilerplate.
80
+ *
81
+ * This function:
82
+ * 1. Registers all interceptor infrastructure (InterceptorRegistry, InterceptorExecutor)
83
+ * 2. Optionally enables built-in interceptors (Performance, Logging, Timeout)
84
+ * 3. Registers custom interceptor classes
85
+ * 4. Initializes the interceptor registry
86
+ *
87
+ * @param container - The DI container
88
+ * @param options - Configuration options for the interceptor system
89
+ * @returns Setup result with references to interceptor services
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * export class App extends AppExpress {
94
+ * async configureServices(): Promise<void> {
95
+ * // Simple setup with performance interceptor
96
+ * setupInterceptorsForExpress(this.config.Container, {
97
+ * builtIn: { performance: true }
98
+ * });
99
+ *
100
+ * // Full setup with custom interceptors
101
+ * setupInterceptorsForExpress(this.config.Container, {
102
+ * builtIn: {
103
+ * performance: true,
104
+ * logging: true,
105
+ * timeout: { defaultTimeout: 5000 }
106
+ * },
107
+ * customInterceptors: [CacheInterceptor, AuditInterceptor]
108
+ * });
109
+ * }
110
+ * }
111
+ * ```
112
+ *
113
+ * @public API
114
+ */
115
+ export declare function setupInterceptorsForExpress(container: interfaces.Container, options?: InterceptorSystemOptions): InterceptorSystemSetupResult;
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Setup Lazy Loading for Express
3
+ *
4
+ * One-liner helper function to configure the lazy loading system.
5
+ *
6
+ * @module adapter-express
7
+ */
8
+ import { RequestHandler } from "express";
9
+ import { Container } from "@expressots/core";
10
+ import { ILazyModule, LazyLoadingOptions, LazyLoadingSetupResult } from "@expressots/core";
11
+ import { LazyRouteMapping } from "./lazy-module-middleware.js";
12
+ /**
13
+ * Set up the lazy loading system with one function call.
14
+ *
15
+ * @layer public
16
+ * @audience application-developers
17
+ * @concept lazy-loading
18
+ *
19
+ * UNIQUE: Zero-configuration lazy loading!
20
+ * - Auto-detects routes from @controller() decorators
21
+ * - Creates middleware for automatic module loading
22
+ * - Optional metrics and background warmup
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * // 1. Define lazy modules (routes auto-detected from @controller)
27
+ * // lazy-modules.ts
28
+ * export const AdminModule = CreateLazyModule([AdminController]);
29
+ * // Routes auto-detected: ["/admin"] from @controller("/admin")
30
+ *
31
+ * export const ReportsModule = CreateLazyModule([ReportsController]);
32
+ * // Routes auto-detected: ["/reports"] from @controller("/reports")
33
+ *
34
+ * // 2. Setup in app.ts (just pass the modules!)
35
+ * export class App extends AppExpress {
36
+ * async configureServices(): Promise<void> {
37
+ * const { middleware } = setupLazyLoadingForExpress(
38
+ * this.config.Container,
39
+ * {
40
+ * lazyModules: [AdminModule, ReportsModule],
41
+ * globalPrefix: "/api" // Optional
42
+ * }
43
+ * );
44
+ *
45
+ * // Add middleware - that's it!
46
+ * if (middleware) {
47
+ * this.Middleware.addMiddleware(middleware);
48
+ * }
49
+ * }
50
+ * }
51
+ *
52
+ * // Now:
53
+ * // - GET /api/admin/* → AdminModule auto-loads
54
+ * // - GET /api/reports/* → ReportsModule auto-loads
55
+ * // - No manual route mapping needed!
56
+ * ```
57
+ *
58
+ * @param container - The DI container
59
+ * @param options - Configuration options
60
+ * @returns Setup result with loader, manager, and middleware
61
+ *
62
+ * @public API
63
+ */
64
+ export declare function setupLazyLoadingForExpress(container: Container, options?: LazyLoadingExpressOptions): LazyLoadingExpressResult;
65
+ /**
66
+ * Extended lazy loading options for Express.
67
+ *
68
+ * @public API
69
+ */
70
+ export interface LazyLoadingExpressOptions extends LazyLoadingOptions {
71
+ /** Lazy modules to register */
72
+ lazyModules?: Array<ILazyModule>;
73
+ /**
74
+ * Manual route prefix mappings.
75
+ * Maps module names to route prefixes for auto-loading.
76
+ *
77
+ * @example
78
+ * ```typescript
79
+ * routePrefixes: {
80
+ * "AdminModule": "/admin",
81
+ * "ReportsModule": "/reports"
82
+ * }
83
+ * ```
84
+ */
85
+ routePrefixes?: Record<string, string>;
86
+ /**
87
+ * Global route prefix (e.g., "/api").
88
+ * Used when determining if a request matches a lazy module route.
89
+ */
90
+ globalPrefix?: string;
91
+ /**
92
+ * Enable automatic module loading when routes are accessed.
93
+ * When enabled, accessing a lazy module's route will trigger loading.
94
+ * @default true
95
+ */
96
+ enableAutoLoad?: boolean;
97
+ }
98
+ /**
99
+ * Extended result of lazy loading setup for Express.
100
+ *
101
+ * @public API
102
+ */
103
+ export interface LazyLoadingExpressResult extends LazyLoadingSetupResult {
104
+ /**
105
+ * Middleware for auto-loading lazy modules.
106
+ * Add this to your Express app to enable auto-loading.
107
+ *
108
+ * @example
109
+ * ```typescript
110
+ * const { middleware } = setupLazyLoadingForExpress(container, options);
111
+ * if (middleware) {
112
+ * this.Middleware.addMiddleware(middleware);
113
+ * }
114
+ * ```
115
+ */
116
+ middleware?: RequestHandler;
117
+ /**
118
+ * Route mappings used by the middleware.
119
+ */
120
+ routeMappings: Array<LazyRouteMapping>;
121
+ }
122
+ export type { LazyLoadingOptions, LazyLoadingSetupResult } from "@expressots/core";
123
+ export type { LazyRouteMapping } from "./lazy-module-middleware.js";
@@ -1,5 +1,5 @@
1
- import { interfaces } from "../../di/di.interfaces";
2
- import type { BaseController, ControllerMetadata, ControllerMethodMetadata, ControllerParameterMetadata, DecoratorTarget, IHttpActionResult } from "./interfaces";
1
+ import { interfaces } from "@expressots/core";
2
+ import type { BaseController, ControllerMetadata, ControllerMethodMetadata, ControllerParameterMetadata, DecoratorTarget, IHttpActionResult } from "./interfaces.js";
3
3
  export declare function getControllersFromContainer(container: interfaces.Container, forceControllers: boolean): Array<BaseController>;
4
4
  export declare function getControllersFromMetadata(): Array<DecoratorTarget>;
5
5
  export declare function getControllerMetadata(constructor: NewableFunction): ControllerMetadata;
@@ -7,3 +7,18 @@ export declare function getControllerMethodMetadata(constructor: NewableFunction
7
7
  export declare function getControllerParameterMetadata(constructor: NewableFunction): ControllerParameterMetadata;
8
8
  export declare function cleanUpMetadata(): void;
9
9
  export declare function instanceOfIHttpActionResult(value: unknown): value is IHttpActionResult;
10
+ /**
11
+ * Gets content negotiation metadata from a controller method.
12
+ * @param target - Controller instance
13
+ * @param propertyKey - Method name
14
+ * @returns Content negotiation metadata
15
+ */
16
+ export declare function getContentNegotiationMetadata(target: object, propertyKey: string | symbol): {
17
+ accept?: Array<string>;
18
+ consumes?: Array<string>;
19
+ produces?: Array<string>;
20
+ csvOptions?: import("@expressots/core").CsvFormatOptions;
21
+ xmlOptions?: import("@expressots/core").XmlFormatOptions;
22
+ yamlOptions?: import("@expressots/core").YamlFormatOptions;
23
+ streamResponse?: boolean;
24
+ };