@catbee/utils 0.0.8-rc.1 → 0.0.8-rc.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/build/{esnext → cjs}/config.d.ts +0 -1
  2. package/build/{src → cjs}/config.js +0 -1
  3. package/build/{esnext → cjs}/index.d.ts +0 -1
  4. package/build/{src → cjs}/index.js +0 -1
  5. package/build/{esnext → cjs}/servers/server.builder.d.ts +0 -1
  6. package/build/{src → cjs}/servers/server.builder.js +10 -13
  7. package/build/{src → cjs}/servers/server.d.ts +0 -1
  8. package/build/{src → cjs}/servers/server.js +83 -75
  9. package/build/{src → cjs}/types/api-response.d.ts +0 -1
  10. package/build/{src → cjs}/types/api-response.js +0 -1
  11. package/build/{src → cjs}/types/index.d.ts +0 -1
  12. package/build/{src → cjs}/types/index.js +0 -1
  13. package/build/{src → cjs}/types/server.d.ts +0 -1
  14. package/build/{src → cjs}/types/server.js +0 -1
  15. package/build/{src → cjs}/utils/array.utils.d.ts +0 -1
  16. package/build/{src → cjs}/utils/array.utils.js +0 -1
  17. package/build/{src → cjs}/utils/async.utils.d.ts +0 -1
  18. package/build/{src → cjs}/utils/async.utils.js +2 -3
  19. package/build/{esnext → cjs}/utils/cache.utils.d.ts +0 -1
  20. package/build/{src → cjs}/utils/cache.utils.js +7 -6
  21. package/build/{esnext → cjs}/utils/context-store.utils.d.ts +1 -2
  22. package/build/{src → cjs}/utils/context-store.utils.js +10 -9
  23. package/build/{esnext → cjs}/utils/crypto.utils.d.ts +0 -1
  24. package/build/{src → cjs}/utils/crypto.utils.js +5 -3
  25. package/build/{src → cjs}/utils/date.utils.d.ts +0 -1
  26. package/build/{src → cjs}/utils/date.utils.js +1 -2
  27. package/build/{src → cjs}/utils/decorators.utils.d.ts +30 -27
  28. package/build/{src → cjs}/utils/decorators.utils.js +169 -30
  29. package/build/{esnext → cjs}/utils/dir.utils.d.ts +0 -1
  30. package/build/{src → cjs}/utils/dir.utils.js +6 -7
  31. package/build/{esnext → cjs}/utils/env.utils.d.ts +0 -1
  32. package/build/{src → cjs}/utils/env.utils.js +5 -8
  33. package/build/{src → cjs}/utils/exception.utils.d.ts +0 -1
  34. package/build/{src → cjs}/utils/exception.utils.js +2 -1
  35. package/build/{src → cjs}/utils/fs.utils.d.ts +0 -1
  36. package/build/{src → cjs}/utils/fs.utils.js +12 -13
  37. package/build/{esnext → cjs}/utils/http-status-codes.d.ts +0 -1
  38. package/build/{src → cjs}/utils/http-status-codes.js +0 -1
  39. package/build/{esnext → cjs}/utils/id.utils.d.ts +0 -1
  40. package/build/{src → cjs}/utils/id.utils.js +0 -1
  41. package/build/{src → cjs}/utils/logger.utils.d.ts +0 -1
  42. package/build/{src → cjs}/utils/logger.utils.js +10 -6
  43. package/build/{esnext → cjs}/utils/middleware.utils.d.ts +0 -1
  44. package/build/{src → cjs}/utils/middleware.utils.js +16 -17
  45. package/build/{esnext → cjs}/utils/obj.utils.d.ts +0 -1
  46. package/build/{src → cjs}/utils/obj.utils.js +1 -2
  47. package/build/{src → cjs}/utils/performance.utils.d.ts +0 -1
  48. package/build/{src → cjs}/utils/performance.utils.js +6 -4
  49. package/build/{esnext → cjs}/utils/request.utils.d.ts +0 -1
  50. package/build/{src → cjs}/utils/request.utils.js +7 -3
  51. package/build/{esnext → cjs}/utils/response.utils.d.ts +0 -1
  52. package/build/{src → cjs}/utils/response.utils.js +42 -28
  53. package/build/{esnext → cjs}/utils/stream.utils.d.ts +0 -1
  54. package/build/{src → cjs}/utils/stream.utils.js +0 -1
  55. package/build/{esnext → cjs}/utils/string.utils.d.ts +0 -1
  56. package/build/{src → cjs}/utils/string.utils.js +0 -1
  57. package/build/{src → cjs}/utils/type.utils.d.ts +0 -1
  58. package/build/{src → cjs}/utils/type.utils.js +2 -3
  59. package/build/{src → cjs}/utils/url.utils.d.ts +0 -1
  60. package/build/{src → cjs}/utils/url.utils.js +8 -9
  61. package/build/{src → cjs}/utils/validate.utils.d.ts +0 -1
  62. package/build/{src → cjs}/utils/validate.utils.js +2 -3
  63. package/build/esm/config.d.ts +0 -1
  64. package/build/esm/config.js +6 -7
  65. package/build/esm/index.d.ts +0 -1
  66. package/build/esm/index.js +0 -1
  67. package/build/esm/servers/server.builder.d.ts +0 -1
  68. package/build/esm/servers/server.builder.js +99 -147
  69. package/build/esm/servers/server.d.ts +0 -1
  70. package/build/esm/servers/server.js +591 -876
  71. package/build/esm/types/api-response.d.ts +0 -1
  72. package/build/esm/types/api-response.js +0 -1
  73. package/build/esm/types/index.d.ts +0 -1
  74. package/build/esm/types/index.js +0 -1
  75. package/build/esm/types/server.d.ts +0 -1
  76. package/build/esm/types/server.js +0 -1
  77. package/build/esm/utils/array.utils.d.ts +0 -1
  78. package/build/esm/utils/array.utils.js +48 -86
  79. package/build/esm/utils/async.utils.d.ts +0 -1
  80. package/build/esm/utils/async.utils.js +247 -524
  81. package/build/esm/utils/cache.utils.d.ts +0 -1
  82. package/build/esm/utils/cache.utils.js +96 -301
  83. package/build/esm/utils/context-store.utils.d.ts +1 -2
  84. package/build/esm/utils/context-store.utils.js +62 -79
  85. package/build/esm/utils/crypto.utils.d.ts +0 -1
  86. package/build/esm/utils/crypto.utils.js +78 -175
  87. package/build/esm/utils/date.utils.d.ts +0 -1
  88. package/build/esm/utils/date.utils.js +47 -53
  89. package/build/esm/utils/decorators.utils.d.ts +30 -27
  90. package/build/esm/utils/decorators.utils.js +417 -461
  91. package/build/esm/utils/dir.utils.d.ts +0 -1
  92. package/build/esm/utils/dir.utils.js +264 -786
  93. package/build/esm/utils/env.utils.d.ts +0 -1
  94. package/build/esm/utils/env.utils.js +180 -271
  95. package/build/esm/utils/exception.utils.d.ts +0 -1
  96. package/build/esm/utils/exception.utils.js +112 -289
  97. package/build/esm/utils/fs.utils.d.ts +0 -1
  98. package/build/esm/utils/fs.utils.js +169 -401
  99. package/build/esm/utils/http-status-codes.d.ts +0 -1
  100. package/build/esm/utils/http-status-codes.js +0 -1
  101. package/build/esm/utils/id.utils.d.ts +0 -1
  102. package/build/esm/utils/id.utils.js +5 -9
  103. package/build/esm/utils/logger.utils.d.ts +0 -1
  104. package/build/esm/utils/logger.utils.js +34 -71
  105. package/build/esm/utils/middleware.utils.d.ts +0 -1
  106. package/build/esm/utils/middleware.utils.js +65 -155
  107. package/build/esm/utils/obj.utils.d.ts +0 -1
  108. package/build/esm/utils/obj.utils.js +69 -176
  109. package/build/esm/utils/performance.utils.d.ts +0 -1
  110. package/build/esm/utils/performance.utils.js +92 -195
  111. package/build/esm/utils/request.utils.d.ts +0 -1
  112. package/build/esm/utils/request.utils.js +41 -74
  113. package/build/esm/utils/response.utils.d.ts +0 -1
  114. package/build/esm/utils/response.utils.js +84 -107
  115. package/build/esm/utils/stream.utils.d.ts +0 -1
  116. package/build/esm/utils/stream.utils.js +38 -113
  117. package/build/esm/utils/string.utils.d.ts +0 -1
  118. package/build/esm/utils/string.utils.js +6 -11
  119. package/build/esm/utils/type.utils.d.ts +0 -1
  120. package/build/esm/utils/type.utils.js +8 -12
  121. package/build/esm/utils/url.utils.d.ts +0 -1
  122. package/build/esm/utils/url.utils.js +49 -127
  123. package/build/esm/utils/validate.utils.d.ts +0 -1
  124. package/build/esm/utils/validate.utils.js +23 -40
  125. package/package.json +288 -63
  126. package/build/esm/config.js.map +0 -1
  127. package/build/esm/index.js.map +0 -1
  128. package/build/esm/servers/server.builder.js.map +0 -1
  129. package/build/esm/servers/server.js.map +0 -1
  130. package/build/esm/types/api-response.js.map +0 -1
  131. package/build/esm/types/index.js.map +0 -1
  132. package/build/esm/types/server.js.map +0 -1
  133. package/build/esm/utils/array.utils.js.map +0 -1
  134. package/build/esm/utils/async.utils.js.map +0 -1
  135. package/build/esm/utils/cache.utils.js.map +0 -1
  136. package/build/esm/utils/context-store.utils.js.map +0 -1
  137. package/build/esm/utils/crypto.utils.js.map +0 -1
  138. package/build/esm/utils/date.utils.js.map +0 -1
  139. package/build/esm/utils/decorators.utils.js.map +0 -1
  140. package/build/esm/utils/dir.utils.js.map +0 -1
  141. package/build/esm/utils/env.utils.js.map +0 -1
  142. package/build/esm/utils/exception.utils.js.map +0 -1
  143. package/build/esm/utils/fs.utils.js.map +0 -1
  144. package/build/esm/utils/http-status-codes.js.map +0 -1
  145. package/build/esm/utils/id.utils.js.map +0 -1
  146. package/build/esm/utils/logger.utils.js.map +0 -1
  147. package/build/esm/utils/middleware.utils.js.map +0 -1
  148. package/build/esm/utils/obj.utils.js.map +0 -1
  149. package/build/esm/utils/performance.utils.js.map +0 -1
  150. package/build/esm/utils/request.utils.js.map +0 -1
  151. package/build/esm/utils/response.utils.js.map +0 -1
  152. package/build/esm/utils/stream.utils.js.map +0 -1
  153. package/build/esm/utils/string.utils.js.map +0 -1
  154. package/build/esm/utils/type.utils.js.map +0 -1
  155. package/build/esm/utils/url.utils.js.map +0 -1
  156. package/build/esm/utils/validate.utils.js.map +0 -1
  157. package/build/esnext/config.js +0 -133
  158. package/build/esnext/config.js.map +0 -1
  159. package/build/esnext/index.js +0 -50
  160. package/build/esnext/index.js.map +0 -1
  161. package/build/esnext/servers/server.builder.js +0 -657
  162. package/build/esnext/servers/server.builder.js.map +0 -1
  163. package/build/esnext/servers/server.d.ts +0 -256
  164. package/build/esnext/servers/server.js +0 -955
  165. package/build/esnext/servers/server.js.map +0 -1
  166. package/build/esnext/types/api-response.d.ts +0 -152
  167. package/build/esnext/types/api-response.js +0 -34
  168. package/build/esnext/types/api-response.js.map +0 -1
  169. package/build/esnext/types/index.d.ts +0 -125
  170. package/build/esnext/types/index.js +0 -25
  171. package/build/esnext/types/index.js.map +0 -1
  172. package/build/esnext/types/server.d.ts +0 -268
  173. package/build/esnext/types/server.js +0 -25
  174. package/build/esnext/types/server.js.map +0 -1
  175. package/build/esnext/utils/array.utils.d.ts +0 -168
  176. package/build/esnext/utils/array.utils.js +0 -345
  177. package/build/esnext/utils/array.utils.js.map +0 -1
  178. package/build/esnext/utils/async.utils.d.ts +0 -265
  179. package/build/esnext/utils/async.utils.js +0 -620
  180. package/build/esnext/utils/async.utils.js.map +0 -1
  181. package/build/esnext/utils/cache.utils.js +0 -293
  182. package/build/esnext/utils/cache.utils.js.map +0 -1
  183. package/build/esnext/utils/context-store.utils.js +0 -289
  184. package/build/esnext/utils/context-store.utils.js.map +0 -1
  185. package/build/esnext/utils/crypto.utils.js +0 -276
  186. package/build/esnext/utils/crypto.utils.js.map +0 -1
  187. package/build/esnext/utils/date.utils.d.ts +0 -159
  188. package/build/esnext/utils/date.utils.js +0 -384
  189. package/build/esnext/utils/date.utils.js.map +0 -1
  190. package/build/esnext/utils/decorators.utils.d.ts +0 -508
  191. package/build/esnext/utils/decorators.utils.js +0 -877
  192. package/build/esnext/utils/decorators.utils.js.map +0 -1
  193. package/build/esnext/utils/dir.utils.js +0 -477
  194. package/build/esnext/utils/dir.utils.js.map +0 -1
  195. package/build/esnext/utils/env.utils.js +0 -785
  196. package/build/esnext/utils/env.utils.js.map +0 -1
  197. package/build/esnext/utils/exception.utils.d.ts +0 -230
  198. package/build/esnext/utils/exception.utils.js +0 -381
  199. package/build/esnext/utils/exception.utils.js.map +0 -1
  200. package/build/esnext/utils/fs.utils.d.ts +0 -164
  201. package/build/esnext/utils/fs.utils.js +0 -349
  202. package/build/esnext/utils/fs.utils.js.map +0 -1
  203. package/build/esnext/utils/http-status-codes.js +0 -295
  204. package/build/esnext/utils/http-status-codes.js.map +0 -1
  205. package/build/esnext/utils/id.utils.js +0 -84
  206. package/build/esnext/utils/id.utils.js.map +0 -1
  207. package/build/esnext/utils/logger.utils.d.ts +0 -160
  208. package/build/esnext/utils/logger.utils.js +0 -300
  209. package/build/esnext/utils/logger.utils.js.map +0 -1
  210. package/build/esnext/utils/middleware.utils.js +0 -236
  211. package/build/esnext/utils/middleware.utils.js.map +0 -1
  212. package/build/esnext/utils/obj.utils.js +0 -413
  213. package/build/esnext/utils/obj.utils.js.map +0 -1
  214. package/build/esnext/utils/performance.utils.d.ts +0 -136
  215. package/build/esnext/utils/performance.utils.js +0 -271
  216. package/build/esnext/utils/performance.utils.js.map +0 -1
  217. package/build/esnext/utils/request.utils.js +0 -186
  218. package/build/esnext/utils/request.utils.js.map +0 -1
  219. package/build/esnext/utils/response.utils.js +0 -247
  220. package/build/esnext/utils/response.utils.js.map +0 -1
  221. package/build/esnext/utils/stream.utils.js +0 -210
  222. package/build/esnext/utils/stream.utils.js.map +0 -1
  223. package/build/esnext/utils/string.utils.js +0 -165
  224. package/build/esnext/utils/string.utils.js.map +0 -1
  225. package/build/esnext/utils/type.utils.d.ts +0 -90
  226. package/build/esnext/utils/type.utils.js +0 -187
  227. package/build/esnext/utils/type.utils.js.map +0 -1
  228. package/build/esnext/utils/url.utils.d.ts +0 -141
  229. package/build/esnext/utils/url.utils.js +0 -304
  230. package/build/esnext/utils/url.utils.js.map +0 -1
  231. package/build/esnext/utils/validate.utils.d.ts +0 -177
  232. package/build/esnext/utils/validate.utils.js +0 -320
  233. package/build/esnext/utils/validate.utils.js.map +0 -1
  234. package/build/src/config.d.ts +0 -122
  235. package/build/src/config.js.map +0 -1
  236. package/build/src/index.d.ts +0 -27
  237. package/build/src/index.js.map +0 -1
  238. package/build/src/servers/server.builder.d.ts +0 -508
  239. package/build/src/servers/server.builder.js.map +0 -1
  240. package/build/src/servers/server.js.map +0 -1
  241. package/build/src/types/api-response.js.map +0 -1
  242. package/build/src/types/index.js.map +0 -1
  243. package/build/src/types/server.js.map +0 -1
  244. package/build/src/utils/array.utils.js.map +0 -1
  245. package/build/src/utils/async.utils.js.map +0 -1
  246. package/build/src/utils/cache.utils.d.ts +0 -153
  247. package/build/src/utils/cache.utils.js.map +0 -1
  248. package/build/src/utils/context-store.utils.d.ts +0 -189
  249. package/build/src/utils/context-store.utils.js.map +0 -1
  250. package/build/src/utils/crypto.utils.d.ts +0 -160
  251. package/build/src/utils/crypto.utils.js.map +0 -1
  252. package/build/src/utils/date.utils.js.map +0 -1
  253. package/build/src/utils/decorators.utils.js.map +0 -1
  254. package/build/src/utils/dir.utils.d.ts +0 -196
  255. package/build/src/utils/dir.utils.js.map +0 -1
  256. package/build/src/utils/env.utils.d.ts +0 -377
  257. package/build/src/utils/env.utils.js.map +0 -1
  258. package/build/src/utils/exception.utils.js.map +0 -1
  259. package/build/src/utils/fs.utils.js.map +0 -1
  260. package/build/src/utils/http-status-codes.d.ts +0 -266
  261. package/build/src/utils/http-status-codes.js.map +0 -1
  262. package/build/src/utils/id.utils.d.ts +0 -36
  263. package/build/src/utils/id.utils.js.map +0 -1
  264. package/build/src/utils/logger.utils.js.map +0 -1
  265. package/build/src/utils/middleware.utils.d.ts +0 -100
  266. package/build/src/utils/middleware.utils.js.map +0 -1
  267. package/build/src/utils/obj.utils.d.ts +0 -124
  268. package/build/src/utils/obj.utils.js.map +0 -1
  269. package/build/src/utils/performance.utils.js.map +0 -1
  270. package/build/src/utils/request.utils.d.ts +0 -86
  271. package/build/src/utils/request.utils.js.map +0 -1
  272. package/build/src/utils/response.utils.d.ts +0 -163
  273. package/build/src/utils/response.utils.js.map +0 -1
  274. package/build/src/utils/stream.utils.d.ts +0 -88
  275. package/build/src/utils/stream.utils.js.map +0 -1
  276. package/build/src/utils/string.utils.d.ts +0 -93
  277. package/build/src/utils/string.utils.js.map +0 -1
  278. package/build/src/utils/type.utils.js.map +0 -1
  279. package/build/src/utils/url.utils.js.map +0 -1
  280. package/build/src/utils/validate.utils.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.builder.js","sourceRoot":"","sources":["../../../src/servers/server.builder.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 { deepObjMerge } from '../utils/obj.utils';\nimport { ServerConfig } from '../types/server';\nimport { defaultServerConfig } from '../config';\nimport { isPort } from '../utils/validate.utils';\n\n/**\n * Builder class for creating and configuring an Express server configuration.\n *\n * This class provides a fluent interface to configure all aspects of the Express server\n * including security settings, middleware, routing, and more.\n *\n * @example\n * ```typescript\n * const serverConfig = new ServerConfigBuilder()\n * .withPort(3000)\n * .withHost('localhost')\n * .enableCors()\n * .enableHelmet()\n * .build();\n * ```\n */\n\nexport const BUILD_MARKER = Symbol.for('catbee.express.server.build');\n\nexport class ServerConfigBuilder {\n private config: Partial<ServerConfig> = {};\n\n /**\n * Validates that a port number is valid and usable.\n *\n * @private\n * @param port - The port number to validate\n * @throws {Error} If port is not an integer or is outside the valid range (1-65535)\n */\n private validatePort(port: number): void {\n if (!isPort(port)) {\n throw new Error(`Port must be a valid number between 1 and 65535, got: ${port}`);\n }\n }\n\n /**\n * Sets the port the server will listen on.\n *\n * @param port - The port number (1-65535)\n * @returns The builder instance for chaining\n * @throws {Error} If port is invalid\n * @default 3000 (can be overridden via PORT env variable)\n *\n * @example\n * ```typescript\n * builder.withPort(3000)\n * ```\n */\n withPort(port: number): this {\n this.validatePort(port);\n this.config.port = port;\n return this;\n }\n\n /**\n * Sets the hostname the server will bind to.\n *\n * @param host - The hostname (e.g., 'localhost', '0.0.0.0', '127.0.0.1')\n * @returns The builder instance for chaining\n * @default '0.0.0.0' (can be overridden via HOST env variable)\n *\n * @example\n * ```typescript\n * builder.withHost('0.0.0.0') // Listen on all interfaces\n * ```\n */\n withHost(host: string): this {\n this.config.host = host;\n return this;\n }\n\n /**\n * Configures Cross-Origin Resource Sharing (CORS) for the server.\n *\n * @param opts - CORS options object or boolean (true to enable with defaults, false to disable)\n * @returns The builder instance for chaining\n * @default false (CORS is disabled by default)\n *\n * @example\n * ```typescript\n * // Enable CORS with default options\n * builder.withCors(true)\n *\n * // Configure CORS with specific options\n * builder.withCors({\n * origin: ['https://example.com'],\n * methods: ['GET', 'POST']\n * })\n * ```\n */\n withCors(opts: ServerConfig['cors']): this {\n this.config.cors = opts;\n return this;\n }\n\n /**\n * Enables CORS with default settings\n *\n * @returns The builder instance for chaining\n */\n enableCors(): this {\n return this.withCors(true);\n }\n\n /**\n * Disables CORS\n *\n * @returns The builder instance for chaining\n */\n disableCors(): this {\n return this.withCors(false);\n }\n\n /**\n * Configures the Helmet middleware for setting HTTP security headers.\n *\n * @param opts - Helmet options object or boolean (true to enable with defaults, false to disable)\n * @returns The builder instance for chaining\n * @default false (Helmet is disabled by default)\n *\n * @example\n * ```typescript\n * // Enable Helmet with default settings\n * builder.withHelmet(true)\n *\n * // Configure Helmet with specific options\n * builder.withHelmet({\n * contentSecurityPolicy: false,\n * xssFilter: true\n * })\n * ```\n */\n withHelmet(opts: ServerConfig['helmet']): this {\n this.config.helmet = opts;\n return this;\n }\n\n /**\n * Enables Helmet with default settings\n *\n * @returns The builder instance for chaining\n */\n enableHelmet(): this {\n return this.withHelmet(true);\n }\n\n /**\n * Disables Helmet\n *\n * @returns The builder instance for chaining\n */\n disableHelmet(): this {\n return this.withHelmet(false);\n }\n\n /**\n * Configures response compression middleware.\n *\n * @param opts - Compression options object or boolean (true to enable with defaults, false to disable)\n * @returns The builder instance for chaining\n * @default false (Compression is disabled by default)\n *\n * @example\n * ```typescript\n * // Enable compression with default settings\n * builder.withCompression(true)\n *\n * // Configure compression with specific options\n * builder.withCompression({\n * level: 6,\n * threshold: 1024\n * })\n * ```\n */\n withCompression(opts: ServerConfig['compression']): this {\n this.config.compression = opts;\n return this;\n }\n\n /**\n * Enables compression with default settings\n *\n * @returns The builder instance for chaining\n */\n enableCompression(): this {\n return this.withCompression(true);\n }\n\n /**\n * Disables compression\n *\n * @returns The builder instance for chaining\n */\n disableCompression(): this {\n return this.withCompression(false);\n }\n\n /**\n * Configures rate limiting to protect against brute-force attacks.\n *\n * @param opts - Rate limit configuration options\n * @returns The builder instance for chaining\n * @default { enable: false, windowMs: 15 * 60 * 1000, max: 100, message: 'Too many requests', standardHeaders: true, legacyHeaders: false }\n *\n * @example\n * ```typescript\n * builder.withRateLimit({\n * enable: true,\n * windowMs: 15 * 60 * 1000, // 15 minutes\n * max: 100 // limit each IP to 100 requests per windowMs\n * })\n * ```\n */\n withRateLimit(opts: Partial<ServerConfig['rateLimit']>): this {\n this.mergeConfig('rateLimit', opts as NonNullable<ServerConfig['rateLimit']>);\n return this;\n }\n\n /**\n * Enables rate limiting with default or custom settings\n *\n * @param opts - Optional rate limit configuration (max requests, window, etc.)\n * @returns The builder instance for chaining\n */\n enableRateLimit(opts: Omit<Partial<NonNullable<ServerConfig['rateLimit']>>, 'enable'> = {}): this {\n return this.setEnabled('rateLimit', true, opts);\n }\n\n /**\n * Disables rate limiting\n *\n * @returns The builder instance for chaining\n */\n disableRateLimit(): this {\n return this.setEnabled('rateLimit', false);\n }\n\n /**\n * Configures HTTP request logging middleware.\n *\n * @param opts - Request logging configuration options\n * @returns The builder instance for chaining\n * @default { enable: true in dev/false in prod, ignorePaths: ['/healthz', '/favicon.ico', '/metrics', '/docs', '/.well-known'], skipNotFoundRoutes: false }\n *\n * @example\n * ```typescript\n * builder.withRequestLogging({\n * enable: true,\n * ignorePaths: ['/health', '/metrics'],\n * skipNotFoundRoutes: true\n * })\n * ```\n */\n withRequestLogging(opts: Partial<NonNullable<ServerConfig['requestLogging']>>): this {\n this.mergeConfig('requestLogging', opts as NonNullable<ServerConfig['requestLogging']>);\n return this;\n }\n\n /**\n * Enables request logging with default or custom settings\n *\n * @param opts - Optional request logging configuration\n * @returns The builder instance for chaining\n */\n enableRequestLogging(opts: Omit<Partial<NonNullable<ServerConfig['requestLogging']>>, 'enable'> = {}): this {\n return this.setEnabled('requestLogging', true, opts);\n }\n\n /**\n * Disables request logging\n *\n * @returns The builder instance for chaining\n */\n disableRequestLogging(): this {\n return this.setEnabled('requestLogging', false);\n }\n\n /**\n * Configures server metrics collection and endpoints.\n *\n * @param opts - Metrics configuration options\n * @returns The builder instance for chaining\n * @default { enable: false, path: '/metrics', withGlobalPrefix: false }\n *\n * @example\n * ```typescript\n * builder.withMetrics({\n * enable: true,\n * path: '/metrics'\n * })\n * ```\n */\n withMetrics(opts: Partial<NonNullable<ServerConfig['metrics']>>): this {\n this.mergeConfig('metrics', opts as NonNullable<ServerConfig['metrics']>);\n return this;\n }\n\n /**\n * Enables Prometheus metrics collection and endpoint\n *\n * @param opts - Optional metrics configuration\n * @returns The builder instance for chaining\n */\n enableMetrics(opts: Omit<Partial<NonNullable<ServerConfig['metrics']>>, 'enable'> = {}): this {\n return this.setEnabled('metrics', true, opts);\n }\n\n /**\n * Disables Prometheus metrics\n *\n * @returns The builder instance for chaining\n */\n disableMetrics(): this {\n return this.setEnabled('metrics', false);\n }\n\n /**\n * Configures server health check endpoint.\n *\n * @param opts - Health check configuration options\n * @returns The builder instance for chaining\n * @default { path: '/healthz', detailed: true, withGlobalPrefix: false }\n *\n * @example\n * ```typescript\n * builder.withHealthCheck({\n * path: '/health',\n * detailed: true\n * })\n * ```\n */\n withHealthCheck(opts: Partial<NonNullable<ServerConfig['healthCheck']>>): this {\n this.mergeConfig('healthCheck', opts as NonNullable<ServerConfig['healthCheck']>);\n return this;\n }\n\n /**\n * Configures OpenAPI/Swagger documentation for the API.\n *\n * @param opts - OpenAPI configuration options\n * @returns The builder instance for chaining\n * @default { enable: false, mountPath: '/docs', verbose: false, withGlobalPrefix: false }\n *\n * @example\n * ```typescript\n * builder.withOpenApi({\n * enable: true,\n * path: '/api-docs',\n * filePath: './openapi.yaml'\n * })\n * ```\n */\n withOpenApi(opts: Partial<NonNullable<ServerConfig['openApi']>>): this {\n this.mergeConfig('openApi', opts as NonNullable<ServerConfig['openApi']>);\n return this;\n }\n\n /**\n * Enables OpenAPI documentation with required file path\n *\n * @param filePath - Path to OpenAPI specification file (required)\n * @param opts - Optional OpenAPI configuration\n * @returns The builder instance for chaining\n */\n enableOpenApi(\n filePath: string,\n opts: Omit<Partial<NonNullable<ServerConfig['openApi']>>, 'enable' | 'filePath'> = {}\n ): this {\n this.setEnabled('openApi', true, { filePath, ...opts });\n return this;\n }\n\n /**\n * Disables OpenAPI documentation\n *\n * @returns The builder instance for chaining\n */\n disableOpenApi(): this {\n return this.setEnabled('openApi', false);\n }\n\n /**\n * Configures the server as a microservice with versioning.\n *\n * @param opts - Microservice configuration options including app name and service version\n * @returns The builder instance for chaining\n * @default { isMicroservice: false, appName: 'express_app' }\n *\n * @example\n * ```typescript\n * builder.withMicroService({\n * appName: 'user-service',\n * serviceVersion: {\n * enable: true,\n * version: '1.2.3'\n * }\n * })\n * ```\n */\n withMicroService(opts: {\n appName: NonNullable<ServerConfig['appName']>;\n serviceVersion: Partial<NonNullable<ServerConfig['serviceVersion']>>;\n }): this {\n this.config.isMicroservice = true;\n this.config.appName = opts.appName;\n\n this.mergeConfig('serviceVersion', opts.serviceVersion as NonNullable<ServerConfig['serviceVersion']>);\n return this;\n }\n\n /**\n * Configures the trust proxy settings to determine if X-Forwarded-* headers should be trusted.\n *\n * @param opts - Trust proxy configuration options\n * @returns The builder instance for chaining\n * @default false\n *\n * @example\n * ```typescript\n * // Trust proxy headers (useful when behind a load balancer)\n * builder.withTrustProxy(true)\n * ```\n */\n withTrustProxy(opts: NonNullable<ServerConfig['trustProxy']>): this {\n this.config.trustProxy = opts;\n return this;\n }\n\n /**\n * Configures the request ID middleware for tracing requests across services.\n *\n * @param opts - Request ID configuration options\n * @returns The builder instance for chaining\n * @default { headerName: 'x-request-id', exposeHeader: true }\n *\n * @example\n * ```typescript\n * builder.withRequestId({\n * headerName: 'X-Request-Id',\n * generator: () => crypto.randomUUID()\n * })\n * ```\n */\n withRequestId(opts: Partial<NonNullable<ServerConfig['requestId']>>): this {\n this.mergeConfig('requestId', opts as NonNullable<ServerConfig['requestId']>);\n return this;\n }\n\n /**\n * Configures the response time middleware for measuring request processing times.\n *\n * @param opts - Response time configuration options\n * @returns The builder instance for chaining\n * @default { enable: false, addHeader: true, logOnComplete: false }\n *\n * @example\n * ```typescript\n * builder.withResponseTime({\n * enable: true,\n * addHeader: true,\n * logOnComplete: true\n * })\n * ```\n */\n withResponseTime(opts: Partial<NonNullable<ServerConfig['responseTime']>>): this {\n this.mergeConfig('responseTime', opts as NonNullable<ServerConfig['responseTime']>);\n return this;\n }\n\n /**\n * Enables response time tracking with default or custom settings\n *\n * @param opts - Optional response time configuration\n * @returns The builder instance for chaining\n */\n enableResponseTime(opts: Omit<Partial<NonNullable<ServerConfig['responseTime']>>, 'enable'> = {}): this {\n this.setEnabled('responseTime', true, opts);\n return this;\n }\n\n /**\n * Disables response time tracking\n *\n * @returns The builder instance for chaining\n */\n disableResponseTime(): this {\n return this.setEnabled('responseTime', false);\n }\n\n /**\n * Configures the body parser middleware options for parsing request bodies.\n *\n * @param opts - Body parser configuration options\n * @returns The builder instance for chaining\n * @default { json: { limit: '1mb' }, urlencoded: { extended: true, limit: '1mb' } }\n *\n * @example\n * ```typescript\n * builder.withBodyParser({\n * json: {\n * limit: '1mb'\n * },\n * urlencoded: {\n * extended: true,\n * limit: '1mb'\n * }\n * })\n * ```\n */\n withBodyParser(opts: NonNullable<ServerConfig['bodyParser']>): this {\n this.config.bodyParser = deepObjMerge({}, this.config.bodyParser ?? {}, opts);\n return this;\n }\n\n /**\n * Configures cookie parsing middleware.\n *\n * @param opts - Cookie parser options or boolean (true to enable with defaults, false to disable)\n * @returns The builder instance for chaining\n * @default false\n *\n * @example\n * ```typescript\n * // Enable cookie parsing with default options\n * builder.withCookies(true)\n *\n * // Enable cookie parsing with specific options\n * builder.withCookies({\n * secret: 'your-secret-key',\n * secure: true\n * })\n * ```\n */\n withCookies(opts: ServerConfig['cookieParser']): this {\n this.config.cookieParser = opts;\n return this;\n }\n\n /**\n * Adds a static folder to serve files from.\n *\n * @param folder - Static folder configuration\n * @returns The builder instance for chaining\n *\n * @example\n * ```typescript\n * builder.withStaticFolder({\n * path: '/assets',\n * directory: './public',\n * options: { maxAge: '1d' }\n * })\n * ```\n */\n withStaticFolder(folder: NonNullable<ServerConfig['staticFolders']>[number]): this {\n if (!folder.path) throw new Error('Static folder requires a path');\n const folders = [...(this.config.staticFolders ?? []), folder];\n this.config.staticFolders = Array.from(new Map(folders.map(f => [f.path, f])).values());\n return this;\n }\n\n /**\n * Sets global headers to be included in all responses.\n *\n * @param headers - Object containing header name/value pairs or functions that return values\n * @returns The builder instance for chaining\n * @default {}\n *\n * @example\n * ```typescript\n * builder.withGlobalHeaders({\n * 'X-Powered-By': 'Catbee',\n * 'Server-Time': () => new Date().toISOString()\n * })\n * ```\n */\n withGlobalHeaders(headers: NonNullable<ServerConfig['globalHeaders']>): this {\n this.mergeConfig('globalHeaders', headers);\n return this;\n }\n\n /**\n * Sets a global prefix for all routes.\n *\n * @param prefix - The prefix to prepend to all routes (e.g., '/api/v1')\n * @returns The builder instance for chaining\n * @default '/'\n *\n * @example\n * ```typescript\n * builder.withGlobalPrefix('/api/v1')\n * ```\n */\n withGlobalPrefix(prefix: string): this {\n this.config.globalPrefix = prefix;\n return this;\n }\n\n /**\n * Applies custom configuration overrides directly.\n *\n * @param overrides - Custom configuration options to merge\n * @returns The builder instance for chaining\n *\n * @example\n * ```typescript\n * builder.withCustom({\n * port: 8080,\n * customMiddleware: myMiddlewareFunction\n * })\n * ```\n */\n withCustom(overrides: Partial<ServerConfig>): this {\n this.config = deepObjMerge({}, this.config, overrides);\n return this;\n }\n\n /**\n * Configures HTTPS server options.\n *\n * @param opts - HTTPS configuration (key, cert, ca, passphrase, etc.)\n * @returns The builder instance for chaining\n *\n * @example\n * ```typescript\n * builder.withHttps({\n * key: './localhost-key.pem',\n * cert: './localhost-cert.pem'\n * })\n * ```\n */\n withHttps(opts: NonNullable<ServerConfig['https']>): this {\n this.config.https = opts;\n return this;\n }\n\n /**\n * Builds and returns the final server configuration.\n *\n * This method merges the user-specified configuration with default values,\n * ensures all sections with 'enable' flags are properly structured, and\n * produces the final configuration to be used by the server.\n *\n * @returns The complete ServerConfig object\n *\n * @example\n * ```typescript\n * const config = new ServerConfigBuilder()\n * .withPort(3000)\n * .withHost('localhost')\n * .withCors(true)\n * .build();\n * ```\n */\n build(): Readonly<ServerConfig> {\n const config = deepObjMerge({}, defaultServerConfig, this.config) as ServerConfig;\n\n // Common validation\n if (config.openApi?.enable && !config.openApi.filePath) {\n throw new Error('OpenAPI is enabled but no filePath is specified');\n }\n\n return Object.freeze({\n ...config,\n [BUILD_MARKER]: true\n });\n }\n\n private mergeConfig<K extends keyof ServerConfig>(key: K, value: Partial<NonNullable<ServerConfig[K]>>): void {\n const current =\n typeof this.config[key] === 'object' && this.config[key] !== null\n ? (this.config[key] as NonNullable<ServerConfig[K]>)\n : {};\n this.config[key] = deepObjMerge({}, current, value) as NonNullable<ServerConfig[K]>;\n }\n\n private setEnabled<K extends keyof ServerConfig>(\n key: K,\n enable: boolean,\n overrides: Partial<NonNullable<ServerConfig[K]>> = {}\n ): this {\n this.mergeConfig(key, { ...overrides, enable });\n return this;\n }\n}\n"]}
@@ -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 +0,0 @@
1
- {"version":3,"file":"api-response.js","sourceRoot":"","sources":["../../../src/types/api-response.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;AAgKH;;GAEG;AACH,IAAY,aAMX;AAND,WAAY,aAAa;IACvB,2BAA2B;IAC3B,4BAAW,CAAA;IAEX,4BAA4B;IAC5B,8BAAa,CAAA;AACf,CAAC,EANW,aAAa,6BAAb,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 +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"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/types/server.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\nimport { Express, json, NextFunction, urlencoded, Request, Response } from 'express';\nimport { ExpressServer } from '../servers/server';\nimport { HelmetOptions } from 'helmet';\nimport { CompressionOptions } from 'compression';\nimport { CookieParseOptions } from 'cookie-parser';\nimport http from 'http';\nimport { CorsOptions } from 'cors';\nimport { ToggleConfig } from '.';\n\n/**\n * Server configuration interface with smart defaults and full customization.\n * All options are designed with security and performance best practices.\n * Most options can be overridden via environment variables.\n */\nexport interface ServerConfig {\n /** Port the server should listen on (default: 3000, env: PORT)\n * - default: 3000\n */\n port: number;\n /** Optional host address for binding (default: '0.0.0.0', env: HOST)\n * - default: '0.0.0.0'\n */\n host?: string;\n\n /** CORS configuration (default: false disables CORS, or provide options object)\n * - default: false\n */\n cors?: ToggleConfig<CorsOptions>;\n\n /** Enable Helmet security headers (default: false disables Helmet, or provide options object)\n * - default: false\n */\n helmet?: ToggleConfig<HelmetOptions>;\n\n /** Enable gzip/deflate compression (default: false disables compression, or provide options object)\n * - default: false\n */\n compression?: ToggleConfig<CompressionOptions>;\n\n /** Request body parsing with size limits\n * - json: { limit: '1mb' }\n * - urlencoded: { extended: true, limit: '1mb' }\n */\n bodyParser?: {\n /** JSON parser (default: { limit: '1mb' }) */\n json?: Parameters<typeof json>[0];\n /** URL-encoded parser (default: { extended: true, limit: '1mb' }) */\n urlencoded?: Parameters<typeof urlencoded>[0];\n };\n\n /** Enable cookie parsing with options (default: false)\n * - default: false\n */\n cookieParser?: ToggleConfig<CookieParseOptions>;\n\n /** Trust proxy headers (default: false)\n * - default: false\n */\n trustProxy?: boolean;\n\n /** Static file serving configuration for assets, uploads, etc.\n * - path: file system path to serve\n * - route: URL route prefix (default: \"/\")\n * - maxAge: cache max age (default: 0)\n * - etag: enable ETag headers (default: true)\n * - immutable: enable immutable caching (default: false)\n * - lastModified: enable last-modified caching (default: true)\n * - cacheControl: enable Cache-Control headers (default: true)\n */\n staticFolders?: Array<{\n /** URL route prefix (default: \"/\") */\n path?: string;\n /** File system path to serve */\n directory: string;\n /** Cache-Control: max-age=<duration> (default: 0) */\n maxAge?: string;\n /** Enable ETag headers (default: true) */\n etag?: boolean;\n /** Enable immutable caching (default: false) */\n immutable?: boolean;\n /** Enable last-modified caching (default: true) */\n lastModified?: boolean;\n /** Enable Cache-Control headers (default: true) */\n cacheControl?: boolean;\n }>;\n\n /** Enable microservice mode (default: false)\n * - default: false\n */\n isMicroservice?: boolean;\n\n /** Service name for headers/metrics (default: 'express_app', env: APP_NAME)\n * - default: 'express_app'\n */\n appName?: string;\n\n /** Global response headers (default: {})\n * - default: {}\n */\n globalHeaders?: Record<string, string | (() => string)>;\n\n /** Rate limiting settings\n * - enable: false\n * - windowMs: 15 * 60 * 1000\n * - max: 100\n * - message: 'Too many requests'\n * - standardHeaders: true\n * - legacyHeaders: false\n */\n rateLimit?: {\n /** Enable rate limiting (default: false) */\n enable: boolean;\n /** Time window in ms (default: 900000 - 15 minutes) */\n windowMs?: number;\n /** Max requests per window (default: 100) */\n max?: number;\n /** Rate limit message (default: 'Too many requests') */\n message?: string;\n /** Add standard headers (default: true) */\n standardHeaders?: boolean;\n /** Add legacy headers (default: false) */\n legacyHeaders?: boolean;\n };\n\n /** Request logging configuration\n * - enable: true in dev, false in prod\n * - ignorePaths: skips /healthz, /favicon.ico, /metrics, /docs, /.well-known\n * - skipNotFoundRoutes: false\n */\n requestLogging?: {\n /** Enable request logging (default: true in dev, false in prod) */\n enable: boolean;\n /** Ignore paths function or string[] (default: skips /healthz, /favicon.ico, /metrics, /docs, /.well-known) */\n ignorePaths?: string[] | ((req: Request, res: Response) => boolean);\n /** Skip logging for not found routes (default: false) */\n skipNotFoundRoutes?: boolean;\n };\n\n /** Health check settings\n * - path: '/healthz'\n * - detailed: true\n * - withGlobalPrefix: false\n */\n healthCheck?: {\n /** Health check path (default: '/healthz') */\n path?: string;\n /** Custom checks (default: []) */\n checks?: Array<{\n name: string;\n check: () => Promise<boolean> | boolean;\n }>;\n /** Show detailed checks status in response (default: true) */\n detailed?: boolean;\n /** Include in global prefix (default: false) */\n withGlobalPrefix?: boolean;\n };\n\n /** Request timeout in ms (default: 30000 - 30 seconds)\n * - default: 30000\n */\n requestTimeout?: number;\n\n /** Response timing configuration\n * - enable: false\n * - addHeader: true\n * - logOnComplete: false\n */\n responseTime?: {\n /** Enable timing (default: false) */\n enable: boolean;\n /** Add X-Response-Time header (default: true) */\n addHeader?: boolean;\n /** Log completion time (default: false) */\n logOnComplete?: boolean;\n };\n\n /** Request ID configuration\n * - headerName: 'x-request-id'\n * - exposeHeader: true\n * - generator: uuid()\n */\n requestId?: {\n /** Header name (default: 'x-request-id') */\n headerName?: string;\n /** Add to response headers (default: true) */\n exposeHeader?: boolean;\n /** ID generator (default: uuid()) */\n generator?: () => string;\n };\n\n /** Global route prefix (default: '/')\n * - default: '/'\n */\n globalPrefix?: string;\n\n /** OpenAPI documentation\n * - enable: false\n * - mountPath: '/docs'\n * - verbose: false\n * - withGlobalPrefix: false\n */\n openApi?: {\n /** Enable docs (default: false) */\n enable: boolean;\n /** UI path (default: '/docs') */\n mountPath?: string;\n /** Spec file path (required if enabled) */\n filePath?: string;\n /** Enable verbose logs (default: false) */\n verbose?: boolean;\n /** Include in global prefix (default: false) */\n withGlobalPrefix?: boolean;\n };\n\n /** Prometheus metrics\n * - enable: false\n * - path: '/metrics'\n * - withGlobalPrefix: false\n */\n metrics?: {\n /** Enable metrics (default: false) */\n enable: boolean;\n /** Metrics path (default: '/metrics') */\n path?: string;\n /** Include in global prefix (default: false) */\n withGlobalPrefix?: boolean;\n };\n\n /** Service version header\n * - enable: false\n * - headerName: 'x-service-version'\n * - version: '0.0.0'\n */\n serviceVersion?: {\n /** Enable version header (default: false) */\n enable: boolean;\n /** Header name (default: 'x-service-version') */\n headerName?: string;\n /** Version value (default: '0.0.0') */\n version?: string | (() => string);\n };\n\n /**\n * HTTPS configuration (if provided, server will use HTTPS)\n * Requires 'key' and 'cert' at minimum.\n * @command - to generate self-signed certificates\n * ```bash\n * choco install mkcert\n * mkcert -key-file localhost-key.pem -cert-file localhost-cert.pem localhost 127.0.0.1 ::1\n * ```\n */\n https?: {\n /** Path to SSL private key file (PEM) */\n key: string;\n /** Path to SSL certificate file (PEM) */\n cert: string;\n /** Optional path to CA bundle file (PEM) */\n ca?: string;\n /** Optional passphrase for the private key */\n passphrase?: string;\n /** Any other https.ServerOptions */\n [key: string]: any;\n };\n}\n\n/**\n * Server lifecycle hooks for custom behavior injection.\n * Allows extending server functionality without modifying core code.\n * All hooks can be async and support error handling.\n */\nexport interface ServerHooks {\n /** Called before any middleware or routes are initialized - good for early setup */\n beforeInit?: (server: ExpressServer) => Promise<void> | void;\n /** Called after middleware and routes are set up - good for final configuration */\n afterInit?: (server: ExpressServer) => Promise<void> | void;\n /** Called just before the server starts listening - good for last-minute checks */\n beforeStart?: (app: Express) => Promise<void> | void;\n /** Called after the server starts successfully - good for announcing readiness */\n afterStart?: (server: http.Server) => Promise<void> | void;\n /** Called before graceful shutdown begins - good for cleanup preparation */\n beforeStop?: (server: http.Server) => Promise<void> | void;\n /** Called after server has stopped - good for final cleanup */\n afterStop?: () => Promise<void> | void;\n /** Custom global error handler - overrides the default error handling */\n onError?: (error: Error, req: Request, res: Response, next: NextFunction) => void;\n /** Called at the start of each request - good for request preprocessing */\n onRequest?: (req: Request, res: Response, next: NextFunction) => void;\n /** Called before response is sent - good for response modification */\n onResponse?: (req: Request, res: Response, next: NextFunction) => void;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"array.utils.js","sourceRoot":"","sources":["../../../src/utils/array.utils.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;AAcH,sBAKC;AAWD,wBAUC;AASD,kCAUC;AASD,wBAGC;AAqBD,0BAeC;AAWD,0BAQC;AAWD,sBAGC;AAUD,gCAIC;AAUD,8BAIC;AAaD,8BAmCC;AAUD,kBAcC;AAUD,8BASC;AAUD,sBAmBC;AAUD,oBAGC;AAUD,8BAUC;AAUD,0BAGC;AAUD,0BAWC;AAjWD,2CAA6C;AAE7C;;;;;;;;;GASG;AACH,SAAgB,KAAK,CAAI,KAAU,EAAE,IAAY;IAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,mBAAmB,CAAC,CAAC;IACpE,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACnG,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;AAClH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,MAAM,CAAI,KAAU,EAAE,KAA4B;IAChE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3D,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAW,CAAC;IAChC,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QACzB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,WAAW,CAAI,KAAY;IACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,MAAM,CAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACpC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,GAAG,WAAW,CAAI,GAAG,CAAC,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,MAAM,CAAI,KAAU;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAClE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AACzD,CAAC;AAqBD,SAAgB,OAAO,CACrB,KAAU,EACV,OAA0D;IAE1D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3D,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAO,EAAE,EAAE,CAAC,IAAI,CAAC,OAAkB,CAAC,CAAC;IAC9F,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACZ,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAA6B,CAAC;QACpD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QAC7B,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAA2C,CAC5C,CAAC;AACJ,CAAC;AACD,gCAAgC;AAEhC;;;;;;;GAOG;AACH,SAAgB,OAAO,CAAI,KAAU;IACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,mBAAmB,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,KAAK,CAAuB,KAAU,EAAE,GAAM;IAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,UAAU,CAAI,CAAM,EAAE,CAAM;IAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,SAAS,CAAI,CAAM,EAAE,CAAM;IACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,SAAS,CAAI,KAAU,EAAE,GAAgC,EAAE,YAA4B,KAAK;IAC1G,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACjE,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC;IAE5C,MAAM,KAAK,GAAG,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAO,EAAE,EAAE,CAAC,IAAA,0BAAc,EAAC,IAAc,EAAE,GAAG,CAAC,CAAC;IAEjG,MAAM,OAAO,GAAG,CAAC,CAAI,EAAE,CAAI,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,wDAAwD;QACxD,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,CAAC,CAAC;QAC5B,IAAI,IAAI,IAAI,IAAI;YAAE,OAAO,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,IAAI,IAAI,IAAI,IAAI;YAAE,OAAO,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,OAAO,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,CAAC,IAAS,EAAE,KAAU,EAAO,EAAE;QAC3C,MAAM,MAAM,GAAQ,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,EACP,CAAC,GAAG,CAAC,CAAC;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3C,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;gBACvD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,GAAQ,EAAO,EAAE;QAC7B,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,GAAG,CAAC;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC;IACF,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;AACrB,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,GAAG,CAAI,GAAG,MAAa;IACrC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,SAAS,CAAC,8BAA8B,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAU,EAAE,CAAC;IAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,SAAS,CAAI,KAAU,EAAE,SAA0D;IACjG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAE3C,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,OAAO,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC3F,CAAC,EACD,CAAC,EAAS,EAAE,EAAS,CAAC,CACvB,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,OAAe,CAAC;IAChE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/E,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,IAAI,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAEvD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,WAAW,IAAI,KAAK,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,IAAI,KAAK,IAAI,GAAG,CAAC,EAAE,CAAC;QACpE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC;QAC9D,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,IAAI,CAAI,KAAU,EAAE,IAAY,CAAC;IAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,SAAS,CAAI,KAAU,EAAE,SAA8C;IACrF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,MAAM,GAAQ,EAAE,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAAE,MAAM;QACnC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,OAAO,CAAI,KAAU;IACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAqB,CAAC;AACnD,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,OAAO,CAAI,KAAU,EAAE,KAA4C;IACjF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACZ,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAChC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAA4B,CAC7B,CAAC;AACJ,CAAC","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 { getValueByPath } from './obj.utils';\n\n/**\n * Splits an array into chunks of the specified size.\n *\n * @template T The type of array elements.\n * @param {T[]} array - The array to split into chunks.\n * @param {number} size - The number of elements per chunk.\n * @returns {T[][]} A new array containing chunked arrays.\n * @throws {TypeError} If array is not an array.\n * @throws {Error} If chunk size is not a positive integer.\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n if (!Array.isArray(array)) throw new TypeError('Expected an array');\n if (!array.length) return [];\n if (!Number.isInteger(size) || size <= 0) throw new Error('Chunk size must be a positive integer');\n return Array.from({ length: Math.ceil(array.length / size) }, (_, i) => array.slice(i * size, i * size + size));\n}\n\n/**\n * Removes duplicate values from an array.\n * Optionally enforces uniqueness by a key function.\n *\n * @template T The type of array elements.\n * @param {T[]} array - The input array.\n * @param {(item: T) => unknown} [keyFn] - Optional function to determine uniqueness by key.\n * @returns {T[]} A new array with unique values.\n */\nexport function unique<T>(array: T[], keyFn?: (item: T) => unknown): T[] {\n if (!Array.isArray(array) || array.length === 0) return [];\n if (!keyFn) return Array.from(new Set(array));\n const seen = new Set<unknown>();\n return array.filter(item => {\n const key = keyFn(item);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\n/**\n * Deeply flattens a nested array to a single-level array.\n *\n * @template T The leaf type of array elements.\n * @param {any[]} array - The (possibly deeply nested) input array.\n * @returns {T[]} A deeply flattened array.\n */\nexport function flattenDeep<T>(array: any[]): T[] {\n if (!Array.isArray(array)) return [];\n return array.reduce<T[]>((acc, val) => {\n if (Array.isArray(val)) {\n acc.push(...flattenDeep<T>(val));\n } else {\n acc.push(val);\n }\n return acc;\n }, []);\n}\n\n/**\n * Returns a random element from an array, or undefined if empty.\n *\n * @template T The type of array elements.\n * @param {T[]} array - The input array.\n * @returns {T | undefined} A randomly selected item, or undefined if array is empty or not an array.\n */\nexport function random<T>(array: T[]): T | undefined {\n if (!Array.isArray(array) || array.length === 0) return undefined;\n return array[Math.floor(Math.random() * array.length)];\n}\n\n/* eslint-disable no-redeclare */\n/**\n * Groups items in an array by a key or key function.\n *\n * @template T The type of array elements.\n * @overload\n * @param {T[]} array - The array to group.\n * @param {keyof T} key - Property key to group by.\n * @returns {Record<string, T[]>}\n * @overload\n * @param {T[]} array - The array to group.\n * @param {(item: T) => string | number | symbol} keyFn - Function to generate group key from item.\n * @returns {Record<K, T[]>}\n * @param {T[]} array - The array to group.\n * @param {keyof T | ((item: T) => string | number | symbol)} keyOrFn - Property key or key-generating function.\n * @returns {Record<string | number | symbol, T[]>} An object mapping group keys to item arrays.\n */\nexport function groupBy<T>(array: T[], key: keyof T): Record<string, T[]>;\nexport function groupBy<T, K extends string | number | symbol>(array: T[], keyFn: (item: T) => K): Record<K, T[]>;\nexport function groupBy<T>(\n array: T[],\n keyOrFn: keyof T | ((item: T) => string | number | symbol)\n): Record<string | number | symbol, T[]> {\n if (!Array.isArray(array) || array.length === 0) return {};\n const keyFn = typeof keyOrFn === 'function' ? keyOrFn : (item: T) => item[keyOrFn as keyof T];\n return array.reduce(\n (acc, item) => {\n const key = keyFn(item) as string | number | symbol;\n if (!acc[key]) acc[key] = [];\n acc[key].push(item);\n return acc;\n },\n {} as Record<string | number | symbol, T[]>\n );\n}\n/* eslint-enable no-redeclare */\n\n/**\n * Shuffles an array using the Fisher-Yates algorithm.\n *\n * @template T The type of array elements.\n * @param {T[]} array - The input array.\n * @returns {T[]} A new shuffled array.\n * @throws {TypeError} If array is not an array.\n */\nexport function shuffle<T>(array: T[]): T[] {\n if (!Array.isArray(array)) throw new TypeError('Expected an array');\n const copy = array.slice();\n for (let i = copy.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [copy[i], copy[j]] = [copy[j], copy[i]];\n }\n return copy;\n}\n\n/**\n * Returns an array of property values from an array of objects.\n *\n * @template T The type of array elements.\n * @template K The object property to pluck.\n * @param {T[]} array - The input array.\n * @param {K} key - The property name to pluck.\n * @returns {T[K][]} Array of property values.\n */\nexport function pluck<T, K extends keyof T>(array: T[], key: K): T[K][] {\n if (!Array.isArray(array)) return [];\n return array.map(item => item[key]);\n}\n\n/**\n * Returns values in array A that are not in array B.\n *\n * @template T The type of array elements.\n * @param {T[]} a - First array.\n * @param {T[]} b - Second array.\n * @returns {T[]} Elements in A that are not in B.\n */\nexport function difference<T>(a: T[], b: T[]): T[] {\n if (!Array.isArray(a) || !Array.isArray(b)) return [];\n const setB = new Set(b);\n return a.filter(item => !setB.has(item));\n}\n\n/**\n * Returns common values between arrays A and B.\n *\n * @template T The type of array elements.\n * @param {T[]} a - First array.\n * @param {T[]} b - Second array.\n * @returns {T[]} Elements that exist in both arrays.\n */\nexport function intersect<T>(a: T[], b: T[]): T[] {\n if (!Array.isArray(a) || !Array.isArray(b)) return [];\n const setB = new Set(b);\n return a.filter(item => setB.has(item));\n}\n\n/**\n * Sorts an array of objects by a nested key using Merge Sort (O(n log n)).\n * Missing/undefined keys are sorted to the \"end\" (asc) or \"start\" (desc).\n *\n * @template T The type of array elements (objects).\n * @param {T[]} array - Array of objects to sort.\n * @param {string | ((item: T) => any)} key - Dot-notated key (e.g., \"profile.age\") or function.\n * @param {\"asc\" | \"desc\"} [direction=\"asc\"] - Sort direction: 'asc' or 'desc'.\n * @returns {T[]} A new sorted array.\n * @throws {TypeError} If array is not an array.\n */\nexport function mergeSort<T>(array: T[], key: string | ((item: T) => any), direction: 'asc' | 'desc' = 'asc'): T[] {\n if (!Array.isArray(array)) throw new TypeError('Expected array');\n if (array.length <= 1) return array.slice();\n\n const keyFn = typeof key === 'function' ? key : (item: T) => getValueByPath(item as object, key);\n\n const compare = (a: T, b: T) => {\n const aVal = keyFn(a);\n const bVal = keyFn(b);\n // Sorts undefined/null last for \"asc\", first for \"desc\"\n if (aVal === bVal) return 0;\n if (aVal == null) return direction === 'asc' ? 1 : -1;\n if (bVal == null) return direction === 'asc' ? -1 : 1;\n return direction === 'asc' ? (aVal < bVal ? -1 : 1) : aVal > bVal ? -1 : 1;\n };\n\n const merge = (left: T[], right: T[]): T[] => {\n const result: T[] = [];\n let i = 0,\n j = 0;\n while (i < left.length && j < right.length) {\n if (compare(left[i], right[j]) <= 0) result.push(left[i++]);\n else result.push(right[j++]);\n }\n return result.concat(left.slice(i)).concat(right.slice(j));\n };\n\n const sort = (arr: T[]): T[] => {\n if (arr.length <= 1) return arr;\n const mid = Math.floor(arr.length / 2);\n const left = sort(arr.slice(0, mid));\n const right = sort(arr.slice(mid));\n return merge(left, right);\n };\n return sort(array);\n}\n\n/**\n * Combines multiple arrays into a single array of grouped elements.\n * Output array length equals the length of the shortest input array.\n *\n * @example zip([1, 2], ['a', 'b']) => [[1, 'a'], [2, 'b']]\n * @param {...Array<T>[]} arrays - Two or more arrays to zip together.\n * @returns {Array<T[]>} Array of grouped elements.\n */\nexport function zip<T>(...arrays: T[][]): T[][] {\n if (arrays.length === 0) return [];\n if (arrays.some(arr => !Array.isArray(arr))) {\n throw new TypeError('All arguments must be arrays');\n }\n\n const minLength = Math.min(...arrays.map(arr => arr.length));\n const result: T[][] = [];\n\n for (let i = 0; i < minLength; i++) {\n result.push(arrays.map(arr => arr[i]));\n }\n\n return result;\n}\n\n/**\n * Splits an array into two arrays based on a predicate function.\n *\n * @template T The type of array elements.\n * @param {T[]} array - The input array.\n * @param {(item: T, index: number, array: T[]) => boolean} predicate - Function to test each element.\n * @returns {[T[], T[]]} A tuple of two arrays: [matched, unmatched].\n */\nexport function partition<T>(array: T[], predicate: (item: T, index: number, array: T[]) => boolean): [T[], T[]] {\n if (!Array.isArray(array)) return [[], []];\n\n return array.reduce(\n ([pass, fail], item, index) => {\n return predicate(item, index, array) ? [[...pass, item], fail] : [pass, [...fail, item]];\n },\n [[] as T[], [] as T[]]\n );\n}\n\n/**\n * Generates an array of numbers within a specified range.\n *\n * @param {number} start - Start of range (inclusive).\n * @param {number} end - End of range (exclusive).\n * @param {number} [step=1] - Step between numbers.\n * @returns {number[]} Array of numbers in range.\n */\nexport function range(start: number, end: number, step: number = 1): number[] {\n if (!Number.isFinite(start) || !Number.isFinite(end) || !Number.isFinite(step)) {\n throw new TypeError('Arguments must be finite numbers');\n }\n if (step === 0) throw new Error('Step cannot be zero');\n\n const isAscending = step > 0;\n if ((isAscending && start >= end) || (!isAscending && start <= end)) {\n return [];\n }\n\n const length = Math.max(Math.ceil((end - start) / step), 0);\n const result = new Array(length);\n\n for (let i = 0, value = start; i < length; i++, value += step) {\n result[i] = value;\n }\n\n return result;\n}\n\n/**\n * Returns the first n elements of an array.\n *\n * @template T The type of array elements.\n * @param {T[]} array - The input array.\n * @param {number} [n=1] - Number of elements to take.\n * @returns {T[]} New array with first n elements.\n */\nexport function take<T>(array: T[], n: number = 1): T[] {\n if (!Array.isArray(array) || n <= 0) return [];\n return array.slice(0, n);\n}\n\n/**\n * Takes elements from the array while predicate returns true.\n *\n * @template T The type of array elements.\n * @param {T[]} array - The input array.\n * @param {(item: T, index: number) => boolean} predicate - Function to test each element.\n * @returns {T[]} New array with taken elements.\n */\nexport function takeWhile<T>(array: T[], predicate: (item: T, index: number) => boolean): T[] {\n if (!Array.isArray(array)) return [];\n\n const result: T[] = [];\n for (let i = 0; i < array.length; i++) {\n if (!predicate(array[i], i)) break;\n result.push(array[i]);\n }\n\n return result;\n}\n\n/**\n * Removes all falsy values from an array.\n * False, null, 0, \"\", undefined, and NaN are falsy.\n *\n * @template T The type of array elements.\n * @param {T[]} array - The input array.\n * @returns {NonNullable<T>[]} New array with falsy values removed.\n */\nexport function compact<T>(array: T[]): NonNullable<T>[] {\n if (!Array.isArray(array)) return [];\n return array.filter(Boolean) as NonNullable<T>[];\n}\n\n/**\n * Counts array elements by a key function.\n *\n * @template T The type of array elements.\n * @param {T[]} array - The input array.\n * @param {(item: T) => string | number | symbol} keyFn - Function to generate count key.\n * @returns {Record<string, number>} Object with counts by key.\n */\nexport function countBy<T>(array: T[], keyFn: (item: T) => string | number | symbol): Record<string, number> {\n if (!Array.isArray(array)) return {};\n\n return array.reduce(\n (acc, item) => {\n const key = String(keyFn(item));\n acc[key] = (acc[key] || 0) + 1;\n return acc;\n },\n {} as Record<string, number>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"async.utils.js","sourceRoot":"","sources":["../../../src/utils/async.utils.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 { getLogger } from './logger.utils';\n\n/**\n * Delays execution for a specified number of milliseconds.\n *\n * @param {number} ms - The number of milliseconds to sleep.\n * @returns {Promise<void>} A Promise that resolves after the given time.\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Creates a debounced version of a function that delays its execution.\n * Provides `.cancel()` and `.flush()` methods.\n *\n * @template T\n * @param {T} fn - The function to debounce.\n * @param {number} delay - Delay in milliseconds.\n * @returns {T & { cancel: () => void; flush: () => void }} A debounced function.\n */\nexport function debounce<T extends (...args: any[]) => void>(fn: T, delay: number) {\n let timer: NodeJS.Timeout | null = null;\n let pendingArgs: Parameters<T> | null = null;\n\n function debounced(...args: Parameters<T>) {\n pendingArgs = args;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n fn(...(pendingArgs as Parameters<T>));\n timer = null;\n }, delay);\n }\n\n debounced.cancel = () => {\n if (timer) clearTimeout(timer);\n timer = null;\n pendingArgs = null;\n };\n\n debounced.flush = () => {\n if (timer) {\n clearTimeout(timer);\n fn(...(pendingArgs as Parameters<T>));\n timer = null;\n pendingArgs = null;\n }\n };\n\n return debounced as typeof debounced & {\n cancel: () => void;\n flush: () => void;\n };\n}\n\n/**\n * Creates a throttled version of a function that limits its execution rate.\n * Allows control over leading/trailing invocation.\n *\n * @template T\n * @param {T} fn - The function to throttle.\n * @param {number} limit - Minimum time between calls in milliseconds.\n * @param {{ leading?: boolean, trailing?: boolean }} [opts] - Options for leading/trailing edge throttling.\n * @returns {(...args: Parameters<T>) => void} A throttled function.\n */\nexport function throttle<T extends (...args: any[]) => void>(\n fn: T,\n limit: number,\n opts: { leading?: boolean; trailing?: boolean } = {\n leading: true,\n trailing: false\n }\n): (...args: Parameters<T>) => void {\n let lastCall = 0;\n let timer: NodeJS.Timeout | null = null;\n let savedArgs: Parameters<T> | null = null;\n\n return function (...args: Parameters<T>) {\n const now = Date.now();\n const { leading = true, trailing = false } = opts;\n\n if (!lastCall && !leading) lastCall = now;\n\n const remaining = limit - (now - lastCall);\n\n if (remaining <= 0) {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n lastCall = now;\n fn(...args);\n } else if (trailing) {\n savedArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n lastCall = leading ? Date.now() : 0;\n timer = null;\n if (savedArgs) fn(...savedArgs);\n }, remaining);\n }\n }\n };\n}\n\n/**\n * Retries an asynchronous function a given number of times with optional delay/backoff.\n *\n * @template T\n * @param {() => Promise<T>} fn - The async function to retry.\n * @param {number} [retries=3] - Number of retry attempts.\n * @param {number} [delay=500] - Delay in milliseconds between retries.\n * @param {boolean} [backoff=false] - Use exponential backoff between attempts.\n * @param {(error: unknown, attempt: number) => void} [onRetry] - Callback for each retry attempt.\n * @returns {Promise<T>} The result of the async function if successful.\n * @throws {*} The last encountered error if all retries fail.\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n retries = 3,\n delay = 500,\n backoff = false,\n onRetry?: (error: unknown, attempt: number) => void\n): Promise<T> {\n for (let i = 0; i < retries; i++) {\n try {\n return await fn();\n } catch (e) {\n if (i === retries - 1) throw e;\n if (onRetry) onRetry(e, i + 1);\n await sleep(backoff ? delay * Math.pow(2, i) : delay);\n }\n }\n throw new Error('Retry failed'); // should never reach here\n}\n\n/**\n * Wraps a promise and rejects it if it doesn't resolve within the specified timeout.\n *\n * @template T\n * @param {Promise<T>} promise - The original promise.\n * @param {number} ms - Timeout in milliseconds.\n * @param {string} [message=\"Operation timed out\"] - Optional timeout message.\n * @returns {Promise<T>} A promise that resolves or rejects within the timeout.\n */\nexport function withTimeout<T>(promise: Promise<T>, ms: number, message = 'Operation timed out'): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timeoutHandle = setTimeout(() => reject(new Error(message)), ms);\n promise\n .then(result => {\n clearTimeout(timeoutHandle);\n resolve(result);\n })\n .catch(err => {\n clearTimeout(timeoutHandle);\n reject(err);\n });\n });\n}\n\n/**\n * Executes async tasks in true batches.\n * Each batch runs in parallel, but batches run sequentially.\n * All tasks in a batch start at the same time, next batch waits for full completion.\n * NOTE: For more granular concurrency, use a \"queue\" or \"pooled\" approach.\n *\n * @template T\n * @param {Array<() => Promise<T>>} tasks - An array of functions that return Promises.\n * @param {number} limit - Number of tasks to run in parallel per batch.\n * @returns {Promise<T[]>} A promise that resolves to an array of resolved values.\n */\nexport async function runInBatches<T>(tasks: (() => Promise<T>)[], limit: number): Promise<T[]> {\n const results: T[] = [];\n for (let i = 0; i < tasks.length; i += limit) {\n const batch = tasks.slice(i, i + limit);\n const batchResults = await Promise.all(batch.map(fn => fn()));\n results.push(...batchResults);\n }\n return results;\n}\n\n/**\n * Wraps a function and ensures it is only called once at a time.\n * Calls made while one is in progress will wait for the same Promise.\n * Optionally, new calls can be dropped while in progress (drop=true).\n *\n * @template TArgs\n * @template TResult\n * @param {(...args: TArgs) => Promise<TResult>} fn - The async function to wrap.\n * @param {boolean} [drop=false] - If true, new calls while one is pending are rejected.\n * @returns {(...args: TArgs) => Promise<TResult>} A wrapped function with singleton behavior.\n */\nexport function singletonAsync<TArgs extends unknown[], TResult>(\n fn: (...args: TArgs) => Promise<TResult>,\n drop: boolean = false\n): (...args: TArgs) => Promise<TResult> {\n let promise: Promise<TResult> | null = null;\n\n return async (...args: TArgs) => {\n if (!promise) {\n promise = fn(...args).finally(() => {\n promise = null;\n });\n } else if (drop) {\n return Promise.reject(new Error('Busy: function already running'));\n }\n return promise;\n };\n}\n\n/**\n * Resolves a list of async tasks in parallel, returning both resolved and rejected results.\n *\n * @template T\n * @param {Array<() => Promise<T>>} tasks - Array of promise-returning functions.\n * @returns {Promise<PromiseSettledResult<T>[]>} Results including status and value/reason.\n */\nexport async function settleAll<T>(tasks: (() => Promise<T>)[]): Promise<PromiseSettledResult<T>[]> {\n return Promise.allSettled(tasks.map(task => task()));\n}\n\nexport interface TaskQueue {\n <T>(taskFn: () => Promise<T>): Promise<T>;\n pause: () => void;\n resume: () => void;\n readonly length: number;\n readonly isPaused: boolean;\n}\n\n/**\n * A simple task queue that executes async tasks with a concurrency limit.\n * Exposes pause, resume, and queue length getters.\n *\n * @param {number} limit - Maximum number of concurrent tasks.\n * @returns {function & { pause: () => void, resume: () => void, length: number, isPaused: boolean }}\n * Enqueue function plus queue controls.\n */\nexport function createTaskQueue(limit: number): TaskQueue {\n const queue: (() => Promise<void>)[] = [];\n let activeCount = 0;\n let paused = false;\n\n const state = {\n /**\n * Pause task processing.\n */\n pause() {\n paused = true;\n },\n /**\n * Resume task processing.\n */\n resume() {\n paused = false;\n next();\n },\n /**\n * The current length of the queue.\n * @type {number}\n */\n get length() {\n return queue.length;\n },\n /**\n * Whether the queue is currently paused.\n * @type {boolean}\n */\n get isPaused() {\n return paused;\n }\n };\n\n const next = () => {\n if (paused || queue.length === 0 || activeCount >= limit) return;\n const task = queue.shift()!;\n activeCount++;\n task().finally(() => {\n activeCount--;\n next();\n });\n };\n\n /**\n * Enqueues a new async task to the queue.\n *\n * @template T\n * @param {() => Promise<T>} taskFn - The async task function.\n * @returns {Promise<T>} Promise resolving when task completes.\n */\n const enqueue = async function <T>(taskFn: () => Promise<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n queue.push(async () => {\n try {\n const result = await taskFn();\n resolve(result);\n } catch (err) {\n reject(err);\n }\n });\n next();\n });\n };\n\n enqueue.pause = state.pause;\n enqueue.resume = state.resume;\n Object.defineProperty(enqueue, 'length', {\n get: () => queue.length\n });\n Object.defineProperty(enqueue, 'isPaused', {\n get: () => paused\n });\n\n return enqueue as TaskQueue;\n}\n\n/**\n * Executes async functions sequentially and collects results.\n * Useful when order matters or tasks depend on each other.\n *\n * @template T\n * @param {Array<() => Promise<T>>} tasks - Array of promise-returning functions.\n * @returns {Promise<T[]>} Array of resolved values.\n */\nexport async function runInSeries<T>(tasks: (() => Promise<T>)[]): Promise<T[]> {\n const results: T[] = [];\n for (const task of tasks) {\n results.push(await task());\n }\n return results;\n}\n\n/**\n * Memoizes an async function, caching results for repeated calls with identical arguments.\n * Optional TTL (time-to-live) for cached entries.\n *\n * @template T Function return type\n * @template Args Function arguments types\n * @param {(...args: Args) => Promise<T>} fn - The async function to memoize\n * @param {object} [options] - Memoization options\n * @param {number} [options.ttl] - Cache TTL in milliseconds (optional)\n * @param {(args: Args) => string} [options.keyFn] - Custom key generator function\n * @returns {(...args: Args) => Promise<T>} Memoized function\n */\nexport function memoizeAsync<T, Args extends any[]>(\n fn: (...args: Args) => Promise<T>,\n options: {\n ttl?: number;\n keyFn?: (args: Args) => string;\n } = {}\n): (...args: Args) => Promise<T> {\n const cache = new Map<string, { value: T; expires: number }>();\n const { ttl, keyFn = JSON.stringify } = options;\n\n return async function (...args: Args): Promise<T> {\n const key = keyFn(args);\n const cached = cache.get(key);\n\n if (cached && (!ttl || Date.now() < cached.expires)) {\n return cached.value;\n }\n\n const result = await fn(...args);\n cache.set(key, {\n value: result,\n expires: ttl ? Date.now() + ttl : Infinity\n });\n\n return result;\n };\n}\n\n/**\n * Creates an abortable version of a promise that can be cancelled using an AbortController.\n *\n * @template T\n * @param {Promise<T>} promise - The promise to make abortable\n * @param {AbortSignal} signal - AbortSignal from AbortController\n * @param {any} [abortValue] - Value to use when rejecting on abort\n * @returns {Promise<T>} Promise that rejects if the signal is aborted\n */\nexport function abortable<T>(\n promise: Promise<T>,\n signal: AbortSignal,\n abortValue: any = new Error('Operation aborted')\n): Promise<T> {\n if (signal.aborted) {\n return Promise.reject(abortValue);\n }\n\n return Promise.race([\n promise,\n new Promise<T>((_, reject) => {\n const abort = () => reject(abortValue);\n signal.addEventListener('abort', abort, { once: true });\n promise.finally(() => signal.removeEventListener('abort', abort));\n })\n ]);\n}\n\n/**\n * Creates a promise with external resolve/reject functions.\n * Useful for creating promises that can be resolved or rejected from outside.\n *\n * @template T\n * @returns {[Promise<T>, (value: T | PromiseLike<T>) => void, (reason?: any) => void]}\n * Tuple of [promise, resolve, reject]\n */\nexport function createDeferred<T>(): [Promise<T>, (value: T | PromiseLike<T>) => void, (reason?: any) => void] {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: any) => void;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return [promise, resolve, reject];\n}\n\n/**\n * Chains a series of async functions, passing the result of each to the next.\n * Similar to function composition but for async functions.\n *\n * @template T\n * @param {Array<(input: any) => Promise<any>>} fns - Array of async functions to compose\n * @returns {(input: any) => Promise<T>} Composed function\n */\nexport function waterfall<T>(fns: Array<(input: any) => Promise<any>>): (initialValue: any) => Promise<T> {\n return async (initialValue: any): Promise<T> => {\n return fns.reduce(async (acc, fn) => fn(await acc), Promise.resolve(initialValue)) as Promise<T>;\n };\n}\n\n/**\n * Creates a rate limiter that ensures functions aren't called more than\n * a specified number of times per interval.\n *\n * @template T\n * @param {(...args: any[]) => Promise<T>} fn - Function to rate limit\n * @param {number} maxCalls - Maximum calls allowed per interval\n * @param {number} interval - Time interval in milliseconds\n * @returns {(...args: any[]) => Promise<T>} Rate limited function\n */\nexport function rateLimit<T>(\n fn: (...args: any[]) => Promise<T>,\n maxCalls: number,\n interval: number\n): (...args: any[]) => Promise<T> {\n const calls: number[] = [];\n\n return async function (...args: any[]): Promise<T> {\n const now = Date.now();\n calls.splice(0, calls.length, ...calls.filter(time => now - time < interval));\n\n if (calls.length >= maxCalls) {\n const oldestCall = calls[0];\n const delay = interval - (now - oldestCall);\n await sleep(Math.max(1, delay));\n // Remove potentially stale entries after sleep\n const currentTime = Date.now();\n calls.splice(0, calls.length, ...calls.filter(time => currentTime - time < interval));\n\n // If still at limit after sleep, wait for another cycle\n if (calls.length >= maxCalls) {\n const nextDelay = interval - (currentTime - calls[0]);\n await sleep(Math.max(1, nextDelay));\n calls.splice(0, calls.length, ...calls.filter(time => Date.now() - time < interval));\n }\n }\n\n calls.push(Date.now());\n return fn(...args);\n };\n}\n\n/**\n * Circuit breaker pattern implementation for protecting against cascading failures.\n * Tracks failures and prevents calling the function when too many failures occur.\n *\n * @param fn - Function to protect with circuit breaker\n * @param options - Circuit breaker options\n * @returns Function wrapped with circuit breaker logic\n *\n * @example\n * ```typescript\n * const protectedFetch = circuitBreaker(\n * async (url) => {\n * const response = await fetch(url);\n * if (!response.ok) throw new Error(`HTTP error: ${response.status}`);\n * return response.json();\n * },\n * {\n * failureThreshold: 3,\n * resetTimeout: 30000,\n * onOpen: () => console.log('Circuit breaker opened'),\n * onClose: () => console.log('Circuit breaker closed')\n * }\n * );\n *\n * // Will throw CircuitBreakerOpenError after failureThreshold consecutive failures\n * try {\n * const data = await protectedFetch('https://api.example.com');\n * } catch (error) {\n * if (error instanceof CircuitBreakerOpenError) {\n * console.log('Service is currently unavailable, please try again later');\n * }\n * }\n * ```\n */\nexport class CircuitBreakerOpenError extends Error {\n constructor(message = 'Circuit breaker is open') {\n super(message);\n this.name = 'CircuitBreakerOpenError';\n }\n}\n\n/**\n * Circuit breaker states\n */\nexport enum CircuitBreakerState {\n CLOSED = 'CLOSED',\n OPEN = 'OPEN',\n HALF_OPEN = 'HALF_OPEN'\n}\n\nexport interface CircuitBreakerOptions {\n /** Number of consecutive failures before opening circuit (default: 5) */\n failureThreshold?: number;\n /** Time in milliseconds to wait before trying again (default: 10000) */\n resetTimeout?: number;\n /** Number of successful calls to close the circuit again (default: 1) */\n successThreshold?: number;\n /** Callback when circuit opens */\n onOpen?: () => void;\n /** Callback when circuit closes */\n onClose?: () => void;\n /** Callback when circuit enters half-open state */\n onHalfOpen?: () => void;\n}\n\nexport function circuitBreaker<T, Args extends any[]>(\n fn: (...args: Args) => Promise<T>,\n options: CircuitBreakerOptions = {}\n): (...args: Args) => Promise<T> {\n const { failureThreshold = 5, resetTimeout = 10000, successThreshold = 1, onOpen, onClose, onHalfOpen } = options;\n\n let state = CircuitBreakerState.CLOSED;\n let failureCount = 0;\n let successCount = 0;\n let nextAttempt = Date.now();\n\n return async function (...args: Args): Promise<T> {\n if (state === CircuitBreakerState.OPEN) {\n if (Date.now() < nextAttempt) {\n throw new CircuitBreakerOpenError();\n }\n\n // Move to half-open state\n state = CircuitBreakerState.HALF_OPEN;\n if (onHalfOpen) onHalfOpen();\n }\n\n try {\n const result = await fn(...args);\n\n // On success in half-open state\n if (state === CircuitBreakerState.HALF_OPEN) {\n successCount++;\n if (successCount >= successThreshold) {\n successCount = 0;\n failureCount = 0;\n state = CircuitBreakerState.CLOSED;\n if (onClose) onClose();\n }\n } else {\n // Reset failure count on success in closed state\n failureCount = 0;\n }\n\n return result;\n } catch (error) {\n // Track failures\n failureCount++;\n\n // Check if we need to open the circuit\n if (\n (state === CircuitBreakerState.CLOSED || state === CircuitBreakerState.HALF_OPEN) &&\n failureCount >= failureThreshold\n ) {\n state = CircuitBreakerState.OPEN;\n nextAttempt = Date.now() + resetTimeout;\n if (onOpen) onOpen();\n }\n\n throw error;\n }\n };\n}\n\n/**\n * Run multiple async tasks with concurrency control.\n *\n * @param tasks - Array of async tasks to run\n * @param options - Concurrency options\n * @returns Promise that resolves when all tasks are complete\n *\n * @example\n * ```typescript\n * const urls = ['https://example.com/1', 'https://example.com/2', many more ];\n *\n * // Process up to 5 requests at a time, with progress reporting\n * const results = await runWithConcurrency(\n * urls.map(url => () => fetch(url).then(res => res.json())),\n * {\n * concurrency: 5,\n * onProgress: (completed, total) => {\n * console.log(`Progress: ${completed}/${total}`);\n * }\n * }\n * );\n * ```\n */\nexport async function runWithConcurrency<T>(\n tasks: Array<() => Promise<T>>,\n options: {\n /** Maximum number of tasks to run at once (default: 3) */\n concurrency?: number;\n /** Called whenever a task completes */\n onProgress?: (completed: number, total: number) => void;\n /** Abort signal to cancel execution */\n signal?: AbortSignal;\n } = {}\n): Promise<T[]> {\n const { concurrency = 3, onProgress, signal } = options;\n const results: T[] = [];\n const totalTasks = tasks.length;\n let completed = 0;\n\n // If no tasks, return empty array\n if (totalTasks === 0) return results;\n\n // Check if execution is already aborted\n if (signal?.aborted) {\n throw new Error('Aborted');\n }\n\n return new Promise((resolve, reject) => {\n let taskIndex = 0;\n\n // Process next task function\n const processNext = async () => {\n // Get current task index and increment\n const currentTaskIndex = taskIndex++;\n\n // Skip if we've processed all tasks\n if (currentTaskIndex >= totalTasks) return;\n\n try {\n // Run the task\n const result = await tasks[currentTaskIndex]();\n\n // Check if aborted during task execution\n if (signal?.aborted) {\n reject(new Error('Aborted'));\n return;\n }\n\n // Store result and update counters\n results[currentTaskIndex] = result;\n completed++;\n\n // Call progress callback if provided\n if (onProgress) {\n try {\n onProgress(completed, totalTasks);\n } catch (err) {\n getLogger().error({ err }, 'Error in onProgress callback');\n }\n }\n } catch (error) {\n reject(error);\n return;\n }\n\n // Check if all tasks are completed\n if (completed === totalTasks) {\n resolve(results);\n return;\n }\n\n // Process next task\n processNext();\n };\n\n // Start initial batch of tasks\n const initialBatch = Math.min(concurrency, totalTasks);\n for (let i = 0; i < initialBatch; i++) {\n processNext();\n }\n\n // Set up abort handler\n if (signal) {\n signal.addEventListener(\n 'abort',\n () => {\n reject(new Error('Aborted'));\n },\n { once: true }\n );\n }\n });\n}\n"]}
@@ -1,153 +0,0 @@
1
- /**
2
- * Options for configuring a TTLCache instance.
3
- */
4
- export interface TTLCacheOptions {
5
- /** Default time-to-live in milliseconds for cache entries */
6
- ttlMs?: number;
7
- /** Maximum number of entries to keep in cache (uses LRU eviction policy) */
8
- maxSize?: number;
9
- /** Auto-cleanup interval in milliseconds (disabled if 0 or negative) */
10
- autoCleanupMs?: number;
11
- }
12
- /**
13
- * An in-memory cache with time-to-live (TTL) support for each entry.
14
- *
15
- * @typeParam K - Type of the key.
16
- * @typeParam V - Type of the value.
17
- *
18
- * @example
19
- * const cache = new TTLCache<string, number>({ ttlMs: 1000 });
20
- * cache.set("x", 123);
21
- * const value = cache.get("x"); // 123
22
- */
23
- export declare class TTLCache<K, V> {
24
- private cache;
25
- private ttlMs;
26
- private maxSize?;
27
- private cleanupInterval?;
28
- /**
29
- * @param options - Configuration options for the cache
30
- */
31
- constructor(options?: TTLCacheOptions);
32
- /**
33
- * Sets a key-value pair in the cache with the default TTL.
34
- *
35
- * @param key - The key to set.
36
- * @param value - The value to associate with the key.
37
- */
38
- set(key: K, value: V): void;
39
- /**
40
- * Sets a key-value pair in the cache with a custom TTL.
41
- *
42
- * @param key - The key to set.
43
- * @param value - The value to associate with the key.
44
- * @param ttlMs - Time-to-live in milliseconds.
45
- */
46
- setWithTTL(key: K, value: V, ttlMs: number): void;
47
- /**
48
- * Retrieves the value for a given key if it hasn't expired.
49
- *
50
- * @param key - The key to retrieve.
51
- * @returns The cached value, or undefined if not found or expired.
52
- */
53
- get(key: K): V | undefined;
54
- /**
55
- * Retrieves or computes a value if it's not in the cache or has expired.
56
- *
57
- * @param key - The key to retrieve
58
- * @param producer - Function to generate the value if not cached
59
- * @param ttlMs - Optional custom TTL for the computed value
60
- * @returns The cached or computed value
61
- */
62
- getOrCompute(key: K, producer: () => Promise<V>, ttlMs?: number): Promise<V>;
63
- /**
64
- * Checks if the key exists and hasn't expired.
65
- *
66
- * @param key - The key to check.
67
- * @returns `true` if key exists and is valid, otherwise `false`.
68
- */
69
- has(key: K): boolean;
70
- /**
71
- * Deletes a key from the cache.
72
- *
73
- * @param key - The key to delete.
74
- * @returns `true` if the key existed and was removed, `false` otherwise.
75
- */
76
- delete(key: K): boolean;
77
- /**
78
- * Clears all entries from the cache.
79
- */
80
- clear(): void;
81
- /**
82
- * Returns the number of entries currently in the cache (includes expired entries until next access/cleanup).
83
- *
84
- * @returns Number of items in the cache (may include expired keys).
85
- */
86
- size(): number;
87
- /**
88
- * Set multiple key-value pairs at once with the default TTL.
89
- *
90
- * @param entries - Array of [key, value] tuples to set
91
- */
92
- setMany(entries: [K, V][]): void;
93
- /**
94
- * Get multiple values at once.
95
- *
96
- * @param keys - Array of keys to retrieve
97
- * @returns Array of values (undefined for keys that don't exist or expired)
98
- */
99
- getMany(keys: K[]): (V | undefined)[];
100
- /**
101
- * Removes all expired entries from the cache.
102
- *
103
- * @returns Number of entries removed.
104
- */
105
- cleanup(): number;
106
- /**
107
- * Returns an iterator of all current valid [key, value] pairs.
108
- *
109
- * @returns IterableIterator<[K, V]>
110
- */
111
- entries(): IterableIterator<[K, V]>;
112
- /**
113
- * Returns an iterator of all current valid keys.
114
- *
115
- * @returns IterableIterator<K>
116
- */
117
- keys(): IterableIterator<K>;
118
- /**
119
- * Returns an iterator of all current valid values.
120
- *
121
- * @returns IterableIterator<V>
122
- */
123
- values(): IterableIterator<V>;
124
- /**
125
- * Extends the expiration of a key by the specified time or default TTL.
126
- *
127
- * @param key - The key to refresh
128
- * @param ttlMs - Optional new TTL in milliseconds (uses default if not specified)
129
- * @returns true if the key was found and refreshed, false otherwise
130
- */
131
- refresh(key: K, ttlMs?: number): boolean;
132
- /**
133
- * Returns a snapshot of cache stats.
134
- *
135
- * @returns Object containing cache statistics
136
- */
137
- stats(): {
138
- size: number;
139
- validEntries: number;
140
- expiredEntries: number;
141
- maxSize: number | undefined;
142
- };
143
- /**
144
- * Stop the auto-cleanup interval if it's running.
145
- */
146
- destroy(): void;
147
- /**
148
- * Evict the least recently used entry from the cache.
149
- * @private
150
- */
151
- private evictLRU;
152
- }
153
- //# sourceMappingURL=cache.utils.d.ts.map