@catbee/utils 0.0.8-rc.0 → 0.0.8-rc.2

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 (281) hide show
  1. package/README.md +25 -1
  2. package/build/esm/config.d.ts +0 -1
  3. package/build/esm/config.js +6 -7
  4. package/build/esm/index.d.ts +0 -1
  5. package/build/esm/index.js +0 -1
  6. package/build/esm/servers/server.builder.d.ts +0 -1
  7. package/build/esm/servers/server.builder.js +99 -147
  8. package/build/esm/servers/server.d.ts +0 -1
  9. package/build/esm/servers/server.js +591 -876
  10. package/build/esm/types/api-response.d.ts +0 -1
  11. package/build/esm/types/api-response.js +0 -1
  12. package/build/esm/types/index.d.ts +0 -1
  13. package/build/esm/types/index.js +0 -1
  14. package/build/esm/types/server.d.ts +0 -1
  15. package/build/esm/types/server.js +0 -1
  16. package/build/esm/utils/array.utils.d.ts +0 -1
  17. package/build/esm/utils/array.utils.js +48 -86
  18. package/build/esm/utils/async.utils.d.ts +0 -1
  19. package/build/esm/utils/async.utils.js +247 -524
  20. package/build/esm/utils/cache.utils.d.ts +0 -1
  21. package/build/esm/utils/cache.utils.js +96 -301
  22. package/build/esm/utils/context-store.utils.d.ts +0 -1
  23. package/build/esm/utils/context-store.utils.js +62 -79
  24. package/build/esm/utils/crypto.utils.d.ts +0 -1
  25. package/build/esm/utils/crypto.utils.js +78 -175
  26. package/build/esm/utils/date.utils.d.ts +0 -1
  27. package/build/esm/utils/date.utils.js +47 -53
  28. package/build/esm/utils/decorators.utils.d.ts +201 -5
  29. package/build/esm/utils/decorators.utils.js +632 -285
  30. package/build/esm/utils/dir.utils.d.ts +0 -1
  31. package/build/esm/utils/dir.utils.js +264 -786
  32. package/build/esm/utils/env.utils.d.ts +0 -1
  33. package/build/esm/utils/env.utils.js +180 -271
  34. package/build/esm/utils/exception.utils.d.ts +0 -1
  35. package/build/esm/utils/exception.utils.js +112 -289
  36. package/build/esm/utils/fs.utils.d.ts +0 -1
  37. package/build/esm/utils/fs.utils.js +169 -401
  38. package/build/esm/utils/http-status-codes.d.ts +0 -1
  39. package/build/esm/utils/http-status-codes.js +0 -1
  40. package/build/esm/utils/id.utils.d.ts +0 -1
  41. package/build/esm/utils/id.utils.js +5 -9
  42. package/build/esm/utils/logger.utils.d.ts +0 -1
  43. package/build/esm/utils/logger.utils.js +34 -71
  44. package/build/esm/utils/middleware.utils.d.ts +0 -1
  45. package/build/esm/utils/middleware.utils.js +65 -155
  46. package/build/esm/utils/obj.utils.d.ts +0 -1
  47. package/build/esm/utils/obj.utils.js +69 -176
  48. package/build/esm/utils/performance.utils.d.ts +0 -1
  49. package/build/esm/utils/performance.utils.js +92 -195
  50. package/build/esm/utils/request.utils.d.ts +0 -1
  51. package/build/esm/utils/request.utils.js +41 -74
  52. package/build/esm/utils/response.utils.d.ts +0 -1
  53. package/build/esm/utils/response.utils.js +84 -107
  54. package/build/esm/utils/stream.utils.d.ts +0 -1
  55. package/build/esm/utils/stream.utils.js +38 -113
  56. package/build/esm/utils/string.utils.d.ts +0 -1
  57. package/build/esm/utils/string.utils.js +6 -11
  58. package/build/esm/utils/type.utils.d.ts +0 -1
  59. package/build/esm/utils/type.utils.js +8 -12
  60. package/build/esm/utils/url.utils.d.ts +0 -1
  61. package/build/esm/utils/url.utils.js +49 -127
  62. package/build/esm/utils/validate.utils.d.ts +0 -1
  63. package/build/esm/utils/validate.utils.js +23 -40
  64. package/package.json +3 -33
  65. package/build/esm/config.js.map +0 -1
  66. package/build/esm/index.js.map +0 -1
  67. package/build/esm/servers/server.builder.js.map +0 -1
  68. package/build/esm/servers/server.js.map +0 -1
  69. package/build/esm/types/api-response.js.map +0 -1
  70. package/build/esm/types/index.js.map +0 -1
  71. package/build/esm/types/server.js.map +0 -1
  72. package/build/esm/utils/array.utils.js.map +0 -1
  73. package/build/esm/utils/async.utils.js.map +0 -1
  74. package/build/esm/utils/cache.utils.js.map +0 -1
  75. package/build/esm/utils/context-store.utils.js.map +0 -1
  76. package/build/esm/utils/crypto.utils.js.map +0 -1
  77. package/build/esm/utils/date.utils.js.map +0 -1
  78. package/build/esm/utils/decorators.utils.js.map +0 -1
  79. package/build/esm/utils/dir.utils.js.map +0 -1
  80. package/build/esm/utils/env.utils.js.map +0 -1
  81. package/build/esm/utils/exception.utils.js.map +0 -1
  82. package/build/esm/utils/fs.utils.js.map +0 -1
  83. package/build/esm/utils/http-status-codes.js.map +0 -1
  84. package/build/esm/utils/id.utils.js.map +0 -1
  85. package/build/esm/utils/logger.utils.js.map +0 -1
  86. package/build/esm/utils/middleware.utils.js.map +0 -1
  87. package/build/esm/utils/obj.utils.js.map +0 -1
  88. package/build/esm/utils/performance.utils.js.map +0 -1
  89. package/build/esm/utils/request.utils.js.map +0 -1
  90. package/build/esm/utils/response.utils.js.map +0 -1
  91. package/build/esm/utils/stream.utils.js.map +0 -1
  92. package/build/esm/utils/string.utils.js.map +0 -1
  93. package/build/esm/utils/type.utils.js.map +0 -1
  94. package/build/esm/utils/url.utils.js.map +0 -1
  95. package/build/esm/utils/validate.utils.js.map +0 -1
  96. package/build/esnext/config.d.ts +0 -122
  97. package/build/esnext/config.js +0 -133
  98. package/build/esnext/config.js.map +0 -1
  99. package/build/esnext/index.d.ts +0 -27
  100. package/build/esnext/index.js +0 -50
  101. package/build/esnext/index.js.map +0 -1
  102. package/build/esnext/servers/server.builder.d.ts +0 -508
  103. package/build/esnext/servers/server.builder.js +0 -657
  104. package/build/esnext/servers/server.builder.js.map +0 -1
  105. package/build/esnext/servers/server.d.ts +0 -256
  106. package/build/esnext/servers/server.js +0 -955
  107. package/build/esnext/servers/server.js.map +0 -1
  108. package/build/esnext/types/api-response.d.ts +0 -152
  109. package/build/esnext/types/api-response.js +0 -34
  110. package/build/esnext/types/api-response.js.map +0 -1
  111. package/build/esnext/types/index.d.ts +0 -125
  112. package/build/esnext/types/index.js +0 -25
  113. package/build/esnext/types/index.js.map +0 -1
  114. package/build/esnext/types/server.d.ts +0 -268
  115. package/build/esnext/types/server.js +0 -25
  116. package/build/esnext/types/server.js.map +0 -1
  117. package/build/esnext/utils/array.utils.d.ts +0 -168
  118. package/build/esnext/utils/array.utils.js +0 -345
  119. package/build/esnext/utils/array.utils.js.map +0 -1
  120. package/build/esnext/utils/async.utils.d.ts +0 -265
  121. package/build/esnext/utils/async.utils.js +0 -620
  122. package/build/esnext/utils/async.utils.js.map +0 -1
  123. package/build/esnext/utils/cache.utils.d.ts +0 -153
  124. package/build/esnext/utils/cache.utils.js +0 -293
  125. package/build/esnext/utils/cache.utils.js.map +0 -1
  126. package/build/esnext/utils/context-store.utils.d.ts +0 -189
  127. package/build/esnext/utils/context-store.utils.js +0 -289
  128. package/build/esnext/utils/context-store.utils.js.map +0 -1
  129. package/build/esnext/utils/crypto.utils.d.ts +0 -160
  130. package/build/esnext/utils/crypto.utils.js +0 -276
  131. package/build/esnext/utils/crypto.utils.js.map +0 -1
  132. package/build/esnext/utils/date.utils.d.ts +0 -159
  133. package/build/esnext/utils/date.utils.js +0 -384
  134. package/build/esnext/utils/date.utils.js.map +0 -1
  135. package/build/esnext/utils/decorators.utils.d.ts +0 -315
  136. package/build/esnext/utils/decorators.utils.js +0 -504
  137. package/build/esnext/utils/decorators.utils.js.map +0 -1
  138. package/build/esnext/utils/dir.utils.d.ts +0 -196
  139. package/build/esnext/utils/dir.utils.js +0 -477
  140. package/build/esnext/utils/dir.utils.js.map +0 -1
  141. package/build/esnext/utils/env.utils.d.ts +0 -377
  142. package/build/esnext/utils/env.utils.js +0 -785
  143. package/build/esnext/utils/env.utils.js.map +0 -1
  144. package/build/esnext/utils/exception.utils.d.ts +0 -230
  145. package/build/esnext/utils/exception.utils.js +0 -381
  146. package/build/esnext/utils/exception.utils.js.map +0 -1
  147. package/build/esnext/utils/fs.utils.d.ts +0 -164
  148. package/build/esnext/utils/fs.utils.js +0 -349
  149. package/build/esnext/utils/fs.utils.js.map +0 -1
  150. package/build/esnext/utils/http-status-codes.d.ts +0 -266
  151. package/build/esnext/utils/http-status-codes.js +0 -295
  152. package/build/esnext/utils/http-status-codes.js.map +0 -1
  153. package/build/esnext/utils/id.utils.d.ts +0 -36
  154. package/build/esnext/utils/id.utils.js +0 -84
  155. package/build/esnext/utils/id.utils.js.map +0 -1
  156. package/build/esnext/utils/logger.utils.d.ts +0 -160
  157. package/build/esnext/utils/logger.utils.js +0 -300
  158. package/build/esnext/utils/logger.utils.js.map +0 -1
  159. package/build/esnext/utils/middleware.utils.d.ts +0 -100
  160. package/build/esnext/utils/middleware.utils.js +0 -236
  161. package/build/esnext/utils/middleware.utils.js.map +0 -1
  162. package/build/esnext/utils/obj.utils.d.ts +0 -124
  163. package/build/esnext/utils/obj.utils.js +0 -413
  164. package/build/esnext/utils/obj.utils.js.map +0 -1
  165. package/build/esnext/utils/performance.utils.d.ts +0 -136
  166. package/build/esnext/utils/performance.utils.js +0 -271
  167. package/build/esnext/utils/performance.utils.js.map +0 -1
  168. package/build/esnext/utils/request.utils.d.ts +0 -86
  169. package/build/esnext/utils/request.utils.js +0 -186
  170. package/build/esnext/utils/request.utils.js.map +0 -1
  171. package/build/esnext/utils/response.utils.d.ts +0 -163
  172. package/build/esnext/utils/response.utils.js +0 -247
  173. package/build/esnext/utils/response.utils.js.map +0 -1
  174. package/build/esnext/utils/stream.utils.d.ts +0 -88
  175. package/build/esnext/utils/stream.utils.js +0 -210
  176. package/build/esnext/utils/stream.utils.js.map +0 -1
  177. package/build/esnext/utils/string.utils.d.ts +0 -93
  178. package/build/esnext/utils/string.utils.js +0 -165
  179. package/build/esnext/utils/string.utils.js.map +0 -1
  180. package/build/esnext/utils/type.utils.d.ts +0 -90
  181. package/build/esnext/utils/type.utils.js +0 -187
  182. package/build/esnext/utils/type.utils.js.map +0 -1
  183. package/build/esnext/utils/url.utils.d.ts +0 -141
  184. package/build/esnext/utils/url.utils.js +0 -304
  185. package/build/esnext/utils/url.utils.js.map +0 -1
  186. package/build/esnext/utils/validate.utils.d.ts +0 -177
  187. package/build/esnext/utils/validate.utils.js +0 -320
  188. package/build/esnext/utils/validate.utils.js.map +0 -1
  189. package/build/src/config.d.ts +0 -122
  190. package/build/src/config.js +0 -138
  191. package/build/src/config.js.map +0 -1
  192. package/build/src/index.d.ts +0 -27
  193. package/build/src/index.js +0 -69
  194. package/build/src/index.js.map +0 -1
  195. package/build/src/servers/server.builder.d.ts +0 -508
  196. package/build/src/servers/server.builder.js +0 -661
  197. package/build/src/servers/server.builder.js.map +0 -1
  198. package/build/src/servers/server.d.ts +0 -256
  199. package/build/src/servers/server.js +0 -962
  200. package/build/src/servers/server.js.map +0 -1
  201. package/build/src/types/api-response.d.ts +0 -152
  202. package/build/src/types/api-response.js +0 -37
  203. package/build/src/types/api-response.js.map +0 -1
  204. package/build/src/types/index.d.ts +0 -125
  205. package/build/src/types/index.js +0 -26
  206. package/build/src/types/index.js.map +0 -1
  207. package/build/src/types/server.d.ts +0 -268
  208. package/build/src/types/server.js +0 -26
  209. package/build/src/types/server.js.map +0 -1
  210. package/build/src/utils/array.utils.d.ts +0 -168
  211. package/build/src/utils/array.utils.js +0 -364
  212. package/build/src/utils/array.utils.js.map +0 -1
  213. package/build/src/utils/async.utils.d.ts +0 -265
  214. package/build/src/utils/async.utils.js +0 -641
  215. package/build/src/utils/async.utils.js.map +0 -1
  216. package/build/src/utils/cache.utils.d.ts +0 -153
  217. package/build/src/utils/cache.utils.js +0 -297
  218. package/build/src/utils/cache.utils.js.map +0 -1
  219. package/build/src/utils/context-store.utils.d.ts +0 -189
  220. package/build/src/utils/context-store.utils.js +0 -296
  221. package/build/src/utils/context-store.utils.js.map +0 -1
  222. package/build/src/utils/crypto.utils.d.ts +0 -160
  223. package/build/src/utils/crypto.utils.js +0 -293
  224. package/build/src/utils/crypto.utils.js.map +0 -1
  225. package/build/src/utils/date.utils.d.ts +0 -159
  226. package/build/src/utils/date.utils.js +0 -396
  227. package/build/src/utils/date.utils.js.map +0 -1
  228. package/build/src/utils/decorators.utils.d.ts +0 -315
  229. package/build/src/utils/decorators.utils.js +0 -516
  230. package/build/src/utils/decorators.utils.js.map +0 -1
  231. package/build/src/utils/dir.utils.d.ts +0 -196
  232. package/build/src/utils/dir.utils.js +0 -501
  233. package/build/src/utils/dir.utils.js.map +0 -1
  234. package/build/src/utils/env.utils.d.ts +0 -377
  235. package/build/src/utils/env.utils.js +0 -789
  236. package/build/src/utils/env.utils.js.map +0 -1
  237. package/build/src/utils/exception.utils.d.ts +0 -230
  238. package/build/src/utils/exception.utils.js +0 -407
  239. package/build/src/utils/exception.utils.js.map +0 -1
  240. package/build/src/utils/fs.utils.d.ts +0 -164
  241. package/build/src/utils/fs.utils.js +0 -372
  242. package/build/src/utils/fs.utils.js.map +0 -1
  243. package/build/src/utils/http-status-codes.d.ts +0 -266
  244. package/build/src/utils/http-status-codes.js +0 -298
  245. package/build/src/utils/http-status-codes.js.map +0 -1
  246. package/build/src/utils/id.utils.d.ts +0 -36
  247. package/build/src/utils/id.utils.js +0 -91
  248. package/build/src/utils/id.utils.js.map +0 -1
  249. package/build/src/utils/logger.utils.d.ts +0 -160
  250. package/build/src/utils/logger.utils.js +0 -346
  251. package/build/src/utils/logger.utils.js.map +0 -1
  252. package/build/src/utils/middleware.utils.d.ts +0 -100
  253. package/build/src/utils/middleware.utils.js +0 -244
  254. package/build/src/utils/middleware.utils.js.map +0 -1
  255. package/build/src/utils/obj.utils.d.ts +0 -124
  256. package/build/src/utils/obj.utils.js +0 -429
  257. package/build/src/utils/obj.utils.js.map +0 -1
  258. package/build/src/utils/performance.utils.d.ts +0 -136
  259. package/build/src/utils/performance.utils.js +0 -278
  260. package/build/src/utils/performance.utils.js.map +0 -1
  261. package/build/src/utils/request.utils.d.ts +0 -86
  262. package/build/src/utils/request.utils.js +0 -195
  263. package/build/src/utils/request.utils.js.map +0 -1
  264. package/build/src/utils/response.utils.d.ts +0 -163
  265. package/build/src/utils/response.utils.js +0 -260
  266. package/build/src/utils/response.utils.js.map +0 -1
  267. package/build/src/utils/stream.utils.d.ts +0 -88
  268. package/build/src/utils/stream.utils.js +0 -218
  269. package/build/src/utils/stream.utils.js.map +0 -1
  270. package/build/src/utils/string.utils.d.ts +0 -93
  271. package/build/src/utils/string.utils.js +0 -179
  272. package/build/src/utils/string.utils.js.map +0 -1
  273. package/build/src/utils/type.utils.d.ts +0 -90
  274. package/build/src/utils/type.utils.js +0 -196
  275. package/build/src/utils/type.utils.js.map +0 -1
  276. package/build/src/utils/url.utils.d.ts +0 -141
  277. package/build/src/utils/url.utils.js +0 -317
  278. package/build/src/utils/url.utils.js.map +0 -1
  279. package/build/src/utils/validate.utils.d.ts +0 -177
  280. package/build/src/utils/validate.utils.js +0 -345
  281. package/build/src/utils/validate.utils.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/servers/server.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * The MIT License\n *\n * Copyright (c) 2025 Catbee Technologies. https://catbee-utils.npm.hprasath.com/license\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport express, { Express, Request, Response, NextFunction, Router } from 'express';\nimport http from 'http';\nimport https from 'https';\nimport { HttpStatusCodes } from '../utils/http-status-codes';\nimport { createFinalErrorResponse, SuccessResponse } from '../utils/response.utils';\nimport { errorHandler, requestId, responseTime, setupRequestContext, timeout } from '../utils/middleware.utils';\nimport { Env } from '../utils/env.utils';\nimport { getLogger } from '../utils/logger.utils';\nimport { InternalServerErrorException, ServiceUnavailableException } from '../utils/exception.utils';\nimport { NotFoundException } from '../utils/exception.utils';\nimport fs from 'fs';\nimport { defaultServerConfig } from '../config';\nimport { deepObjMerge } from '../utils/obj.utils';\nimport { fileExists } from '../utils/fs.utils';\nimport { Socket } from 'net';\nimport { ServerConfig, ServerHooks } from '../types/server';\nimport { BUILD_MARKER } from './server.builder';\nimport { isPort } from '../utils/validate.utils';\n\n/**\n * Production-ready Express server with enterprise features.\n *\n * Core Features:\n * - Security: Helmet, CORS, rate limiting, timeouts\n * - Monitoring: Request logs, metrics, health checks\n * - Performance: Compression, caching, static files\n * - Reliability: Graceful shutdown, error handling\n * - Developer UX: OpenAPI docs, debugging tools\n * - Extensibility: Hooks, middleware, custom routes\n *\n * Designed for microservices and production workloads.\n * Includes K8s readiness probes and zero-downtime support.\n */\nexport class ExpressServer {\n /** Prometheus client registry for metrics collection */\n private register: any = null;\n /** HTTP server instance (null when not running) */\n protected server: http.Server | https.Server | null = null;\n /** Merged configuration with defaults applied */\n protected config: ServerConfig;\n /** User-defined lifecycle hooks */\n protected hooks: ServerHooks;\n /** Global API prefix (from config) */\n protected globalPrefix: string;\n /** Internal fallback router */\n private rootRouter: Router;\n /** User-supplied router */\n private externalRouter?: Router;\n /** Internal Express app instance */\n private app: Express;\n /** Set of active WebSocket connections */\n private connections = new Set<Socket>();\n /** Flag indicating if the server is shutting down */\n private isShuttingDown = false;\n /**\n * Collection of registered health check functions.\n * These are executed when the health check endpoint is accessed.\n */\n private healthChecks: Array<{ name: string; check: () => Promise<boolean> | boolean }> = [];\n\n /** Prometheus metrics for monitoring */\n private requestCounter?: any;\n private routeTimings?: any;\n private requestSizes?: any;\n private clientIPs?: any;\n\n /** Promise that resolves when initialization (middleware + routes) is complete */\n private initPromise: Promise<void>;\n\n /**\n * Initializes server with intelligent defaults and security best practices.\n * All settings can be customized via config and hooks.\n *\n * Default Security:\n * - Secure headers (Helmet)\n * - Rate limiting\n * - Request timeouts\n * - Body size limits\n * - CORS protection\n *\n * Default Monitoring:\n * - Request/Response logging\n * - Prometheus metrics\n * - Health checks\n * - Request tracing\n */\n constructor(config: Partial<ServerConfig>, hooks: ServerHooks = {}) {\n if (ExpressServer.isBuiltServerConfig(config)) {\n this.config = config as Required<ServerConfig>;\n } else {\n // Deep merge config with user overrides\n this.config = deepObjMerge({}, defaultServerConfig, config) as Required<ServerConfig>;\n }\n\n if (!isPort(this.config.port)) {\n getLogger().error(`Port must be a valid number between 1 and 65535, got: ${this.config.port}`);\n process.exit(1);\n }\n\n // Sanitize app name for metrics (replace invalid characters with underscore)\n const safeAppName = (this.config.appName || 'express_app').toLowerCase().replace(/[^a-z0-9_]/g, '_');\n\n if (this.config.metrics?.enable) {\n const client = ExpressServer.optionalRequire('prom-client');\n if (!client) {\n getLogger().error(\n { command: 'npm install prom-client' },\n 'prom-client is required for metrics but not installed. Please add it to your dependencies'\n );\n process.exit(1);\n }\n this.register = new client.Registry();\n // Initialize Prometheus metrics with sanitized names\n this.requestCounter = new client.Counter({\n name: `${safeAppName}_http_requests_total`,\n help: 'Total HTTP requests',\n labelNames: ['method', 'route', 'status'],\n registers: [this.register]\n });\n this.routeTimings = new client.Histogram({\n name: `${safeAppName}_http_request_duration_seconds`,\n help: 'Duration of HTTP requests by route',\n labelNames: ['method', 'route', 'status'],\n buckets: [0.1, 0.3, 0.5, 0.7, 1, 3, 5, 7, 10],\n registers: [this.register]\n });\n this.requestSizes = new client.Histogram({\n name: `${safeAppName}_http_request_size_bytes`,\n help: 'Size of HTTP request bodies',\n labelNames: ['method', 'route'],\n buckets: [100, 1000, 10000, 100000, 1000000],\n registers: [this.register]\n });\n this.clientIPs = new client.Counter({\n name: `${safeAppName}_http_client_ip_total`,\n help: 'Client IP request counter',\n labelNames: ['ip', 'method'],\n registers: [this.register]\n });\n // Default system metrics (CPU, memory, event loop lag, etc.)\n client.collectDefaultMetrics({\n register: this.register,\n prefix: `${safeAppName}_`\n });\n }\n\n // Health checks\n if (config.healthCheck?.checks) {\n this.healthChecks.push(...config.healthCheck.checks);\n }\n\n // Set global prefix (normalize to empty string or \"/prefix\" without trailing slash)\n this.globalPrefix = this.normalizePath(this.config.globalPrefix ?? '', false);\n\n this.hooks = hooks;\n this.app = express();\n this.rootRouter = express.Router();\n\n // Store initialization promise to prevent race conditions with start()\n this.initPromise = this.initialize();\n }\n\n /**\n * Execute a lifecycle hook safely with comprehensive error handling.\n * Prevents hook failures from crashing the server while logging issues.\n *\n * @param hook Name of the lifecycle hook to execute\n * @param args Arguments to pass to the hook function\n */\n private async runHook<T extends keyof ServerHooks>(hook: T, ...args: unknown[]) {\n try {\n const fn = this.hooks[hook];\n if (fn) await (fn as (...args: unknown[]) => unknown).apply(null, args);\n } catch (err) {\n getLogger().error({ err, hook }, `Error executing ${hook as string} hook:`);\n }\n }\n\n /**\n * Initialize the Express server with middleware and routes.\n */\n private async initialize(): Promise<void> {\n await this.runHook('beforeInit', this);\n\n // Set up middleware stack (order is critical)\n await this.setupMiddleware();\n\n // Set up default routes and error handling\n await this.setupRoutes();\n\n await this.runHook('afterInit', this);\n }\n\n /**\n * Configure and register all middlewares in the optimal order.\n *\n * Middleware Order (CRITICAL - don't change without understanding implications):\n * 1. Basic server configuration (trust proxy, x-powered-by)\n * 2. Request ID generation (for tracing)\n * 3. Request context setup (for logging correlation)\n * 4. Timeout protection (prevents hanging requests)\n * 5. Response time tracking (for performance monitoring)\n * 6. Request logging (after ID/context setup)\n * 7. Custom request hooks\n * 8. Security middleware (rate limiting, CORS, Helmet)\n * 9. Response compression\n * 10. Static file serving\n * 11. Request parsing (body parsing, cookies)\n * 12. API documentation (OpenAPI)\n * 13. Global headers\n * 14. Custom response hooks\n */\n protected async setupMiddleware(): Promise<void> {\n if (this.config.https) {\n await this.validateHttpsFiles();\n }\n\n // Basic middleware should be first\n this.app.disable('x-powered-by');\n\n if (this.config.trustProxy) {\n this.app.set('trust proxy', true);\n }\n\n // Request ID generation - must be first for proper tracing\n this.app.use(\n requestId({\n headerName: this.config.requestId?.headerName,\n exposeHeader: this.config.requestId?.exposeHeader,\n generator: this.config.requestId?.generator\n })\n );\n\n // Request context setup for logging correlation\n this.app.use(\n setupRequestContext({\n headerName: this.config.requestId?.headerName,\n autoLog: false\n })\n );\n\n // Early shutdown-awareness middleware (lets load balancers drain connections gracefully)\n this.app.use((_req: Request, res: Response, next: NextFunction) => {\n if (this.isShuttingDown) {\n res.setHeader('Connection', 'close');\n return res\n .status(HttpStatusCodes.SERVICE_UNAVAILABLE)\n .json(new ServiceUnavailableException('Server is shutting down'));\n }\n next();\n return;\n });\n\n // Security middleware should come early\n if (this.config.helmet) {\n const helmet = ExpressServer.optionalRequire('helmet');\n if (!helmet) {\n getLogger().error(\n { command: 'npm install helmet' },\n 'helmet is required but not installed. Please add it to your dependencies'\n );\n process.exit(1);\n }\n\n if (typeof this.config.helmet === 'object') {\n this.app.use(helmet(this.config.helmet));\n } else {\n this.app.use(helmet());\n }\n }\n\n // CORS middleware should be early\n if (this.config.cors) {\n const cors = ExpressServer.optionalRequire('cors');\n if (!cors) {\n getLogger().error(\n { command: 'npm install cors' },\n 'cors is required but not installed. Please add it to your dependencies'\n );\n process.exit(1);\n }\n this.app.use(cors(this.config.cors === true ? {} : this.config.cors));\n }\n\n // Global headers\n this.app.use((_req, res, next) => {\n if (this.config.globalHeaders) {\n for (const key in this.config.globalHeaders) {\n const value = this.config.globalHeaders[key];\n res.setHeader(key, typeof value === 'function' ? value() : value);\n }\n }\n if (this.config.isMicroservice) {\n res.setHeader('X-Microservice', this.config.appName || 'express_app');\n }\n if (this.config.serviceVersion?.enable) {\n const version =\n typeof this.config.serviceVersion?.version === 'function'\n ? this.config.serviceVersion.version()\n : this.config.serviceVersion?.version;\n\n res.setHeader(this.config.serviceVersion?.headerName || 'x-service-version', version || '0.0.0');\n }\n next();\n });\n\n // Global request timeout protection\n if (this.config.requestTimeout) {\n this.app.use(timeout(this.config.requestTimeout));\n }\n\n // Response time tracking for performance monitoring\n if (this.config.responseTime?.enable) {\n this.app.use(\n responseTime({\n addHeader: this.config.responseTime.addHeader,\n logOnComplete: this.config.responseTime.logOnComplete\n })\n );\n }\n\n // Rate limiting should be early to prevent unnecessary processing\n if (this.config.rateLimit?.enable) {\n const rateLimit = ExpressServer.optionalRequire('express-rate-limit');\n if (!rateLimit) {\n getLogger().error(\n { command: 'npm install express-rate-limit' },\n 'express-rate-limit is required but not installed. Please add it to your dependencies'\n );\n process.exit(1);\n }\n\n this.app.use(\n rateLimit({\n windowMs: this.config.rateLimit.windowMs ?? 15 * 60 * 1000,\n max: this.config.rateLimit.max ?? 100,\n handler: (req: Request, res: Response) => {\n const status = HttpStatusCodes.TOO_MANY_REQUESTS;\n const response = createFinalErrorResponse(\n req,\n status,\n this.config.rateLimit?.message || 'Too many requests'\n );\n res.status(status).json(response);\n },\n standardHeaders: this.config.rateLimit.standardHeaders ?? true,\n legacyHeaders: this.config.rateLimit.legacyHeaders ?? false\n })\n );\n }\n\n // Request logging with filtering\n if (this.config.requestLogging?.enable) {\n this.app.use((req, res, next) => {\n if (typeof this.config.requestLogging?.ignorePaths === 'function') {\n const skip = this.config.requestLogging?.ignorePaths?.(req, res);\n if (skip) return next();\n } else if (Array.isArray(this.config.requestLogging?.ignorePaths)) {\n const skip = this.config.requestLogging?.ignorePaths?.includes(req.path);\n if (skip) return next();\n }\n\n const logger = getLogger();\n const incomingRequestMetaData = {\n requestId: req.id,\n method: req.method,\n url: req.originalUrl || req.url,\n ip: req.ip\n };\n logger.info(incomingRequestMetaData, 'Incoming Request');\n next();\n });\n }\n\n // Custom request preprocessing hook\n if (this.hooks.onRequest) {\n this.app.use(this.hooks.onRequest);\n }\n\n // Response compression for better performance\n if (this.config.compression) {\n const compression = ExpressServer.optionalRequire('compression');\n if (!compression) {\n getLogger().error(\n { command: 'npm install compression' },\n 'compression is required but not installed. Please add it to your dependencies'\n );\n process.exit(1);\n }\n\n if (typeof this.config.compression === 'object') {\n this.app.use(compression(this.config.compression));\n } else {\n this.app.use(compression());\n }\n }\n\n // Static file serving (do NOT normalize filesystem path; only normalize route)\n if (this.config.staticFolders) {\n this.config.staticFolders.forEach(folder => {\n this.app.use(\n this.normalizePath(folder.path ?? '/'),\n express.static(folder.directory, {\n maxAge: folder.maxAge || 0,\n etag: folder.etag !== false,\n immutable: folder.immutable === true,\n lastModified: folder.lastModified !== false,\n cacheControl: folder.cacheControl !== false\n })\n );\n getLogger().info(`Serving static folder: ${folder.directory} at path ${folder.path || '/'}`);\n });\n }\n\n // Request body parsing with size limits\n if (this.config.bodyParser) {\n if (this.config.bodyParser.json) {\n this.app.use(express.json(this.config.bodyParser.json));\n }\n if (this.config.bodyParser.urlencoded) {\n this.app.use(express.urlencoded(this.config.bodyParser.urlencoded));\n }\n }\n\n // Cookie parser middleware\n if (this.config.cookieParser) {\n const cookieParser = ExpressServer.optionalRequire('cookie-parser');\n if (!cookieParser) {\n getLogger().error(\n { command: 'npm install cookie-parser' },\n 'cookie-parser is required but not installed. Please add it to your dependencies'\n );\n process.exit(1);\n }\n\n if (typeof this.config.cookieParser === 'object') {\n this.app.use(cookieParser(undefined, this.config.cookieParser));\n } else {\n this.app.use(cookieParser());\n }\n }\n\n // OpenAPI docs via @scalar/express-api-reference\n if (this.config.openApi?.enable) {\n try {\n const openApiMountPath = this.normalizePath(\n this.config.openApi.mountPath ?? '/docs',\n this.config.openApi.withGlobalPrefix\n );\n const openApiFilePath = this.config.openApi.filePath;\n if (!openApiFilePath) {\n getLogger().error('OpenAPI file path is required');\n process.exit(1);\n }\n const isOpenApiFilePathExists = await fileExists(openApiFilePath);\n if (!isOpenApiFilePathExists) {\n getLogger().error(`OpenAPI spec file not found at ${openApiFilePath}`);\n process.exit(1);\n }\n\n if (this.config.openApi?.verbose) {\n getLogger().info(`Mounting OpenAPI docs at ${openApiMountPath}`);\n getLogger().info(`Using OpenAPI spec file at ${openApiFilePath}`);\n }\n\n const apiReference = ExpressServer.optionalRequire('@scalar/express-api-reference').apiReference;\n if (!apiReference) {\n getLogger().error(\n { command: 'npm install @scalar/express-api-reference' },\n '@scalar/express-api-reference is required for OpenAPI docs but not installed. Please add it to your dependencies'\n );\n process.exit(1);\n }\n\n this.app.use(\n openApiMountPath,\n apiReference({\n spec: {\n content: await fs.promises.readFile(openApiFilePath, 'utf8')\n }\n } as any)\n );\n if (this.config.openApi?.verbose) {\n getLogger().info(`Mounted OpenAPI docs at ${openApiMountPath}`);\n }\n } catch (err) {\n getLogger().error({ err }, 'Failed to mount OpenAPI docs');\n }\n }\n\n // Custom response preprocessing hook (apply global prefix if set)\n if (this.hooks.onResponse) {\n this.app.use(this.globalPrefix, this.hooks.onResponse);\n }\n\n if (this.config.metrics?.enable) {\n // Add metrics tracking middleware\n this.app.use((req, res, next) => {\n const start = process.hrtime();\n // Track client IPs\n this.clientIPs?.inc({ ip: req.ip, method: req.method });\n\n // Track request sizes (parse safely)\n const cl = req.headers['content-length'];\n if (cl) {\n const size = Number(cl);\n if (!Number.isNaN(size) && size >= 0) {\n const route = this.normalizeRouteForMetrics(req, res);\n this.requestSizes?.observe({ method: req.method, route }, size);\n }\n }\n\n res.once('finish', () => {\n const [seconds, nanoseconds] = process.hrtime(start);\n const finalRoute = this.normalizeRouteForMetrics(req, res);\n this.requestCounter?.inc({\n method: req.method,\n route: finalRoute,\n status: res.statusCode.toString()\n });\n this.routeTimings?.observe(\n {\n method: req.method,\n route: finalRoute,\n status: res.statusCode.toString()\n },\n seconds + nanoseconds / 1e9\n );\n });\n\n next();\n });\n }\n }\n\n /**\n * Configure server routes and error handling.\n * Sets up in following order:\n *\n * 1. Built-in routes (health, metrics)\n * 2. Application routes\n * 3. 404 handler\n * 4. Error handler\n */\n protected async setupRoutes(): Promise<void> {\n // Health check endpoint\n const healthCheckPath = this.normalizePath(\n this.config.healthCheck?.path || '/healthz',\n this.config.healthCheck?.withGlobalPrefix\n );\n\n this.app.get(healthCheckPath, async (_req: Request, res: Response) => {\n try {\n if (!this.healthChecks.length) {\n return res.status(HttpStatusCodes.OK).json(new SuccessResponse('OK'));\n }\n\n const checkResults = await Promise.allSettled(\n this.healthChecks.map(async ({ name, check }) => {\n try {\n const status = await Promise.resolve(check());\n return { name, status, error: null };\n } catch (error) {\n return { name, status: false, error: (error as Error).message };\n }\n })\n );\n\n const results = checkResults.map(result => {\n if (result.status === 'fulfilled') return result.value;\n return { name: 'unknown', status: false, error: result.reason };\n });\n\n const allOk = results.every(r => r.status);\n const status = allOk ? HttpStatusCodes.OK : HttpStatusCodes.SERVICE_UNAVAILABLE;\n const response = new SuccessResponse(allOk ? 'OK' : 'Service unavailable');\n if (!allOk) response.error = true;\n if (this.config.healthCheck?.detailed) response.data = { checks: results };\n return res.status(status).json(response);\n } catch {\n return res\n .status(HttpStatusCodes.INTERNAL_SERVER_ERROR)\n .json(new InternalServerErrorException('Health check failed'));\n }\n });\n\n // Metrics endpoint\n if (this.config.metrics?.enable) {\n const metricsPath = this.normalizePath(\n this.config.metrics.path ?? '/metrics',\n this.config.metrics?.withGlobalPrefix\n );\n this.app.get(metricsPath, async (_req, res) => {\n res.set('Content-Type', this.register.contentType);\n res.end(await this.register.metrics());\n });\n }\n\n // Application routes\n const routerToUse = this.externalRouter || this.rootRouter;\n this.app.use(this.globalPrefix, routerToUse);\n\n // 404 handler (must be after all other routes)\n this.app.use((req: Request, res: Response) => {\n const status = HttpStatusCodes.NOT_FOUND;\n const response = createFinalErrorResponse(req, status, `Route ${req.method.toUpperCase()} ${req.path} not found`);\n res.status(status).json(response);\n });\n\n // Global error handler (must be the last middleware)\n this.app.use((err: Error, req: Request, res: Response, next: NextFunction) => {\n // Check if this is a 404 error that should be handled with special logging rules\n const isNotFoundError = err instanceof NotFoundException;\n const shouldSkipLogging =\n !this.hooks.onError &&\n isNotFoundError &&\n this.config.requestLogging?.enable &&\n this.config.requestLogging.skipNotFoundRoutes === true;\n if (this.hooks.onError) {\n // Use custom error handler if provided\n this.hooks.onError(err, req, res, next);\n } else {\n // Default error handler with logging\n const errorHandlerMiddleware = errorHandler({\n logErrors: !shouldSkipLogging,\n includeDetails: Env.isDev() // Only show stack traces in development\n });\n errorHandlerMiddleware(err, req, res, next);\n }\n });\n }\n\n /**\n * Register a new health check function for monitoring service dependencies.\n *\n * Health checks are executed when the health endpoint is accessed and\n * help determine if the service is ready to handle requests.\n *\n * Examples:\n * - Database connectivity\n * - External service availability\n * - File system access\n * - Memory/CPU usage checks\n *\n * @param name Unique identifier for the check (used in detailed responses)\n * @param check Function returning boolean or Promise<boolean> indicating health\n * @returns This instance for method chaining\n */\n public registerHealthCheck(name: string, check: () => Promise<boolean> | boolean): this {\n this.healthChecks.push({ name, check });\n return this;\n }\n\n /**\n * Get the underlying Express application instance.\n * Use this for advanced Express features not exposed by this wrapper.\n *\n * @returns The raw Express app instance\n */\n public getApp(): Express {\n return this.app;\n }\n\n /**\n * Get the active HTTP/HTTPS server instance.\n * Returns null if the server is not currently running.\n *\n * @returns The HTTP/HTTPS server instance or null\n */\n public getServer(): http.Server | https.Server | null {\n return this.server;\n }\n\n /**\n * Start the HTTP server and begin listening for requests.\n *\n * This method:\n * - Executes beforeStart hooks\n * - Binds to the configured host/port\n * - Sets up error handling for startup failures\n * - Executes afterStart hooks on success\n * - Logs startup information\n *\n * @returns Promise resolving to the running HTTP server instance\n * @throws Error if server fails to start or port is already in use\n */\n public async start(): Promise<http.Server | https.Server> {\n // Ensure initialization (middleware + routes) completed before starting\n await this.initPromise;\n await this.runHook('beforeStart', this.app);\n\n return new Promise<http.Server | https.Server>((resolve, reject) => {\n try {\n // Prepare listen arguments with optional host parameter\n const listenArgs: [number, (string | undefined)?, (() => void)?] = [\n this.config.port,\n this.config.host,\n async () => {\n const protocol = this.config.https ? 'https' : 'http';\n const url = `${protocol}://${this.config.host}:${this.config.port}`;\n getLogger().info(`Server running on ${url}`);\n if (this.config.healthCheck?.path) {\n getLogger().info(\n `Health check available at ${url}${this.normalizePath(this.config.healthCheck.path, this.config.healthCheck.withGlobalPrefix)}`\n );\n }\n if (this.config.metrics?.enable && this.config.metrics.path) {\n getLogger().info(\n `Metrics available at ${url}${this.normalizePath(this.config.metrics.path, this.config.metrics.withGlobalPrefix)}`\n );\n }\n if (this.config.openApi?.enable) {\n getLogger().info(\n `API docs available at ${url}${this.normalizePath(this.config.openApi.mountPath as string, this.config.openApi.withGlobalPrefix)}`\n );\n }\n if (this.server) await this.runHook('afterStart', this.server);\n resolve(this.server as http.Server | https.Server);\n }\n ];\n\n if (this.config.https) {\n const httpsOptions: https.ServerOptions = {\n ...this.config.https,\n key: fs.readFileSync(this.config.https.key),\n cert: fs.readFileSync(this.config.https.cert)\n };\n if (this.config.https.ca) {\n httpsOptions.ca = fs.readFileSync(this.config.https.ca);\n }\n if (this.config.https.passphrase) {\n httpsOptions.passphrase = this.config.https.passphrase;\n }\n this.server = https.createServer(httpsOptions, this.app).listen(...(listenArgs as any));\n } else {\n // Start the HTTP server\n this.server = this.app.listen(...(listenArgs as any));\n }\n\n // Track connections\n this.server.on('connection', (conn: Socket) => {\n this.connections.add(conn);\n conn.on('close', () => this.connections.delete(conn));\n });\n\n // Handle server startup errors (port in use, permission denied, etc.)\n this.server.on('error', err => {\n getLogger().error({ err }, 'Server failed to start');\n reject(err);\n });\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Stop the HTTP server gracefully.\n *\n * This method:\n * - Executes beforeStop hooks\n * - Stops accepting new connections\n * - Waits for existing connections to finish\n * - Closes the server\n * - Executes afterStop hooks\n * - Logs shutdown information\n *\n * Graceful shutdown ensures:\n * - No requests are dropped\n * - Resources are properly cleaned up\n * - Monitoring systems are notified\n */\n public async stop(force = false): Promise<void> {\n if (!this.server) {\n getLogger().warn('Stop called but server is not running');\n return;\n }\n if (this.isShuttingDown) {\n getLogger().warn('Stop called while shutdown is already in progress');\n return;\n }\n\n this.isShuttingDown = true;\n await this.runHook('beforeStop', this.server);\n\n const shutdownTimeout = 10_000; // 10s max wait\n\n const serverClosePromise = new Promise<void>((resolve, reject) => {\n this.server!.close(async err => {\n if (err) {\n getLogger().error({ err }, 'Error while closing server');\n reject(err);\n return;\n }\n this.server = null;\n this.isShuttingDown = false;\n\n getLogger().info('Server stopped gracefully');\n await this.runHook('afterStop');\n resolve();\n });\n });\n\n const timeoutPromise = new Promise<void>((_, reject) =>\n setTimeout(() => reject(new Error('Shutdown timeout')), shutdownTimeout)\n );\n\n try {\n await Promise.race([serverClosePromise, timeoutPromise]);\n } catch (err) {\n getLogger().error({ err }, 'Graceful shutdown timed out');\n if (force) {\n getLogger().warn('Forcing connection destroy due to shutdown timeout');\n }\n } finally {\n // Always clean up connections\n await this.destroyConnections();\n }\n }\n\n /**\n * Enable graceful shutdown on OS signals for production deployment.\n *\n * This is essential for:\n * - Container orchestration (Docker, Kubernetes)\n * - Process managers (PM2, systemd)\n * - Load balancer health checks\n * - Zero-downtime deployments\n *\n * @param signals Array of process signals to listen for (default: SIGINT, SIGTERM)\n */\n public enableGracefulShutdown(signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM']): this {\n signals.forEach(signal => {\n process.on(signal, async () => {\n getLogger().info(`Received ${signal}, initiating graceful shutdown...`);\n try {\n await this.stop();\n process.exit(0);\n } catch (err) {\n getLogger().error({ err }, 'Error during graceful shutdown, forcing stop...');\n try {\n await this.stop(true); // fallback to forced shutdown\n process.exit(1);\n } catch (forceError) {\n getLogger().fatal({ forceError }, 'Forced shutdown failed, exiting hard');\n process.exit(1);\n }\n }\n });\n });\n return this;\n }\n\n /**\n * Set an externally created base router.\n * This will override the internal rootRouter.\n */\n public setBaseRouter(router: Router): this {\n this.externalRouter = router;\n return this;\n }\n\n /**\n * Create and register a new router (only used if not injecting one externally - use `setBaseRouter` instead).\n */\n public createRouter(prefix: string = ''): Router {\n const router = express.Router();\n const path = this.normalizePath(prefix, true);\n this.rootRouter.use(path, router);\n return router;\n }\n\n /**\n * Register a new route handler with support for multiple HTTP methods.\n * The route is automatically registered under the globalPrefix if set.\n *\n * @param methods Array of HTTP methods (get, post, put, delete, etc.)\n * @param path Route path with Express path patterns support\n * @param handlers One or more Express request handlers (middleware + final handler)\n * @returns This instance for method chaining\n */\n public registerRoute(\n methods: Array<keyof Pick<Express, 'get' | 'post' | 'put' | 'delete' | 'patch' | 'options' | 'head'>>,\n path: string,\n ...handlers: Array<express.RequestHandler>\n ): this {\n const fullPath = this.normalizePath(path, true);\n const methodMap: {\n [K in keyof Pick<\n Express,\n 'get' | 'post' | 'put' | 'delete' | 'patch' | 'options' | 'head'\n >]: (typeof this.app)[K];\n } = {\n get: this.app.get.bind(this.app),\n post: this.app.post.bind(this.app),\n put: this.app.put.bind(this.app),\n delete: this.app.delete.bind(this.app),\n patch: this.app.patch.bind(this.app),\n options: this.app.options.bind(this.app),\n head: this.app.head.bind(this.app)\n };\n methods.forEach(m => {\n const fn = methodMap[m];\n if (fn) {\n fn(fullPath, ...handlers);\n } else {\n throw new Error(`Unsupported HTTP method: ${m}`);\n }\n });\n return this;\n }\n\n /**\n * Register custom middleware with optional path restriction.\n *\n * Use this for:\n * - Adding authentication to specific routes\n * - Custom logging or validation\n * - Request transformation\n * - Third-party middleware integration\n *\n * @param path Optional path prefix or middleware function if no path\n * @param middleware Middleware handler (required if path is provided)\n * @returns This instance for method chaining\n */\n public registerMiddleware(path: string | express.RequestHandler, middleware?: express.RequestHandler): this {\n if (typeof path === 'string') {\n const normalizedPath = this.normalizePath(path);\n if (normalizedPath) {\n this.app.use(normalizedPath, middleware as express.RequestHandler);\n } else {\n this.app.use(middleware as express.RequestHandler);\n }\n } else {\n this.app.use(path);\n }\n return this;\n }\n\n /**\n * Register one or more middleware functions to be applied globally.\n * This is a simpler alternative to registerMiddleware when you just want\n * to add middleware without path restrictions.\n *\n * @param middlewares One or more Express middleware functions\n * @returns This instance for method chaining\n */\n public useMiddleware(...middlewares: express.RequestHandler[]): this {\n middlewares.forEach(middleware => {\n this.app.use(middleware);\n });\n return this;\n }\n\n /**\n * Get Prometheus registry (to add custom counters/histograms)\n *\n * @return {*} {client.Registry}\n */\n public getMetricsRegistry() {\n if (!this.config.metrics?.enable) {\n throw new Error('Metrics are not enabled in the server configuration');\n }\n return this.register as typeof import('prom-client').Registry;\n }\n\n /**\n * Get server configuration\n *\n * @return {*} {ServerConfig}\n */\n public getConfig(): ServerConfig {\n return this.config;\n }\n\n /**\n * Wait until server initialization (middleware + routes) has completed.\n * Useful for integration tests that inspect app before starting.\n */\n public async waitUntilReady(): Promise<void> {\n await this.initPromise;\n }\n\n private normalizePath(path: string, withGlobalPrefix = false): string {\n const sanitize = (p: string): string => {\n return (\n '/' +\n p\n .trim()\n .replace(/^\\/+/, '') // remove leading slashes\n .replace(/\\/{2,}/g, '/') // collapse multiple slashes\n .replace(/\\/+$/, '')\n ); // remove trailing slash\n };\n\n // Resolve global prefix if enabled\n const prefix = withGlobalPrefix && this.globalPrefix ? sanitize(this.globalPrefix) : '';\n\n // If path is invalid, default to prefix or root\n if (typeof path !== 'string' || !path.trim()) {\n return prefix || '/';\n }\n\n return sanitize(prefix + '/' + path);\n }\n\n private normalizeRouteForMetrics(req: Request, res: Response): string {\n // Prevent high cardinality metrics by normalizing routes\n if ((req as any)?.route?.path) {\n // Use Express route pattern instead of actual URL\n return (req as any).route.path;\n }\n // Group common patterns\n if (res.statusCode === 404) return '/404';\n const path = (req.path || 'unknown').split('?')[0];\n // Replace IDs and UUIDs with placeholders\n return path\n .replace(/\\/[0-9]+/g, '/:id')\n .replace(/\\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/g, '/:uuid');\n }\n\n /**\n * Destroy all active connections (gracefully if possible).\n * If a connection does not close cleanly, it will be force-destroyed.\n */\n private async destroyConnections(): Promise<void> {\n const total = this.connections.size;\n if (total === 0) {\n getLogger().debug('No active connections to close');\n return;\n }\n\n const timeoutMs = 5000;\n await Promise.race([\n Promise.all(\n Array.from(this.connections).map(\n conn =>\n new Promise<void>(resolve => {\n conn.end(() => {\n if (!conn.destroyed) conn.destroy();\n resolve();\n });\n conn.on('error', () => {\n conn.destroy();\n resolve();\n });\n })\n )\n ),\n new Promise<void>(resolve => setTimeout(resolve, timeoutMs))\n ]);\n\n this.connections.clear();\n getLogger().info(`Closed ${total} active connections`);\n }\n\n private async validateHttpsFiles() {\n if (!(await fileExists(this.config.https!.key))) {\n getLogger().error(`HTTPS key file not found: ${this.config.https!.key}`);\n process.exit(1);\n }\n if (!(await fileExists(this.config.https!.cert))) {\n getLogger().error(`HTTPS cert file not found: ${this.config.https!.cert}`);\n process.exit(1);\n }\n if (this.config.https!.ca && !(await fileExists(this.config.https!.ca))) {\n getLogger().error(`HTTPS CA file not found: ${this.config.https!.ca}`);\n process.exit(1);\n }\n }\n\n private static isBuiltServerConfig(config: Partial<ServerConfig>): boolean {\n if (config[BUILD_MARKER]) {\n return true;\n }\n return false;\n }\n\n private static optionalRequire<T = any>(name: string): T | null {\n try {\n return require(name);\n } catch {\n return null;\n }\n }\n}\n"]}
