@expressots/core 3.0.0-beta.4 → 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 (1090) hide show
  1. package/README.md +43 -95
  2. package/lib/CHANGELOG.md +40 -14
  3. package/lib/README.md +43 -95
  4. package/lib/cjs/application/application-container.js +467 -33
  5. package/lib/cjs/application/application-factory.js +105 -5
  6. package/lib/cjs/application/application.types.js +32 -2
  7. package/lib/cjs/application/bootstrap.js +812 -0
  8. package/lib/cjs/application/index.js +10 -7
  9. package/lib/cjs/authorization/authorization-config.interface.js +2 -0
  10. package/lib/cjs/authorization/decorators/convenience.js +80 -0
  11. package/lib/cjs/authorization/guard-constants.js +12 -0
  12. package/lib/cjs/authorization/guard-decorators.js +159 -0
  13. package/lib/cjs/authorization/guard-executor.js +101 -0
  14. package/lib/cjs/authorization/guard-registry.js +133 -0
  15. package/lib/cjs/authorization/guard.interface.js +75 -0
  16. package/lib/cjs/authorization/guards/attribute-based.guard.js +109 -0
  17. package/lib/cjs/authorization/guards/authenticated.guard.js +49 -0
  18. package/lib/cjs/authorization/guards/composition.guard.js +67 -0
  19. package/lib/cjs/authorization/guards/conditional.guard.js +41 -0
  20. package/lib/cjs/authorization/guards/index.js +24 -0
  21. package/lib/cjs/authorization/guards/permission.guard.js +82 -0
  22. package/lib/cjs/authorization/guards/resource-owner.guard.js +61 -0
  23. package/lib/cjs/authorization/guards/role.guard.js +64 -0
  24. package/lib/cjs/authorization/index.js +40 -0
  25. package/lib/cjs/authorization/services/guard-cache.interface.js +2 -0
  26. package/lib/cjs/authorization/services/guard-cache.js +56 -0
  27. package/lib/cjs/authorization/services/permission-hierarchy.interface.js +2 -0
  28. package/lib/cjs/authorization/services/permission-hierarchy.js +54 -0
  29. package/lib/cjs/authorization/services/permission-service.interface.js +2 -0
  30. package/lib/cjs/authorization/services/permission-service.js +58 -0
  31. package/lib/cjs/authorization/services/security-context.interface.js +2 -0
  32. package/lib/cjs/authorization/services/security-context.js +75 -0
  33. package/lib/cjs/authorization/setup.js +141 -0
  34. package/lib/cjs/config/config-resolver.js +719 -0
  35. package/lib/cjs/config/config.interfaces.js +14 -0
  36. package/lib/cjs/config/define-config.js +495 -0
  37. package/lib/cjs/config/env-field-builders.js +402 -0
  38. package/lib/cjs/config/index.js +83 -0
  39. package/lib/cjs/config/secret-value.js +201 -0
  40. package/lib/cjs/console/color-codes.js +4 -0
  41. package/lib/cjs/console/console.js +72 -9
  42. package/lib/cjs/console/index.js +2 -2
  43. package/lib/cjs/container-module/container-module.js +257 -26
  44. package/lib/cjs/container-module/index.js +6 -4
  45. package/lib/cjs/decorator/index.js +1 -1
  46. package/lib/cjs/decorator/scope-binding.js +307 -16
  47. package/lib/cjs/di/annotation/decorator_utils.js +4 -4
  48. package/lib/cjs/di/annotation/inject.js +3 -3
  49. package/lib/cjs/di/annotation/inject_base.js +5 -5
  50. package/lib/cjs/di/annotation/injectable.js +2 -2
  51. package/lib/cjs/di/annotation/multi_inject.js +3 -3
  52. package/lib/cjs/di/annotation/named.js +4 -4
  53. package/lib/cjs/di/annotation/optional.js +4 -4
  54. package/lib/cjs/di/annotation/post_construct.js +4 -4
  55. package/lib/cjs/di/annotation/pre_destroy.js +4 -4
  56. package/lib/cjs/di/annotation/property_event_decorator.js +2 -2
  57. package/lib/cjs/di/annotation/tagged.js +3 -3
  58. package/lib/cjs/di/annotation/target_name.js +5 -5
  59. package/lib/cjs/di/annotation/unmanaged.js +5 -5
  60. package/lib/cjs/di/binding-decorator/constants.js +3 -0
  61. package/lib/cjs/di/binding-decorator/decorator/fluent_provide.js +7 -7
  62. package/lib/cjs/di/binding-decorator/decorator/provide.js +7 -7
  63. package/lib/cjs/di/binding-decorator/factory/module_factory.js +23 -4
  64. package/lib/cjs/di/binding-decorator/index.js +11 -9
  65. package/lib/cjs/di/binding-decorator/syntax/provide_done_syntax.js +7 -7
  66. package/lib/cjs/di/binding-decorator/syntax/provide_in_syntax.js +19 -12
  67. package/lib/cjs/di/binding-decorator/syntax/provide_in_when_on_syntax.js +3 -0
  68. package/lib/cjs/di/binding-decorator/syntax/provide_on_syntax.js +4 -4
  69. package/lib/cjs/di/binding-decorator/syntax/provide_when_syntax.js +30 -30
  70. package/lib/cjs/di/binding-decorator/utils/auto_wire.js +4 -4
  71. package/lib/cjs/di/bindings/binding.js +5 -6
  72. package/lib/cjs/di/constants/error_msgs.js +6 -2
  73. package/lib/cjs/di/constants/literal_types.js +3 -3
  74. package/lib/cjs/di/container/container.js +44 -44
  75. package/lib/cjs/di/container/container_module.js +3 -3
  76. package/lib/cjs/di/container/lookup.js +3 -3
  77. package/lib/cjs/di/container/module_activation_store.js +3 -3
  78. package/lib/cjs/di/container-introspection.js +42 -0
  79. package/lib/cjs/di/inversify.js +85 -52
  80. package/lib/cjs/di/planning/context.js +2 -2
  81. package/lib/cjs/di/planning/metadata.js +1 -1
  82. package/lib/cjs/di/planning/metadata_reader.js +1 -1
  83. package/lib/cjs/di/planning/planner.js +37 -37
  84. package/lib/cjs/di/planning/reflection_utils.js +12 -12
  85. package/lib/cjs/di/planning/request.js +2 -2
  86. package/lib/cjs/di/planning/target.js +10 -10
  87. package/lib/cjs/di/resolution/instantiation.js +13 -13
  88. package/lib/cjs/di/resolution/resolver.js +22 -22
  89. package/lib/cjs/di/scope/scope-registry.js +115 -0
  90. package/lib/cjs/di/scope/scope.js +38 -8
  91. package/lib/cjs/di/syntax/binding_in_syntax.js +18 -8
  92. package/lib/cjs/di/syntax/binding_in_when_on_syntax.js +9 -6
  93. package/lib/cjs/di/syntax/binding_on_syntax.js +3 -3
  94. package/lib/cjs/di/syntax/binding_to_syntax.js +27 -27
  95. package/lib/cjs/di/syntax/binding_when_on_syntax.js +4 -4
  96. package/lib/cjs/di/syntax/binding_when_syntax.js +30 -30
  97. package/lib/cjs/di/syntax/constraint_helpers.js +3 -3
  98. package/lib/cjs/di/utils/binding_utils.js +18 -18
  99. package/lib/cjs/di/utils/exceptions.js +1 -1
  100. package/lib/cjs/di/utils/serialization.js +1 -1
  101. package/lib/cjs/error/app-error.js +152 -8
  102. package/lib/cjs/error/base-exception-filter.js +135 -0
  103. package/lib/cjs/error/error-handler-middleware.js +7 -7
  104. package/lib/cjs/error/exception-filter-constants.js +12 -0
  105. package/lib/cjs/error/exception-filter-decorators.js +161 -0
  106. package/lib/cjs/error/exception-filter-registry.js +163 -0
  107. package/lib/cjs/error/exception-filter.interface.js +2 -0
  108. package/lib/cjs/error/exception-handler-middleware.js +378 -0
  109. package/lib/cjs/error/filters/app-error.filter.js +31 -0
  110. package/lib/cjs/error/filters/global-exception.filter.js +39 -0
  111. package/lib/cjs/error/filters/not-found.filter.js +35 -0
  112. package/lib/cjs/error/filters/validation-error.filter.js +35 -0
  113. package/lib/cjs/error/index.js +28 -7
  114. package/lib/cjs/error/not-found.error.js +17 -0
  115. package/lib/cjs/error/report.js +104 -9
  116. package/lib/cjs/error/status-code.js +20 -0
  117. package/lib/cjs/error/utils.js +247 -33
  118. package/lib/cjs/error/validation.error.js +18 -0
  119. package/lib/cjs/event/event-decorators.js +280 -0
  120. package/lib/cjs/event/event-emitter.js +373 -0
  121. package/lib/cjs/event/event-flow-tracker.js +236 -0
  122. package/lib/cjs/event/event-recorder.js +289 -0
  123. package/lib/cjs/event/event-registry.js +207 -0
  124. package/lib/cjs/event/event.interfaces.js +54 -0
  125. package/lib/cjs/event/index.js +80 -0
  126. package/lib/cjs/index.js +29 -8
  127. package/lib/cjs/interceptor/conditional-interceptor.js +108 -0
  128. package/lib/cjs/interceptor/execution-context.js +66 -0
  129. package/lib/cjs/interceptor/index.js +64 -0
  130. package/lib/cjs/interceptor/interceptor-composition.js +130 -0
  131. package/lib/cjs/interceptor/interceptor-constants.js +20 -0
  132. package/lib/cjs/interceptor/interceptor-decorators.js +155 -0
  133. package/lib/cjs/interceptor/interceptor-executor.js +140 -0
  134. package/lib/cjs/interceptor/interceptor-registry.js +159 -0
  135. package/lib/cjs/interceptor/interceptor.interface.js +20 -0
  136. package/lib/cjs/interceptor/interceptors/index.js +22 -0
  137. package/lib/cjs/interceptor/interceptors/logging.interceptor.js +70 -0
  138. package/lib/cjs/interceptor/interceptors/performance.interceptor.js +251 -0
  139. package/lib/cjs/interceptor/interceptors/timeout.interceptor.js +66 -0
  140. package/lib/cjs/lazy-loading/index.js +73 -0
  141. package/lib/cjs/lazy-loading/lazy-load-metrics.js +355 -0
  142. package/lib/cjs/lazy-loading/lazy-module-loader.js +311 -0
  143. package/lib/cjs/lazy-loading/lazy-module-manager.js +244 -0
  144. package/lib/cjs/lazy-loading/lazy-module-warmup.js +294 -0
  145. package/lib/cjs/lazy-loading/lazy-module.js +380 -0
  146. package/lib/cjs/lazy-loading/lazy.interfaces.js +18 -0
  147. package/lib/cjs/lifecycle/index.js +15 -0
  148. package/lib/cjs/lifecycle/lifecycle-registry.js +301 -0
  149. package/lib/cjs/lifecycle/lifecycle.interface.js +37 -0
  150. package/lib/cjs/middleware/content-negotiation/accept-header-parser.js +110 -0
  151. package/lib/cjs/middleware/content-negotiation/content-negotiation-service.js +288 -0
  152. package/lib/cjs/middleware/content-negotiation/formatter-registry.js +168 -0
  153. package/lib/cjs/middleware/content-negotiation/formatters/csv-formatter.js +114 -0
  154. package/lib/cjs/middleware/content-negotiation/formatters/index.js +16 -0
  155. package/lib/cjs/middleware/content-negotiation/formatters/json-formatter.js +34 -0
  156. package/lib/cjs/middleware/content-negotiation/formatters/plain-text-formatter.js +44 -0
  157. package/lib/cjs/middleware/content-negotiation/formatters/xml-formatter.js +124 -0
  158. package/lib/cjs/middleware/content-negotiation/formatters/yaml-formatter.js +134 -0
  159. package/lib/cjs/middleware/content-negotiation/index.js +27 -0
  160. package/lib/cjs/middleware/index.js +59 -30
  161. package/lib/cjs/middleware/interfaces/content-negotiation.interface.js +7 -0
  162. package/lib/cjs/middleware/middleware-config.js +10 -0
  163. package/lib/cjs/middleware/middleware-presets.js +294 -0
  164. package/lib/cjs/middleware/middleware-profiler.js +310 -0
  165. package/lib/cjs/middleware/middleware-registry.js +160 -0
  166. package/lib/cjs/middleware/middleware-resolver.js +318 -57
  167. package/lib/cjs/middleware/middleware-service.js +1636 -308
  168. package/lib/cjs/middleware/middleware-utils.js +280 -0
  169. package/lib/cjs/middleware/upload-registry.js +91 -0
  170. package/lib/cjs/path-resolver/index.js +252 -0
  171. package/lib/cjs/provider/db-in-memory/adapter/adapter.interface.js +10 -0
  172. package/lib/cjs/provider/db-in-memory/adapter/in-memory.adapter.js +665 -0
  173. package/lib/cjs/provider/db-in-memory/adapter/index.js +10 -0
  174. package/lib/cjs/provider/db-in-memory/base-repo.repository.js +4 -4
  175. package/lib/cjs/provider/db-in-memory/db-in-memory.provider.js +14 -18
  176. package/lib/cjs/provider/db-in-memory/db.provider.js +402 -0
  177. package/lib/cjs/provider/db-in-memory/index.js +115 -9
  178. package/lib/cjs/provider/db-in-memory/query/index.js +24 -0
  179. package/lib/cjs/provider/db-in-memory/query/query-engine.js +573 -0
  180. package/lib/cjs/provider/db-in-memory/query/query.types.js +10 -0
  181. package/lib/cjs/provider/db-in-memory/schema/decorators.js +402 -0
  182. package/lib/cjs/provider/db-in-memory/schema/entity.interface.js +9 -0
  183. package/lib/cjs/provider/db-in-memory/schema/index.js +21 -0
  184. package/lib/cjs/provider/db-in-memory/storage/index.js +14 -0
  185. package/lib/cjs/provider/db-in-memory/storage/memory-store.js +706 -0
  186. package/lib/cjs/provider/dto-validator/dto-validator.provider.js +8 -8
  187. package/lib/cjs/provider/dto-validator/package-resolver.js +2 -2
  188. package/lib/cjs/provider/index.js +14 -10
  189. package/lib/cjs/provider/logger/decorators/index.js +17 -0
  190. package/lib/cjs/provider/logger/decorators/log-performance.decorator.js +178 -0
  191. package/lib/cjs/provider/logger/index.js +35 -0
  192. package/lib/cjs/provider/logger/logger.banner.js +473 -0
  193. package/lib/cjs/provider/logger/logger.config.js +22 -0
  194. package/lib/cjs/provider/logger/logger.context.js +341 -0
  195. package/lib/cjs/provider/logger/logger.flow.js +255 -0
  196. package/lib/cjs/provider/logger/logger.formatter.js +676 -0
  197. package/lib/cjs/provider/logger/logger.grouping.js +319 -0
  198. package/lib/cjs/provider/logger/logger.health.js +295 -0
  199. package/lib/cjs/provider/logger/logger.metrics-collector.js +184 -0
  200. package/lib/cjs/provider/logger/logger.metrics.js +91 -0
  201. package/lib/cjs/provider/logger/logger.performance.js +300 -0
  202. package/lib/cjs/provider/logger/logger.provider.js +698 -75
  203. package/lib/cjs/provider/logger/logger.query.js +532 -0
  204. package/lib/cjs/provider/logger/logger.redaction.js +456 -0
  205. package/lib/cjs/provider/logger/logger.suggestions.js +480 -0
  206. package/lib/cjs/provider/logger/transports/console.transport.js +78 -0
  207. package/lib/cjs/provider/logger/transports/file.transport.js +287 -0
  208. package/lib/cjs/provider/logger/transports/http-server.js +141 -0
  209. package/lib/cjs/provider/logger/transports/http.transport.js +151 -0
  210. package/lib/cjs/provider/logger/transports/index.js +21 -0
  211. package/lib/cjs/provider/logger/transports/transport.interface.js +2 -0
  212. package/lib/cjs/provider/logger/utils/index.js +18 -0
  213. package/lib/cjs/provider/logger/utils/log-entry.js +26 -0
  214. package/lib/cjs/provider/logger/utils/log-levels.js +106 -0
  215. package/lib/cjs/provider/provider-manager.js +209 -16
  216. package/lib/cjs/provider/provider-registry.js +414 -0
  217. package/lib/cjs/provider/provider.interface.js +49 -0
  218. package/lib/cjs/provider/validation/adapters/class-validator.adapter.js +264 -0
  219. package/lib/cjs/provider/validation/adapters/index.js +14 -0
  220. package/lib/cjs/provider/validation/helpful-error-formatter.js +228 -0
  221. package/lib/cjs/provider/validation/index.js +35 -0
  222. package/lib/cjs/provider/validation/smart-field-detector.js +543 -0
  223. package/lib/cjs/provider/validation/type-inference.js +192 -0
  224. package/lib/cjs/provider/validation/validation-registry.js +220 -0
  225. package/lib/cjs/provider/validation/validation.interface.js +9 -0
  226. package/lib/cjs/render/adapters/base-adapter.js +134 -0
  227. package/lib/cjs/render/adapters/ejs-adapter.js +172 -0
  228. package/lib/cjs/render/adapters/handlebars-adapter.js +191 -0
  229. package/lib/cjs/render/adapters/index.js +20 -0
  230. package/lib/cjs/render/adapters/pug-adapter.js +164 -0
  231. package/lib/cjs/render/adapters/react-adapter.js +336 -0
  232. package/lib/cjs/render/features/auto-detection.js +228 -0
  233. package/lib/cjs/render/features/hot-reload.js +155 -0
  234. package/lib/cjs/render/features/index.js +20 -0
  235. package/lib/cjs/render/features/streaming.js +106 -0
  236. package/lib/cjs/render/features/type-generator.js +221 -0
  237. package/lib/cjs/render/features/view-debugger.js +174 -0
  238. package/lib/cjs/render/index.js +80 -0
  239. package/lib/cjs/render/presets/index.js +216 -0
  240. package/lib/cjs/render/render-config.js +10 -0
  241. package/lib/cjs/render/render-interface.js +2 -0
  242. package/lib/cjs/render/render-registry.js +130 -0
  243. package/lib/cjs/render/render-service.js +418 -0
  244. package/lib/cjs/render/utils/cache-manager.js +199 -0
  245. package/lib/cjs/render/utils/index.js +20 -0
  246. package/lib/cjs/render/utils/package-resolver.js +121 -0
  247. package/lib/cjs/render/utils/view-scanner.js +208 -0
  248. package/lib/cjs/testing/create-test-app.js +366 -0
  249. package/lib/cjs/testing/create-test-database.js +416 -0
  250. package/lib/cjs/testing/fluent-request.js +454 -0
  251. package/lib/cjs/testing/index.js +142 -0
  252. package/lib/cjs/testing/load-test.js +484 -0
  253. package/lib/cjs/testing/matchers.js +444 -0
  254. package/lib/cjs/testing/mock-context.js +406 -0
  255. package/lib/cjs/testing/mock-provider.js +339 -0
  256. package/lib/cjs/testing/snapshot-request.js +378 -0
  257. package/lib/cjs/testing/testing.interfaces.js +10 -0
  258. package/lib/cjs/types/application/application-container.d.ts +320 -20
  259. package/lib/cjs/types/application/application-factory.d.ts +99 -3
  260. package/lib/cjs/types/application/application.types.d.ts +177 -2
  261. package/lib/cjs/types/application/bootstrap.d.ts +484 -0
  262. package/lib/cjs/types/application/index.d.ts +4 -3
  263. package/lib/cjs/types/authorization/authorization-config.interface.d.ts +45 -0
  264. package/lib/cjs/types/authorization/decorators/convenience.d.ts +64 -0
  265. package/lib/cjs/types/authorization/guard-constants.d.ts +9 -0
  266. package/lib/cjs/types/authorization/guard-decorators.d.ts +128 -0
  267. package/lib/cjs/types/authorization/guard-executor.d.ts +26 -0
  268. package/lib/cjs/types/authorization/guard-registry.d.ts +35 -0
  269. package/lib/cjs/types/authorization/guard.interface.d.ts +335 -0
  270. package/lib/cjs/types/authorization/guards/attribute-based.guard.d.ts +60 -0
  271. package/lib/cjs/types/authorization/guards/authenticated.guard.d.ts +26 -0
  272. package/lib/cjs/types/authorization/guards/composition.guard.d.ts +42 -0
  273. package/lib/cjs/types/authorization/guards/conditional.guard.d.ts +21 -0
  274. package/lib/cjs/types/authorization/guards/index.d.ts +7 -0
  275. package/lib/cjs/types/authorization/guards/permission.guard.d.ts +29 -0
  276. package/lib/cjs/types/authorization/guards/resource-owner.guard.d.ts +29 -0
  277. package/lib/cjs/types/authorization/guards/role.guard.d.ts +28 -0
  278. package/lib/cjs/types/authorization/index.d.ts +18 -0
  279. package/lib/cjs/types/authorization/services/guard-cache.d.ts +26 -0
  280. package/lib/cjs/types/authorization/services/guard-cache.interface.d.ts +29 -0
  281. package/lib/cjs/types/authorization/services/permission-hierarchy.d.ts +21 -0
  282. package/lib/cjs/types/authorization/services/permission-hierarchy.interface.d.ts +22 -0
  283. package/lib/cjs/types/authorization/services/permission-service.d.ts +21 -0
  284. package/lib/cjs/types/authorization/services/permission-service.interface.d.ts +19 -0
  285. package/lib/cjs/types/authorization/services/security-context.d.ts +32 -0
  286. package/lib/cjs/types/authorization/services/security-context.interface.d.ts +25 -0
  287. package/lib/cjs/types/authorization/setup.d.ts +84 -0
  288. package/lib/cjs/types/config/config-resolver.d.ts +40 -0
  289. package/lib/cjs/types/config/config.interfaces.d.ts +570 -0
  290. package/lib/cjs/types/config/define-config.d.ts +109 -0
  291. package/lib/cjs/types/config/env-field-builders.d.ts +288 -0
  292. package/lib/cjs/types/config/index.d.ts +61 -0
  293. package/lib/cjs/types/config/secret-value.d.ts +99 -0
  294. package/lib/cjs/types/console/color-codes.d.ts +1 -1
  295. package/lib/cjs/types/console/console.d.ts +65 -2
  296. package/lib/cjs/types/console/index.d.ts +1 -1
  297. package/lib/cjs/types/container-module/container-module.d.ts +215 -8
  298. package/lib/cjs/types/container-module/index.d.ts +1 -1
  299. package/lib/cjs/types/decorator/index.d.ts +1 -1
  300. package/lib/cjs/types/decorator/scope-binding.d.ts +339 -11
  301. package/lib/cjs/types/di/annotation/decorator_utils.d.ts +1 -1
  302. package/lib/cjs/types/di/annotation/inject.d.ts +1 -1
  303. package/lib/cjs/types/di/annotation/inject_base.d.ts +2 -2
  304. package/lib/cjs/types/di/annotation/lazy_service_identifier.d.ts +1 -1
  305. package/lib/cjs/types/di/annotation/multi_inject.d.ts +1 -1
  306. package/lib/cjs/types/di/annotation/named.d.ts +1 -1
  307. package/lib/cjs/types/di/annotation/target_name.d.ts +1 -1
  308. package/lib/cjs/types/di/annotation/unmanaged.d.ts +1 -1
  309. package/lib/cjs/types/di/binding-decorator/constants.d.ts +3 -0
  310. package/lib/cjs/types/di/binding-decorator/decorator/fluent_provide.d.ts +2 -2
  311. package/lib/cjs/types/di/binding-decorator/decorator/provide.d.ts +1 -1
  312. package/lib/cjs/types/di/binding-decorator/factory/module_factory.d.ts +20 -1
  313. package/lib/cjs/types/di/binding-decorator/index.d.ts +6 -4
  314. package/lib/cjs/types/di/binding-decorator/interfaces/interfaces.d.ts +2 -1
  315. package/lib/cjs/types/di/binding-decorator/syntax/provide_done_syntax.d.ts +1 -1
  316. package/lib/cjs/types/di/binding-decorator/syntax/provide_in_syntax.d.ts +3 -2
  317. package/lib/cjs/types/di/binding-decorator/syntax/provide_in_when_on_syntax.d.ts +3 -2
  318. package/lib/cjs/types/di/binding-decorator/syntax/provide_on_syntax.d.ts +2 -2
  319. package/lib/cjs/types/di/binding-decorator/syntax/provide_when_on_syntax.d.ts +2 -2
  320. package/lib/cjs/types/di/binding-decorator/syntax/provide_when_syntax.d.ts +2 -2
  321. package/lib/cjs/types/di/binding-decorator/utils/auto_wire.d.ts +1 -1
  322. package/lib/cjs/types/di/bindings/binding.d.ts +1 -1
  323. package/lib/cjs/types/di/constants/literal_types.d.ts +3 -3
  324. package/lib/cjs/types/di/container/container.d.ts +1 -1
  325. package/lib/cjs/types/di/container/container_module.d.ts +1 -1
  326. package/lib/cjs/types/di/container/container_snapshot.d.ts +1 -1
  327. package/lib/cjs/types/di/container/lookup.d.ts +1 -1
  328. package/lib/cjs/types/di/container/module_activation_store.d.ts +1 -1
  329. package/lib/cjs/types/di/container-introspection.d.ts +25 -0
  330. package/lib/cjs/types/di/interfaces/interfaces.d.ts +4 -3
  331. package/lib/cjs/types/di/inversify.d.ts +53 -24
  332. package/lib/cjs/types/di/planning/context.d.ts +1 -1
  333. package/lib/cjs/types/di/planning/metadata.d.ts +1 -1
  334. package/lib/cjs/types/di/planning/metadata_reader.d.ts +1 -1
  335. package/lib/cjs/types/di/planning/plan.d.ts +1 -1
  336. package/lib/cjs/types/di/planning/planner.d.ts +1 -1
  337. package/lib/cjs/types/di/planning/queryable_string.d.ts +1 -1
  338. package/lib/cjs/types/di/planning/reflection_utils.d.ts +2 -2
  339. package/lib/cjs/types/di/planning/request.d.ts +1 -1
  340. package/lib/cjs/types/di/planning/target.d.ts +2 -2
  341. package/lib/cjs/types/di/resolution/instantiation.d.ts +1 -1
  342. package/lib/cjs/types/di/resolution/resolver.d.ts +1 -1
  343. package/lib/cjs/types/di/scope/scope-registry.d.ts +91 -0
  344. package/lib/cjs/types/di/scope/scope.d.ts +1 -1
  345. package/lib/cjs/types/di/syntax/binding_in_syntax.d.ts +2 -1
  346. package/lib/cjs/types/di/syntax/binding_in_when_on_syntax.d.ts +2 -1
  347. package/lib/cjs/types/di/syntax/binding_on_syntax.d.ts +1 -1
  348. package/lib/cjs/types/di/syntax/binding_to_syntax.d.ts +2 -2
  349. package/lib/cjs/types/di/syntax/binding_when_on_syntax.d.ts +1 -1
  350. package/lib/cjs/types/di/syntax/binding_when_syntax.d.ts +1 -1
  351. package/lib/cjs/types/di/syntax/constraint_helpers.d.ts +1 -1
  352. package/lib/cjs/types/di/utils/binding_utils.d.ts +1 -1
  353. package/lib/cjs/types/di/utils/clonable.d.ts +1 -1
  354. package/lib/cjs/types/di/utils/serialization.d.ts +1 -1
  355. package/lib/cjs/types/error/app-error.d.ts +155 -7
  356. package/lib/cjs/types/error/base-exception-filter.d.ts +73 -0
  357. package/lib/cjs/types/error/exception-filter-constants.d.ts +9 -0
  358. package/lib/cjs/types/error/exception-filter-decorators.d.ts +126 -0
  359. package/lib/cjs/types/error/exception-filter-registry.d.ts +38 -0
  360. package/lib/cjs/types/error/exception-filter.interface.d.ts +82 -0
  361. package/lib/cjs/types/error/exception-handler-middleware.d.ts +35 -0
  362. package/lib/cjs/types/error/filters/app-error.filter.d.ts +10 -0
  363. package/lib/cjs/types/error/filters/global-exception.filter.d.ts +9 -0
  364. package/lib/cjs/types/error/filters/not-found.filter.d.ts +10 -0
  365. package/lib/cjs/types/error/filters/validation-error.filter.d.ts +10 -0
  366. package/lib/cjs/types/error/index.d.ts +14 -3
  367. package/lib/cjs/types/error/not-found.error.d.ts +7 -0
  368. package/lib/cjs/types/error/report.d.ts +84 -6
  369. package/lib/cjs/types/error/status-code.d.ts +20 -0
  370. package/lib/cjs/types/error/utils.d.ts +16 -0
  371. package/lib/cjs/types/error/validation.error.d.ts +8 -0
  372. package/lib/cjs/types/event/event-decorators.d.ts +199 -0
  373. package/lib/cjs/types/event/event-emitter.d.ts +109 -0
  374. package/lib/cjs/types/event/event-flow-tracker.d.ts +88 -0
  375. package/lib/cjs/types/event/event-recorder.d.ts +121 -0
  376. package/lib/cjs/types/event/event-registry.d.ts +84 -0
  377. package/lib/cjs/types/event/event.interfaces.d.ts +528 -0
  378. package/lib/cjs/types/event/index.d.ts +55 -0
  379. package/lib/cjs/types/index.d.ts +27 -8
  380. package/lib/cjs/types/interceptor/conditional-interceptor.d.ts +91 -0
  381. package/lib/cjs/types/interceptor/execution-context.d.ts +41 -0
  382. package/lib/cjs/types/interceptor/index.d.ts +41 -0
  383. package/lib/cjs/types/interceptor/interceptor-composition.d.ts +115 -0
  384. package/lib/cjs/types/interceptor/interceptor-constants.d.ts +17 -0
  385. package/lib/cjs/types/interceptor/interceptor-decorators.d.ts +124 -0
  386. package/lib/cjs/types/interceptor/interceptor-executor.d.ts +46 -0
  387. package/lib/cjs/types/interceptor/interceptor-registry.d.ts +65 -0
  388. package/lib/cjs/types/interceptor/interceptor.interface.d.ts +281 -0
  389. package/lib/cjs/types/interceptor/interceptors/index.d.ts +6 -0
  390. package/lib/cjs/types/interceptor/interceptors/logging.interceptor.d.ts +28 -0
  391. package/lib/cjs/types/interceptor/interceptors/performance.interceptor.d.ts +197 -0
  392. package/lib/cjs/types/interceptor/interceptors/timeout.interceptor.d.ts +42 -0
  393. package/lib/cjs/types/lazy-loading/index.d.ts +42 -0
  394. package/lib/cjs/types/lazy-loading/lazy-load-metrics.d.ts +139 -0
  395. package/lib/cjs/types/lazy-loading/lazy-module-loader.d.ts +169 -0
  396. package/lib/cjs/types/lazy-loading/lazy-module-manager.d.ts +148 -0
  397. package/lib/cjs/types/lazy-loading/lazy-module-warmup.d.ts +130 -0
  398. package/lib/cjs/types/lazy-loading/lazy-module.d.ts +168 -0
  399. package/lib/cjs/types/lazy-loading/lazy.interfaces.d.ts +480 -0
  400. package/lib/cjs/types/lifecycle/index.d.ts +9 -0
  401. package/lib/cjs/types/lifecycle/lifecycle-registry.d.ts +213 -0
  402. package/lib/cjs/types/lifecycle/lifecycle.interface.d.ts +191 -0
  403. package/lib/cjs/types/middleware/content-negotiation/accept-header-parser.d.ts +26 -0
  404. package/lib/cjs/types/middleware/content-negotiation/content-negotiation-service.d.ts +64 -0
  405. package/lib/cjs/types/middleware/content-negotiation/formatter-registry.d.ts +60 -0
  406. package/lib/cjs/types/middleware/content-negotiation/formatters/csv-formatter.d.ts +34 -0
  407. package/lib/cjs/types/middleware/content-negotiation/formatters/index.d.ts +8 -0
  408. package/lib/cjs/types/middleware/content-negotiation/formatters/json-formatter.d.ts +14 -0
  409. package/lib/cjs/types/middleware/content-negotiation/formatters/plain-text-formatter.d.ts +12 -0
  410. package/lib/cjs/types/middleware/content-negotiation/formatters/xml-formatter.d.ts +26 -0
  411. package/lib/cjs/types/middleware/content-negotiation/formatters/yaml-formatter.d.ts +26 -0
  412. package/lib/cjs/types/middleware/content-negotiation/index.d.ts +7 -0
  413. package/lib/cjs/types/middleware/index.d.ts +25 -15
  414. package/lib/cjs/types/middleware/interfaces/content-negotiation.interface.d.ts +142 -0
  415. package/lib/cjs/types/middleware/interfaces/cookie-session/cookie-session.interface.d.ts +1 -1
  416. package/lib/cjs/types/middleware/middleware-config.d.ts +574 -0
  417. package/lib/cjs/types/middleware/middleware-interface.d.ts +594 -88
  418. package/lib/cjs/types/middleware/middleware-presets.d.ts +90 -0
  419. package/lib/cjs/types/middleware/middleware-profiler.d.ts +199 -0
  420. package/lib/cjs/types/middleware/middleware-registry.d.ts +103 -0
  421. package/lib/cjs/types/middleware/middleware-resolver.d.ts +156 -8
  422. package/lib/cjs/types/middleware/middleware-service.d.ts +634 -112
  423. package/lib/cjs/types/middleware/middleware-utils.d.ts +145 -0
  424. package/lib/cjs/types/middleware/upload-registry.d.ts +50 -0
  425. package/lib/cjs/types/path-resolver/index.d.ts +80 -0
  426. package/lib/cjs/types/provider/db-in-memory/adapter/adapter.interface.d.ts +222 -0
  427. package/lib/cjs/types/provider/db-in-memory/adapter/in-memory.adapter.d.ts +239 -0
  428. package/lib/cjs/types/provider/db-in-memory/adapter/index.d.ts +6 -0
  429. package/lib/cjs/types/provider/db-in-memory/base-repo.repository.d.ts +1 -1
  430. package/lib/cjs/types/provider/db-in-memory/db-in-memory.interface.d.ts +1 -1
  431. package/lib/cjs/types/provider/db-in-memory/db-in-memory.provider.d.ts +8 -2
  432. package/lib/cjs/types/provider/db-in-memory/db.provider.d.ts +281 -0
  433. package/lib/cjs/types/provider/db-in-memory/index.d.ts +63 -4
  434. package/lib/cjs/types/provider/db-in-memory/query/index.d.ts +6 -0
  435. package/lib/cjs/types/provider/db-in-memory/query/query-engine.d.ts +101 -0
  436. package/lib/cjs/types/provider/db-in-memory/query/query.types.d.ts +318 -0
  437. package/lib/cjs/types/provider/db-in-memory/schema/decorators.d.ts +314 -0
  438. package/lib/cjs/types/provider/db-in-memory/schema/entity.interface.d.ts +60 -0
  439. package/lib/cjs/types/provider/db-in-memory/schema/index.d.ts +6 -0
  440. package/lib/cjs/types/provider/db-in-memory/storage/index.d.ts +5 -0
  441. package/lib/cjs/types/provider/db-in-memory/storage/memory-store.d.ts +326 -0
  442. package/lib/cjs/types/provider/index.d.ts +7 -5
  443. package/lib/cjs/types/provider/logger/decorators/index.d.ts +1 -0
  444. package/lib/cjs/types/provider/logger/decorators/log-performance.decorator.d.ts +49 -0
  445. package/lib/cjs/types/provider/logger/index.d.ts +17 -0
  446. package/lib/cjs/types/provider/logger/logger.banner.d.ts +94 -0
  447. package/lib/cjs/types/provider/logger/logger.config.d.ts +55 -0
  448. package/lib/cjs/types/provider/logger/logger.context.d.ts +189 -0
  449. package/lib/cjs/types/provider/logger/logger.flow.d.ts +165 -0
  450. package/lib/cjs/types/provider/logger/logger.formatter.d.ts +44 -0
  451. package/lib/cjs/types/provider/logger/logger.grouping.d.ts +124 -0
  452. package/lib/cjs/types/provider/logger/logger.health.d.ts +123 -0
  453. package/lib/cjs/types/provider/logger/logger.metrics-collector.d.ts +44 -0
  454. package/lib/cjs/types/provider/logger/logger.metrics.d.ts +162 -0
  455. package/lib/cjs/types/provider/logger/logger.performance.d.ts +179 -0
  456. package/lib/cjs/types/provider/logger/logger.provider.d.ts +303 -30
  457. package/lib/cjs/types/provider/logger/logger.query.d.ts +232 -0
  458. package/lib/cjs/types/provider/logger/logger.redaction.d.ts +169 -0
  459. package/lib/cjs/types/provider/logger/logger.suggestions.d.ts +124 -0
  460. package/lib/cjs/types/provider/logger/transports/console.transport.d.ts +49 -0
  461. package/lib/cjs/types/provider/logger/transports/file.transport.d.ts +87 -0
  462. package/lib/cjs/types/provider/logger/transports/http-server.d.ts +88 -0
  463. package/lib/cjs/types/provider/logger/transports/http.transport.d.ts +74 -0
  464. package/lib/cjs/types/provider/logger/transports/index.d.ts +5 -0
  465. package/lib/cjs/types/provider/logger/transports/transport.interface.d.ts +31 -0
  466. package/lib/cjs/types/provider/logger/utils/index.d.ts +2 -0
  467. package/lib/cjs/types/provider/logger/utils/log-entry.d.ts +82 -0
  468. package/lib/cjs/types/provider/logger/utils/log-levels.d.ts +53 -0
  469. package/lib/cjs/types/provider/provider-manager.d.ts +165 -13
  470. package/lib/cjs/types/provider/provider-registry.d.ts +192 -0
  471. package/lib/cjs/types/provider/provider.interface.d.ts +337 -0
  472. package/lib/cjs/types/provider/validation/adapters/class-validator.adapter.d.ts +68 -0
  473. package/lib/cjs/types/provider/validation/adapters/index.d.ts +10 -0
  474. package/lib/cjs/types/provider/validation/helpful-error-formatter.d.ts +110 -0
  475. package/lib/cjs/types/provider/validation/index.d.ts +19 -0
  476. package/lib/cjs/types/provider/validation/smart-field-detector.d.ts +91 -0
  477. package/lib/cjs/types/provider/validation/type-inference.d.ts +81 -0
  478. package/lib/cjs/types/provider/validation/validation-registry.d.ts +105 -0
  479. package/lib/cjs/types/provider/validation/validation.interface.d.ts +178 -0
  480. package/lib/cjs/types/render/adapters/base-adapter.d.ts +95 -0
  481. package/lib/cjs/types/render/adapters/ejs-adapter.d.ts +57 -0
  482. package/lib/cjs/types/render/adapters/handlebars-adapter.d.ts +74 -0
  483. package/lib/cjs/types/render/adapters/index.d.ts +12 -0
  484. package/lib/cjs/types/render/adapters/pug-adapter.d.ts +57 -0
  485. package/lib/cjs/types/render/adapters/react-adapter.d.ts +99 -0
  486. package/lib/cjs/types/render/features/auto-detection.d.ts +58 -0
  487. package/lib/cjs/types/render/features/hot-reload.d.ts +65 -0
  488. package/lib/cjs/types/render/features/index.d.ts +12 -0
  489. package/lib/cjs/types/render/features/streaming.d.ts +39 -0
  490. package/lib/cjs/types/render/features/type-generator.d.ts +64 -0
  491. package/lib/cjs/types/render/features/view-debugger.d.ts +42 -0
  492. package/lib/cjs/types/render/index.d.ts +50 -0
  493. package/lib/cjs/types/render/presets/index.d.ts +119 -0
  494. package/lib/cjs/types/render/render-config.d.ts +213 -0
  495. package/lib/cjs/types/render/render-interface.d.ts +126 -0
  496. package/lib/cjs/types/render/render-registry.d.ts +86 -0
  497. package/lib/cjs/types/render/render-service.d.ts +157 -0
  498. package/lib/cjs/types/render/utils/cache-manager.d.ts +106 -0
  499. package/lib/cjs/types/render/utils/index.d.ts +11 -0
  500. package/lib/cjs/types/render/utils/package-resolver.d.ts +57 -0
  501. package/lib/cjs/types/render/utils/view-scanner.d.ts +74 -0
  502. package/lib/cjs/types/testing/create-test-app.d.ts +71 -0
  503. package/lib/cjs/types/testing/create-test-database.d.ts +100 -0
  504. package/lib/cjs/types/testing/fluent-request.d.ts +37 -0
  505. package/lib/cjs/types/testing/index.d.ts +93 -0
  506. package/lib/cjs/types/testing/load-test.d.ts +139 -0
  507. package/lib/cjs/types/testing/matchers.d.ts +184 -0
  508. package/lib/cjs/types/testing/mock-context.d.ts +117 -0
  509. package/lib/cjs/types/testing/mock-provider.d.ts +93 -0
  510. package/lib/cjs/types/testing/snapshot-request.d.ts +46 -0
  511. package/lib/cjs/types/testing/testing.interfaces.d.ts +948 -0
  512. package/lib/cjs/types/utils/node-require.d.ts +11 -0
  513. package/lib/cjs/utils/node-require.js +59 -0
  514. package/lib/esm/application/application-container.js +526 -0
  515. package/lib/esm/application/application-factory.js +134 -0
  516. package/lib/esm/application/application.types.js +41 -0
  517. package/lib/esm/application/bootstrap.js +805 -0
  518. package/lib/esm/application/index.js +4 -0
  519. package/lib/esm/authorization/authorization-config.interface.js +1 -0
  520. package/lib/esm/authorization/decorators/convenience.js +74 -0
  521. package/lib/esm/authorization/guard-constants.js +9 -0
  522. package/lib/esm/authorization/guard-decorators.js +155 -0
  523. package/lib/esm/authorization/guard-executor.js +101 -0
  524. package/lib/esm/authorization/guard-registry.js +132 -0
  525. package/lib/esm/authorization/guard.interface.js +73 -0
  526. package/lib/esm/authorization/guards/attribute-based.guard.js +106 -0
  527. package/lib/esm/authorization/guards/authenticated.guard.js +45 -0
  528. package/lib/esm/authorization/guards/composition.guard.js +63 -0
  529. package/lib/esm/authorization/guards/conditional.guard.js +38 -0
  530. package/lib/esm/authorization/guards/index.js +8 -0
  531. package/lib/esm/authorization/guards/permission.guard.js +80 -0
  532. package/lib/esm/authorization/guards/resource-owner.guard.js +58 -0
  533. package/lib/esm/authorization/guards/role.guard.js +61 -0
  534. package/lib/esm/authorization/index.js +24 -0
  535. package/lib/esm/authorization/services/guard-cache.interface.js +1 -0
  536. package/lib/esm/authorization/services/guard-cache.js +51 -0
  537. package/lib/esm/authorization/services/permission-hierarchy.interface.js +1 -0
  538. package/lib/esm/authorization/services/permission-hierarchy.js +49 -0
  539. package/lib/esm/authorization/services/permission-service.interface.js +1 -0
  540. package/lib/esm/authorization/services/permission-service.js +56 -0
  541. package/lib/esm/authorization/services/security-context.interface.js +1 -0
  542. package/lib/esm/authorization/services/security-context.js +74 -0
  543. package/lib/esm/authorization/setup.js +137 -0
  544. package/lib/esm/config/config-resolver.js +714 -0
  545. package/lib/esm/config/config.interfaces.js +13 -0
  546. package/lib/esm/config/define-config.js +492 -0
  547. package/lib/esm/config/env-field-builders.js +392 -0
  548. package/lib/esm/config/index.js +67 -0
  549. package/lib/esm/config/secret-value.js +175 -0
  550. package/lib/esm/console/color-codes.js +46 -0
  551. package/lib/esm/console/console.js +107 -0
  552. package/lib/esm/console/index.js +1 -0
  553. package/lib/esm/container-module/container-module.js +322 -0
  554. package/lib/esm/container-module/index.js +1 -0
  555. package/lib/esm/decorator/index.js +1 -0
  556. package/lib/esm/decorator/scope-binding.js +344 -0
  557. package/lib/esm/di/annotation/decorator_utils.js +93 -0
  558. package/lib/esm/di/annotation/inject.js +18 -0
  559. package/lib/esm/di/annotation/inject_base.js +14 -0
  560. package/lib/esm/di/annotation/injectable.js +19 -0
  561. package/lib/esm/di/annotation/lazy_service_identifier.js +9 -0
  562. package/lib/esm/di/annotation/multi_inject.js +4 -0
  563. package/lib/esm/di/annotation/named.js +9 -0
  564. package/lib/esm/di/annotation/optional.js +7 -0
  565. package/lib/esm/di/annotation/post_construct.js +5 -0
  566. package/lib/esm/di/annotation/pre_destroy.js +5 -0
  567. package/lib/esm/di/annotation/property_event_decorator.js +13 -0
  568. package/lib/esm/di/annotation/tagged.js +7 -0
  569. package/lib/esm/di/annotation/target_name.js +10 -0
  570. package/lib/esm/di/annotation/unmanaged.js +10 -0
  571. package/lib/esm/di/binding-decorator/constants.js +7 -0
  572. package/lib/esm/di/binding-decorator/decorator/fluent_provide.js +15 -0
  573. package/lib/esm/di/binding-decorator/decorator/provide.js +35 -0
  574. package/lib/esm/di/binding-decorator/factory/module_factory.js +34 -0
  575. package/lib/esm/di/binding-decorator/index.js +10 -0
  576. package/lib/esm/di/binding-decorator/interfaces/interfaces.js +1 -0
  577. package/lib/esm/di/binding-decorator/syntax/provide_done_syntax.js +41 -0
  578. package/lib/esm/di/binding-decorator/syntax/provide_in_syntax.js +37 -0
  579. package/lib/esm/di/binding-decorator/syntax/provide_in_when_on_syntax.js +68 -0
  580. package/lib/esm/di/binding-decorator/syntax/provide_on_syntax.js +19 -0
  581. package/lib/esm/di/binding-decorator/syntax/provide_when_on_syntax.js +57 -0
  582. package/lib/esm/di/binding-decorator/syntax/provide_when_syntax.js +86 -0
  583. package/lib/esm/di/binding-decorator/utils/auto_wire.js +13 -0
  584. package/lib/esm/di/bindings/binding.js +64 -0
  585. package/lib/esm/di/bindings/binding_count.js +5 -0
  586. package/lib/esm/di/constants/error_msgs.js +54 -0
  587. package/lib/esm/di/constants/literal_types.js +21 -0
  588. package/lib/esm/di/constants/metadata_keys.js +35 -0
  589. package/lib/esm/di/container/container.js +505 -0
  590. package/lib/esm/di/container/container_module.js +17 -0
  591. package/lib/esm/di/container/container_snapshot.js +17 -0
  592. package/lib/esm/di/container/lookup.js +108 -0
  593. package/lib/esm/di/container/module_activation_store.js +43 -0
  594. package/lib/esm/di/container-introspection.js +38 -0
  595. package/lib/esm/di/interfaces/interfaces.js +1 -0
  596. package/lib/esm/di/inversify.js +53 -0
  597. package/lib/esm/di/planning/context.js +18 -0
  598. package/lib/esm/di/planning/metadata.js +18 -0
  599. package/lib/esm/di/planning/metadata_reader.js +19 -0
  600. package/lib/esm/di/planning/plan.js +9 -0
  601. package/lib/esm/di/planning/planner.js +159 -0
  602. package/lib/esm/di/planning/queryable_string.js +25 -0
  603. package/lib/esm/di/planning/reflection_utils.js +150 -0
  604. package/lib/esm/di/planning/request.js +28 -0
  605. package/lib/esm/di/planning/target.js +89 -0
  606. package/lib/esm/di/resolution/instantiation.js +125 -0
  607. package/lib/esm/di/resolution/resolver.js +163 -0
  608. package/lib/esm/di/scope/scope-registry.js +109 -0
  609. package/lib/esm/di/scope/scope.js +75 -0
  610. package/lib/esm/di/syntax/binding_in_syntax.js +31 -0
  611. package/lib/esm/di/syntax/binding_in_when_on_syntax.js +79 -0
  612. package/lib/esm/di/syntax/binding_on_syntax.js +16 -0
  613. package/lib/esm/di/syntax/binding_to_syntax.js +89 -0
  614. package/lib/esm/di/syntax/binding_when_on_syntax.js +64 -0
  615. package/lib/esm/di/syntax/binding_when_syntax.js +82 -0
  616. package/lib/esm/di/syntax/constraint_helpers.js +39 -0
  617. package/lib/esm/di/utils/async.js +12 -0
  618. package/lib/esm/di/utils/binding_utils.js +48 -0
  619. package/lib/esm/di/utils/clonable.js +7 -0
  620. package/lib/esm/di/utils/exceptions.js +18 -0
  621. package/lib/esm/di/utils/factory_type.js +6 -0
  622. package/lib/esm/di/utils/id.js +5 -0
  623. package/lib/esm/di/utils/js.js +12 -0
  624. package/lib/esm/di/utils/serialization.js +102 -0
  625. package/lib/esm/error/app-error.js +209 -0
  626. package/lib/esm/error/base-exception-filter.js +134 -0
  627. package/lib/esm/error/error-handler-middleware.js +34 -0
  628. package/lib/esm/error/exception-filter-constants.js +9 -0
  629. package/lib/esm/error/exception-filter-decorators.js +157 -0
  630. package/lib/esm/error/exception-filter-registry.js +162 -0
  631. package/lib/esm/error/exception-filter.interface.js +1 -0
  632. package/lib/esm/error/exception-handler-middleware.js +378 -0
  633. package/lib/esm/error/filters/app-error.filter.js +28 -0
  634. package/lib/esm/error/filters/global-exception.filter.js +36 -0
  635. package/lib/esm/error/filters/not-found.filter.js +32 -0
  636. package/lib/esm/error/filters/validation-error.filter.js +32 -0
  637. package/lib/esm/error/index.js +13 -0
  638. package/lib/esm/error/not-found.error.js +13 -0
  639. package/lib/esm/error/report.js +153 -0
  640. package/lib/esm/error/status-code.js +106 -0
  641. package/lib/esm/error/utils.js +252 -0
  642. package/lib/esm/error/validation.error.js +15 -0
  643. package/lib/esm/event/event-decorators.js +268 -0
  644. package/lib/esm/event/event-emitter.js +376 -0
  645. package/lib/esm/event/event-flow-tracker.js +230 -0
  646. package/lib/esm/event/event-recorder.js +286 -0
  647. package/lib/esm/event/event-registry.js +201 -0
  648. package/lib/esm/event/event.interfaces.js +51 -0
  649. package/lib/esm/event/index.js +58 -0
  650. package/lib/esm/index.mjs +27 -0
  651. package/lib/esm/interceptor/conditional-interceptor.js +104 -0
  652. package/lib/esm/interceptor/execution-context.js +66 -0
  653. package/lib/esm/interceptor/index.js +48 -0
  654. package/lib/esm/interceptor/interceptor-composition.js +126 -0
  655. package/lib/esm/interceptor/interceptor-constants.js +17 -0
  656. package/lib/esm/interceptor/interceptor-decorators.js +151 -0
  657. package/lib/esm/interceptor/interceptor-executor.js +139 -0
  658. package/lib/esm/interceptor/interceptor-registry.js +158 -0
  659. package/lib/esm/interceptor/interceptor.interface.js +16 -0
  660. package/lib/esm/interceptor/interceptors/index.js +6 -0
  661. package/lib/esm/interceptor/interceptors/logging.interceptor.js +68 -0
  662. package/lib/esm/interceptor/interceptors/performance.interceptor.js +253 -0
  663. package/lib/esm/interceptor/interceptors/timeout.interceptor.js +65 -0
  664. package/lib/esm/lazy-loading/index.js +56 -0
  665. package/lib/esm/lazy-loading/lazy-load-metrics.js +352 -0
  666. package/lib/esm/lazy-loading/lazy-module-loader.js +305 -0
  667. package/lib/esm/lazy-loading/lazy-module-manager.js +241 -0
  668. package/lib/esm/lazy-loading/lazy-module-warmup.js +291 -0
  669. package/lib/esm/lazy-loading/lazy-module.js +352 -0
  670. package/lib/esm/lazy-loading/lazy.interfaces.js +17 -0
  671. package/lib/esm/lifecycle/index.js +9 -0
  672. package/lib/esm/lifecycle/lifecycle-registry.js +298 -0
  673. package/lib/esm/lifecycle/lifecycle.interface.js +33 -0
  674. package/lib/esm/middleware/content-negotiation/accept-header-parser.js +106 -0
  675. package/lib/esm/middleware/content-negotiation/content-negotiation-service.js +286 -0
  676. package/lib/esm/middleware/content-negotiation/formatter-registry.js +165 -0
  677. package/lib/esm/middleware/content-negotiation/formatters/csv-formatter.js +111 -0
  678. package/lib/esm/middleware/content-negotiation/formatters/index.js +8 -0
  679. package/lib/esm/middleware/content-negotiation/formatters/json-formatter.js +30 -0
  680. package/lib/esm/middleware/content-negotiation/formatters/plain-text-formatter.js +40 -0
  681. package/lib/esm/middleware/content-negotiation/formatters/xml-formatter.js +121 -0
  682. package/lib/esm/middleware/content-negotiation/formatters/yaml-formatter.js +131 -0
  683. package/lib/esm/middleware/content-negotiation/index.js +7 -0
  684. package/lib/esm/middleware/index.js +19 -0
  685. package/lib/esm/middleware/interfaces/body-parser.interface.js +1 -0
  686. package/lib/esm/middleware/interfaces/compression.interface.js +1 -0
  687. package/lib/esm/middleware/interfaces/content-negotiation.interface.js +6 -0
  688. package/lib/esm/middleware/interfaces/cookie-parser.interface.js +1 -0
  689. package/lib/esm/middleware/interfaces/cookie-session/cookie-session.interface.js +1 -0
  690. package/lib/esm/middleware/interfaces/cookie-session/keygrip.interface.js +1 -0
  691. package/lib/esm/middleware/interfaces/cors.interface.js +1 -0
  692. package/lib/esm/middleware/interfaces/express-rate-limit.interface.js +1 -0
  693. package/lib/esm/middleware/interfaces/express-session.interface.js +1 -0
  694. package/lib/esm/middleware/interfaces/helmet.interface.js +1 -0
  695. package/lib/esm/middleware/interfaces/morgan.interface.js +1 -0
  696. package/lib/esm/middleware/interfaces/multer.interface.js +1 -0
  697. package/lib/esm/middleware/interfaces/serve-favicon.interface.js +1 -0
  698. package/lib/esm/middleware/interfaces/serve-static.interface.js +1 -0
  699. package/lib/esm/middleware/interfaces/url-encoded.interface.js +1 -0
  700. package/lib/esm/middleware/middleware-config.js +9 -0
  701. package/lib/esm/middleware/middleware-interface.js +1 -0
  702. package/lib/esm/middleware/middleware-presets.js +286 -0
  703. package/lib/esm/middleware/middleware-profiler.js +307 -0
  704. package/lib/esm/middleware/middleware-registry.js +152 -0
  705. package/lib/esm/middleware/middleware-resolver.js +320 -0
  706. package/lib/esm/middleware/middleware-service.js +1797 -0
  707. package/lib/esm/middleware/middleware-utils.js +273 -0
  708. package/lib/esm/middleware/upload-registry.js +84 -0
  709. package/lib/esm/package.json +3 -0
  710. package/lib/esm/path-resolver/index.js +224 -0
  711. package/lib/esm/provider/db-in-memory/adapter/adapter.interface.js +9 -0
  712. package/lib/esm/provider/db-in-memory/adapter/in-memory.adapter.js +667 -0
  713. package/lib/esm/provider/db-in-memory/adapter/index.js +5 -0
  714. package/lib/esm/provider/db-in-memory/base-repo.repository.js +54 -0
  715. package/lib/esm/provider/db-in-memory/db-in-memory.interface.js +1 -0
  716. package/lib/esm/provider/db-in-memory/db-in-memory.provider.js +104 -0
  717. package/lib/esm/provider/db-in-memory/db-in-memory.types.js +20 -0
  718. package/lib/esm/provider/db-in-memory/db.provider.js +405 -0
  719. package/lib/esm/provider/db-in-memory/index.js +90 -0
  720. package/lib/esm/provider/db-in-memory/query/index.js +6 -0
  721. package/lib/esm/provider/db-in-memory/query/query-engine.js +570 -0
  722. package/lib/esm/provider/db-in-memory/query/query.types.js +9 -0
  723. package/lib/esm/provider/db-in-memory/schema/decorators.js +387 -0
  724. package/lib/esm/provider/db-in-memory/schema/entity.interface.js +8 -0
  725. package/lib/esm/provider/db-in-memory/schema/index.js +5 -0
  726. package/lib/esm/provider/db-in-memory/storage/index.js +5 -0
  727. package/lib/esm/provider/db-in-memory/storage/memory-store.js +709 -0
  728. package/lib/esm/provider/dto-validator/dto-validator.provider.js +49 -0
  729. package/lib/esm/provider/dto-validator/package-resolver.js +30 -0
  730. package/lib/esm/provider/index.js +7 -0
  731. package/lib/esm/provider/logger/decorators/index.js +1 -0
  732. package/lib/esm/provider/logger/decorators/log-performance.decorator.js +175 -0
  733. package/lib/esm/provider/logger/index.js +17 -0
  734. package/lib/esm/provider/logger/logger.banner.js +471 -0
  735. package/lib/esm/provider/logger/logger.config.js +19 -0
  736. package/lib/esm/provider/logger/logger.context.js +334 -0
  737. package/lib/esm/provider/logger/logger.flow.js +248 -0
  738. package/lib/esm/provider/logger/logger.formatter.js +670 -0
  739. package/lib/esm/provider/logger/logger.grouping.js +314 -0
  740. package/lib/esm/provider/logger/logger.health.js +291 -0
  741. package/lib/esm/provider/logger/logger.metrics-collector.js +180 -0
  742. package/lib/esm/provider/logger/logger.metrics.js +85 -0
  743. package/lib/esm/provider/logger/logger.performance.js +299 -0
  744. package/lib/esm/provider/logger/logger.provider.js +746 -0
  745. package/lib/esm/provider/logger/logger.query.js +529 -0
  746. package/lib/esm/provider/logger/logger.redaction.js +450 -0
  747. package/lib/esm/provider/logger/logger.suggestions.js +471 -0
  748. package/lib/esm/provider/logger/transports/console.transport.js +81 -0
  749. package/lib/esm/provider/logger/transports/file.transport.js +291 -0
  750. package/lib/esm/provider/logger/transports/http-server.js +141 -0
  751. package/lib/esm/provider/logger/transports/http.transport.js +157 -0
  752. package/lib/esm/provider/logger/transports/index.js +5 -0
  753. package/lib/esm/provider/logger/transports/transport.interface.js +1 -0
  754. package/lib/esm/provider/logger/utils/index.js +2 -0
  755. package/lib/esm/provider/logger/utils/log-entry.js +23 -0
  756. package/lib/esm/provider/logger/utils/log-levels.js +100 -0
  757. package/lib/esm/provider/provider-manager.js +283 -0
  758. package/lib/esm/provider/provider-registry.js +411 -0
  759. package/lib/esm/provider/provider.interface.js +44 -0
  760. package/lib/esm/provider/validation/adapters/class-validator.adapter.js +258 -0
  761. package/lib/esm/provider/validation/adapters/index.js +10 -0
  762. package/lib/esm/provider/validation/helpful-error-formatter.js +225 -0
  763. package/lib/esm/provider/validation/index.js +21 -0
  764. package/lib/esm/provider/validation/smart-field-detector.js +539 -0
  765. package/lib/esm/provider/validation/type-inference.js +183 -0
  766. package/lib/esm/provider/validation/validation-registry.js +214 -0
  767. package/lib/esm/provider/validation/validation.interface.js +8 -0
  768. package/lib/esm/render/adapters/base-adapter.js +131 -0
  769. package/lib/esm/render/adapters/ejs-adapter.js +142 -0
  770. package/lib/esm/render/adapters/handlebars-adapter.js +161 -0
  771. package/lib/esm/render/adapters/index.js +12 -0
  772. package/lib/esm/render/adapters/pug-adapter.js +134 -0
  773. package/lib/esm/render/adapters/react-adapter.js +303 -0
  774. package/lib/esm/render/features/auto-detection.js +202 -0
  775. package/lib/esm/render/features/hot-reload.js +153 -0
  776. package/lib/esm/render/features/index.js +12 -0
  777. package/lib/esm/render/features/streaming.js +103 -0
  778. package/lib/esm/render/features/type-generator.js +195 -0
  779. package/lib/esm/render/features/view-debugger.js +172 -0
  780. package/lib/esm/render/index.js +54 -0
  781. package/lib/esm/render/presets/index.js +207 -0
  782. package/lib/esm/render/render-config.js +9 -0
  783. package/lib/esm/render/render-interface.js +1 -0
  784. package/lib/esm/render/render-registry.js +124 -0
  785. package/lib/esm/render/render-service.js +394 -0
  786. package/lib/esm/render/utils/cache-manager.js +196 -0
  787. package/lib/esm/render/utils/index.js +10 -0
  788. package/lib/esm/render/utils/package-resolver.js +118 -0
  789. package/lib/esm/render/utils/view-scanner.js +178 -0
  790. package/lib/esm/testing/create-test-app.js +365 -0
  791. package/lib/esm/testing/create-test-database.js +411 -0
  792. package/lib/esm/testing/fluent-request.js +452 -0
  793. package/lib/esm/testing/index.js +102 -0
  794. package/lib/esm/testing/load-test.js +479 -0
  795. package/lib/esm/testing/matchers.js +440 -0
  796. package/lib/esm/testing/mock-context.js +400 -0
  797. package/lib/esm/testing/mock-provider.js +333 -0
  798. package/lib/esm/testing/snapshot-request.js +356 -0
  799. package/lib/esm/testing/testing.interfaces.js +9 -0
  800. package/lib/esm/types/application/application-container.d.ts +352 -0
  801. package/lib/esm/types/application/application-factory.d.ts +118 -0
  802. package/lib/esm/types/application/application.types.d.ts +185 -0
  803. package/lib/esm/types/application/bootstrap.d.ts +484 -0
  804. package/lib/esm/types/application/index.d.ts +4 -0
  805. package/lib/esm/types/authorization/authorization-config.interface.d.ts +45 -0
  806. package/lib/esm/types/authorization/decorators/convenience.d.ts +64 -0
  807. package/lib/esm/types/authorization/guard-constants.d.ts +9 -0
  808. package/lib/esm/types/authorization/guard-decorators.d.ts +128 -0
  809. package/lib/esm/types/authorization/guard-executor.d.ts +26 -0
  810. package/lib/esm/types/authorization/guard-registry.d.ts +35 -0
  811. package/lib/esm/types/authorization/guard.interface.d.ts +335 -0
  812. package/lib/esm/types/authorization/guards/attribute-based.guard.d.ts +60 -0
  813. package/lib/esm/types/authorization/guards/authenticated.guard.d.ts +26 -0
  814. package/lib/esm/types/authorization/guards/composition.guard.d.ts +42 -0
  815. package/lib/esm/types/authorization/guards/conditional.guard.d.ts +21 -0
  816. package/lib/esm/types/authorization/guards/index.d.ts +7 -0
  817. package/lib/esm/types/authorization/guards/permission.guard.d.ts +29 -0
  818. package/lib/esm/types/authorization/guards/resource-owner.guard.d.ts +29 -0
  819. package/lib/esm/types/authorization/guards/role.guard.d.ts +28 -0
  820. package/lib/esm/types/authorization/index.d.ts +18 -0
  821. package/lib/esm/types/authorization/services/guard-cache.d.ts +26 -0
  822. package/lib/esm/types/authorization/services/guard-cache.interface.d.ts +29 -0
  823. package/lib/esm/types/authorization/services/permission-hierarchy.d.ts +21 -0
  824. package/lib/esm/types/authorization/services/permission-hierarchy.interface.d.ts +22 -0
  825. package/lib/esm/types/authorization/services/permission-service.d.ts +21 -0
  826. package/lib/esm/types/authorization/services/permission-service.interface.d.ts +19 -0
  827. package/lib/esm/types/authorization/services/security-context.d.ts +32 -0
  828. package/lib/esm/types/authorization/services/security-context.interface.d.ts +25 -0
  829. package/lib/esm/types/authorization/setup.d.ts +84 -0
  830. package/lib/esm/types/config/config-resolver.d.ts +40 -0
  831. package/lib/esm/types/config/config.interfaces.d.ts +570 -0
  832. package/lib/esm/types/config/define-config.d.ts +109 -0
  833. package/lib/esm/types/config/env-field-builders.d.ts +288 -0
  834. package/lib/esm/types/config/index.d.ts +61 -0
  835. package/lib/esm/types/config/secret-value.d.ts +99 -0
  836. package/lib/esm/types/console/color-codes.d.ts +29 -0
  837. package/lib/esm/types/console/console.d.ts +83 -0
  838. package/lib/esm/types/console/index.d.ts +2 -0
  839. package/lib/esm/types/container-module/container-module.d.ts +242 -0
  840. package/lib/esm/types/container-module/index.d.ts +1 -0
  841. package/lib/esm/types/decorator/index.d.ts +1 -0
  842. package/lib/esm/types/decorator/scope-binding.d.ts +374 -0
  843. package/lib/esm/types/di/annotation/decorator_utils.d.ts +16 -0
  844. package/lib/esm/types/di/annotation/inject.d.ts +16 -0
  845. package/lib/esm/types/di/annotation/inject_base.d.ts +3 -0
  846. package/lib/esm/types/di/annotation/injectable.d.ts +7 -0
  847. package/lib/esm/types/di/annotation/lazy_service_identifier.d.ts +7 -0
  848. package/lib/esm/types/di/annotation/multi_inject.d.ts +2 -0
  849. package/lib/esm/types/di/annotation/named.d.ts +2 -0
  850. package/lib/esm/types/di/annotation/optional.d.ts +2 -0
  851. package/lib/esm/types/di/annotation/post_construct.d.ts +4 -0
  852. package/lib/esm/types/di/annotation/pre_destroy.d.ts +4 -0
  853. package/lib/esm/types/di/annotation/property_event_decorator.d.ts +4 -0
  854. package/lib/esm/types/di/annotation/tagged.d.ts +2 -0
  855. package/lib/esm/types/di/annotation/target_name.d.ts +3 -0
  856. package/lib/esm/types/di/annotation/unmanaged.d.ts +3 -0
  857. package/lib/esm/types/di/binding-decorator/constants.d.ts +7 -0
  858. package/lib/esm/types/di/binding-decorator/decorator/fluent_provide.d.ts +4 -0
  859. package/lib/esm/types/di/binding-decorator/decorator/provide.d.ts +4 -0
  860. package/lib/esm/types/di/binding-decorator/factory/module_factory.d.ts +23 -0
  861. package/lib/esm/types/di/binding-decorator/index.d.ts +10 -0
  862. package/lib/esm/types/di/binding-decorator/interfaces/interfaces.d.ts +40 -0
  863. package/lib/esm/types/di/binding-decorator/syntax/provide_done_syntax.d.ts +7 -0
  864. package/lib/esm/types/di/binding-decorator/syntax/provide_in_syntax.d.ts +12 -0
  865. package/lib/esm/types/di/binding-decorator/syntax/provide_in_when_on_syntax.d.ts +28 -0
  866. package/lib/esm/types/di/binding-decorator/syntax/provide_on_syntax.d.ts +10 -0
  867. package/lib/esm/types/di/binding-decorator/syntax/provide_when_on_syntax.d.ts +24 -0
  868. package/lib/esm/types/di/binding-decorator/syntax/provide_when_syntax.d.ts +23 -0
  869. package/lib/esm/types/di/binding-decorator/utils/auto_wire.d.ts +3 -0
  870. package/lib/esm/types/di/bindings/binding.d.ts +20 -0
  871. package/lib/esm/types/di/bindings/binding_count.d.ts +5 -0
  872. package/lib/esm/types/di/constants/error_msgs.d.ts +32 -0
  873. package/lib/esm/types/di/constants/literal_types.d.ts +5 -0
  874. package/lib/esm/types/di/constants/metadata_keys.d.ts +13 -0
  875. package/lib/esm/types/di/container/container.d.ts +73 -0
  876. package/lib/esm/types/di/container/container_module.d.ts +11 -0
  877. package/lib/esm/types/di/container/container_snapshot.d.ts +10 -0
  878. package/lib/esm/types/di/container/lookup.d.ts +16 -0
  879. package/lib/esm/types/di/container/module_activation_store.d.ts +10 -0
  880. package/lib/esm/types/di/container-introspection.d.ts +25 -0
  881. package/lib/esm/types/di/interfaces/interfaces.d.ts +300 -0
  882. package/lib/esm/types/di/inversify.d.ts +54 -0
  883. package/lib/esm/types/di/planning/context.d.ts +11 -0
  884. package/lib/esm/types/di/planning/metadata.d.ts +8 -0
  885. package/lib/esm/types/di/planning/metadata_reader.d.ts +6 -0
  886. package/lib/esm/types/di/planning/plan.d.ts +7 -0
  887. package/lib/esm/types/di/planning/planner.d.ts +5 -0
  888. package/lib/esm/types/di/planning/queryable_string.d.ts +11 -0
  889. package/lib/esm/types/di/planning/reflection_utils.d.ts +5 -0
  890. package/lib/esm/types/di/planning/request.d.ts +14 -0
  891. package/lib/esm/types/di/planning/target.d.ts +23 -0
  892. package/lib/esm/types/di/resolution/instantiation.d.ts +3 -0
  893. package/lib/esm/types/di/resolution/resolver.d.ts +3 -0
  894. package/lib/esm/types/di/scope/scope-registry.d.ts +91 -0
  895. package/lib/esm/types/di/scope/scope.d.ts +3 -0
  896. package/lib/esm/types/di/syntax/binding_in_syntax.d.ts +10 -0
  897. package/lib/esm/types/di/syntax/binding_in_when_on_syntax.d.ts +30 -0
  898. package/lib/esm/types/di/syntax/binding_on_syntax.d.ts +8 -0
  899. package/lib/esm/types/di/syntax/binding_to_syntax.d.ts +18 -0
  900. package/lib/esm/types/di/syntax/binding_when_on_syntax.d.ts +25 -0
  901. package/lib/esm/types/di/syntax/binding_when_syntax.d.ts +21 -0
  902. package/lib/esm/types/di/syntax/constraint_helpers.d.ts +6 -0
  903. package/lib/esm/types/di/utils/async.d.ts +3 -0
  904. package/lib/esm/types/di/utils/binding_utils.d.ts +4 -0
  905. package/lib/esm/types/di/utils/clonable.d.ts +3 -0
  906. package/lib/esm/types/di/utils/exceptions.d.ts +2 -0
  907. package/lib/esm/types/di/utils/factory_type.d.ts +5 -0
  908. package/lib/esm/types/di/utils/id.d.ts +2 -0
  909. package/lib/esm/types/di/utils/js.d.ts +1 -0
  910. package/lib/esm/types/di/utils/serialization.d.ts +10 -0
  911. package/lib/esm/types/error/app-error.d.ts +177 -0
  912. package/lib/esm/types/error/base-exception-filter.d.ts +73 -0
  913. package/lib/esm/types/error/error-handler-middleware.d.ts +11 -0
  914. package/lib/esm/types/error/exception-filter-constants.d.ts +9 -0
  915. package/lib/esm/types/error/exception-filter-decorators.d.ts +126 -0
  916. package/lib/esm/types/error/exception-filter-registry.d.ts +38 -0
  917. package/lib/esm/types/error/exception-filter.interface.d.ts +82 -0
  918. package/lib/esm/types/error/exception-handler-middleware.d.ts +35 -0
  919. package/lib/esm/types/error/filters/app-error.filter.d.ts +10 -0
  920. package/lib/esm/types/error/filters/global-exception.filter.d.ts +9 -0
  921. package/lib/esm/types/error/filters/not-found.filter.d.ts +10 -0
  922. package/lib/esm/types/error/filters/validation-error.filter.d.ts +10 -0
  923. package/lib/esm/types/error/index.d.ts +14 -0
  924. package/lib/esm/types/error/not-found.error.d.ts +7 -0
  925. package/lib/esm/types/error/report.d.ts +105 -0
  926. package/lib/esm/types/error/status-code.d.ts +156 -0
  927. package/lib/esm/types/error/utils.d.ts +17 -0
  928. package/lib/esm/types/error/validation.error.d.ts +8 -0
  929. package/lib/esm/types/event/event-decorators.d.ts +199 -0
  930. package/lib/esm/types/event/event-emitter.d.ts +109 -0
  931. package/lib/esm/types/event/event-flow-tracker.d.ts +88 -0
  932. package/lib/esm/types/event/event-recorder.d.ts +121 -0
  933. package/lib/esm/types/event/event-registry.d.ts +84 -0
  934. package/lib/esm/types/event/event.interfaces.d.ts +528 -0
  935. package/lib/esm/types/event/index.d.ts +55 -0
  936. package/lib/esm/types/index.d.ts +27 -0
  937. package/lib/esm/types/interceptor/conditional-interceptor.d.ts +91 -0
  938. package/lib/esm/types/interceptor/execution-context.d.ts +41 -0
  939. package/lib/esm/types/interceptor/index.d.ts +41 -0
  940. package/lib/esm/types/interceptor/interceptor-composition.d.ts +115 -0
  941. package/lib/esm/types/interceptor/interceptor-constants.d.ts +17 -0
  942. package/lib/esm/types/interceptor/interceptor-decorators.d.ts +124 -0
  943. package/lib/esm/types/interceptor/interceptor-executor.d.ts +46 -0
  944. package/lib/esm/types/interceptor/interceptor-registry.d.ts +65 -0
  945. package/lib/esm/types/interceptor/interceptor.interface.d.ts +281 -0
  946. package/lib/esm/types/interceptor/interceptors/index.d.ts +6 -0
  947. package/lib/esm/types/interceptor/interceptors/logging.interceptor.d.ts +28 -0
  948. package/lib/esm/types/interceptor/interceptors/performance.interceptor.d.ts +197 -0
  949. package/lib/esm/types/interceptor/interceptors/timeout.interceptor.d.ts +42 -0
  950. package/lib/esm/types/lazy-loading/index.d.ts +42 -0
  951. package/lib/esm/types/lazy-loading/lazy-load-metrics.d.ts +139 -0
  952. package/lib/esm/types/lazy-loading/lazy-module-loader.d.ts +169 -0
  953. package/lib/esm/types/lazy-loading/lazy-module-manager.d.ts +148 -0
  954. package/lib/esm/types/lazy-loading/lazy-module-warmup.d.ts +130 -0
  955. package/lib/esm/types/lazy-loading/lazy-module.d.ts +168 -0
  956. package/lib/esm/types/lazy-loading/lazy.interfaces.d.ts +480 -0
  957. package/lib/esm/types/lifecycle/index.d.ts +9 -0
  958. package/lib/esm/types/lifecycle/lifecycle-registry.d.ts +213 -0
  959. package/lib/esm/types/lifecycle/lifecycle.interface.d.ts +191 -0
  960. package/lib/esm/types/middleware/content-negotiation/accept-header-parser.d.ts +26 -0
  961. package/lib/esm/types/middleware/content-negotiation/content-negotiation-service.d.ts +64 -0
  962. package/lib/esm/types/middleware/content-negotiation/formatter-registry.d.ts +60 -0
  963. package/lib/esm/types/middleware/content-negotiation/formatters/csv-formatter.d.ts +34 -0
  964. package/lib/esm/types/middleware/content-negotiation/formatters/index.d.ts +8 -0
  965. package/lib/esm/types/middleware/content-negotiation/formatters/json-formatter.d.ts +14 -0
  966. package/lib/esm/types/middleware/content-negotiation/formatters/plain-text-formatter.d.ts +12 -0
  967. package/lib/esm/types/middleware/content-negotiation/formatters/xml-formatter.d.ts +26 -0
  968. package/lib/esm/types/middleware/content-negotiation/formatters/yaml-formatter.d.ts +26 -0
  969. package/lib/esm/types/middleware/content-negotiation/index.d.ts +7 -0
  970. package/lib/esm/types/middleware/index.d.ts +25 -0
  971. package/lib/esm/types/middleware/interfaces/body-parser.interface.d.ts +31 -0
  972. package/lib/esm/types/middleware/interfaces/compression.interface.d.ts +98 -0
  973. package/lib/esm/types/middleware/interfaces/content-negotiation.interface.d.ts +142 -0
  974. package/lib/esm/types/middleware/interfaces/cookie-parser.interface.d.ts +9 -0
  975. package/lib/esm/types/middleware/interfaces/cookie-session/cookie-session.interface.d.ts +57 -0
  976. package/lib/esm/types/middleware/interfaces/cookie-session/keygrip.interface.d.ts +27 -0
  977. package/lib/esm/types/middleware/interfaces/cors.interface.d.ts +57 -0
  978. package/lib/esm/types/middleware/interfaces/express-rate-limit.interface.d.ts +292 -0
  979. package/lib/esm/types/middleware/interfaces/express-session.interface.d.ts +207 -0
  980. package/lib/esm/types/middleware/interfaces/helmet.interface.d.ts +210 -0
  981. package/lib/esm/types/middleware/interfaces/morgan.interface.d.ts +39 -0
  982. package/lib/esm/types/middleware/interfaces/multer.interface.d.ts +253 -0
  983. package/lib/esm/types/middleware/interfaces/serve-favicon.interface.d.ts +11 -0
  984. package/lib/esm/types/middleware/interfaces/serve-static.interface.d.ts +69 -0
  985. package/lib/esm/types/middleware/interfaces/url-encoded.interface.d.ts +37 -0
  986. package/lib/esm/types/middleware/middleware-config.d.ts +574 -0
  987. package/lib/esm/types/middleware/middleware-interface.d.ts +691 -0
  988. package/lib/esm/types/middleware/middleware-presets.d.ts +90 -0
  989. package/lib/esm/types/middleware/middleware-profiler.d.ts +199 -0
  990. package/lib/esm/types/middleware/middleware-registry.d.ts +103 -0
  991. package/lib/esm/types/middleware/middleware-resolver.d.ts +159 -0
  992. package/lib/esm/types/middleware/middleware-service.d.ts +767 -0
  993. package/lib/esm/types/middleware/middleware-utils.d.ts +145 -0
  994. package/lib/esm/types/middleware/upload-registry.d.ts +50 -0
  995. package/lib/esm/types/path-resolver/index.d.ts +80 -0
  996. package/lib/esm/types/provider/db-in-memory/adapter/adapter.interface.d.ts +222 -0
  997. package/lib/esm/types/provider/db-in-memory/adapter/in-memory.adapter.d.ts +239 -0
  998. package/lib/esm/types/provider/db-in-memory/adapter/index.d.ts +6 -0
  999. package/lib/esm/types/provider/db-in-memory/base-repo.repository.d.ts +18 -0
  1000. package/lib/esm/types/provider/db-in-memory/db-in-memory.interface.d.ts +43 -0
  1001. package/lib/esm/types/provider/db-in-memory/db-in-memory.provider.d.ts +39 -0
  1002. package/lib/esm/types/provider/db-in-memory/db-in-memory.types.d.ts +14 -0
  1003. package/lib/esm/types/provider/db-in-memory/db.provider.d.ts +281 -0
  1004. package/lib/esm/types/provider/db-in-memory/index.d.ts +63 -0
  1005. package/lib/esm/types/provider/db-in-memory/query/index.d.ts +6 -0
  1006. package/lib/esm/types/provider/db-in-memory/query/query-engine.d.ts +101 -0
  1007. package/lib/esm/types/provider/db-in-memory/query/query.types.d.ts +318 -0
  1008. package/lib/esm/types/provider/db-in-memory/schema/decorators.d.ts +314 -0
  1009. package/lib/esm/types/provider/db-in-memory/schema/entity.interface.d.ts +60 -0
  1010. package/lib/esm/types/provider/db-in-memory/schema/index.d.ts +6 -0
  1011. package/lib/esm/types/provider/db-in-memory/storage/index.d.ts +5 -0
  1012. package/lib/esm/types/provider/db-in-memory/storage/memory-store.d.ts +326 -0
  1013. package/lib/esm/types/provider/dto-validator/dto-validator.provider.d.ts +10 -0
  1014. package/lib/esm/types/provider/dto-validator/package-resolver.d.ts +7 -0
  1015. package/lib/esm/types/provider/index.d.ts +7 -0
  1016. package/lib/esm/types/provider/logger/decorators/index.d.ts +1 -0
  1017. package/lib/esm/types/provider/logger/decorators/log-performance.decorator.d.ts +49 -0
  1018. package/lib/esm/types/provider/logger/index.d.ts +17 -0
  1019. package/lib/esm/types/provider/logger/logger.banner.d.ts +94 -0
  1020. package/lib/esm/types/provider/logger/logger.config.d.ts +55 -0
  1021. package/lib/esm/types/provider/logger/logger.context.d.ts +189 -0
  1022. package/lib/esm/types/provider/logger/logger.flow.d.ts +165 -0
  1023. package/lib/esm/types/provider/logger/logger.formatter.d.ts +44 -0
  1024. package/lib/esm/types/provider/logger/logger.grouping.d.ts +124 -0
  1025. package/lib/esm/types/provider/logger/logger.health.d.ts +123 -0
  1026. package/lib/esm/types/provider/logger/logger.metrics-collector.d.ts +44 -0
  1027. package/lib/esm/types/provider/logger/logger.metrics.d.ts +162 -0
  1028. package/lib/esm/types/provider/logger/logger.performance.d.ts +179 -0
  1029. package/lib/esm/types/provider/logger/logger.provider.d.ts +332 -0
  1030. package/lib/esm/types/provider/logger/logger.query.d.ts +232 -0
  1031. package/lib/esm/types/provider/logger/logger.redaction.d.ts +169 -0
  1032. package/lib/esm/types/provider/logger/logger.suggestions.d.ts +124 -0
  1033. package/lib/esm/types/provider/logger/transports/console.transport.d.ts +49 -0
  1034. package/lib/esm/types/provider/logger/transports/file.transport.d.ts +87 -0
  1035. package/lib/esm/types/provider/logger/transports/http-server.d.ts +88 -0
  1036. package/lib/esm/types/provider/logger/transports/http.transport.d.ts +74 -0
  1037. package/lib/esm/types/provider/logger/transports/index.d.ts +5 -0
  1038. package/lib/esm/types/provider/logger/transports/transport.interface.d.ts +31 -0
  1039. package/lib/esm/types/provider/logger/utils/index.d.ts +2 -0
  1040. package/lib/esm/types/provider/logger/utils/log-entry.d.ts +82 -0
  1041. package/lib/esm/types/provider/logger/utils/log-levels.d.ts +53 -0
  1042. package/lib/esm/types/provider/provider-manager.d.ts +208 -0
  1043. package/lib/esm/types/provider/provider-registry.d.ts +192 -0
  1044. package/lib/esm/types/provider/provider.interface.d.ts +337 -0
  1045. package/lib/esm/types/provider/validation/adapters/class-validator.adapter.d.ts +68 -0
  1046. package/lib/esm/types/provider/validation/adapters/index.d.ts +10 -0
  1047. package/lib/esm/types/provider/validation/helpful-error-formatter.d.ts +110 -0
  1048. package/lib/esm/types/provider/validation/index.d.ts +19 -0
  1049. package/lib/esm/types/provider/validation/smart-field-detector.d.ts +91 -0
  1050. package/lib/esm/types/provider/validation/type-inference.d.ts +81 -0
  1051. package/lib/esm/types/provider/validation/validation-registry.d.ts +105 -0
  1052. package/lib/esm/types/provider/validation/validation.interface.d.ts +178 -0
  1053. package/lib/esm/types/render/adapters/base-adapter.d.ts +95 -0
  1054. package/lib/esm/types/render/adapters/ejs-adapter.d.ts +57 -0
  1055. package/lib/esm/types/render/adapters/handlebars-adapter.d.ts +74 -0
  1056. package/lib/esm/types/render/adapters/index.d.ts +12 -0
  1057. package/lib/esm/types/render/adapters/pug-adapter.d.ts +57 -0
  1058. package/lib/esm/types/render/adapters/react-adapter.d.ts +99 -0
  1059. package/lib/esm/types/render/features/auto-detection.d.ts +58 -0
  1060. package/lib/esm/types/render/features/hot-reload.d.ts +65 -0
  1061. package/lib/esm/types/render/features/index.d.ts +12 -0
  1062. package/lib/esm/types/render/features/streaming.d.ts +39 -0
  1063. package/lib/esm/types/render/features/type-generator.d.ts +64 -0
  1064. package/lib/esm/types/render/features/view-debugger.d.ts +42 -0
  1065. package/lib/esm/types/render/index.d.ts +50 -0
  1066. package/lib/esm/types/render/presets/index.d.ts +119 -0
  1067. package/lib/esm/types/render/render-config.d.ts +213 -0
  1068. package/lib/esm/types/render/render-interface.d.ts +126 -0
  1069. package/lib/esm/types/render/render-registry.d.ts +86 -0
  1070. package/lib/esm/types/render/render-service.d.ts +157 -0
  1071. package/lib/esm/types/render/utils/cache-manager.d.ts +106 -0
  1072. package/lib/esm/types/render/utils/index.d.ts +11 -0
  1073. package/lib/esm/types/render/utils/package-resolver.d.ts +57 -0
  1074. package/lib/esm/types/render/utils/view-scanner.d.ts +74 -0
  1075. package/lib/esm/types/testing/create-test-app.d.ts +71 -0
  1076. package/lib/esm/types/testing/create-test-database.d.ts +100 -0
  1077. package/lib/esm/types/testing/fluent-request.d.ts +37 -0
  1078. package/lib/esm/types/testing/index.d.ts +93 -0
  1079. package/lib/esm/types/testing/load-test.d.ts +139 -0
  1080. package/lib/esm/types/testing/matchers.d.ts +184 -0
  1081. package/lib/esm/types/testing/mock-context.d.ts +117 -0
  1082. package/lib/esm/types/testing/mock-provider.d.ts +93 -0
  1083. package/lib/esm/types/testing/snapshot-request.d.ts +46 -0
  1084. package/lib/esm/types/testing/testing.interfaces.d.ts +948 -0
  1085. package/lib/esm/types/utils/node-require.d.ts +11 -0
  1086. package/lib/esm/utils/node-require.js +56 -0
  1087. package/lib/package.json +152 -151
  1088. package/package.json +152 -151
  1089. package/lib/cjs/provider/environment/env-validator.provider.js +0 -100
  1090. package/lib/cjs/types/provider/environment/env-validator.provider.d.ts +0 -39
