ts-packages 2.0.0 → 3.0.0

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 (286) hide show
  1. package/package.json +1 -1
  2. package/packages/cache/README.md +105 -9
  3. package/packages/cache/dist/cjs/adapters/memcache/MemcacheCache.d.ts +1 -54
  4. package/packages/cache/dist/cjs/adapters/memcache/MemcacheCache.js +75 -281
  5. package/packages/cache/dist/cjs/adapters/memory/MemoryCache.js +76 -22
  6. package/packages/cache/dist/cjs/adapters/redis/RedisCache.js +84 -26
  7. package/packages/cache/dist/cjs/core/BaseCache.js +13 -4
  8. package/packages/cache/dist/cjs/core/factory.js +26 -4
  9. package/packages/cache/dist/cjs/errors/CacheError.d.ts +10 -7
  10. package/packages/cache/dist/cjs/errors/CacheError.js +6 -11
  11. package/packages/cache/dist/cjs/errors/cacheErrorCodes.d.ts +22 -0
  12. package/packages/cache/dist/cjs/errors/cacheErrorCodes.js +24 -0
  13. package/packages/cache/dist/cjs/errors/index.js +3 -0
  14. package/packages/cache/dist/cjs/middleware/express/cacheMiddleware.js +8 -8
  15. package/packages/cache/dist/cjs/session/SessionStore.js +84 -28
  16. package/packages/cache/dist/esm/adapters/memcache/MemcacheCache.d.ts +1 -54
  17. package/packages/cache/dist/esm/adapters/memcache/MemcacheCache.js +75 -281
  18. package/packages/cache/dist/esm/adapters/memory/MemoryCache.js +76 -22
  19. package/packages/cache/dist/esm/adapters/redis/RedisCache.js +84 -26
  20. package/packages/cache/dist/esm/core/BaseCache.js +13 -4
  21. package/packages/cache/dist/esm/core/factory.js +26 -4
  22. package/packages/cache/dist/esm/errors/CacheError.d.ts +10 -7
  23. package/packages/cache/dist/esm/errors/CacheError.js +6 -11
  24. package/packages/cache/dist/esm/errors/cacheErrorCodes.d.ts +22 -0
  25. package/packages/cache/dist/esm/errors/cacheErrorCodes.js +21 -0
  26. package/packages/cache/dist/esm/errors/index.js +3 -0
  27. package/packages/cache/dist/esm/middleware/express/cacheMiddleware.js +8 -8
  28. package/packages/cache/dist/esm/session/SessionStore.js +84 -28
  29. package/packages/cache/dist/types/adapters/memcache/MemcacheCache.d.ts +1 -54
  30. package/packages/cache/dist/types/errors/CacheError.d.ts +10 -7
  31. package/packages/cache/dist/types/errors/cacheErrorCodes.d.ts +22 -0
  32. package/packages/cache/package.json +8 -6
  33. package/packages/cache/src/adapters/memcache/MemcacheCache.ts +79 -352
  34. package/packages/cache/src/adapters/memory/MemoryCache.ts +76 -77
  35. package/packages/cache/src/adapters/redis/RedisCache.ts +84 -86
  36. package/packages/cache/src/core/BaseCache.ts +13 -14
  37. package/packages/cache/src/core/factory.ts +27 -16
  38. package/packages/cache/src/errors/CacheError.ts +16 -17
  39. package/packages/cache/src/errors/cacheErrorCodes.ts +24 -0
  40. package/packages/cache/src/errors/index.ts +5 -0
  41. package/packages/cache/src/middleware/express/cacheMiddleware.ts +8 -8
  42. package/packages/cache/src/session/SessionStore.ts +84 -84
  43. package/packages/errors-utils/README.md +54 -57
  44. package/packages/errors-utils/dist/cjs/constants/errorCodes.d.ts +28 -23
  45. package/packages/errors-utils/dist/cjs/constants/errorCodes.js +57 -22
  46. package/packages/errors-utils/dist/cjs/constants/errorMessages.d.ts +8 -1
  47. package/packages/errors-utils/dist/cjs/constants/errorMessages.js +72 -29
  48. package/packages/errors-utils/dist/cjs/error/AppError.d.ts +2 -2
  49. package/packages/errors-utils/dist/cjs/error/AppError.js +2 -2
  50. package/packages/errors-utils/dist/cjs/error/ServiceUnavailableError.d.ts +4 -0
  51. package/packages/errors-utils/dist/cjs/error/ServiceUnavailableError.js +11 -0
  52. package/packages/errors-utils/dist/cjs/error/TokenExpiredError.d.ts +2 -2
  53. package/packages/errors-utils/dist/cjs/error/TokenExpiredError.js +2 -2
  54. package/packages/errors-utils/dist/cjs/error/TokenMalformedError.d.ts +2 -2
  55. package/packages/errors-utils/dist/cjs/error/TokenMalformedError.js +2 -2
  56. package/packages/errors-utils/dist/cjs/error/UnauthorizedError.d.ts +1 -2
  57. package/packages/errors-utils/dist/cjs/error/UnauthorizedError.js +2 -2
  58. package/packages/errors-utils/dist/cjs/error/index.d.ts +14 -0
  59. package/packages/errors-utils/dist/cjs/error/index.js +39 -0
  60. package/packages/errors-utils/dist/cjs/errorRegistry/errorRegistry.d.ts +19 -0
  61. package/packages/errors-utils/dist/cjs/errorRegistry/errorRegistry.js +63 -0
  62. package/packages/errors-utils/dist/cjs/errorRegistry/index.d.ts +3 -0
  63. package/packages/errors-utils/dist/cjs/errorRegistry/index.js +6 -0
  64. package/packages/errors-utils/dist/cjs/index.d.ts +3 -9
  65. package/packages/errors-utils/dist/cjs/index.js +12 -9
  66. package/packages/errors-utils/dist/cjs/middleware/express/{errorHandler.js → errorHandler.middleware.js} +4 -4
  67. package/packages/errors-utils/dist/cjs/middleware/express/index.d.ts +2 -2
  68. package/packages/errors-utils/dist/cjs/middleware/express/index.js +2 -2
  69. package/packages/errors-utils/dist/esm/constants/errorCodes.d.ts +28 -23
  70. package/packages/errors-utils/dist/esm/constants/errorCodes.js +57 -22
  71. package/packages/errors-utils/dist/esm/constants/errorMessages.d.ts +8 -1
  72. package/packages/errors-utils/dist/esm/constants/errorMessages.js +72 -29
  73. package/packages/errors-utils/dist/esm/error/AppError.d.ts +2 -2
  74. package/packages/errors-utils/dist/esm/error/AppError.js +2 -2
  75. package/packages/errors-utils/dist/esm/error/ServiceUnavailableError.d.ts +4 -0
  76. package/packages/errors-utils/dist/esm/error/ServiceUnavailableError.js +7 -0
  77. package/packages/errors-utils/dist/esm/error/TokenExpiredError.d.ts +2 -2
  78. package/packages/errors-utils/dist/esm/error/TokenExpiredError.js +2 -2
  79. package/packages/errors-utils/dist/esm/error/TokenMalformedError.d.ts +2 -2
  80. package/packages/errors-utils/dist/esm/error/TokenMalformedError.js +2 -2
  81. package/packages/errors-utils/dist/esm/error/UnauthorizedError.d.ts +1 -2
  82. package/packages/errors-utils/dist/esm/error/UnauthorizedError.js +2 -2
  83. package/packages/errors-utils/dist/esm/error/index.d.ts +14 -0
  84. package/packages/errors-utils/dist/esm/error/index.js +23 -0
  85. package/packages/errors-utils/dist/esm/errorRegistry/errorRegistry.d.ts +19 -0
  86. package/packages/errors-utils/dist/esm/errorRegistry/errorRegistry.js +59 -0
  87. package/packages/errors-utils/dist/esm/errorRegistry/index.d.ts +3 -0
  88. package/packages/errors-utils/dist/esm/errorRegistry/index.js +3 -0
  89. package/packages/errors-utils/dist/esm/index.d.ts +3 -9
  90. package/packages/errors-utils/dist/esm/index.js +12 -9
  91. package/packages/errors-utils/dist/esm/middleware/express/{errorHandler.js → errorHandler.middleware.js} +5 -5
  92. package/packages/errors-utils/dist/esm/middleware/express/index.d.ts +2 -2
  93. package/packages/errors-utils/dist/esm/middleware/express/index.js +2 -2
  94. package/packages/errors-utils/dist/types/constants/errorCodes.d.ts +28 -23
  95. package/packages/errors-utils/dist/types/constants/errorMessages.d.ts +8 -1
  96. package/packages/errors-utils/dist/types/error/AppError.d.ts +2 -2
  97. package/packages/errors-utils/dist/types/error/ServiceUnavailableError.d.ts +4 -0
  98. package/packages/errors-utils/dist/types/error/TokenExpiredError.d.ts +2 -2
  99. package/packages/errors-utils/dist/types/error/TokenMalformedError.d.ts +2 -2
  100. package/packages/errors-utils/dist/types/error/UnauthorizedError.d.ts +1 -2
  101. package/packages/errors-utils/dist/types/error/index.d.ts +14 -0
  102. package/packages/errors-utils/dist/types/errorRegistry/errorRegistry.d.ts +19 -0
  103. package/packages/errors-utils/dist/types/errorRegistry/index.d.ts +3 -0
  104. package/packages/errors-utils/dist/types/index.d.ts +3 -9
  105. package/packages/errors-utils/dist/types/middleware/express/index.d.ts +2 -2
  106. package/packages/errors-utils/package.json +4 -4
  107. package/packages/errors-utils/src/constants/errorCodes.ts +64 -23
  108. package/packages/errors-utils/src/constants/errorMessages.ts +91 -34
  109. package/packages/errors-utils/src/error/AppError.ts +3 -2
  110. package/packages/errors-utils/src/error/ServiceUnavailableError.ts +8 -0
  111. package/packages/errors-utils/src/error/TokenExpiredError.ts +2 -2
  112. package/packages/errors-utils/src/error/TokenMalformedError.ts +2 -2
  113. package/packages/errors-utils/src/error/UnauthorizedError.ts +8 -8
  114. package/packages/errors-utils/src/error/index.ts +26 -0
  115. package/packages/errors-utils/src/errorRegistry/errorRegistry.ts +74 -0
  116. package/packages/errors-utils/src/errorRegistry/index.ts +4 -0
  117. package/packages/errors-utils/src/index.ts +12 -10
  118. package/packages/errors-utils/src/middleware/express/{errorHandler.ts → errorHandler.middleware.ts} +5 -5
  119. package/packages/errors-utils/src/middleware/express/index.ts +2 -2
  120. package/packages/js-extensions/README.md +174 -425
  121. package/packages/js-extensions/dist/cjs/array/array-extensions.js +84 -50
  122. package/packages/js-extensions/dist/cjs/core/performance.d.ts +1 -0
  123. package/packages/js-extensions/dist/cjs/core/performance.js +6 -0
  124. package/packages/js-extensions/dist/cjs/core/version.d.ts +1 -0
  125. package/packages/js-extensions/dist/cjs/core/version.js +9 -0
  126. package/packages/js-extensions/dist/cjs/index.d.ts +1 -0
  127. package/packages/js-extensions/dist/cjs/index.js +1 -0
  128. package/packages/js-extensions/dist/cjs/number/number-extensions.js +85 -97
  129. package/packages/js-extensions/dist/cjs/object/object-extensions.js +102 -103
  130. package/packages/js-extensions/dist/cjs/string/string-extensions.js +66 -43
  131. package/packages/js-extensions/dist/cjs/types/global-augmentations.d.ts +1 -0
  132. package/packages/js-extensions/dist/cjs/utils/defineExtension.d.ts +1 -0
  133. package/packages/js-extensions/dist/cjs/utils/defineExtension.js +13 -0
  134. package/packages/js-extensions/dist/cjs/utils/index.d.ts +1 -0
  135. package/packages/js-extensions/dist/cjs/utils/index.js +1 -0
  136. package/packages/js-extensions/dist/esm/array/array-extensions.js +84 -50
  137. package/packages/js-extensions/dist/esm/core/performance.d.ts +1 -0
  138. package/packages/js-extensions/dist/esm/core/performance.js +5 -0
  139. package/packages/js-extensions/dist/esm/core/version.d.ts +1 -0
  140. package/packages/js-extensions/dist/esm/core/version.js +5 -0
  141. package/packages/js-extensions/dist/esm/index.d.ts +1 -0
  142. package/packages/js-extensions/dist/esm/index.js +1 -0
  143. package/packages/js-extensions/dist/esm/number/number-extensions.js +86 -98
  144. package/packages/js-extensions/dist/esm/object/object-extensions.js +102 -103
  145. package/packages/js-extensions/dist/esm/string/string-extensions.js +66 -43
  146. package/packages/js-extensions/dist/esm/types/global-augmentations.d.ts +1 -0
  147. package/packages/js-extensions/dist/esm/utils/defineExtension.d.ts +1 -0
  148. package/packages/js-extensions/dist/esm/utils/defineExtension.js +10 -0
  149. package/packages/js-extensions/dist/esm/utils/index.d.ts +1 -0
  150. package/packages/js-extensions/dist/esm/utils/index.js +1 -0
  151. package/packages/js-extensions/dist/types/core/performance.d.ts +1 -0
  152. package/packages/js-extensions/dist/types/core/version.d.ts +1 -0
  153. package/packages/js-extensions/dist/types/index.d.ts +1 -0
  154. package/packages/js-extensions/dist/types/types/global-augmentations.d.ts +1 -0
  155. package/packages/js-extensions/dist/types/utils/defineExtension.d.ts +1 -0
  156. package/packages/js-extensions/dist/types/utils/index.d.ts +1 -0
  157. package/packages/js-extensions/package.json +8 -4
  158. package/packages/js-extensions/src/array/array-extensions.ts +268 -150
  159. package/packages/js-extensions/src/core/performance.ts +11 -0
  160. package/packages/js-extensions/src/core/version.ts +7 -0
  161. package/packages/js-extensions/src/index.ts +2 -0
  162. package/packages/js-extensions/src/number/number-extensions.ts +90 -123
  163. package/packages/js-extensions/src/object/object-extensions.ts +102 -130
  164. package/packages/js-extensions/src/string/string-extensions.ts +80 -76
  165. package/packages/js-extensions/src/types/global-augmentations.ts +2 -1
  166. package/packages/js-extensions/src/utils/defineExtension.ts +14 -0
  167. package/packages/js-extensions/src/utils/index.ts +1 -0
  168. package/packages/response-utils/README.md +156 -198
  169. package/packages/response-utils/dist/cjs/core/BaseResponder.js +20 -4
  170. package/packages/response-utils/dist/cjs/index.d.ts +0 -1
  171. package/packages/response-utils/dist/cjs/index.js +1 -25
  172. package/packages/response-utils/dist/esm/core/BaseResponder.js +20 -4
  173. package/packages/response-utils/dist/esm/index.d.ts +0 -1
  174. package/packages/response-utils/dist/esm/index.js +0 -2
  175. package/packages/response-utils/dist/types/index.d.ts +0 -1
  176. package/packages/response-utils/package.json +1 -1
  177. package/packages/response-utils/src/core/BaseResponder.ts +25 -4
  178. package/packages/response-utils/src/index.ts +0 -3
  179. package/packages/response-utils/src/middleware/express/expressMiddleware.ts +1 -1
  180. package/packages/security/README.md +153 -355
  181. package/packages/security/dist/cjs/core/crypto/cryptoManager.js +34 -17
  182. package/packages/security/dist/cjs/core/jwt/decode.js +4 -1
  183. package/packages/security/dist/cjs/core/jwt/generateTokens.js +4 -1
  184. package/packages/security/dist/cjs/core/jwt/jwtManager.d.ts +19 -43
  185. package/packages/security/dist/cjs/core/jwt/jwtManager.js +84 -199
  186. package/packages/security/dist/cjs/core/jwt/parseDuration.js +3 -2
  187. package/packages/security/dist/cjs/core/jwt/signToken.js +2 -1
  188. package/packages/security/dist/cjs/core/jwt/validateToken.d.ts +10 -7
  189. package/packages/security/dist/cjs/core/jwt/validateToken.js +19 -10
  190. package/packages/security/dist/cjs/core/jwt/verify.d.ts +8 -9
  191. package/packages/security/dist/cjs/core/jwt/verify.js +59 -14
  192. package/packages/security/dist/cjs/core/password/hash.js +4 -4
  193. package/packages/security/dist/cjs/core/password/passwordManager.d.ts +1 -1
  194. package/packages/security/dist/cjs/core/password/passwordManager.js +36 -80
  195. package/packages/security/dist/cjs/core/password/strength.js +12 -6
  196. package/packages/security/dist/cjs/core/password/utils.d.ts +12 -0
  197. package/packages/security/dist/cjs/core/password/utils.js +16 -1
  198. package/packages/security/dist/cjs/core/password/verify.js +4 -4
  199. package/packages/security/dist/cjs/index.d.ts +2 -7
  200. package/packages/security/dist/esm/core/crypto/cryptoManager.js +34 -17
  201. package/packages/security/dist/esm/core/jwt/decode.js +4 -1
  202. package/packages/security/dist/esm/core/jwt/generateTokens.js +4 -1
  203. package/packages/security/dist/esm/core/jwt/jwtManager.d.ts +19 -43
  204. package/packages/security/dist/esm/core/jwt/jwtManager.js +85 -200
  205. package/packages/security/dist/esm/core/jwt/parseDuration.js +3 -2
  206. package/packages/security/dist/esm/core/jwt/signToken.js +2 -1
  207. package/packages/security/dist/esm/core/jwt/validateToken.d.ts +10 -7
  208. package/packages/security/dist/esm/core/jwt/validateToken.js +19 -10
  209. package/packages/security/dist/esm/core/jwt/verify.d.ts +8 -9
  210. package/packages/security/dist/esm/core/jwt/verify.js +58 -13
  211. package/packages/security/dist/esm/core/password/hash.js +4 -4
  212. package/packages/security/dist/esm/core/password/passwordManager.d.ts +1 -1
  213. package/packages/security/dist/esm/core/password/passwordManager.js +36 -80
  214. package/packages/security/dist/esm/core/password/strength.js +12 -6
  215. package/packages/security/dist/esm/core/password/utils.d.ts +12 -0
  216. package/packages/security/dist/esm/core/password/utils.js +16 -1
  217. package/packages/security/dist/esm/core/password/verify.js +4 -4
  218. package/packages/security/dist/esm/index.d.ts +2 -7
  219. package/packages/security/dist/types/core/jwt/jwtManager.d.ts +19 -43
  220. package/packages/security/dist/types/core/jwt/validateToken.d.ts +10 -7
  221. package/packages/security/dist/types/core/jwt/verify.d.ts +8 -9
  222. package/packages/security/dist/types/core/password/passwordManager.d.ts +1 -1
  223. package/packages/security/dist/types/core/password/utils.d.ts +12 -0
  224. package/packages/security/dist/types/index.d.ts +2 -7
  225. package/packages/security/package.json +3 -3
  226. package/packages/security/src/core/crypto/cryptoManager.ts +53 -21
  227. package/packages/security/src/core/jwt/decode.ts +4 -1
  228. package/packages/security/src/core/jwt/generateTokens.ts +4 -1
  229. package/packages/security/src/core/jwt/jwtManager.ts +105 -257
  230. package/packages/security/src/core/jwt/parseDuration.ts +4 -2
  231. package/packages/security/src/core/jwt/signToken.ts +2 -1
  232. package/packages/security/src/core/jwt/validateToken.ts +21 -13
  233. package/packages/security/src/core/jwt/verify.ts +82 -20
  234. package/packages/security/src/core/password/hash.ts +10 -4
  235. package/packages/security/src/core/password/passwordManager.ts +38 -108
  236. package/packages/security/src/core/password/strength.ts +13 -8
  237. package/packages/security/src/core/password/utils.ts +19 -3
  238. package/packages/security/src/core/password/verify.ts +6 -4
  239. package/packages/server-utils/README.md +1 -1
  240. package/packages/server-utils/dist/cjs/core/server.js +6 -6
  241. package/packages/server-utils/dist/cjs/middleware/auth.middleware.d.ts +1 -2
  242. package/packages/server-utils/dist/cjs/middleware/auth.middleware.js +17 -14
  243. package/packages/server-utils/dist/cjs/middleware/cache.middleware.js +2 -2
  244. package/packages/server-utils/dist/cjs/middleware/errorHandler.middleware.d.ts +1 -1
  245. package/packages/server-utils/dist/cjs/middleware/errorHandler.middleware.js +34 -17
  246. package/packages/server-utils/dist/cjs/middleware/session.middleware.js +8 -8
  247. package/packages/server-utils/dist/cjs/middleware/validation.middleware.js +2 -2
  248. package/packages/server-utils/dist/esm/core/server.js +6 -6
  249. package/packages/server-utils/dist/esm/middleware/auth.middleware.d.ts +1 -2
  250. package/packages/server-utils/dist/esm/middleware/auth.middleware.js +18 -15
  251. package/packages/server-utils/dist/esm/middleware/cache.middleware.js +2 -2
  252. package/packages/server-utils/dist/esm/middleware/errorHandler.middleware.d.ts +1 -1
  253. package/packages/server-utils/dist/esm/middleware/errorHandler.middleware.js +34 -17
  254. package/packages/server-utils/dist/esm/middleware/session.middleware.js +8 -8
  255. package/packages/server-utils/dist/esm/middleware/validation.middleware.js +2 -2
  256. package/packages/server-utils/dist/types/middleware/auth.middleware.d.ts +1 -2
  257. package/packages/server-utils/dist/types/middleware/errorHandler.middleware.d.ts +1 -1
  258. package/packages/server-utils/package.json +4 -4
  259. package/packages/server-utils/src/core/server.ts +6 -6
  260. package/packages/server-utils/src/middleware/auth.middleware.ts +40 -27
  261. package/packages/server-utils/src/middleware/cache.middleware.ts +2 -2
  262. package/packages/server-utils/src/middleware/errorHandler.middleware.ts +39 -24
  263. package/packages/server-utils/src/middleware/session.middleware.ts +11 -8
  264. package/packages/server-utils/src/middleware/validation.middleware.ts +2 -3
  265. package/packages/errors-utils/dist/cjs/error/RateLimitError.d.ts +0 -4
  266. package/packages/errors-utils/dist/cjs/error/RateLimitError.js +0 -11
  267. package/packages/errors-utils/dist/cjs/utils/mapAppErrorToResponder.d.ts +0 -3
  268. package/packages/errors-utils/dist/cjs/utils/mapAppErrorToResponder.js +0 -27
  269. package/packages/errors-utils/dist/esm/error/RateLimitError.d.ts +0 -4
  270. package/packages/errors-utils/dist/esm/error/RateLimitError.js +0 -7
  271. package/packages/errors-utils/dist/esm/utils/mapAppErrorToResponder.d.ts +0 -3
  272. package/packages/errors-utils/dist/esm/utils/mapAppErrorToResponder.js +0 -24
  273. package/packages/errors-utils/dist/types/error/RateLimitError.d.ts +0 -4
  274. package/packages/errors-utils/dist/types/utils/mapAppErrorToResponder.d.ts +0 -3
  275. package/packages/errors-utils/src/error/RateLimitError.ts +0 -8
  276. package/packages/errors-utils/src/utils/mapAppErrorToResponder.ts +0 -38
  277. package/packages/response-utils/src/legacy.ts +0 -30
  278. /package/packages/errors-utils/dist/cjs/middleware/express/{errorConverter.d.ts → errorConverter.middleware.d.ts} +0 -0
  279. /package/packages/errors-utils/dist/cjs/middleware/express/{errorConverter.js → errorConverter.middleware.js} +0 -0
  280. /package/packages/errors-utils/dist/cjs/middleware/express/{errorHandler.d.ts → errorHandler.middleware.d.ts} +0 -0
  281. /package/packages/errors-utils/dist/esm/middleware/express/{errorConverter.d.ts → errorConverter.middleware.d.ts} +0 -0
  282. /package/packages/errors-utils/dist/esm/middleware/express/{errorConverter.js → errorConverter.middleware.js} +0 -0
  283. /package/packages/errors-utils/dist/esm/middleware/express/{errorHandler.d.ts → errorHandler.middleware.d.ts} +0 -0
  284. /package/packages/errors-utils/dist/types/middleware/express/{errorConverter.d.ts → errorConverter.middleware.d.ts} +0 -0
  285. /package/packages/errors-utils/dist/types/middleware/express/{errorHandler.d.ts → errorHandler.middleware.d.ts} +0 -0
  286. /package/packages/errors-utils/src/middleware/express/{errorConverter.ts → errorConverter.middleware.ts} +0 -0