@@ -1,152 +0,0 @@
1
- /**
2
- * Generic API response format.
3
- * Used to wrap any successful or failed response from the server.
4
- */
5
- export interface ApiResponse<T = any> {
6
- /** Payload returned from the API. Can be any shape depending on the endpoint. */
7
- data: T | null;
8
- /** Indicates whether an error occurred (true = error, false = success). */
9
- error: boolean;
10
- /** Success message describing the result of the operation. */
11
- message: string;
12
- /** Unique request ID for traceability in logs (e.g., from a middleware). */
13
- requestId: string;
14
- /** ISO timestamp when the response was generated. */
15
- timestamp: string;
16
- }
17
- /**
18
- * Generic pagination structure used for paged lists (e.g., /users?page=1).
19
- */
20
- export interface Pagination<T = any> {
21
- /** List of records for the current page. */
22
- content: T[];
23
- /** Metadata about the pagination state. */
24
- pagination: {
25
- /** Total number of records across all pages. */
26
- totalRecords: number;
27
- /** Total number of pages available. */
28
- totalPages: number;
29
- /** Current page number (1-based index). */
30
- page: number;
31
- /** Number of records per page. */
32
- limit: number;
33
- /** Field by which the data is sorted. */
34
- sortBy: string;
35
- /** Sort order: ascending or descending. */
36
- sortOrder: 'asc' | 'desc';
37
- };
38
- }
39
- /**
40
- * Alias for paginated API response.
41
- * Allows semantic naming like `PaginationResponse<User>` or `PaginationResponse<Post>`.
42
- */
43
- export type PaginationResponse<T = any> = Pagination<T>;
44
- /**
45
- * Error response structure with additional metadata.
46
- * Used for providing richer error information to clients.
47
- */
48
- export interface ApiErrorResponse extends Omit<ApiResponse<never>, 'data'> {
49
- /** Error always true for error responses */
50
- error: true;
51
- /** HTTP status code */
52
- status: number;
53
- /** Path to the resource that caused the error */
54
- path: string;
55
- /** Stack trace of the error (if available) */
56
- stack?: string[];
57
- }
58
- /**
59
- * Success response structure with strongly typed data.
60
- * Used for providing successful responses to clients.
61
- */
62
- export interface ApiSuccessResponse<T = any> extends ApiResponse<T> {
63
- /** Error always false for success responses */
64
- error: false;
65
- /** HTTP status code (usually 200) */
66
- status?: number;
67
- }
68
- /**
69
- * Response structure for batch operations.
70
- * Used when multiple operations are performed in a single request.
71
- */
72
- export interface BatchResponse<T = any> {
73
- /** Overall success/failure indicator */
74
- success: boolean;
75
- /** Total number of operations */
76
- total: number;
77
- /** Number of successful operations */
78
- successful: number;
79
- /** Number of failed operations */
80
- failed: number;
81
- /** Results of individual operations */
82
- results: Array<{
83
- /** Identifier for this operation */
84
- id: string | number;
85
- /** Success/failure indicator for this operation */
86
- success: boolean;
87
- /** Response data for this operation */
88
- data?: T;
89
- /** Error information if this operation failed */
90
- error?: {
91
- message: string;
92
- code?: string;
93
- };
94
- }>;
95
- }
96
- /**
97
- * Response structure for asynchronous operations.
98
- * Used when the operation will complete in the future.
99
- */
100
- export interface AsyncOperationResponse {
101
- /** Always true for async operations */
102
- async: true;
103
- /** Job or task ID to check status later */
104
- jobId: string;
105
- /** Estimated completion time in seconds (if known) */
106
- estimatedTime?: number;
107
- /** URL to check status */
108
- statusUrl: string;
109
- }
110
- /**
111
- * Response structure for streaming operations.
112
- * Used when data is returned as a stream rather than all at once.
113
- */
114
- export interface StreamResponse {
115
- /** Stream identifier */
116
- streamId: string;
117
- /** Stream type (e.g., 'json', 'binary') */
118
- streamType: string;
119
- /** Total size in bytes (if known) */
120
- totalSize?: number;
121
- /** Chunk size in bytes */
122
- chunkSize: number;
123
- }
124
- /**
125
- * Sort direction enumeration.
126
- */
127
- export declare enum SortDirection {
128
- /** Ascending sort order */
129
- ASC = "asc",
130
- /** Descending sort order */
131
- DESC = "desc"
132
- }
133
- /**
134
- * Pagination parameters for API requests.
135
- */
136
- export interface PaginationParams {
137
- /** Current page number (1-based index) */
138
- page: number;
139
- /** Number of records per page */
140
- limit: number;
141
- /** Field by which the data is sorted */
142
- sortBy: string;
143
- /** Sort order: ascending or descending */
144
- sortOrder: SortDirection;
145
- /** Optional search query */
146
- search?: string;
147
- }
148
- /**
149
- * Type that combines pagination parameters with additional data.
150
- */
151
- export type WithPagination<T = {}> = PaginationParams & T;
152
- //# sourceMappingURL=api-response.d.ts.map
@@ -1,34 +0,0 @@
1
- /*
2
- * The MIT License
3
- *
4
- * Copyright (c) 2025 Catbee Technologies. https://catbee-utils.npm.hprasath.com/license
5
- *
6
- * Permission is hereby granted, free of charge, to any person obtaining a copy
7
- * of this software and associated documentation files (the "Software"), to deal
8
- * in the Software without restriction, including without limitation the rights
9
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- * copies of the Software, and to permit persons to whom the Software is
11
- * furnished to do so, subject to the following conditions:
12
- *
13
- * The above copyright notice and this permission notice shall be included in all
14
- * copies or substantial portions of the Software.
15
- *
16
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
- * SOFTWARE.
23
- */
24
- /**
25
- * Sort direction enumeration.
26
- */
27
- export var SortDirection;
28
- (function (SortDirection) {
29
- /** Ascending sort order */
30
- SortDirection["ASC"] = "asc";
31
- /** Descending sort order */
32
- SortDirection["DESC"] = "desc";
33
- })(SortDirection || (SortDirection = {}));
34
- //# sourceMappingURL=api-response.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-response.js","sourceRoot":"","sources":["../../../src/types/api-response.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAgKH;;GAEG;AACH,MAAM,CAAN,IAAY,aAMX;AAND,WAAY,aAAa;IACvB,2BAA2B;IAC3B,4BAAW,CAAA;IAEX,4BAA4B;IAC5B,8BAAa,CAAA;AACf,CAAC,EANW,aAAa,KAAb,aAAa,QAMxB","sourcesContent":["/*\n * The MIT License\n *\n * Copyright (c) 2025 Catbee Technologies. https://catbee-utils.npm.hprasath.com/license\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Generic API response format.\n * Used to wrap any successful or failed response from the server.\n */\nexport interface ApiResponse<T = any> {\n /** Payload returned from the API. Can be any shape depending on the endpoint. */\n data: T | null;\n\n /** Indicates whether an error occurred (true = error, false = success). */\n error: boolean;\n\n /** Success message describing the result of the operation. */\n message: string;\n\n /** Unique request ID for traceability in logs (e.g., from a middleware). */\n requestId: string;\n\n /** ISO timestamp when the response was generated. */\n timestamp: string;\n}\n\n/**\n * Generic pagination structure used for paged lists (e.g., /users?page=1).\n */\nexport interface Pagination<T = any> {\n /** List of records for the current page. */\n content: T[];\n\n /** Metadata about the pagination state. */\n pagination: {\n /** Total number of records across all pages. */\n totalRecords: number;\n\n /** Total number of pages available. */\n totalPages: number;\n\n /** Current page number (1-based index). */\n page: number;\n\n /** Number of records per page. */\n limit: number;\n\n /** Field by which the data is sorted. */\n sortBy: string;\n\n /** Sort order: ascending or descending. */\n sortOrder: 'asc' | 'desc';\n };\n}\n\n/**\n * Alias for paginated API response.\n * Allows semantic naming like `PaginationResponse<User>` or `PaginationResponse<Post>`.\n */\nexport type PaginationResponse<T = any> = Pagination<T>;\n\n/**\n * Error response structure with additional metadata.\n * Used for providing richer error information to clients.\n */\nexport interface ApiErrorResponse extends Omit<ApiResponse<never>, 'data'> {\n /** Error always true for error responses */\n error: true;\n\n /** HTTP status code */\n status: number;\n\n /** Path to the resource that caused the error */\n path: string;\n\n /** Stack trace of the error (if available) */\n stack?: string[];\n}\n\n/**\n * Success response structure with strongly typed data.\n * Used for providing successful responses to clients.\n */\nexport interface ApiSuccessResponse<T = any> extends ApiResponse<T> {\n /** Error always false for success responses */\n error: false;\n\n /** HTTP status code (usually 200) */\n status?: number;\n}\n\n/**\n * Response structure for batch operations.\n * Used when multiple operations are performed in a single request.\n */\nexport interface BatchResponse<T = any> {\n /** Overall success/failure indicator */\n success: boolean;\n\n /** Total number of operations */\n total: number;\n\n /** Number of successful operations */\n successful: number;\n\n /** Number of failed operations */\n failed: number;\n\n /** Results of individual operations */\n results: Array<{\n /** Identifier for this operation */\n id: string | number;\n\n /** Success/failure indicator for this operation */\n success: boolean;\n\n /** Response data for this operation */\n data?: T;\n\n /** Error information if this operation failed */\n error?: {\n message: string;\n code?: string;\n };\n }>;\n}\n\n/**\n * Response structure for asynchronous operations.\n * Used when the operation will complete in the future.\n */\nexport interface AsyncOperationResponse {\n /** Always true for async operations */\n async: true;\n\n /** Job or task ID to check status later */\n jobId: string;\n\n /** Estimated completion time in seconds (if known) */\n estimatedTime?: number;\n\n /** URL to check status */\n statusUrl: string;\n}\n\n/**\n * Response structure for streaming operations.\n * Used when data is returned as a stream rather than all at once.\n */\nexport interface StreamResponse {\n /** Stream identifier */\n streamId: string;\n\n /** Stream type (e.g., 'json', 'binary') */\n streamType: string;\n\n /** Total size in bytes (if known) */\n totalSize?: number;\n\n /** Chunk size in bytes */\n chunkSize: number;\n}\n\n/**\n * Sort direction enumeration.\n */\nexport enum SortDirection {\n /** Ascending sort order */\n ASC = 'asc',\n\n /** Descending sort order */\n DESC = 'desc'\n}\n\n/**\n * Pagination parameters for API requests.\n */\nexport interface PaginationParams {\n /** Current page number (1-based index) */\n page: number;\n\n /** Number of records per page */\n limit: number;\n\n /** Field by which the data is sorted */\n sortBy: string;\n\n /** Sort order: ascending or descending */\n sortOrder: SortDirection;\n\n /** Optional search query */\n search?: string;\n}\n\n/**\n * Type that combines pagination parameters with additional data.\n */\nexport type WithPagination<T = {}> = PaginationParams & T;\n"]}
@@ -1,125 +0,0 @@
1
- /**
2
- * A type that represents a configurable toggle.
3
- * Can be `true`, `false`, or a custom configuration object `T`.
4
- */
5
- export type ToggleConfig<T> = boolean | T;
6
- /**
7
- * A type representing a value that can be `null` or `undefined`.
8
- */
9
- export type Nullable<T> = T | null | undefined;
10
- /**
11
- * A type representing a value that may or may not be present.
12
- */
13
- export type Optional<T> = T | undefined;
14
- /**
15
- * A type that makes all properties of `T` deeply optional.
16
- */
17
- export type DeepPartial<T> = {
18
- [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
19
- };
20
- /**
21
- * A type that makes all properties of `T` readonly, recursively.
22
- */
23
- export type DeepReadonly<T> = {
24
- readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P];
25
- };
26
- /**
27
- * A type that converts a union of types into an intersection.
28
- */
29
- export type UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
30
- /**
31
- * A type representing a promise or a plain value.
32
- */
33
- export type MaybePromise<T> = T | Promise<T>;
34
- /**
35
- * A type representing a record with string keys and values of type `T`.
36
- */
37
- export type StringKeyedRecord<T> = Record<string, T>;
38
- /**
39
- * A type representing a function that returns `R` and optionally receives arguments `A`.
40
- */
41
- export type Func<A extends any[] = any[], R = any> = (...args: A) => R;
42
- /**
43
- * A type representing a partial pick from `T` (like Partial + Pick combined)
44
- */
45
- export type PartialPick<T, K extends keyof T> = Partial<Pick<T, K>> & Omit<T, K>;
46
- /**
47
- * A type that deeply stringifies all properties of T or makes them null.
48
- */
49
- export type DeepStringifyOrNull<T> = T extends string | number | boolean | bigint | boolean | symbol | null | undefined | null ? string | null : T extends Array<infer U> ? Array<DeepStringifyOrNull<U>> : T extends object ? {
50
- [K in keyof T]: DeepStringifyOrNull<T[K]>;
51
- } : string | null;
52
- /**
53
- * A type representing a non-empty array of T.
54
- */
55
- export type NonEmptyArray<T> = [T, ...T[]];
56
- /**
57
- * A type representing the union of all property values of T.
58
- */
59
- export type ValueOf<T> = T[keyof T];
60
- /**
61
- * A type that makes all properties of T mutable (removes readonly).
62
- */
63
- export type Mutable<T> = {
64
- -readonly [P in keyof T]: T[P];
65
- };
66
- /**
67
- * A type that gets the keys of T whose values are assignable to U.
68
- */
69
- export type KeysOfType<T, U> = {
70
- [K in keyof T]: T[K] extends U ? K : never;
71
- }[keyof T];
72
- /**
73
- * Require at least one of the keys in K to be present in T.
74
- */
75
- export type RequireAtLeastOne<T, K extends keyof T = keyof T> = K extends keyof T ? {
76
- [P in K]-?: T[P];
77
- } & Omit<T, K> : never;
78
- /**
79
- * A record type with optional keys.
80
- */
81
- export type RecordOptional<K extends string | number | symbol, T> = {
82
- [P in K]?: T;
83
- };
84
- /**
85
- * Primitive types in TypeScript.
86
- */
87
- export type Primitive = string | number | boolean | bigint | symbol | undefined | null;
88
- /**
89
- * Recursively unwraps Promise types to get their resolved value type.
90
- */
91
- export type Awaited<T> = T extends Promise<infer U> ? Awaited<U> : T;
92
- /**
93
- * Picks properties from T that are of type U.
94
- */
95
- export type PickByType<T, U> = {
96
- [P in keyof T as T[P] extends U ? P : never]: T[P];
97
- };
98
- /**
99
- * Makes all properties of T required recursively.
100
- */
101
- export type DeepRequired<T> = {
102
- [P in keyof T]-?: T[P] extends object ? DeepRequired<T[P]> : T[P];
103
- };
104
- /**
105
- * Checks if two types are exactly equal.
106
- * Returns true or false as type.
107
- */
108
- export type IsEqual<T, U> = (<G>() => G extends T ? 1 : 2) extends <G>() => G extends U ? 1 : 2 ? true : false;
109
- /**
110
- * Makes all properties of an object writable (removes readonly).
111
- */
112
- export type Writable<T> = {
113
- -readonly [P in keyof T]: T[P];
114
- };
115
- /**
116
- * Makes specific keys K of type T optional.
117
- */
118
- export type Optional2<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
119
- /**
120
- * Creates a type with all properties of T except those with types assignable to U.
121
- */
122
- export type Without<T, U> = {
123
- [P in keyof T as T[P] extends U ? never : P]: T[P];
124
- };
125
- //# sourceMappingURL=index.d.ts.map
@@ -1,25 +0,0 @@
1
- /*
2
- * The MIT License
3
- *
4
- * Copyright (c) 2025 Catbee Technologies. https://catbee-utils.npm.hprasath.com/license
5
- *
6
- * Permission is hereby granted, free of charge, to any person obtaining a copy
7
- * of this software and associated documentation files (the "Software"), to deal
8
- * in the Software without restriction, including without limitation the rights
9
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- * copies of the Software, and to permit persons to whom the Software is
11
- * furnished to do so, subject to the following conditions:
12
- *
13
- * The above copyright notice and this permission notice shall be included in all
14
- * copies or substantial portions of the Software.
15
- *
16
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
- * SOFTWARE.
23
- */
24
- export {};
25
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG","sourcesContent":["/*\n * The MIT License\n *\n * Copyright (c) 2025 Catbee Technologies. https://catbee-utils.npm.hprasath.com/license\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * A type that represents a configurable toggle.\n * Can be `true`, `false`, or a custom configuration object `T`.\n */\nexport type ToggleConfig<T> = boolean | T;\n\n/**\n * A type representing a value that can be `null` or `undefined`.\n */\nexport type Nullable<T> = T | null | undefined;\n\n/**\n * A type representing a value that may or may not be present.\n */\nexport type Optional<T> = T | undefined;\n\n/**\n * A type that makes all properties of `T` deeply optional.\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\n/**\n * A type that makes all properties of `T` readonly, recursively.\n */\nexport type DeepReadonly<T> = {\n readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P];\n};\n\n/**\n * A type that converts a union of types into an intersection.\n */\nexport type UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends (x: infer I) => void ? I : never;\n\n/**\n * A type representing a promise or a plain value.\n */\nexport type MaybePromise<T> = T | Promise<T>;\n\n/**\n * A type representing a record with string keys and values of type `T`.\n */\nexport type StringKeyedRecord<T> = Record<string, T>;\n\n/**\n * A type representing a function that returns `R` and optionally receives arguments `A`.\n */\nexport type Func<A extends any[] = any[], R = any> = (...args: A) => R;\n\n/**\n * A type representing a partial pick from `T` (like Partial + Pick combined)\n */\nexport type PartialPick<T, K extends keyof T> = Partial<Pick<T, K>> & Omit<T, K>;\n\n/**\n * A type that deeply stringifies all properties of T or makes them null.\n */\nexport type DeepStringifyOrNull<T> = T extends\n | string\n | number\n | boolean\n | bigint\n | boolean\n | symbol\n | null\n | undefined\n | null\n ? string | null\n : T extends Array<infer U>\n ? Array<DeepStringifyOrNull<U>>\n : T extends object\n ? { [K in keyof T]: DeepStringifyOrNull<T[K]> }\n : string | null;\n\n/**\n * A type representing a non-empty array of T.\n */\nexport type NonEmptyArray<T> = [T, ...T[]];\n\n/**\n * A type representing the union of all property values of T.\n */\nexport type ValueOf<T> = T[keyof T];\n\n/**\n * A type that makes all properties of T mutable (removes readonly).\n */\nexport type Mutable<T> = {\n -readonly [P in keyof T]: T[P];\n};\n\n/**\n * A type that gets the keys of T whose values are assignable to U.\n */\nexport type KeysOfType<T, U> = {\n [K in keyof T]: T[K] extends U ? K : never;\n}[keyof T];\n\n/**\n * Require at least one of the keys in K to be present in T.\n */\nexport type RequireAtLeastOne<T, K extends keyof T = keyof T> = K extends keyof T\n ? { [P in K]-?: T[P] } & Omit<T, K>\n : never;\n\n/**\n * A record type with optional keys.\n */\nexport type RecordOptional<K extends string | number | symbol, T> = {\n [P in K]?: T;\n};\n\n/**\n * Primitive types in TypeScript.\n */\nexport type Primitive = string | number | boolean | bigint | symbol | undefined | null;\n\n/**\n * Recursively unwraps Promise types to get their resolved value type.\n */\nexport type Awaited<T> = T extends Promise<infer U> ? Awaited<U> : T;\n\n/**\n * Picks properties from T that are of type U.\n */\nexport type PickByType<T, U> = {\n [P in keyof T as T[P] extends U ? P : never]: T[P];\n};\n\n/**\n * Makes all properties of T required recursively.\n */\nexport type DeepRequired<T> = {\n [P in keyof T]-?: T[P] extends object ? DeepRequired<T[P]> : T[P];\n};\n\n/**\n * Checks if two types are exactly equal.\n * Returns true or false as type.\n */\nexport type IsEqual<T, U> = (<G>() => G extends T ? 1 : 2) extends <G>() => G extends U ? 1 : 2 ? true : false;\n\n/**\n * Makes all properties of an object writable (removes readonly).\n */\nexport type Writable<T> = { -readonly [P in keyof T]: T[P] };\n\n/**\n * Makes specific keys K of type T optional.\n */\nexport type Optional2<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\n\n/**\n * Creates a type with all properties of T except those with types assignable to U.\n */\nexport type Without<T, U> = {\n [P in keyof T as T[P] extends U ? never : P]: T[P];\n};\n"]}