@@ -0,0 +1,1797 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { static as expressStatic, json, urlencoded, } from "express";
8
+ import { injectable } from "../di/inversify.js";
9
+ import defaultErrorHandler from "../error/error-handler-middleware.js";
10
+ import { ExceptionHandlerMiddleware } from "../error/exception-handler-middleware.js";
11
+ import { Logger } from "../provider/logger/logger.provider.js";
12
+ import { middlewareResolver, isMiddlewareAvailable, isPackageAvailable, resolvePackage, getResolverStartupWarnings, clearResolverStartupWarnings, } from "./middleware-resolver.js";
13
+ import { getMiddlewareRegistry, } from "./middleware-registry.js";
14
+ import { setGlobalUploadConfig } from "./upload-registry.js";
15
+ import { ContentNegotiationService } from "./content-negotiation/content-negotiation-service.js";
16
+ import { MiddlewareProfiler, } from "./middleware-profiler.js";
17
+ /**
18
+ * Abstract class for creating custom Expresso middleware.
19
+ *
20
+ * @layer public
21
+ * @audience application-developers
22
+ * @concept custom-middleware
23
+ * @difficulty intermediate
24
+ *
25
+ * @summary Quick Start
26
+ * Create custom middleware classes by extending this abstract class.
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * class AuthMiddleware extends ExpressoMiddleware {
31
+ * use(req: Request, res: Response, next: NextFunction): void {
32
+ * const token = req.headers.authorization;
33
+ * if (!token) {
34
+ * return res.status(401).json({ error: "Unauthorized" });
35
+ * }
36
+ * next();
37
+ * }
38
+ * }
39
+ *
40
+ * // Use in application
41
+ * services.Middleware.addMiddleware(new AuthMiddleware());
42
+ * ```
43
+ *
44
+ * @layer internal
45
+ * @audience framework-developers
46
+ *
47
+ * **Internal Behavior**
48
+ * - Provides `name` getter (returns constructor name)
49
+ * - Abstract `use()` method must be implemented
50
+ * - Compatible with Express middleware signature
51
+ *
52
+ * @see {@link IMiddleware.addMiddleware} for adding middleware
53
+ *
54
+ * @public API
55
+ */
56
+ let ExpressoMiddleware = class ExpressoMiddleware {
57
+ get name() {
58
+ return this.constructor.name;
59
+ }
60
+ };
61
+ ExpressoMiddleware = __decorate([
62
+ injectable()
63
+ ], ExpressoMiddleware);
64
+ export { ExpressoMiddleware };
65
+ /**
66
+ * MiddlewareType Enum
67
+ *
68
+ * The MiddlewareType enum represents the various types of middleware that can be added to the middleware collection.
69
+ * - Config: Middleware configuration object.
70
+ * - ExpressHandler: Express request handler function.
71
+ * - IExpressoMiddleware: Custom Expresso middleware.
72
+ */
73
+ var MiddlewareType;
74
+ (function (MiddlewareType) {
75
+ MiddlewareType[MiddlewareType["Config"] = 0] = "Config";
76
+ MiddlewareType[MiddlewareType["ExpressHandler"] = 1] = "ExpressHandler";
77
+ MiddlewareType[MiddlewareType["IExpressoMiddleware"] = 2] = "IExpressoMiddleware";
78
+ })(MiddlewareType || (MiddlewareType = {}));
79
+ /**
80
+ * Mapping of known middleware names to categories.
81
+ */
82
+ const MIDDLEWARE_CATEGORIES = {
83
+ // Parsers
84
+ jsonParser: "parser",
85
+ urlencodedParser: "parser",
86
+ bodyParser: "parser",
87
+ cookieParser: "parser",
88
+ // Security
89
+ cors: "security",
90
+ helmet: "security",
91
+ rateLimit: "security",
92
+ // Session
93
+ session: "session",
94
+ cookieSession: "session",
95
+ // Logging
96
+ morgan: "logging",
97
+ RequestLoggingMiddleware: "logging",
98
+ // Static
99
+ serveStatic: "static",
100
+ serveFavicon: "static",
101
+ // Compression/Other
102
+ compression: "other",
103
+ multer: "other",
104
+ };
105
+ /**
106
+ * Category icons for visual pipeline display.
107
+ */
108
+ const CATEGORY_ICONS = {
109
+ parser: "📦",
110
+ security: "🔒",
111
+ logging: "📝",
112
+ validation: "✅",
113
+ error: "⚠️",
114
+ session: "🔑",
115
+ static: "📁",
116
+ other: "⚙️",
117
+ };
118
+ /**
119
+ * Middleware service for managing Express middleware pipeline.
120
+ *
121
+ * @layer public
122
+ * @audience application-developers
123
+ * @concept middleware-management
124
+ * @difficulty beginner
125
+ *
126
+ * @summary Quick Start
127
+ * Configure and manage middleware for your ExpressoTS application.
128
+ *
129
+ * @example
130
+ * ```typescript
131
+ * @provide(App)
132
+ * export class App extends AppFactory {
133
+ * configureServices(services: IService): void {
134
+ * // Add built-in middleware
135
+ * services.Middleware.addCors();
136
+ * services.Middleware.addBodyParser();
137
+ * services.Middleware.addHelmet();
138
+ *
139
+ * // Add custom middleware
140
+ * services.Middleware.addMiddleware((req, res, next) => {
141
+ * // Custom logic
142
+ * next();
143
+ * });
144
+ * }
145
+ * }
146
+ * ```
147
+ *
148
+ * **Features:**
149
+ * - Built-in middleware helpers (CORS, Helmet, Body Parser, etc.)
150
+ * - Custom middleware support
151
+ * - Middleware presets for common configurations
152
+ * - Conditional middleware execution
153
+ * - Content negotiation
154
+ * - Request validation
155
+ * - Performance profiling
156
+ *
157
+ * @layer internal
158
+ * @audience framework-developers
159
+ *
160
+ * **Internal Architecture**
161
+ *
162
+ * Middleware service:
163
+ * - Maintains ordered pipeline array
164
+ * - Uses Map for O(1) middleware lookup
165
+ * - Caches sorted pipeline for performance
166
+ * - Supports conditional middleware execution
167
+ * - Integrates with middleware resolver for auto-discovery
168
+ *
169
+ * **Design Decisions**
170
+ * - Singleton pattern (one instance per app)
171
+ * - Ordered pipeline (insertion order preserved)
172
+ * - Cached sorting (invalidated on changes)
173
+ * - Built-in middleware auto-discovery
174
+ *
175
+ * @see {@link IMiddleware} for interface definition
176
+ * @see {@link middlewareResolver} for middleware resolution
177
+ *
178
+ * @layer advanced
179
+ * @audience power-users
180
+ *
181
+ * **Advanced Usage**
182
+ *
183
+ * Conditional middleware:
184
+ * ```typescript
185
+ * services.Middleware.addConditional({
186
+ * middleware: rateLimiter,
187
+ * condition: (req) => !req.headers["x-internal-service"],
188
+ * name: "conditional-rate-limit"
189
+ * });
190
+ * ```
191
+ *
192
+ * Middleware presets:
193
+ * ```typescript
194
+ * services.Middleware.usePreset("api", {
195
+ * overrides: {
196
+ * Cors: { origin: "https://myapp.com" }
197
+ * }
198
+ * });
199
+ * ```
200
+ *
201
+ * @public API
202
+ */
203
+ export class Middleware {
204
+ // O(1) lookup map for middleware by name
205
+ middlewareMap = new Map();
206
+ // Ordered pipeline array
207
+ middlewarePipeline = [];
208
+ // Insertion order counter for stable sorting
209
+ insertionOrder = 0;
210
+ // Cached sorted pipeline
211
+ sortedPipelineCache = null;
212
+ // Error handler
213
+ errorHandler;
214
+ // Singleton logger (renamed to avoid conflict with logger() method)
215
+ _logger;
216
+ // Content negotiation service
217
+ contentNegotiationService;
218
+ // Profiler instance
219
+ profiler = null;
220
+ // Profiling enabled flag
221
+ profilingEnabled = false;
222
+ // v4: Custom presets storage
223
+ customPresets = new Map();
224
+ // v4: Middleware registry reference
225
+ registry = getMiddlewareRegistry();
226
+ // v4: Buffered startup logs (displayed after banner)
227
+ startupLogs = [];
228
+ // v4: Track registered middleware names for summary
229
+ registeredMiddlewareNames = [];
230
+ constructor() {
231
+ this._logger = new Logger();
232
+ }
233
+ /**
234
+ * Buffer a startup log message to be displayed after the banner.
235
+ * Only buffers in development mode.
236
+ * @param message - The message to buffer
237
+ * @param type - Log type: "info" or "warn"
238
+ */
239
+ bufferStartupLog(message, type = "info") {
240
+ this.startupLogs.push({ message, type });
241
+ }
242
+ /**
243
+ * Get all buffered startup logs for display after the banner.
244
+ * Includes warnings from the middleware resolver (e.g., missing packages).
245
+ * @returns Array of startup log entries
246
+ */
247
+ getStartupLogs() {
248
+ // Combine service logs with resolver warnings
249
+ const logs = [...this.startupLogs, ...getResolverStartupWarnings()];
250
+ // Add registered middleware summary at the end if any were registered
251
+ if (this.registeredMiddlewareNames.length > 0) {
252
+ logs.push({
253
+ message: `Registered: ${this.registeredMiddlewareNames.join(", ")}`,
254
+ type: "info",
255
+ });
256
+ }
257
+ return logs;
258
+ }
259
+ /**
260
+ * Clear all buffered startup logs.
261
+ */
262
+ clearStartupLogs() {
263
+ this.startupLogs = [];
264
+ this.registeredMiddlewareNames = [];
265
+ clearResolverStartupWarnings();
266
+ }
267
+ // ═══════════════════════════════════════════════════════════════════════════
268
+ // PRIVATE HELPER METHODS
269
+ // ═══════════════════════════════════════════════════════════════════════════
270
+ /**
271
+ * Retrieves the type of the middleware.
272
+ *
273
+ * @param middleware - The middleware to be checked.
274
+ * @returns The type of the middleware.
275
+ */
276
+ getMiddlewareType(middleware) {
277
+ if (middleware && typeof middleware === "object" && "path" in middleware) {
278
+ return MiddlewareType.Config;
279
+ }
280
+ if (typeof middleware === "function") {
281
+ return MiddlewareType.ExpressHandler;
282
+ }
283
+ return MiddlewareType.IExpressoMiddleware;
284
+ }
285
+ /**
286
+ * Checks if a middleware with the given name exists in the middleware collection.
287
+ * Uses O(1) Map lookup instead of O(n) array scan.
288
+ *
289
+ * @param middlewareName - The name of the middleware to be checked.
290
+ * @returns A boolean value indicating whether the middleware exists or not.
291
+ */
292
+ middlewareExists(middlewareName) {
293
+ return this.middlewareMap.has(middlewareName);
294
+ }
295
+ /**
296
+ * Invalidate the sorted pipeline cache.
297
+ */
298
+ invalidateCache() {
299
+ this.sortedPipelineCache = null;
300
+ }
301
+ /**
302
+ * Generic method to add built-in middleware with consistent pattern.
303
+ *
304
+ * @param name - Middleware name for lookup
305
+ * @param category - Middleware category
306
+ * @param middlewareFactory - Factory function that creates the middleware
307
+ * @returns True if middleware was added, false if skipped
308
+ */
309
+ addBuiltInMiddleware(name, category, middlewareFactory) {
310
+ if (this.middlewareExists(name)) {
311
+ this._logger.warn(`[${name}] already exists. Skipping...`, "middleware-service");
312
+ return false;
313
+ }
314
+ const middleware = middlewareFactory();
315
+ if (!middleware) {
316
+ return false;
317
+ }
318
+ const entry = {
319
+ order: this.insertionOrder++,
320
+ middleware,
321
+ name,
322
+ category,
323
+ isBuiltIn: true,
324
+ };
325
+ this.middlewarePipeline.push(entry);
326
+ this.middlewareMap.set(name, entry);
327
+ this.invalidateCache();
328
+ return true;
329
+ }
330
+ /**
331
+ * Get middleware name from a pipeline entry.
332
+ */
333
+ getMiddlewareName(m) {
334
+ if (m.name) {
335
+ return m.name;
336
+ }
337
+ const middlewareType = this.getMiddlewareType(m.middleware);
338
+ if (middlewareType === MiddlewareType.Config) {
339
+ const config = m.middleware;
340
+ return config.path || "ConfigMiddleware";
341
+ }
342
+ else if (middlewareType === MiddlewareType.IExpressoMiddleware) {
343
+ return m.middleware.constructor.name;
344
+ }
345
+ else {
346
+ return m.middleware?.name || "Anonymous";
347
+ }
348
+ }
349
+ /**
350
+ * Get the category of a middleware.
351
+ */
352
+ getMiddlewareCategory(name,
353
+ // Parameter reserved for future use (built-in middleware differentiation)
354
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
355
+ _isBuiltIn) {
356
+ // Check known categories
357
+ if (MIDDLEWARE_CATEGORIES[name]) {
358
+ return MIDDLEWARE_CATEGORIES[name];
359
+ }
360
+ // Try to infer from name
361
+ const lowerName = name.toLowerCase();
362
+ if (lowerName.includes("parser") ||
363
+ lowerName.includes("body") ||
364
+ lowerName.includes("json")) {
365
+ return "parser";
366
+ }
367
+ if (lowerName.includes("cors") ||
368
+ lowerName.includes("helmet") ||
369
+ lowerName.includes("auth") ||
370
+ lowerName.includes("security")) {
371
+ return "security";
372
+ }
373
+ if (lowerName.includes("log") ||
374
+ lowerName.includes("morgan") ||
375
+ lowerName.includes("request")) {
376
+ return "logging";
377
+ }
378
+ if (lowerName.includes("valid")) {
379
+ return "validation";
380
+ }
381
+ if (lowerName.includes("error") || lowerName.includes("handler")) {
382
+ return "error";
383
+ }
384
+ if (lowerName.includes("session") || lowerName.includes("cookie")) {
385
+ return "session";
386
+ }
387
+ if (lowerName.includes("static") || lowerName.includes("favicon")) {
388
+ return "static";
389
+ }
390
+ return "other";
391
+ }
392
+ /**
393
+ * Get the path for a middleware.
394
+ */
395
+ getMiddlewarePath(m) {
396
+ const middlewareType = this.getMiddlewareType(m.middleware);
397
+ if (middlewareType === MiddlewareType.Config) {
398
+ return m.middleware.path || "Global";
399
+ }
400
+ return "Global";
401
+ }
402
+ // ═══════════════════════════════════════════════════════════════════════════
403
+ // INTERNAL MIDDLEWARE HELPERS (used by v4 unified methods)
404
+ // ═══════════════════════════════════════════════════════════════════════════
405
+ /**
406
+ * Internal: Sets up Multer middleware for handling multipart/form-data.
407
+ * Used by upload() method.
408
+ * @internal
409
+ */
410
+ setupMulter(options) {
411
+ const multerMiddleware = middlewareResolver("multer", options);
412
+ if (multerMiddleware) {
413
+ return multerMiddleware;
414
+ }
415
+ return null;
416
+ }
417
+ /**
418
+ * Internal: Adds a middleware to serve static files.
419
+ * Used by static() method.
420
+ * @internal
421
+ */
422
+ serveStatic(root, options) {
423
+ this.addBuiltInMiddleware("serveStatic", "static", () => expressStatic(root, options));
424
+ }
425
+ // ═══════════════════════════════════════════════════════════════════════════
426
+ // CUSTOM MIDDLEWARE METHODS
427
+ // ═══════════════════════════════════════════════════════════════════════════
428
+ /**
429
+ * Helper method to add middleware configuration objects.
430
+ */
431
+ addConfigMiddleware(middleware) {
432
+ const config = middleware;
433
+ if (config.middlewares.length === 0) {
434
+ this._logger.warn(`No middlewares in the route [${config.path}]. Skipping...`, "middleware-service");
435
+ return;
436
+ }
437
+ const configKey = config.path || `config_${this.insertionOrder}`;
438
+ if (this.middlewareExists(configKey)) {
439
+ this._logger.warn(`[${config.path}] route already exists. Skipping...`, "middleware-service");
440
+ return;
441
+ }
442
+ const entry = {
443
+ order: this.insertionOrder++,
444
+ middleware: config,
445
+ name: configKey,
446
+ category: "other",
447
+ isBuiltIn: false,
448
+ };
449
+ this.middlewarePipeline.push(entry);
450
+ this.middlewareMap.set(configKey, entry);
451
+ this.invalidateCache();
452
+ }
453
+ /**
454
+ * Helper method to add express request handler functions.
455
+ */
456
+ addExpressHandlerMiddleware(middleware) {
457
+ const middlewareName = middleware?.name || `anonymous_${this.insertionOrder}`;
458
+ if (this.middlewareExists(middlewareName) && middleware?.name) {
459
+ this._logger.warn(`[${middlewareName}] already exists. Skipping...`, "middleware-service");
460
+ return;
461
+ }
462
+ const entry = {
463
+ order: this.insertionOrder++,
464
+ middleware,
465
+ name: middlewareName,
466
+ category: this.getMiddlewareCategory(middlewareName),
467
+ isBuiltIn: false,
468
+ };
469
+ this.middlewarePipeline.push(entry);
470
+ this.middlewareMap.set(middlewareName, entry);
471
+ this.invalidateCache();
472
+ }
473
+ /**
474
+ * Helper method to add custom Expresso middleware.
475
+ */
476
+ addIExpressoMiddleware(middleware) {
477
+ const middlewareName = middleware.constructor.name;
478
+ if (this.middlewareExists(middlewareName)) {
479
+ this._logger.warn(`[${middlewareName}] already exists. Skipping...`, "middleware-service");
480
+ return;
481
+ }
482
+ const entry = {
483
+ order: this.insertionOrder++,
484
+ middleware,
485
+ name: middlewareName,
486
+ category: this.getMiddlewareCategory(middlewareName),
487
+ isBuiltIn: false,
488
+ };
489
+ this.middlewarePipeline.push(entry);
490
+ this.middlewareMap.set(middlewareName, entry);
491
+ this.invalidateCache();
492
+ }
493
+ /**
494
+ * Adds a middleware to the middleware collection.
495
+ *
496
+ * @param options - The Express request handler function, middleware configuration object,
497
+ * or a custom Expresso middleware.
498
+ *
499
+ * @example Express Handler
500
+ * ```typescript
501
+ * const middleware = (req, res, next) => {
502
+ * // Your middleware logic here
503
+ * next();
504
+ * }
505
+ * ```
506
+ *
507
+ * @example Middleware Configuration Object
508
+ * ```typescript
509
+ * const middleware = {
510
+ * path: "/",
511
+ * middlewares: [] // Array of Express Handlers
512
+ * }
513
+ * ```
514
+ *
515
+ * @example Expresso Middleware
516
+ * ```typescript
517
+ * class CustomMiddleware implements IExpressoMiddleware {
518
+ * use(req: Request, res: Response, next: NextFunction): Promise<void> | void {
519
+ * // Your middleware logic here
520
+ * next();
521
+ * }
522
+ * }
523
+ * ```
524
+ */
525
+ addMiddleware(options) {
526
+ switch (this.getMiddlewareType(options)) {
527
+ case MiddlewareType.Config:
528
+ this.addConfigMiddleware(options);
529
+ break;
530
+ case MiddlewareType.ExpressHandler:
531
+ this.addExpressHandlerMiddleware(options);
532
+ break;
533
+ case MiddlewareType.IExpressoMiddleware:
534
+ this.addIExpressoMiddleware(options);
535
+ break;
536
+ }
537
+ }
538
+ // ═══════════════════════════════════════════════════════════════════════════
539
+ // CONDITIONAL MIDDLEWARE
540
+ // ═══════════════════════════════════════════════════════════════════════════
541
+ /**
542
+ * Add middleware that only executes when a condition is met.
543
+ *
544
+ * @param config - Conditional middleware configuration
545
+ *
546
+ * @example
547
+ * ```typescript
548
+ * // Only apply rate limiting for non-internal requests
549
+ * middleware.addConditional({
550
+ * middleware: rateLimiter,
551
+ * condition: (req) => !req.headers["x-internal-service"],
552
+ * name: "conditional-rate-limit"
553
+ * });
554
+ *
555
+ * // Only apply auth for non-public routes
556
+ * middleware.addConditional({
557
+ * middleware: authMiddleware,
558
+ * condition: (req) => !req.path.startsWith("/public"),
559
+ * name: "conditional-auth"
560
+ * });
561
+ * ```
562
+ *
563
+ * @public API
564
+ */
565
+ addConditional(config) {
566
+ const name = config.name || `conditional_${this.insertionOrder}`;
567
+ if (this.middlewareExists(name)) {
568
+ this._logger.warn(`[${name}] already exists. Skipping...`, "middleware-service");
569
+ return;
570
+ }
571
+ // Wrap the middleware with the condition check
572
+ const wrappedMiddleware = (req, res, next) => {
573
+ if (config.condition(req)) {
574
+ return config.middleware(req, res, next);
575
+ }
576
+ next();
577
+ };
578
+ const entry = {
579
+ order: this.insertionOrder++,
580
+ middleware: wrappedMiddleware,
581
+ name,
582
+ category: config.category || "other",
583
+ isBuiltIn: false,
584
+ condition: config.condition,
585
+ };
586
+ this.middlewarePipeline.push(entry);
587
+ this.middlewareMap.set(name, entry);
588
+ this.invalidateCache();
589
+ }
590
+ // ═══════════════════════════════════════════════════════════════════════════
591
+ // ERROR HANDLER
592
+ // ═══════════════════════════════════════════════════════════════════════════
593
+ /**
594
+ * Configures the error handling middleware for the application.
595
+ *
596
+ * @param options - The object containing the configuration options for the error handler middleware.
597
+ */
598
+ setErrorHandler(options = {}) {
599
+ const { errorHandler: errorHandling, showStackTrace, enableExceptionFilters = false, container, } = options;
600
+ // Custom error handler takes precedence (backward compatibility)
601
+ if (errorHandling) {
602
+ this.errorHandler = errorHandling;
603
+ if (enableExceptionFilters) {
604
+ this._logger.warn("Custom errorHandler provided - exception filters are disabled. Remove errorHandler to use exception filters.", "middleware-service");
605
+ }
606
+ return;
607
+ }
608
+ // If exception filters are enabled, wrap the error handler with ExceptionHandlerMiddleware
609
+ if (enableExceptionFilters && container) {
610
+ try {
611
+ const exceptionHandler = new ExceptionHandlerMiddleware(container, undefined, showStackTrace ?? false);
612
+ this.errorHandler = exceptionHandler.handle;
613
+ }
614
+ catch (error) {
615
+ this._logger.warn(`Failed to enable exception filters: ${error}. Falling back to default error handler.`, "middleware-service");
616
+ // Fall back to default handler
617
+ this.errorHandler = (error, req, res, next) => {
618
+ defaultErrorHandler(error, res, next, showStackTrace);
619
+ };
620
+ }
621
+ }
622
+ else {
623
+ // Default error handler
624
+ this.errorHandler = (error, req, res, next) => {
625
+ defaultErrorHandler(error, res, next, showStackTrace);
626
+ };
627
+ }
628
+ // Warn if enableExceptionFilters is true but container is not provided
629
+ if (enableExceptionFilters && !container) {
630
+ this._logger.warn("enableExceptionFilters is true but container is not provided. Exception filters will not be enabled.", "middleware-service");
631
+ }
632
+ }
633
+ /**
634
+ * Gets the configured error handler middleware.
635
+ *
636
+ * @returns The error handler middleware.
637
+ */
638
+ getErrorHandler() {
639
+ return this.errorHandler;
640
+ }
641
+ // ═══════════════════════════════════════════════════════════════════════════
642
+ // CONTENT NEGOTIATION
643
+ // ═══════════════════════════════════════════════════════════════════════════
644
+ /**
645
+ * Configures content negotiation middleware for automatic response format selection.
646
+ *
647
+ * @param options - Configuration options for content negotiation
648
+ * @public API
649
+ */
650
+ addContentNegotiation(options) {
651
+ if (!this.contentNegotiationService) {
652
+ this.contentNegotiationService = new ContentNegotiationService();
653
+ }
654
+ this.contentNegotiationService.configure(options || {});
655
+ }
656
+ /**
657
+ * Gets the content negotiation service instance.
658
+ * @returns Content negotiation service or undefined if not configured
659
+ * @internal
660
+ */
661
+ getContentNegotiationService() {
662
+ return this.contentNegotiationService;
663
+ }
664
+ // ═══════════════════════════════════════════════════════════════════════════
665
+ // VALIDATION
666
+ // ═══════════════════════════════════════════════════════════════════════════
667
+ // Validation Service - will be set by adapter-express
668
+ validationServiceFactory;
669
+ /**
670
+ * Configures validation for automatic request parameter validation.
671
+ *
672
+ * @param options - Configuration options for validation
673
+ * @public API
674
+ */
675
+ addValidation(options) {
676
+ this._validationConfig = options || {};
677
+ }
678
+ /**
679
+ * Gets the validation configuration.
680
+ * @internal
681
+ */
682
+ getValidationConfig() {
683
+ return this
684
+ ._validationConfig;
685
+ }
686
+ /**
687
+ * Sets the validation service factory (called by adapter-express).
688
+ * @internal
689
+ */
690
+ setValidationServiceFactory(factory) {
691
+ this.validationServiceFactory = factory;
692
+ }
693
+ /**
694
+ * Gets the validation service instance.
695
+ * @internal
696
+ */
697
+ getValidationService() {
698
+ return this.validationServiceFactory?.();
699
+ }
700
+ // ═══════════════════════════════════════════════════════════════════════════
701
+ // PROFILING
702
+ // ═══════════════════════════════════════════════════════════════════════════
703
+ /**
704
+ * Enable middleware profiling to track execution times.
705
+ *
706
+ * @param options - Profiler options
707
+ * @returns The profiler instance
708
+ *
709
+ * @example
710
+ * ```typescript
711
+ * const profiler = middleware.enableProfiling();
712
+ *
713
+ * // Later, get metrics
714
+ * const stats = profiler.getStats();
715
+ * console.log(stats.metrics);
716
+ * ```
717
+ *
718
+ * @public API
719
+ */
720
+ enableProfiling(options) {
721
+ if (!this.profiler) {
722
+ this.profiler = new MiddlewareProfiler(options);
723
+ }
724
+ this.profilingEnabled = true;
725
+ return this.profiler;
726
+ }
727
+ /**
728
+ * Disable middleware profiling.
729
+ * @public API
730
+ */
731
+ disableProfiling() {
732
+ this.profilingEnabled = false;
733
+ if (this.profiler) {
734
+ this.profiler.setEnabled(false);
735
+ }
736
+ }
737
+ /**
738
+ * Get the profiler instance.
739
+ * @returns The profiler or null if not enabled
740
+ * @public API
741
+ */
742
+ getProfiler() {
743
+ return this.profiler;
744
+ }
745
+ /**
746
+ * Get profiling metrics for all middleware.
747
+ *
748
+ * @returns Array of middleware metrics or empty array if profiling is disabled
749
+ * @public API
750
+ */
751
+ getProfilingMetrics() {
752
+ return this.profiler?.getAllMetrics() ?? [];
753
+ }
754
+ /**
755
+ * Get profiling statistics.
756
+ *
757
+ * @returns Profiler statistics or null if profiling is disabled
758
+ * @public API
759
+ */
760
+ getProfilingStats() {
761
+ return this.profiler?.getStats() ?? null;
762
+ }
763
+ // ═══════════════════════════════════════════════════════════════════════════
764
+ // HEALTH CHECK
765
+ // ═══════════════════════════════════════════════════════════════════════════
766
+ /**
767
+ * Add a health check endpoint that reports middleware status.
768
+ *
769
+ * @param options - Health check options
770
+ *
771
+ * @example
772
+ * ```typescript
773
+ * middleware.addHealthCheck({
774
+ * path: "/health/middleware",
775
+ * includeMetrics: true
776
+ * });
777
+ * ```
778
+ *
779
+ * @public API
780
+ */
781
+ addHealthCheck(options) {
782
+ const path = options?.path ?? "/health/middleware";
783
+ const healthHandler = (req, res) => {
784
+ const info = this.getPipelineInfo();
785
+ const response = {
786
+ status: "healthy",
787
+ timestamp: new Date().toISOString(),
788
+ middleware: {
789
+ total: info.total,
790
+ byCategory: info.byCategory,
791
+ },
792
+ };
793
+ if (options?.detailed) {
794
+ response.middleware = {
795
+ ...response.middleware,
796
+ entries: info.entries.map((e) => ({
797
+ name: e.name,
798
+ type: e.type,
799
+ category: e.category,
800
+ path: e.path,
801
+ })),
802
+ };
803
+ }
804
+ if (options?.includeMetrics && this.profiler) {
805
+ response.metrics = this.profiler.getStats();
806
+ }
807
+ res.json(response);
808
+ };
809
+ this.addMiddleware({ path, middlewares: [healthHandler] });
810
+ }
811
+ // ═══════════════════════════════════════════════════════════════════════════
812
+ // PIPELINE RETRIEVAL
813
+ // ═══════════════════════════════════════════════════════════════════════════
814
+ /**
815
+ * Retrieves middleware pipeline in the order they were added.
816
+ * Uses cached sorting for performance.
817
+ *
818
+ * @returns An array of middleware pipeline entries.
819
+ */
820
+ getMiddlewarePipeline() {
821
+ if (this.sortedPipelineCache) {
822
+ return this.sortedPipelineCache;
823
+ }
824
+ this.sortedPipelineCache = [...this.middlewarePipeline].sort((a, b) => a.order - b.order);
825
+ return this.sortedPipelineCache;
826
+ }
827
+ /**
828
+ * View middleware pipeline formatted as a table.
829
+ */
830
+ viewMiddlewarePipeline() {
831
+ const sortedMiddlewarePipeline = this.getMiddlewarePipeline();
832
+ const formattedPipeline = sortedMiddlewarePipeline.map((m) => {
833
+ const middlewareType = this.getMiddlewareType(m.middleware);
834
+ if (middlewareType === MiddlewareType.Config) {
835
+ const middlewareNames = m.middleware.middlewares.map((mw) => mw?.name || "Anonymous");
836
+ return {
837
+ order: m.order,
838
+ path: m.middleware.path,
839
+ middleware: `[${middlewareNames.join(", ")}]`,
840
+ };
841
+ }
842
+ else if (middlewareType === MiddlewareType.IExpressoMiddleware) {
843
+ return {
844
+ order: m.order,
845
+ path: m.middleware.path ?? "Global",
846
+ middleware: m.middleware.constructor.name,
847
+ };
848
+ }
849
+ else {
850
+ return {
851
+ order: m.order,
852
+ path: "Global",
853
+ middleware: m.middleware?.name,
854
+ };
855
+ }
856
+ });
857
+ console.table(formattedPipeline);
858
+ }
859
+ // ═══════════════════════════════════════════════════════════════════════════
860
+ // VISUAL PIPELINE
861
+ // ═══════════════════════════════════════════════════════════════════════════
862
+ /**
863
+ * Get a visual ASCII representation of the middleware pipeline.
864
+ *
865
+ * @returns ASCII art diagram of the pipeline
866
+ *
867
+ * @example
868
+ * ```typescript
869
+ * console.log(middleware.visualizePipeline());
870
+ * // ╔══════════════════════════════════════════════════════════════╗
871
+ * // ║ MIDDLEWARE PIPELINE ║
872
+ * // ╠══════════════════════════════════════════════════════════════╣
873
+ * // ║ 📦 jsonParser [parser] ║
874
+ * // ║ ↓ ║
875
+ * // ║ 🔒 cors [security] ║
876
+ * // ║ ↓ ║
877
+ * // ║ 🔒 helmet [security] ║
878
+ * // ╚══════════════════════════════════════════════════════════════╝
879
+ * ```
880
+ *
881
+ * @public API
882
+ */
883
+ visualizePipeline() {
884
+ const pipeline = this.getMiddlewarePipeline();
885
+ const width = 64;
886
+ const lines = [
887
+ "╔" + "═".repeat(width) + "╗",
888
+ "║" +
889
+ "MIDDLEWARE PIPELINE".padStart((width + 19) / 2).padEnd(width) +
890
+ "║",
891
+ "╠" + "═".repeat(width) + "╣",
892
+ ];
893
+ if (pipeline.length === 0) {
894
+ lines.push("║" + "(empty)".padStart((width + 7) / 2).padEnd(width) + "║");
895
+ }
896
+ else {
897
+ for (let i = 0; i < pipeline.length; i++) {
898
+ const m = pipeline[i];
899
+ const name = this.getMiddlewareName(m);
900
+ const category = m.category ?? this.getMiddlewareCategory(name);
901
+ const icon = CATEGORY_ICONS[category];
902
+ const categoryLabel = `[${category}]`;
903
+ const content = `${icon} ${name}`;
904
+ const contentWithCategory = content.padEnd(width - categoryLabel.length - 2) + categoryLabel;
905
+ lines.push("║ " + contentWithCategory.padEnd(width - 1) + "║");
906
+ if (i < pipeline.length - 1) {
907
+ lines.push("║" + " ↓".padEnd(width) + "║");
908
+ }
909
+ }
910
+ }
911
+ lines.push("╚" + "═".repeat(width) + "╝");
912
+ return lines.join("\n");
913
+ }
914
+ /**
915
+ * Get a compact summary of the middleware pipeline.
916
+ *
917
+ * @returns Single-line summary
918
+ * @public API
919
+ */
920
+ getPipelineSummary() {
921
+ const info = this.getPipelineInfo();
922
+ const categories = Object.entries(info.byCategory)
923
+ .filter(([, count]) => count > 0)
924
+ .map(([cat, count]) => `${CATEGORY_ICONS[cat]}${count}`)
925
+ .join(" ");
926
+ return `Middleware: ${info.total} total | ${categories}`;
927
+ }
928
+ // ═══════════════════════════════════════════════════════════════════════════
929
+ // INTROSPECTION METHODS
930
+ // ═══════════════════════════════════════════════════════════════════════════
931
+ /**
932
+ * Get structured pipeline info for banner display and introspection.
933
+ * @returns Middleware pipeline information
934
+ * @public API
935
+ */
936
+ getPipelineInfo() {
937
+ const sorted = this.getMiddlewarePipeline();
938
+ const entries = [];
939
+ const byCategory = {
940
+ parser: 0,
941
+ security: 0,
942
+ logging: 0,
943
+ validation: 0,
944
+ error: 0,
945
+ session: 0,
946
+ static: 0,
947
+ other: 0,
948
+ };
949
+ sorted.forEach((m, index) => {
950
+ const name = this.getMiddlewareName(m);
951
+ const category = m.category || this.getMiddlewareCategory(name, m.isBuiltIn);
952
+ const path = this.getMiddlewarePath(m);
953
+ const isBuiltIn = m.isBuiltIn ?? !name.includes("Middleware");
954
+ entries.push({
955
+ name,
956
+ type: isBuiltIn ? "built-in" : "custom",
957
+ category,
958
+ order: index,
959
+ path,
960
+ middleware: m.middleware,
961
+ });
962
+ byCategory[category]++;
963
+ });
964
+ return {
965
+ total: entries.length,
966
+ entries,
967
+ byCategory,
968
+ };
969
+ }
970
+ /**
971
+ * Get a formatted view for banner display.
972
+ * @param maxDisplay - Maximum number of middleware to show
973
+ * @returns Formatted middleware view
974
+ * @public API
975
+ */
976
+ getFormattedView(maxDisplay = 6) {
977
+ const info = this.getPipelineInfo();
978
+ const entries = info.entries.slice(0, maxDisplay).map((e) => ({
979
+ name: e.name,
980
+ category: e.category,
981
+ type: e.type,
982
+ }));
983
+ return {
984
+ entries,
985
+ total: info.total,
986
+ remaining: Math.max(0, info.total - maxDisplay),
987
+ };
988
+ }
989
+ /**
990
+ * Get middleware count by category.
991
+ * @returns Record of category to count
992
+ * @public API
993
+ */
994
+ getCountByCategory() {
995
+ return this.getPipelineInfo().byCategory;
996
+ }
997
+ /**
998
+ * Get middleware by name.
999
+ * @param name - The middleware name
1000
+ * @returns The middleware entry or undefined
1001
+ * @public API
1002
+ */
1003
+ getByName(name) {
1004
+ return this.getPipelineInfo().entries.find((e) => e.name === name);
1005
+ }
1006
+ /**
1007
+ * Remove a middleware from the pipeline by name.
1008
+ *
1009
+ * @param name - The middleware name to remove
1010
+ * @returns True if removed, false if not found
1011
+ * @public API
1012
+ */
1013
+ remove(name) {
1014
+ if (!this.middlewareMap.has(name)) {
1015
+ return false;
1016
+ }
1017
+ this.middlewareMap.delete(name);
1018
+ const index = this.middlewarePipeline.findIndex((m) => m.name === name);
1019
+ if (index >= 0) {
1020
+ this.middlewarePipeline.splice(index, 1);
1021
+ }
1022
+ this.invalidateCache();
1023
+ return true;
1024
+ }
1025
+ /**
1026
+ * Clear all middleware from the pipeline.
1027
+ * @public API
1028
+ */
1029
+ clear() {
1030
+ this.middlewarePipeline = [];
1031
+ this.middlewareMap.clear();
1032
+ this.insertionOrder = 0;
1033
+ this.invalidateCache();
1034
+ }
1035
+ /**
1036
+ * Get the total number of middleware in the pipeline.
1037
+ * @returns Number of middleware
1038
+ * @public API
1039
+ */
1040
+ count() {
1041
+ return this.middlewarePipeline.length;
1042
+ }
1043
+ // ═══════════════════════════════════════════════════════════════════════════
1044
+ // V4 UNIFIED METHODS
1045
+ // ═══════════════════════════════════════════════════════════════════════════
1046
+ /**
1047
+ * Configure request parsing (unified method).
1048
+ * Replaces: addBodyParser, addUrlEncodedParser, addCookieParser
1049
+ */
1050
+ parse(options) {
1051
+ const opts = options || {};
1052
+ // JSON parsing (default: enabled)
1053
+ if (opts.json !== false) {
1054
+ const jsonOpts = typeof opts.json === "object" ? opts.json : { limit: "100kb" };
1055
+ this.addBuiltInMiddleware("jsonParser", "parser", () => json(jsonOpts));
1056
+ }
1057
+ // URL-encoded parsing (default: enabled)
1058
+ if (opts.urlencoded !== false) {
1059
+ const urlencodedOpts = typeof opts.urlencoded === "object"
1060
+ ? opts.urlencoded
1061
+ : { extended: true };
1062
+ this.addBuiltInMiddleware("urlencodedParser", "parser", () => urlencoded(urlencodedOpts));
1063
+ }
1064
+ // Cookie parsing (default: disabled, requires package)
1065
+ if (opts.cookies) {
1066
+ const cookieOpts = typeof opts.cookies === "object" ? opts.cookies : {};
1067
+ this.addBuiltInMiddleware("cookieParser", "parser", () => middlewareResolver("cookieParser", cookieOpts.secret, cookieOpts.options));
1068
+ }
1069
+ this.bufferStartupLog("Request parsing configured");
1070
+ }
1071
+ /**
1072
+ * Configure logging with any implementation.
1073
+ * Replaces: addMorgan
1074
+ */
1075
+ logger(config) {
1076
+ // Skip in test if configured
1077
+ if (config?.disableInTest !== false && process.env.NODE_ENV === "test") {
1078
+ return;
1079
+ }
1080
+ // Custom logger takes precedence
1081
+ if (config?.custom) {
1082
+ const customHandler = config.custom;
1083
+ this.addBuiltInMiddleware("customLogger", "logging", () => customHandler);
1084
+ this.bufferStartupLog("Using custom logger");
1085
+ return;
1086
+ }
1087
+ const implementation = config?.implementation || "auto";
1088
+ const handler = this.resolveLoggerImplementation(implementation, config?.options, config?.skip);
1089
+ if (handler) {
1090
+ const implName = implementation === "auto" ? this.detectBestLogger() : implementation;
1091
+ this.addBuiltInMiddleware(`logger-${implName}`, "logging", () => handler);
1092
+ this.bufferStartupLog(`Using ${implName} logger${implementation === "auto" ? " (auto-detected)" : ""}`);
1093
+ }
1094
+ }
1095
+ // Internal logger getter
1096
+ get loggerInstance() {
1097
+ return this._logger;
1098
+ }
1099
+ /**
1100
+ * Detect the best available logger.
1101
+ */
1102
+ detectBestLogger() {
1103
+ if (isPackageAvailable("pino-http"))
1104
+ return "pino";
1105
+ if (isPackageAvailable("express-winston"))
1106
+ return "winston";
1107
+ if (isMiddlewareAvailable("morgan"))
1108
+ return "morgan";
1109
+ return "console";
1110
+ }
1111
+ /**
1112
+ * Resolve logger implementation.
1113
+ */
1114
+ resolveLoggerImplementation(implementation, options, skip) {
1115
+ const impl = implementation === "auto" ? this.detectBestLogger() : implementation;
1116
+ switch (impl) {
1117
+ case "morgan": {
1118
+ const morganOpts = options;
1119
+ const format = morganOpts?.format || "combined";
1120
+ // Only pass options object if skip is defined to avoid passing undefined
1121
+ if (skip) {
1122
+ return middlewareResolver("morgan", format, { skip });
1123
+ }
1124
+ return middlewareResolver("morgan", format);
1125
+ }
1126
+ case "pino": {
1127
+ const pino = resolvePackage("pino-http");
1128
+ if (pino) {
1129
+ return pino(options);
1130
+ }
1131
+ this.bufferStartupLog("pino-http not installed, falling back to morgan", "warn");
1132
+ return this.resolveLoggerImplementation("morgan", options, skip);
1133
+ }
1134
+ case "winston": {
1135
+ const winston = resolvePackage("express-winston");
1136
+ if (winston?.logger) {
1137
+ return winston.logger(options);
1138
+ }
1139
+ this.bufferStartupLog("express-winston not installed, falling back to morgan", "warn");
1140
+ return this.resolveLoggerImplementation("morgan", options, skip);
1141
+ }
1142
+ case "console": {
1143
+ // Simple console logger
1144
+ const handler = (req, _res, next) => {
1145
+ console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
1146
+ next();
1147
+ };
1148
+ return handler;
1149
+ }
1150
+ default:
1151
+ return null;
1152
+ }
1153
+ }
1154
+ /**
1155
+ * Unified security configuration.
1156
+ * Replaces: addHelmet, addCors, addRateLimiter
1157
+ */
1158
+ security(config) {
1159
+ // Handle preset strings
1160
+ const secConfig = typeof config === "string"
1161
+ ? this.getSecurityPreset(config)
1162
+ : config || this.getSecurityPreset("standard");
1163
+ // Helmet/security headers
1164
+ if (secConfig.headers !== false) {
1165
+ const helmetOpts = typeof secConfig.headers === "object" ? secConfig.headers : {};
1166
+ this.addBuiltInMiddleware("helmet", "security", () => middlewareResolver("helmet", helmetOpts));
1167
+ }
1168
+ // CORS
1169
+ if (secConfig.cors !== false) {
1170
+ const corsOpts = typeof secConfig.cors === "object" ? secConfig.cors : { origin: true };
1171
+ this.addBuiltInMiddleware("cors", "security", () => middlewareResolver("cors", corsOpts));
1172
+ }
1173
+ // Rate limiting
1174
+ if (secConfig.rateLimit) {
1175
+ const rateLimitOpts = typeof secConfig.rateLimit === "object"
1176
+ ? secConfig.rateLimit
1177
+ : { windowMs: 60000, max: 100 };
1178
+ this.addBuiltInMiddleware("rateLimit", "security", () => middlewareResolver("rateLimit", rateLimitOpts));
1179
+ }
1180
+ // Custom security middleware
1181
+ if (secConfig.custom) {
1182
+ for (const middleware of secConfig.custom) {
1183
+ this.addMiddleware(middleware);
1184
+ }
1185
+ }
1186
+ this.bufferStartupLog("Security configured");
1187
+ }
1188
+ /**
1189
+ * Get security preset configuration.
1190
+ */
1191
+ getSecurityPreset(preset) {
1192
+ const presets = {
1193
+ standard: {
1194
+ headers: "helmet",
1195
+ cors: true,
1196
+ rateLimit: false,
1197
+ },
1198
+ strict: {
1199
+ headers: "helmet",
1200
+ cors: { origin: false, credentials: true },
1201
+ rateLimit: { windowMs: 60000, max: 60 },
1202
+ },
1203
+ api: {
1204
+ headers: "helmet",
1205
+ cors: {
1206
+ origin: true,
1207
+ credentials: true,
1208
+ methods: ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"],
1209
+ },
1210
+ rateLimit: { windowMs: 60000, max: 100 },
1211
+ },
1212
+ minimal: {
1213
+ headers: false,
1214
+ cors: true,
1215
+ rateLimit: false,
1216
+ },
1217
+ relaxed: {
1218
+ headers: false,
1219
+ cors: { origin: true },
1220
+ rateLimit: false,
1221
+ },
1222
+ };
1223
+ return presets[preset] || presets.standard;
1224
+ }
1225
+ /**
1226
+ * Configure compression.
1227
+ * Replaces: addCompression
1228
+ */
1229
+ compress(config) {
1230
+ const impl = config?.implementation || "auto";
1231
+ let handler = null;
1232
+ if (impl === "auto") {
1233
+ // Try shrink-ray first, then compression
1234
+ if (isPackageAvailable("shrink-ray-current")) {
1235
+ const shrinkRay = resolvePackage("shrink-ray-current");
1236
+ if (shrinkRay) {
1237
+ handler = shrinkRay(config);
1238
+ this.bufferStartupLog("Using shrink-ray compression (auto-detected)");
1239
+ }
1240
+ }
1241
+ if (!handler) {
1242
+ handler = middlewareResolver("compression", config);
1243
+ if (handler) {
1244
+ this.bufferStartupLog("Using compression (auto-detected)");
1245
+ }
1246
+ }
1247
+ }
1248
+ else if (impl === "shrink-ray") {
1249
+ const shrinkRay = resolvePackage("shrink-ray-current");
1250
+ if (shrinkRay) {
1251
+ handler = shrinkRay(config);
1252
+ }
1253
+ }
1254
+ else {
1255
+ handler = middlewareResolver("compression", config);
1256
+ }
1257
+ if (handler) {
1258
+ this.addBuiltInMiddleware("compression", "other", () => handler);
1259
+ }
1260
+ }
1261
+ /**
1262
+ * Unified session management.
1263
+ * Replaces: addSession, addCookieSession
1264
+ */
1265
+ session(config) {
1266
+ switch (config.type) {
1267
+ case "cookie": {
1268
+ // Use cookie-session
1269
+ const cookieSessionOpts = {
1270
+ name: config.name || "session",
1271
+ secret: config.secret,
1272
+ keys: config.keys || [
1273
+ typeof config.secret === "string"
1274
+ ? config.secret
1275
+ : config.secret[0],
1276
+ ],
1277
+ ...config.cookie,
1278
+ };
1279
+ this.addBuiltInMiddleware("cookieSession", "session", () => middlewareResolver("cookieSession", cookieSessionOpts));
1280
+ break;
1281
+ }
1282
+ case "store": {
1283
+ // Use express-session
1284
+ const sessionOpts = {
1285
+ secret: config.secret,
1286
+ name: config.name,
1287
+ store: config.store,
1288
+ resave: config.resave ?? false,
1289
+ saveUninitialized: config.saveUninitialized ?? false,
1290
+ rolling: config.rolling,
1291
+ cookie: config.cookie,
1292
+ };
1293
+ this.addBuiltInMiddleware("session", "session", () => middlewareResolver("session", sessionOpts));
1294
+ break;
1295
+ }
1296
+ case "jwt": {
1297
+ // JWT session - minimal implementation
1298
+ this.bufferStartupLog("JWT sessions require custom implementation. Use Middleware.add() with your JWT middleware.", "warn");
1299
+ break;
1300
+ }
1301
+ }
1302
+ }
1303
+ /**
1304
+ * Enhanced file upload handling.
1305
+ * Configures global upload settings and returns upload handlers.
1306
+ *
1307
+ * When called, this stores the configuration globally so that
1308
+ * @FileUpload decorators can use these settings as defaults.
1309
+ *
1310
+ * @param config - Upload configuration
1311
+ * @returns Upload handler with single, array, fields, any, none methods
1312
+ *
1313
+ * @example
1314
+ * ```typescript
1315
+ * // In app.ts - configure globally
1316
+ * this.Middleware.upload({
1317
+ * destination: './uploads',
1318
+ * limits: { fileSize: 10 * 1024 * 1024 }
1319
+ * });
1320
+ *
1321
+ * // In controller - @FileUpload uses global config
1322
+ * @FileUpload({ fieldName: 'avatar' })
1323
+ * uploadAvatar(req: Request) { }
1324
+ * ```
1325
+ *
1326
+ * @public API
1327
+ */
1328
+ upload(config) {
1329
+ // Store configuration globally for @FileUpload decorator
1330
+ if (config) {
1331
+ setGlobalUploadConfig(config);
1332
+ this.bufferStartupLog("Upload configured");
1333
+ }
1334
+ const multerOpts = {
1335
+ dest: config?.destination,
1336
+ limits: config?.limits,
1337
+ };
1338
+ if (config?.fileFilter) {
1339
+ const userFilter = config.fileFilter;
1340
+ multerOpts.fileFilter = (_req, file, cb) => {
1341
+ try {
1342
+ const result = userFilter(file);
1343
+ if (result instanceof Promise) {
1344
+ result
1345
+ .then((accepted) => cb(null, accepted))
1346
+ .catch((err) => cb(err));
1347
+ }
1348
+ else {
1349
+ cb(null, result);
1350
+ }
1351
+ }
1352
+ catch (err) {
1353
+ cb(err);
1354
+ }
1355
+ };
1356
+ }
1357
+ const multerInstance = this.setupMulter(multerOpts);
1358
+ return {
1359
+ single: (fieldName) => multerInstance.single(fieldName),
1360
+ array: (fieldName, maxCount) => multerInstance.array(fieldName, maxCount),
1361
+ fields: (fields) => multerInstance.fields(fields),
1362
+ any: () => multerInstance.any(),
1363
+ none: () => multerInstance.none(),
1364
+ };
1365
+ }
1366
+ /**
1367
+ * Enhanced static file serving.
1368
+ * Replaces: serveStatic, addServeFavicon
1369
+ */
1370
+ static(config) {
1371
+ const configs = Array.isArray(config) ? config : [config];
1372
+ for (const cfg of configs) {
1373
+ if (typeof cfg === "string") {
1374
+ // Simple path string
1375
+ this.serveStatic(cfg);
1376
+ }
1377
+ else {
1378
+ // Full config object
1379
+ const staticOpts = {
1380
+ maxAge: cfg.maxAge,
1381
+ etag: cfg.etag,
1382
+ index: cfg.spa ? false : cfg.index,
1383
+ ...cfg.options,
1384
+ };
1385
+ if (cfg.prefix) {
1386
+ // Route-specific static serving
1387
+ this.addMiddleware({
1388
+ path: cfg.prefix,
1389
+ middlewares: [expressStatic(cfg.path, staticOpts)],
1390
+ });
1391
+ }
1392
+ else {
1393
+ this.serveStatic(cfg.path, staticOpts);
1394
+ }
1395
+ // SPA support - serve index.html for all non-file routes
1396
+ if (cfg.spa) {
1397
+ const indexPath = cfg.index || "index.html";
1398
+ const spaHandler = (_req, res, next) => {
1399
+ const filePath = `${cfg.path}/${indexPath}`;
1400
+ res.sendFile(filePath, { root: process.cwd() }, (err) => {
1401
+ if (err)
1402
+ next(err);
1403
+ });
1404
+ };
1405
+ this.addBuiltInMiddleware("spa-fallback", "static", () => spaHandler);
1406
+ }
1407
+ }
1408
+ }
1409
+ }
1410
+ // ═══════════════════════════════════════════════════════════════════════════
1411
+ // V4 MIDDLEWARE REGISTRY
1412
+ // ═══════════════════════════════════════════════════════════════════════════
1413
+ /**
1414
+ * Register a named middleware for use in routes.
1415
+ */
1416
+ register(name, handler) {
1417
+ this.registry.register(name, handler);
1418
+ // Track registered names for summary (no individual logging)
1419
+ this.registeredMiddlewareNames.push(name);
1420
+ }
1421
+ /**
1422
+ * Get a registered middleware by name.
1423
+ */
1424
+ get(name) {
1425
+ return this.registry.get(name);
1426
+ }
1427
+ /**
1428
+ * Check if a middleware is registered.
1429
+ */
1430
+ has(name) {
1431
+ return this.registry.has(name);
1432
+ }
1433
+ /**
1434
+ * Get all registered middleware names.
1435
+ */
1436
+ getRegisteredNames() {
1437
+ return this.registry.getRegisteredNames();
1438
+ }
1439
+ // ═══════════════════════════════════════════════════════════════════════════
1440
+ // V4 PRESET SYSTEM
1441
+ // ═══════════════════════════════════════════════════════════════════════════
1442
+ /**
1443
+ * Define a custom reusable preset.
1444
+ */
1445
+ definePreset(name, config) {
1446
+ this.customPresets.set(name, config);
1447
+ this.bufferStartupLog(`Defined custom preset: ${name}`);
1448
+ }
1449
+ /**
1450
+ * Apply a preset configuration.
1451
+ */
1452
+ applyPreset(preset, overrides) {
1453
+ const config = this.getPresetConfig(preset);
1454
+ if (!config) {
1455
+ this.loggerInstance.error(`Preset '${preset}' not found. Available: ${this.getAvailablePresetNames().join(", ")}`, "middleware");
1456
+ return;
1457
+ }
1458
+ // Merge with overrides
1459
+ const finalConfig = overrides
1460
+ ? this.mergeConfigs(config, overrides)
1461
+ : config;
1462
+ // Apply each category
1463
+ if (finalConfig.parse) {
1464
+ if (typeof finalConfig.parse === "boolean") {
1465
+ this.parse();
1466
+ }
1467
+ else {
1468
+ this.parse(finalConfig.parse);
1469
+ }
1470
+ }
1471
+ if (finalConfig.logger) {
1472
+ if (typeof finalConfig.logger === "boolean") {
1473
+ this.logger();
1474
+ }
1475
+ else {
1476
+ this.logger(finalConfig.logger);
1477
+ }
1478
+ }
1479
+ if (finalConfig.security) {
1480
+ if (typeof finalConfig.security === "boolean") {
1481
+ this.security();
1482
+ }
1483
+ else {
1484
+ this.security(finalConfig.security);
1485
+ }
1486
+ }
1487
+ if (finalConfig.compress) {
1488
+ if (typeof finalConfig.compress === "boolean") {
1489
+ this.compress();
1490
+ }
1491
+ else {
1492
+ this.compress(finalConfig.compress);
1493
+ }
1494
+ }
1495
+ if (finalConfig.session) {
1496
+ this.session(finalConfig.session);
1497
+ }
1498
+ if (finalConfig.static) {
1499
+ this.static(finalConfig.static);
1500
+ }
1501
+ this.bufferStartupLog(`Applied preset: ${preset}`);
1502
+ }
1503
+ /**
1504
+ * Get all available presets.
1505
+ */
1506
+ getAllPresets() {
1507
+ const builtIn = this.getBuiltInPresets();
1508
+ const custom = Object.fromEntries(this.customPresets);
1509
+ return { ...builtIn, ...custom };
1510
+ }
1511
+ /**
1512
+ * Get built-in presets.
1513
+ */
1514
+ getBuiltInPresets() {
1515
+ return {
1516
+ api: {
1517
+ parse: true,
1518
+ logger: { implementation: "auto" },
1519
+ security: "api",
1520
+ compress: true,
1521
+ },
1522
+ web: {
1523
+ parse: { json: true, urlencoded: true, cookies: true },
1524
+ logger: { implementation: "auto" },
1525
+ security: "standard",
1526
+ compress: true,
1527
+ },
1528
+ spa: {
1529
+ parse: { json: true, urlencoded: true },
1530
+ security: "standard",
1531
+ compress: true,
1532
+ },
1533
+ microservice: {
1534
+ parse: { json: { limit: "1mb" } },
1535
+ compress: true,
1536
+ },
1537
+ graphql: {
1538
+ parse: { json: { limit: "50mb" } },
1539
+ security: {
1540
+ headers: "helmet",
1541
+ cors: { origin: true, methods: ["GET", "POST", "OPTIONS"] },
1542
+ },
1543
+ compress: true,
1544
+ },
1545
+ minimal: {
1546
+ parse: true,
1547
+ },
1548
+ development: {
1549
+ parse: true,
1550
+ logger: { implementation: "morgan", options: { format: "dev" } },
1551
+ security: "relaxed",
1552
+ },
1553
+ production: {
1554
+ parse: true,
1555
+ logger: { implementation: "auto", disableInTest: true },
1556
+ security: "strict",
1557
+ compress: true,
1558
+ },
1559
+ };
1560
+ }
1561
+ /**
1562
+ * Get preset config by name.
1563
+ */
1564
+ getPresetConfig(name) {
1565
+ return this.customPresets.get(name) || this.getBuiltInPresets()[name];
1566
+ }
1567
+ /**
1568
+ * Get available preset names.
1569
+ */
1570
+ getAvailablePresetNames() {
1571
+ return [
1572
+ ...Object.keys(this.getBuiltInPresets()),
1573
+ ...this.customPresets.keys(),
1574
+ ];
1575
+ }
1576
+ /**
1577
+ * Merge two configs.
1578
+ */
1579
+ mergeConfigs(base, override) {
1580
+ return {
1581
+ ...base,
1582
+ ...override,
1583
+ // Deep merge for nested objects
1584
+ parse: override.parse !== undefined
1585
+ ? typeof override.parse === "object" && typeof base.parse === "object"
1586
+ ? { ...base.parse, ...override.parse }
1587
+ : override.parse
1588
+ : base.parse,
1589
+ logger: override.logger !== undefined
1590
+ ? typeof override.logger === "object" &&
1591
+ typeof base.logger === "object"
1592
+ ? { ...base.logger, ...override.logger }
1593
+ : override.logger
1594
+ : base.logger,
1595
+ security: override.security !== undefined ? override.security : base.security,
1596
+ compress: override.compress !== undefined ? override.compress : base.compress,
1597
+ session: override.session !== undefined ? override.session : base.session,
1598
+ static: override.static !== undefined ? override.static : base.static,
1599
+ };
1600
+ }
1601
+ // ═══════════════════════════════════════════════════════════════════════════
1602
+ // V4 ADVANCED FEATURES
1603
+ // ═══════════════════════════════════════════════════════════════════════════
1604
+ /**
1605
+ * Conditional middleware application.
1606
+ */
1607
+ when(condition, handler) {
1608
+ const shouldApply = typeof condition === "function" ? condition() : condition;
1609
+ if (shouldApply) {
1610
+ if (typeof handler === "function" && handler.length === 0) {
1611
+ // It's a callback function, execute it
1612
+ handler();
1613
+ }
1614
+ else {
1615
+ // It's a middleware handler
1616
+ this.addMiddleware(handler);
1617
+ }
1618
+ }
1619
+ }
1620
+ /**
1621
+ * Auto-optimize middleware pipeline.
1622
+ */
1623
+ optimize(config) {
1624
+ if (config?.autoReorder) {
1625
+ this.reorderForPerformance();
1626
+ }
1627
+ if (config?.metrics) {
1628
+ this.enableProfiling();
1629
+ }
1630
+ this.bufferStartupLog("Middleware pipeline optimized");
1631
+ }
1632
+ /**
1633
+ * Reorder middleware for optimal performance.
1634
+ */
1635
+ reorderForPerformance() {
1636
+ // Priority order: security first, then parsers, then logging, then others
1637
+ const priorityOrder = {
1638
+ security: 1,
1639
+ parser: 2,
1640
+ logging: 3,
1641
+ session: 4,
1642
+ validation: 5,
1643
+ static: 6,
1644
+ other: 7,
1645
+ error: 100, // Error handlers go last
1646
+ };
1647
+ this.middlewarePipeline.sort((a, b) => {
1648
+ const priorityA = priorityOrder[a.category] || 50;
1649
+ const priorityB = priorityOrder[b.category] || 50;
1650
+ if (priorityA !== priorityB) {
1651
+ return priorityA - priorityB;
1652
+ }
1653
+ return a.order - b.order;
1654
+ });
1655
+ this.invalidateCache();
1656
+ }
1657
+ /**
1658
+ * Analyze middleware pipeline.
1659
+ */
1660
+ analyze() {
1661
+ const info = this.getPipelineInfo();
1662
+ const issues = [];
1663
+ const bottlenecks = [];
1664
+ // Check for common issues
1665
+ if (!this.middlewareExists("jsonParser")) {
1666
+ issues.push("No JSON body parser configured");
1667
+ }
1668
+ if (!this.middlewareExists("compression") &&
1669
+ process.env.NODE_ENV === "production") {
1670
+ issues.push("Compression not enabled in production");
1671
+ }
1672
+ if (!this.middlewareExists("rateLimit") &&
1673
+ process.env.NODE_ENV === "production") {
1674
+ issues.push("Rate limiting not enabled in production");
1675
+ }
1676
+ // Identify potential bottlenecks
1677
+ if (this.profilingEnabled && this.profiler) {
1678
+ const metrics = this.profiler.getAllMetrics();
1679
+ for (const metric of metrics) {
1680
+ if (metric.avgExecutionMs > 50) {
1681
+ bottlenecks.push(`${metric.name}: avg ${metric.avgExecutionMs.toFixed(2)}ms`);
1682
+ }
1683
+ }
1684
+ }
1685
+ return {
1686
+ count: info.total,
1687
+ estimatedOverhead: info.total * 0.1, // Rough estimate: 0.1ms per middleware
1688
+ order: info.entries.map((e) => ({
1689
+ name: e.name,
1690
+ category: e.category,
1691
+ isBuiltIn: e.type === "built-in",
1692
+ })),
1693
+ issues,
1694
+ bottlenecks,
1695
+ };
1696
+ }
1697
+ /**
1698
+ * Get recommendations for improvement.
1699
+ */
1700
+ getRecommendations() {
1701
+ const recommendations = [];
1702
+ const analysis = this.analyze();
1703
+ // Check compression
1704
+ if (!this.middlewareExists("compression")) {
1705
+ recommendations.push({
1706
+ type: "performance",
1707
+ severity: "medium",
1708
+ message: "Compression is not enabled. Responses can be 60-80% smaller.",
1709
+ action: "this.Middleware.compress()",
1710
+ });
1711
+ }
1712
+ // Check rate limiting in production
1713
+ if (!this.middlewareExists("rateLimit") &&
1714
+ process.env.NODE_ENV === "production") {
1715
+ recommendations.push({
1716
+ type: "security",
1717
+ severity: "high",
1718
+ message: "Rate limiting not enabled in production. API is vulnerable to abuse.",
1719
+ action: "this.Middleware.security({ rateLimit: true })",
1720
+ });
1721
+ }
1722
+ // Check helmet in production
1723
+ if (!this.middlewareExists("helmet") &&
1724
+ process.env.NODE_ENV === "production") {
1725
+ recommendations.push({
1726
+ type: "security",
1727
+ severity: "high",
1728
+ message: "Security headers (Helmet) not enabled in production.",
1729
+ action: "this.Middleware.security('standard')",
1730
+ });
1731
+ }
1732
+ // Check for issues
1733
+ for (const issue of analysis.issues) {
1734
+ recommendations.push({
1735
+ type: "best-practice",
1736
+ severity: "low",
1737
+ message: issue,
1738
+ });
1739
+ }
1740
+ return recommendations;
1741
+ }
1742
+ // ═══════════════════════════════════════════════════════════════════════════
1743
+ // V4 ALIAS: add() for addMiddleware()
1744
+ // ═══════════════════════════════════════════════════════════════════════════
1745
+ /**
1746
+ * Add custom middleware to global pipeline.
1747
+ * Alias for addMiddleware() with shorter name.
1748
+ */
1749
+ add(middleware) {
1750
+ this.addMiddleware(middleware);
1751
+ }
1752
+ // ═══════════════════════════════════════════════════════════════════════════
1753
+ // V4 RENDER ENGINE
1754
+ // ═══════════════════════════════════════════════════════════════════════════
1755
+ /** Render service instance (lazy initialized) */
1756
+ renderService = null;
1757
+ /** Express app reference for render service */
1758
+ expressApp = null;
1759
+ /**
1760
+ * Set the Express app reference for render service initialization.
1761
+ * Called internally by AppExpress.
1762
+ * @internal
1763
+ */
1764
+ setExpressApp(app) {
1765
+ this.expressApp = app;
1766
+ }
1767
+ /**
1768
+ * Configure view rendering with unified API.
1769
+ * Supports traditional engines (EJS, Pug, Handlebars) and modern frameworks (React, Vue, Svelte).
1770
+ *
1771
+ * @param config - Render configuration or preset name
1772
+ */
1773
+ async render(config) {
1774
+ if (!this.expressApp) {
1775
+ throw new Error("Express app not available. render() must be called within configureServices().");
1776
+ }
1777
+ // Lazy import to avoid circular dependencies.
1778
+ // The `.js` extension is required by NodeNext for ESM consumers; the
1779
+ // CJS build also accepts it (TypeScript rewrites unchanged).
1780
+ const { RenderService } = await import("../render/render-service.js");
1781
+ if (!this.renderService) {
1782
+ this.renderService = new RenderService(this.expressApp);
1783
+ }
1784
+ await this.renderService.configure(config || {});
1785
+ // Buffer startup log
1786
+ const engine = this.renderService.getActiveEngine().name;
1787
+ this.bufferStartupLog(`Render engine configured: ${engine}`, "info");
1788
+ }
1789
+ /**
1790
+ * Get the render service instance.
1791
+ *
1792
+ * @returns Render service or null if not configured
1793
+ */
1794
+ getRenderService() {
1795
+ return this.renderService;
1796
+ }
1797
+ }