@@ -1,99 +1,70 @@
1
- // Number prototype extensions
2
- import { withCache } from '../core/performance'
1
+ import { defineExtension } from 'src/utils'
2
+ import { makeInternalCacheKey, withCache } from '../core/performance'
3
+
4
+ let numberExtended = false
3
5
 
4
6
  export function extendNumber() {
5
- Number.prototype.toPercent = function (decimals = 2): string {
6
- return `${(this.valueOf() * 100).toFixed(decimals)}%`
7
- }
8
-
9
- Number.prototype.toCurrency = function (
10
- currency = 'USD',
11
- locale = 'en-US',
12
- ): string {
13
- return new Intl.NumberFormat(locale, {
14
- style: 'currency',
15
- currency,
16
- }).format(this.valueOf())
17
- }
18
-
19
- Number.prototype.clamp = function (min: number, max: number): number {
20
- if (min > max) {
21
- throw new RangeError(
22
- `clamp: min (${min}) cannot be greater than max (${max})`,
23
- )
24
- }
25
- return Math.min(Math.max(this.valueOf(), min), max)
26
- }
7
+ if (numberExtended) return
8
+ numberExtended = true
9
+
10
+ defineExtension(Number.prototype, 'toPercent', function (this: number, decimals = 2): string {
11
+ return `${(this * 100).toFixed(decimals)}%`
12
+ })
27
13
 
28
- Number.prototype.isEven = function (): boolean {
29
- return this.valueOf() % 2 === 0
30
- }
14
+ defineExtension(Number.prototype, 'toCurrency', function (this: number, currency = 'USD', locale = 'en-US'): string {
15
+ return new Intl.NumberFormat(locale, { style: 'currency', currency }).format(this)
16
+ })
31
17
 
32
- Number.prototype.isOdd = function (): boolean {
33
- return this.valueOf() % 2 !== 0
34
- }
18
+ defineExtension(Number.prototype, 'clamp', function (this: number, min: number, max: number): number {
19
+ if (min > max) throw new RangeError(`clamp: min (${min}) cannot be greater than max (${max})`)
20
+ return Math.min(Math.max(this, min), max)
21
+ })
35
22
 
36
- Number.prototype.isPrime = function (): boolean {
37
- const num = this.valueOf()
38
- return withCache(`prime_${num}`, () => {
23
+ defineExtension(Number.prototype, 'isEven', function (this: number): boolean {
24
+ return this % 2 === 0
25
+ })
26
+
27
+ defineExtension(Number.prototype, 'isOdd', function (this: number): boolean {
28
+ return this % 2 !== 0
29
+ })
30
+
31
+ defineExtension(Number.prototype, 'isPrime', function (this: number): boolean {
32
+ const num = this
33
+ return withCache(makeInternalCacheKey('prime', num), () => {
39
34
  if (num < 2) return false
40
- for (let i = 2; i <= Math.sqrt(num); i++) {
41
- if (num % i === 0) return false
42
- }
35
+ for (let i = 2; i <= Math.sqrt(num); i++) if (num % i === 0) return false
43
36
  return true
44
37
  })
45
- }
38
+ })
46
39
 
47
- Number.prototype.factorial = function (): number {
48
- const num = Math.floor(this.valueOf())
49
- return withCache(`factorial_${num}`, () => {
50
- if (num < 0) return Number.NaN
51
- if (num === 0 || num === 1) return 1
40
+ defineExtension(Number.prototype, 'factorial', function (this: number): number {
41
+ const num = Math.floor(this)
42
+ return withCache(makeInternalCacheKey('factorial', num), () => {
43
+ if (num < 0) return NaN
44
+ if (num <= 1) return 1
52
45
  let result = 1
53
- for (let i = 2; i <= num; i++) {
54
- result *= i
55
- }
46
+ for (let i = 2; i <= num; i++) result *= i
56
47
  return result
57
48
  })
58
- }
49
+ })
59
50
 
60
- Number.prototype.toOrdinal = function (): string {
61
- const num = Math.floor(this.valueOf())
51
+ defineExtension(Number.prototype, 'toOrdinal', function (this: number): string {
52
+ const num = Math.floor(this)
62
53
  const suffix = ['th', 'st', 'nd', 'rd']
63
54
  const v = num % 100
64
55
  return num + (suffix[(v - 20) % 10] || suffix[v] || suffix[0])
65
- }
66
-
67
- Number.prototype.toRoman = function (): string {
68
- const num = Math.floor(this.valueOf())
56
+ })
69
57
 
70
- // Better validation for roman numerals
71
- if (num <= 0) {
72
- throw new RangeError('toRoman: number must be positive')
73
- }
74
- if (num >= 4000) {
75
- throw new RangeError('toRoman: number must be less than 4000')
76
- }
58
+ defineExtension(Number.prototype, 'toRoman', function (this: number): string {
59
+ const num = Math.floor(this)
60
+ if (num <= 0) throw new RangeError('toRoman: number must be positive')
61
+ if (num >= 4000) throw new RangeError('toRoman: number must be less than 4000')
77
62
 
78
- return withCache(`roman_${num}`, () => {
63
+ return withCache(makeInternalCacheKey('roman', num), () => {
79
64
  const values = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
80
- const symbols = [
81
- 'M',
82
- 'CM',
83
- 'D',
84
- 'CD',
85
- 'C',
86
- 'XC',
87
- 'L',
88
- 'XL',
89
- 'X',
90
- 'IX',
91
- 'V',
92
- 'IV',
93
- 'I',
94
- ]
95
- let result = ''
65
+ const symbols = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I']
96
66
  let n = num
67
+ let result = ''
97
68
  for (let i = 0; i < values.length; i++) {
98
69
  while (n >= values[i]) {
99
70
  result += symbols[i]
@@ -102,61 +73,57 @@ export function extendNumber() {
102
73
  }
103
74
  return result
104
75
  })
105
- }
76
+ })
106
77
 
107
- Number.prototype.inRange = function (min: number, max: number): boolean {
108
- const num = this.valueOf()
109
- return num >= min && num <= max
110
- }
78
+ defineExtension(Number.prototype, 'inRange', function (this: number, min: number, max: number): boolean {
79
+ return this >= min && this <= max
80
+ })
111
81
 
112
- Number.prototype.round = function (decimals = 0): number {
113
- if (!Number.isInteger(decimals) || decimals < 0) {
114
- throw new TypeError(
115
- `round: decimals must be a non-negative integer, got ${decimals}`,
116
- )
117
- }
82
+ defineExtension(Number.prototype, 'round', function (this: number, decimals = 0): number {
83
+ if (!Number.isInteger(decimals) || decimals < 0) throw new TypeError('round: decimals must be non-negative integer')
118
84
  const factor = Math.pow(10, decimals)
119
- return Math.round(this.valueOf() * factor) / factor
120
- }
85
+ return Math.round(this * factor) / factor
86
+ })
121
87
 
122
- Number.prototype.ceil = function (decimals = 0): number {
123
- if (!Number.isInteger(decimals) || decimals < 0) {
124
- throw new TypeError(
125
- `ceil: decimals must be a non-negative integer, got ${decimals}`,
126
- )
127
- }
88
+ defineExtension(Number.prototype, 'ceil', function (this: number, decimals = 0): number {
89
+ if (!Number.isInteger(decimals) || decimals < 0) throw new TypeError('ceil: decimals must be non-negative integer')
90
+ const factor = Math.pow(10, decimals)
91
+ return Math.ceil(this * factor) / factor
92
+ })
93
+
94
+ defineExtension(Number.prototype, 'floor', function (this: number, decimals = 0): number {
95
+ if (!Number.isInteger(decimals) || decimals < 0) throw new TypeError('floor: decimals must be non-negative integer')
128
96
  const factor = Math.pow(10, decimals)
129
- return Math.ceil(this.valueOf() * factor) / factor
130
- }
97
+ return Math.floor(this * factor) / factor
98
+ })
131
99
 
132
- Number.prototype.floor = function (decimals = 0): number {
100
+ defineExtension(Number.prototype, 'abs', function (this: number): number {
101
+ return Math.abs(this)
102
+ })
103
+
104
+ defineExtension(Number.prototype, 'sign', function (this: number): number {
105
+ return Math.sign(this)
106
+ })
107
+
108
+ defineExtension(Number.prototype, 'times', function (this: number, callback: (index: number) => void): void {
109
+ if (typeof callback !== 'function') throw new TypeError('times: callback must be a function')
110
+ for (let i = 0; i < Math.floor(this); i++) callback(i)
111
+ })
112
+
113
+ defineExtension(Number.prototype, 'toFixedNumber', function (this: number, decimals = 0): number {
133
114
  if (!Number.isInteger(decimals) || decimals < 0) {
134
- throw new TypeError(
135
- `floor: decimals must be a non-negative integer, got ${decimals}`,
136
- )
115
+ throw new TypeError(`toFixedNumber: decimals must be a non-negative integer, got ${decimals}`);
137
116
  }
138
- const factor = Math.pow(10, decimals)
139
- return Math.floor(this.valueOf() * factor) / factor
140
- }
141
-
142
- Number.prototype.abs = function (): number {
143
- return Math.abs(this.valueOf())
144
- }
145
-
146
- Number.prototype.sign = function (): number {
147
- return Math.sign(this.valueOf())
148
- }
149
-
150
- Number.prototype.times = function (callback: (index: number) => void): void {
151
- if (typeof callback !== 'function') {
152
- throw new TypeError(
153
- `times: callback must be a function, got ${typeof callback}`,
154
- )
117
+ const factor = Math.pow(10, decimals);
118
+ return Math.round(this.valueOf() * factor) / factor;
119
+ });
120
+
121
+ defineExtension(Number.prototype, 'randomUpTo', function (this: number): number {
122
+ const max = this.valueOf();
123
+ if (!Number.isFinite(max)) {
124
+ throw new TypeError(`randomUpTo: number must be finite, got ${max}`);
155
125
  }
126
+ return Math.random() * max;
127
+ });
156
128
 
157
- const num = Math.floor(this.valueOf())
158
- for (let i = 0; i < num; i++) {
159
- callback(i)
160
- }
161
- }
162
129
  }
@@ -1,171 +1,143 @@
1
- // Object prototype extensions
1
+ import { defineExtension } from "src/utils"
2
+
3
+
4
+ let objectExtended = false
2
5
 
3
6
  export function extendObject() {
4
- Object.prototype.isEmpty = function (): boolean {
7
+ if (objectExtended) return
8
+ objectExtended = true
9
+
10
+ defineExtension(Object.prototype, 'isEmpty', function (this: object): boolean {
5
11
  return Object.keys(this).length === 0
6
- }
7
-
8
- Object.prototype.pick = function <
9
- T extends Record<string, any>,
10
- K extends keyof T,
11
- >(keys: K[]): Pick<T, K> {
12
- if (this === null || this === undefined) {
13
- throw new TypeError('pick: cannot be called on null or undefined')
14
- }
15
- if (!Array.isArray(keys)) {
16
- throw new TypeError(`pick: keys must be an array, got ${typeof keys}`)
17
- }
18
- if (keys.length === 0) {
19
- throw new TypeError('pick: keys array cannot be empty')
20
- }
12
+ })
21
13
 
14
+ defineExtension(Object.prototype, 'pick', function <T extends Record<string, any>, K extends keyof T>(this: T, keys: K[]): Pick<T, K> {
15
+ if (!Array.isArray(keys)) throw new TypeError('pick: keys must be an array')
16
+ if (!keys.length) throw new TypeError('pick: keys array cannot be empty')
22
17
  const result = {} as Pick<T, K>
23
- const obj = this as T
24
18
  keys.forEach((key) => {
25
- if (key in obj) {
26
- result[key] = obj[key]
27
- }
19
+ if (key in this) result[key] = this[key]
28
20
  })
29
21
  return result
30
- }
31
-
32
- Object.prototype.omit = function <
33
- T extends Record<string, any>,
34
- K extends keyof T,
35
- >(keys: K[]): Omit<T, K> {
36
- if (this === null || this === undefined) {
37
- throw new TypeError('omit: cannot be called on null or undefined')
38
- }
39
- if (!Array.isArray(keys)) {
40
- throw new TypeError(`omit: keys must be an array, got ${typeof keys}`)
41
- }
42
- if (keys.length === 0) {
43
- throw new TypeError('omit: keys array cannot be empty')
44
- }
22
+ })
45
23
 
46
- const result = { ...this } as T
47
- keys.forEach((key) => {
48
- delete result[key]
49
- })
50
- return result as Omit<T, K>
51
- }
52
-
53
- Object.prototype.deepClone = function <T>(): T {
54
- // Simple cycle detection without caching key generation
55
- if (this === null || typeof this !== 'object') return this
56
-
57
- // Handle Date objects
58
- if (this instanceof Date) return new Date(this.getTime()) as unknown as T
59
-
60
- // Handle Array objects
61
- if (Array.isArray(this)) {
62
- return this.map((item) => {
63
- if (
64
- item &&
65
- typeof item === 'object' &&
66
- typeof (item as any).deepClone === 'function'
67
- ) {
68
- return (item as any).deepClone()
69
- }
70
- return item
71
- }) as unknown as T
72
- }
24
+ defineExtension(Object.prototype, 'omit', function <T extends Record<string, any>, K extends keyof T>(this: T, keys: K[]): Omit<T, K> {
25
+ if (!Array.isArray(keys)) throw new TypeError('omit: keys must be an array')
26
+ if (!keys.length) throw new TypeError('omit: keys array cannot be empty')
27
+ const result = { ...this }
28
+ keys.forEach((key) => delete result[key])
29
+ return result
30
+ })
73
31
 
74
- // Handle regular objects with better cycle detection
32
+ defineExtension(Object.prototype, 'deepClone', function <T>(this: T): T {
75
33
  const visited = new WeakSet()
76
-
77
34
  function deepCloneSafe(obj: any): any {
78
35
  if (obj === null || typeof obj !== 'object') return obj
79
-
80
- if (visited.has(obj)) {
81
- throw new Error('Circular reference detected in deepClone')
82
- }
83
-
36
+ if (visited.has(obj)) throw new Error('Circular reference detected in deepClone')
84
37
  visited.add(obj)
85
-
86
38
  if (obj instanceof Date) return new Date(obj.getTime())
87
39
  if (Array.isArray(obj)) return obj.map((item) => deepCloneSafe(item))
88
-
89
- const cloned = {} as Record<string, unknown>
40
+ const cloned: Record<string, unknown> = {}
90
41
  Object.keys(obj).forEach((key) => {
91
42
  cloned[key] = deepCloneSafe(obj[key])
92
43
  })
93
-
94
44
  return cloned
95
45
  }
46
+ return deepCloneSafe(this)
47
+ })
96
48
 
97
- return deepCloneSafe(this) as T
98
- }
99
-
100
- Object.prototype.merge = function <T extends Record<string, unknown>>(
101
- other: Partial<T>,
102
- ): T {
103
- return { ...this, ...other } as T
104
- }
49
+ defineExtension(Object.prototype, 'merge', function <T extends object>(this: T, other: Partial<T>): T {
50
+ return { ...this, ...other }
51
+ })
105
52
 
106
- Object.prototype.deepFreeze = function <T>(): T {
107
- const propNames = Object.getOwnPropertyNames(this)
108
- for (const name of propNames) {
53
+ defineExtension(Object.prototype, 'deepFreeze', function <T>(this: T): T {
54
+ Object.getOwnPropertyNames(this).forEach((name) => {
109
55
  const value = (this as any)[name]
110
- if (value && typeof value === 'object') {
111
- value.deepFreeze()
112
- }
113
- }
114
- return Object.freeze(this) as T
115
- }
56
+ if (value && typeof value === 'object') value.deepFreeze?.()
57
+ })
58
+ return Object.freeze(this)
59
+ })
60
+
61
+ defineExtension(Object.prototype, 'hasPath', function (this: object, path: string): boolean {
62
+ if (!path.trim()) throw new TypeError('hasPath: path cannot be empty')
63
+ return path.split('.').every((key) => {
64
+ if (this == null || !(key in this)) return false
65
+ // @ts-ignore
66
+ this = this[key]
67
+ return true
68
+ })
69
+ })
116
70
 
117
- Object.prototype.hasPath = function (path: string): boolean {
118
- if (typeof path !== 'string') {
119
- throw new TypeError(`hasPath: path must be a string, got ${typeof path}`)
120
- }
121
- if (path.trim() === '') {
122
- throw new TypeError('hasPath: path cannot be empty or whitespace')
123
- }
71
+ defineExtension(Object.prototype, 'getPath', function (this: object, path: string, defaultValue?: any): any {
72
+ if (!path.trim()) throw new TypeError('getPath: path cannot be empty')
73
+ return path.split('.').reduce((acc: any, key) => (acc && key in acc ? acc[key] : defaultValue), this as any)
74
+ })
124
75
 
76
+ defineExtension(Object.prototype, 'setPath', function (this: object, path: string, value: any): any {
77
+ if (!path.trim()) throw new TypeError('setPath: path cannot be empty')
125
78
  const keys = path.split('.')
126
79
  let current: any = this
127
- for (const key of keys) {
128
- if (current == null || !(key in current)) return false
129
- current = current[key]
80
+ for (let i = 0; i < keys.length - 1; i++) {
81
+ if (!(keys[i] in current) || typeof current[keys[i]] !== 'object') current[keys[i]] = {}
82
+ current = current[keys[i]]
130
83
  }
131
- return true
132
- }
84
+ current[keys[keys.length - 1]] = value
85
+ return this
86
+ })
133
87
 
134
- Object.prototype.getPath = function (path: string, defaultValue?: any): any {
135
- if (typeof path !== 'string') {
136
- throw new TypeError(`getPath: path must be a string, got ${typeof path}`)
88
+ defineExtension(Object.prototype, 'mapValues', function <T extends Record<string, any>>(this: T, fn: (value: T[keyof T], key: keyof T) => any): Record<string, any> {
89
+ if (typeof fn !== 'function') {
90
+ throw new TypeError(`mapValues: fn must be a function, got ${typeof fn}`);
137
91
  }
138
- if (path.trim() === '') {
139
- throw new TypeError('getPath: path cannot be empty or whitespace')
92
+ const result: Record<string, any> = {};
93
+ for (const key in this) {
94
+ if (Object.prototype.hasOwnProperty.call(this, key)) {
95
+ result[key] = fn((this as any)[key], key);
96
+ }
140
97
  }
98
+ return result;
99
+ });
141
100
 
142
- const keys = path.split('.')
143
- let current: any = this
144
- for (const key of keys) {
145
- if (current == null || !(key in current)) return defaultValue
146
- current = current[key]
101
+ defineExtension(Object.prototype, 'mapKeys', function <T extends Record<string, any>>(this: T, fn: (key: keyof T) => string | number | symbol): Record<string, any> {
102
+ if (typeof fn !== 'function') {
103
+ throw new TypeError(`mapKeys: fn must be a function, got ${typeof fn}`);
147
104
  }
148
- return current
149
- }
105
+ const result: Record<string, any> = {};
106
+ for (const key in this) {
107
+ if (Object.prototype.hasOwnProperty.call(this, key)) {
108
+ const newKey = fn(key);
109
+ result[newKey as string] = (this as any)[key];
110
+ }
111
+ }
112
+ return result;
113
+ });
150
114
 
151
- Object.prototype.setPath = function (path: string, value: any): any {
152
- if (typeof path !== 'string') {
153
- throw new TypeError(`setPath: path must be a string, got ${typeof path}`)
115
+ defineExtension(Object.prototype, 'filterKeys', function <T extends Record<string, any>>(this: T, keys: (keyof T)[]): Partial<T> {
116
+ if (!Array.isArray(keys)) {
117
+ throw new TypeError(`filterKeys: keys must be an array, got ${typeof keys}`);
154
118
  }
155
- if (path.trim() === '') {
156
- throw new TypeError('setPath: path cannot be empty or whitespace')
119
+ const result: Partial<T> = {};
120
+ for (const key of keys) {
121
+ if (key in this) {
122
+ result[key] = (this as any)[key];
123
+ }
157
124
  }
125
+ return result;
126
+ });
158
127
 
159
- const keys = path.split('.')
160
- let current: any = this
161
- for (let i = 0; i < keys.length - 1; i++) {
162
- const key = keys[i]
163
- if (!(key in current) || typeof current[key] !== 'object') {
164
- current[key] = {}
128
+ defineExtension(Object.prototype, 'filterValues', function <T extends Record<string, any>>(this: T, fn: (value: T[keyof T], key: keyof T) => boolean): Partial<T> {
129
+ if (typeof fn !== 'function') {
130
+ throw new TypeError(`filterValues: fn must be a function, got ${typeof fn}`);
131
+ }
132
+ const result: Partial<T> = {};
133
+ for (const key in this) {
134
+ if (Object.prototype.hasOwnProperty.call(this, key)) {
135
+ const val = (this as any)[key];
136
+ if (fn(val, key)) {
137
+ result[key] = val;
138
+ }
165
139
  }
166
- current = current[key]
167
140
  }
168
- current[keys[keys.length - 1]] = value
169
- return this
170
- }
141
+ return result;
142
+ });
171
143
  }