nestlens 0.1.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 (359) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +145 -0
  3. package/dist/__tests__/api/api.controller.spec.d.ts +2 -0
  4. package/dist/__tests__/api/api.controller.spec.d.ts.map +1 -0
  5. package/dist/__tests__/api/api.controller.spec.js +982 -0
  6. package/dist/__tests__/api/api.controller.spec.js.map +1 -0
  7. package/dist/__tests__/api/api.guard.spec.d.ts +2 -0
  8. package/dist/__tests__/api/api.guard.spec.d.ts.map +1 -0
  9. package/dist/__tests__/api/api.guard.spec.js +572 -0
  10. package/dist/__tests__/api/api.guard.spec.js.map +1 -0
  11. package/dist/__tests__/api/dashboard.controller.spec.d.ts +2 -0
  12. package/dist/__tests__/api/dashboard.controller.spec.d.ts.map +1 -0
  13. package/dist/__tests__/api/dashboard.controller.spec.js +474 -0
  14. package/dist/__tests__/api/dashboard.controller.spec.js.map +1 -0
  15. package/dist/__tests__/api/tag.controller.spec.d.ts +2 -0
  16. package/dist/__tests__/api/tag.controller.spec.d.ts.map +1 -0
  17. package/dist/__tests__/api/tag.controller.spec.js +280 -0
  18. package/dist/__tests__/api/tag.controller.spec.js.map +1 -0
  19. package/dist/__tests__/collector.service.spec.d.ts +2 -0
  20. package/dist/__tests__/collector.service.spec.d.ts.map +1 -0
  21. package/dist/__tests__/collector.service.spec.js +240 -0
  22. package/dist/__tests__/collector.service.spec.js.map +1 -0
  23. package/dist/__tests__/core/collector.service.spec.d.ts +2 -0
  24. package/dist/__tests__/core/collector.service.spec.d.ts.map +1 -0
  25. package/dist/__tests__/core/collector.service.spec.js +526 -0
  26. package/dist/__tests__/core/collector.service.spec.js.map +1 -0
  27. package/dist/__tests__/core/family-hash.service.spec.d.ts +2 -0
  28. package/dist/__tests__/core/family-hash.service.spec.d.ts.map +1 -0
  29. package/dist/__tests__/core/family-hash.service.spec.js +1117 -0
  30. package/dist/__tests__/core/family-hash.service.spec.js.map +1 -0
  31. package/dist/__tests__/core/pruning.service.spec.d.ts +2 -0
  32. package/dist/__tests__/core/pruning.service.spec.d.ts.map +1 -0
  33. package/dist/__tests__/core/pruning.service.spec.js +224 -0
  34. package/dist/__tests__/core/pruning.service.spec.js.map +1 -0
  35. package/dist/__tests__/core/storage/sqlite.storage.spec.d.ts +2 -0
  36. package/dist/__tests__/core/storage/sqlite.storage.spec.d.ts.map +1 -0
  37. package/dist/__tests__/core/storage/sqlite.storage.spec.js +853 -0
  38. package/dist/__tests__/core/storage/sqlite.storage.spec.js.map +1 -0
  39. package/dist/__tests__/core/tag.service.spec.d.ts +2 -0
  40. package/dist/__tests__/core/tag.service.spec.d.ts.map +1 -0
  41. package/dist/__tests__/core/tag.service.spec.js +994 -0
  42. package/dist/__tests__/core/tag.service.spec.js.map +1 -0
  43. package/dist/__tests__/family-hash.service.spec.d.ts +2 -0
  44. package/dist/__tests__/family-hash.service.spec.d.ts.map +1 -0
  45. package/dist/__tests__/family-hash.service.spec.js +325 -0
  46. package/dist/__tests__/family-hash.service.spec.js.map +1 -0
  47. package/dist/__tests__/filters/api-filters.spec.d.ts +2 -0
  48. package/dist/__tests__/filters/api-filters.spec.d.ts.map +1 -0
  49. package/dist/__tests__/filters/api-filters.spec.js +172 -0
  50. package/dist/__tests__/filters/api-filters.spec.js.map +1 -0
  51. package/dist/__tests__/filters/entry-factories.d.ts +20 -0
  52. package/dist/__tests__/filters/entry-factories.d.ts.map +1 -0
  53. package/dist/__tests__/filters/entry-factories.js +288 -0
  54. package/dist/__tests__/filters/entry-factories.js.map +1 -0
  55. package/dist/__tests__/filters/filter-contract.spec.d.ts +2 -0
  56. package/dist/__tests__/filters/filter-contract.spec.d.ts.map +1 -0
  57. package/dist/__tests__/filters/filter-contract.spec.js +230 -0
  58. package/dist/__tests__/filters/filter-contract.spec.js.map +1 -0
  59. package/dist/__tests__/filters/filter-test-data.d.ts +26 -0
  60. package/dist/__tests__/filters/filter-test-data.d.ts.map +1 -0
  61. package/dist/__tests__/filters/filter-test-data.js +374 -0
  62. package/dist/__tests__/filters/filter-test-data.js.map +1 -0
  63. package/dist/__tests__/filters/storage-filters.spec.d.ts +2 -0
  64. package/dist/__tests__/filters/storage-filters.spec.d.ts.map +1 -0
  65. package/dist/__tests__/filters/storage-filters.spec.js +699 -0
  66. package/dist/__tests__/filters/storage-filters.spec.js.map +1 -0
  67. package/dist/__tests__/filters/test-utils.d.ts +23 -0
  68. package/dist/__tests__/filters/test-utils.d.ts.map +1 -0
  69. package/dist/__tests__/filters/test-utils.js +54 -0
  70. package/dist/__tests__/filters/test-utils.js.map +1 -0
  71. package/dist/__tests__/nestlens.module.spec.d.ts +2 -0
  72. package/dist/__tests__/nestlens.module.spec.d.ts.map +1 -0
  73. package/dist/__tests__/nestlens.module.spec.js +620 -0
  74. package/dist/__tests__/nestlens.module.spec.js.map +1 -0
  75. package/dist/__tests__/pruning.service.spec.d.ts +2 -0
  76. package/dist/__tests__/pruning.service.spec.d.ts.map +1 -0
  77. package/dist/__tests__/pruning.service.spec.js +142 -0
  78. package/dist/__tests__/pruning.service.spec.js.map +1 -0
  79. package/dist/__tests__/setup.d.ts +7 -0
  80. package/dist/__tests__/setup.d.ts.map +1 -0
  81. package/dist/__tests__/setup.js +24 -0
  82. package/dist/__tests__/setup.js.map +1 -0
  83. package/dist/__tests__/tag.service.spec.d.ts +2 -0
  84. package/dist/__tests__/tag.service.spec.d.ts.map +1 -0
  85. package/dist/__tests__/tag.service.spec.js +482 -0
  86. package/dist/__tests__/tag.service.spec.js.map +1 -0
  87. package/dist/__tests__/watchers/batch.watcher.spec.d.ts +2 -0
  88. package/dist/__tests__/watchers/batch.watcher.spec.d.ts.map +1 -0
  89. package/dist/__tests__/watchers/batch.watcher.spec.js +515 -0
  90. package/dist/__tests__/watchers/batch.watcher.spec.js.map +1 -0
  91. package/dist/__tests__/watchers/cache.watcher.spec.d.ts +2 -0
  92. package/dist/__tests__/watchers/cache.watcher.spec.d.ts.map +1 -0
  93. package/dist/__tests__/watchers/cache.watcher.spec.js +395 -0
  94. package/dist/__tests__/watchers/cache.watcher.spec.js.map +1 -0
  95. package/dist/__tests__/watchers/command.watcher.spec.d.ts +2 -0
  96. package/dist/__tests__/watchers/command.watcher.spec.d.ts.map +1 -0
  97. package/dist/__tests__/watchers/command.watcher.spec.js +598 -0
  98. package/dist/__tests__/watchers/command.watcher.spec.js.map +1 -0
  99. package/dist/__tests__/watchers/dump.watcher.spec.d.ts +2 -0
  100. package/dist/__tests__/watchers/dump.watcher.spec.d.ts.map +1 -0
  101. package/dist/__tests__/watchers/dump.watcher.spec.js +724 -0
  102. package/dist/__tests__/watchers/dump.watcher.spec.js.map +1 -0
  103. package/dist/__tests__/watchers/event.watcher.spec.d.ts +2 -0
  104. package/dist/__tests__/watchers/event.watcher.spec.d.ts.map +1 -0
  105. package/dist/__tests__/watchers/event.watcher.spec.js +316 -0
  106. package/dist/__tests__/watchers/event.watcher.spec.js.map +1 -0
  107. package/dist/__tests__/watchers/exception.watcher.spec.d.ts +2 -0
  108. package/dist/__tests__/watchers/exception.watcher.spec.d.ts.map +1 -0
  109. package/dist/__tests__/watchers/exception.watcher.spec.js +495 -0
  110. package/dist/__tests__/watchers/exception.watcher.spec.js.map +1 -0
  111. package/dist/__tests__/watchers/gate.watcher.spec.d.ts +2 -0
  112. package/dist/__tests__/watchers/gate.watcher.spec.d.ts.map +1 -0
  113. package/dist/__tests__/watchers/gate.watcher.spec.js +683 -0
  114. package/dist/__tests__/watchers/gate.watcher.spec.js.map +1 -0
  115. package/dist/__tests__/watchers/http-client.watcher.spec.d.ts +2 -0
  116. package/dist/__tests__/watchers/http-client.watcher.spec.d.ts.map +1 -0
  117. package/dist/__tests__/watchers/http-client.watcher.spec.js +888 -0
  118. package/dist/__tests__/watchers/http-client.watcher.spec.js.map +1 -0
  119. package/dist/__tests__/watchers/job.watcher.spec.d.ts +2 -0
  120. package/dist/__tests__/watchers/job.watcher.spec.d.ts.map +1 -0
  121. package/dist/__tests__/watchers/job.watcher.spec.js +513 -0
  122. package/dist/__tests__/watchers/job.watcher.spec.js.map +1 -0
  123. package/dist/__tests__/watchers/log.watcher.spec.d.ts +2 -0
  124. package/dist/__tests__/watchers/log.watcher.spec.d.ts.map +1 -0
  125. package/dist/__tests__/watchers/log.watcher.spec.js +428 -0
  126. package/dist/__tests__/watchers/log.watcher.spec.js.map +1 -0
  127. package/dist/__tests__/watchers/mail.watcher.spec.d.ts +2 -0
  128. package/dist/__tests__/watchers/mail.watcher.spec.d.ts.map +1 -0
  129. package/dist/__tests__/watchers/mail.watcher.spec.js +425 -0
  130. package/dist/__tests__/watchers/mail.watcher.spec.js.map +1 -0
  131. package/dist/__tests__/watchers/model.watcher.spec.d.ts +2 -0
  132. package/dist/__tests__/watchers/model.watcher.spec.d.ts.map +1 -0
  133. package/dist/__tests__/watchers/model.watcher.spec.js +675 -0
  134. package/dist/__tests__/watchers/model.watcher.spec.js.map +1 -0
  135. package/dist/__tests__/watchers/notification.watcher.spec.d.ts +2 -0
  136. package/dist/__tests__/watchers/notification.watcher.spec.d.ts.map +1 -0
  137. package/dist/__tests__/watchers/notification.watcher.spec.js +595 -0
  138. package/dist/__tests__/watchers/notification.watcher.spec.js.map +1 -0
  139. package/dist/__tests__/watchers/query/types.spec.d.ts +2 -0
  140. package/dist/__tests__/watchers/query/types.spec.d.ts.map +1 -0
  141. package/dist/__tests__/watchers/query/types.spec.js +292 -0
  142. package/dist/__tests__/watchers/query/types.spec.js.map +1 -0
  143. package/dist/__tests__/watchers/query.watcher.spec.d.ts +2 -0
  144. package/dist/__tests__/watchers/query.watcher.spec.d.ts.map +1 -0
  145. package/dist/__tests__/watchers/query.watcher.spec.js +597 -0
  146. package/dist/__tests__/watchers/query.watcher.spec.js.map +1 -0
  147. package/dist/__tests__/watchers/redis.watcher.spec.d.ts +2 -0
  148. package/dist/__tests__/watchers/redis.watcher.spec.d.ts.map +1 -0
  149. package/dist/__tests__/watchers/redis.watcher.spec.js +634 -0
  150. package/dist/__tests__/watchers/redis.watcher.spec.js.map +1 -0
  151. package/dist/__tests__/watchers/request.watcher.spec.d.ts +2 -0
  152. package/dist/__tests__/watchers/request.watcher.spec.d.ts.map +1 -0
  153. package/dist/__tests__/watchers/request.watcher.spec.js +1017 -0
  154. package/dist/__tests__/watchers/request.watcher.spec.js.map +1 -0
  155. package/dist/__tests__/watchers/schedule.watcher.spec.d.ts +2 -0
  156. package/dist/__tests__/watchers/schedule.watcher.spec.d.ts.map +1 -0
  157. package/dist/__tests__/watchers/schedule.watcher.spec.js +338 -0
  158. package/dist/__tests__/watchers/schedule.watcher.spec.js.map +1 -0
  159. package/dist/__tests__/watchers/view.watcher.spec.d.ts +2 -0
  160. package/dist/__tests__/watchers/view.watcher.spec.d.ts.map +1 -0
  161. package/dist/__tests__/watchers/view.watcher.spec.js +564 -0
  162. package/dist/__tests__/watchers/view.watcher.spec.js.map +1 -0
  163. package/dist/api/api.controller.d.ts +193 -0
  164. package/dist/api/api.controller.d.ts.map +1 -0
  165. package/dist/api/api.controller.js +562 -0
  166. package/dist/api/api.controller.js.map +1 -0
  167. package/dist/api/api.guard.d.ts +77 -0
  168. package/dist/api/api.guard.d.ts.map +1 -0
  169. package/dist/api/api.guard.js +294 -0
  170. package/dist/api/api.guard.js.map +1 -0
  171. package/dist/api/dashboard.controller.d.ts +49 -0
  172. package/dist/api/dashboard.controller.d.ts.map +1 -0
  173. package/dist/api/dashboard.controller.js +472 -0
  174. package/dist/api/dashboard.controller.js.map +1 -0
  175. package/dist/api/index.d.ts +5 -0
  176. package/dist/api/index.d.ts.map +1 -0
  177. package/dist/api/index.js +21 -0
  178. package/dist/api/index.js.map +1 -0
  179. package/dist/api/tag.controller.d.ts +65 -0
  180. package/dist/api/tag.controller.d.ts.map +1 -0
  181. package/dist/api/tag.controller.js +149 -0
  182. package/dist/api/tag.controller.js.map +1 -0
  183. package/dist/core/collector.service.d.ts +80 -0
  184. package/dist/core/collector.service.d.ts.map +1 -0
  185. package/dist/core/collector.service.js +255 -0
  186. package/dist/core/collector.service.js.map +1 -0
  187. package/dist/core/family-hash.service.d.ts +64 -0
  188. package/dist/core/family-hash.service.d.ts.map +1 -0
  189. package/dist/core/family-hash.service.js +281 -0
  190. package/dist/core/family-hash.service.js.map +1 -0
  191. package/dist/core/index.d.ts +4 -0
  192. package/dist/core/index.d.ts.map +1 -0
  193. package/dist/core/index.js +20 -0
  194. package/dist/core/index.js.map +1 -0
  195. package/dist/core/pruning.service.d.ts +16 -0
  196. package/dist/core/pruning.service.d.ts.map +1 -0
  197. package/dist/core/pruning.service.js +71 -0
  198. package/dist/core/pruning.service.js.map +1 -0
  199. package/dist/core/storage/index.d.ts +3 -0
  200. package/dist/core/storage/index.d.ts.map +1 -0
  201. package/dist/core/storage/index.js +19 -0
  202. package/dist/core/storage/index.js.map +1 -0
  203. package/dist/core/storage/sqlite.storage.d.ts +60 -0
  204. package/dist/core/storage/sqlite.storage.d.ts.map +1 -0
  205. package/dist/core/storage/sqlite.storage.js +929 -0
  206. package/dist/core/storage/sqlite.storage.js.map +1 -0
  207. package/dist/core/storage/storage.interface.d.ts +122 -0
  208. package/dist/core/storage/storage.interface.d.ts.map +1 -0
  209. package/dist/core/storage/storage.interface.js +5 -0
  210. package/dist/core/storage/storage.interface.js.map +1 -0
  211. package/dist/core/tag.service.d.ts +71 -0
  212. package/dist/core/tag.service.d.ts.map +1 -0
  213. package/dist/core/tag.service.js +568 -0
  214. package/dist/core/tag.service.js.map +1 -0
  215. package/dist/dashboard/public/assets/BatchesPage-DFT4fKlJ.js +1 -0
  216. package/dist/dashboard/public/assets/CachePage-CRy1Tjb8.js +1 -0
  217. package/dist/dashboard/public/assets/ClickableBadge-CV5J3THx.js +1 -0
  218. package/dist/dashboard/public/assets/CommandsPage-DdRnTm-W.js +1 -0
  219. package/dist/dashboard/public/assets/DashboardPage-CjaRZXYy.js +26 -0
  220. package/dist/dashboard/public/assets/DataTable-B6o9H8lh.js +88 -0
  221. package/dist/dashboard/public/assets/DumpsPage-DO8y1RTg.js +1 -0
  222. package/dist/dashboard/public/assets/EntryDetailPage-By-YcAGL.js +125 -0
  223. package/dist/dashboard/public/assets/EventsPage-u-r4AiT4.js +1 -0
  224. package/dist/dashboard/public/assets/ExceptionsPage-DXUcARr1.js +6 -0
  225. package/dist/dashboard/public/assets/GatesPage-DpeP7CDZ.js +1 -0
  226. package/dist/dashboard/public/assets/HttpClientPage-BJ4-5E6t.js +1 -0
  227. package/dist/dashboard/public/assets/JobsPage-Dv3KaX2x.js +1 -0
  228. package/dist/dashboard/public/assets/LogsPage-D0Q3yDb1.js +1 -0
  229. package/dist/dashboard/public/assets/MailPage-Bf8C6WF6.js +1 -0
  230. package/dist/dashboard/public/assets/ModelsPage-BMHncI5y.js +1 -0
  231. package/dist/dashboard/public/assets/NotificationsPage-D5-I-Oxb.js +1 -0
  232. package/dist/dashboard/public/assets/QueriesPage-oNp0i6Gt.js +1 -0
  233. package/dist/dashboard/public/assets/RedisPage-_GeS2OD8.js +1 -0
  234. package/dist/dashboard/public/assets/RequestsPage-BCwqu9US.js +1 -0
  235. package/dist/dashboard/public/assets/SchedulePage-CR0P-oX6.js +1 -0
  236. package/dist/dashboard/public/assets/ViewsPage-Dsy5ECRA.js +1 -0
  237. package/dist/dashboard/public/assets/calendar-DfK3x-6B.js +6 -0
  238. package/dist/dashboard/public/assets/circle-check-big-DcsYW8y8.js +6 -0
  239. package/dist/dashboard/public/assets/format-BFldcnCk.js +1 -0
  240. package/dist/dashboard/public/assets/index-DmeA1maE.css +1 -0
  241. package/dist/dashboard/public/assets/index-rkbGYdU7.js +351 -0
  242. package/dist/dashboard/public/assets/types-Cldoe2db.js +1 -0
  243. package/dist/dashboard/public/assets/vendor-B2nVRih0.js +43 -0
  244. package/dist/dashboard/public/assets/zap-DqtRi0JM.js +6 -0
  245. package/dist/dashboard/public/index.html +15 -0
  246. package/dist/dashboard/public/nestlens-icon.svg +9 -0
  247. package/dist/index.d.ts +22 -0
  248. package/dist/index.d.ts.map +1 -0
  249. package/dist/index.js +69 -0
  250. package/dist/index.js.map +1 -0
  251. package/dist/nestlens.config.d.ts +216 -0
  252. package/dist/nestlens.config.d.ts.map +1 -0
  253. package/dist/nestlens.config.js +57 -0
  254. package/dist/nestlens.config.js.map +1 -0
  255. package/dist/nestlens.module.d.ts +10 -0
  256. package/dist/nestlens.module.d.ts.map +1 -0
  257. package/dist/nestlens.module.js +211 -0
  258. package/dist/nestlens.module.js.map +1 -0
  259. package/dist/types/entry.types.d.ts +368 -0
  260. package/dist/types/entry.types.d.ts.map +1 -0
  261. package/dist/types/entry.types.js +3 -0
  262. package/dist/types/entry.types.js.map +1 -0
  263. package/dist/types/index.d.ts +4 -0
  264. package/dist/types/index.d.ts.map +1 -0
  265. package/dist/types/index.js +20 -0
  266. package/dist/types/index.js.map +1 -0
  267. package/dist/types/request.types.d.ts +9 -0
  268. package/dist/types/request.types.d.ts.map +1 -0
  269. package/dist/types/request.types.js +3 -0
  270. package/dist/types/request.types.js.map +1 -0
  271. package/dist/types/tag.types.d.ts +32 -0
  272. package/dist/types/tag.types.d.ts.map +1 -0
  273. package/dist/types/tag.types.js +3 -0
  274. package/dist/types/tag.types.js.map +1 -0
  275. package/dist/watchers/batch.watcher.d.ts +48 -0
  276. package/dist/watchers/batch.watcher.d.ts.map +1 -0
  277. package/dist/watchers/batch.watcher.js +185 -0
  278. package/dist/watchers/batch.watcher.js.map +1 -0
  279. package/dist/watchers/cache.watcher.d.ts +19 -0
  280. package/dist/watchers/cache.watcher.d.ts.map +1 -0
  281. package/dist/watchers/cache.watcher.js +158 -0
  282. package/dist/watchers/cache.watcher.js.map +1 -0
  283. package/dist/watchers/command.watcher.d.ts +32 -0
  284. package/dist/watchers/command.watcher.d.ts.map +1 -0
  285. package/dist/watchers/command.watcher.js +174 -0
  286. package/dist/watchers/command.watcher.js.map +1 -0
  287. package/dist/watchers/dump.watcher.d.ts +52 -0
  288. package/dist/watchers/dump.watcher.d.ts.map +1 -0
  289. package/dist/watchers/dump.watcher.js +234 -0
  290. package/dist/watchers/dump.watcher.js.map +1 -0
  291. package/dist/watchers/event.watcher.d.ts +20 -0
  292. package/dist/watchers/event.watcher.d.ts.map +1 -0
  293. package/dist/watchers/event.watcher.js +123 -0
  294. package/dist/watchers/event.watcher.js.map +1 -0
  295. package/dist/watchers/exception.watcher.d.ts +15 -0
  296. package/dist/watchers/exception.watcher.d.ts.map +1 -0
  297. package/dist/watchers/exception.watcher.js +117 -0
  298. package/dist/watchers/exception.watcher.js.map +1 -0
  299. package/dist/watchers/gate.watcher.d.ts +40 -0
  300. package/dist/watchers/gate.watcher.d.ts.map +1 -0
  301. package/dist/watchers/gate.watcher.js +200 -0
  302. package/dist/watchers/gate.watcher.js.map +1 -0
  303. package/dist/watchers/http-client.watcher.d.ts +34 -0
  304. package/dist/watchers/http-client.watcher.d.ts.map +1 -0
  305. package/dist/watchers/http-client.watcher.js +259 -0
  306. package/dist/watchers/http-client.watcher.js.map +1 -0
  307. package/dist/watchers/index.d.ts +19 -0
  308. package/dist/watchers/index.d.ts.map +1 -0
  309. package/dist/watchers/index.js +35 -0
  310. package/dist/watchers/index.js.map +1 -0
  311. package/dist/watchers/job.watcher.d.ts +27 -0
  312. package/dist/watchers/job.watcher.d.ts.map +1 -0
  313. package/dist/watchers/job.watcher.js +190 -0
  314. package/dist/watchers/job.watcher.js.map +1 -0
  315. package/dist/watchers/log.watcher.d.ts +26 -0
  316. package/dist/watchers/log.watcher.d.ts.map +1 -0
  317. package/dist/watchers/log.watcher.js +122 -0
  318. package/dist/watchers/log.watcher.js.map +1 -0
  319. package/dist/watchers/mail.watcher.d.ts +26 -0
  320. package/dist/watchers/mail.watcher.d.ts.map +1 -0
  321. package/dist/watchers/mail.watcher.js +154 -0
  322. package/dist/watchers/mail.watcher.js.map +1 -0
  323. package/dist/watchers/model.watcher.d.ts +54 -0
  324. package/dist/watchers/model.watcher.d.ts.map +1 -0
  325. package/dist/watchers/model.watcher.js +343 -0
  326. package/dist/watchers/model.watcher.js.map +1 -0
  327. package/dist/watchers/notification.watcher.d.ts +48 -0
  328. package/dist/watchers/notification.watcher.d.ts.map +1 -0
  329. package/dist/watchers/notification.watcher.js +215 -0
  330. package/dist/watchers/notification.watcher.js.map +1 -0
  331. package/dist/watchers/query/index.d.ts +3 -0
  332. package/dist/watchers/query/index.d.ts.map +1 -0
  333. package/dist/watchers/query/index.js +19 -0
  334. package/dist/watchers/query/index.js.map +1 -0
  335. package/dist/watchers/query/query.watcher.d.ts +27 -0
  336. package/dist/watchers/query/query.watcher.d.ts.map +1 -0
  337. package/dist/watchers/query/query.watcher.js +167 -0
  338. package/dist/watchers/query/query.watcher.js.map +1 -0
  339. package/dist/watchers/query/types.d.ts +60 -0
  340. package/dist/watchers/query/types.d.ts.map +1 -0
  341. package/dist/watchers/query/types.js +55 -0
  342. package/dist/watchers/query/types.js.map +1 -0
  343. package/dist/watchers/redis.watcher.d.ts +43 -0
  344. package/dist/watchers/redis.watcher.d.ts.map +1 -0
  345. package/dist/watchers/redis.watcher.js +225 -0
  346. package/dist/watchers/redis.watcher.js.map +1 -0
  347. package/dist/watchers/request.watcher.d.ts +21 -0
  348. package/dist/watchers/request.watcher.d.ts.map +1 -0
  349. package/dist/watchers/request.watcher.js +287 -0
  350. package/dist/watchers/request.watcher.js.map +1 -0
  351. package/dist/watchers/schedule.watcher.d.ts +25 -0
  352. package/dist/watchers/schedule.watcher.d.ts.map +1 -0
  353. package/dist/watchers/schedule.watcher.js +168 -0
  354. package/dist/watchers/schedule.watcher.js.map +1 -0
  355. package/dist/watchers/view.watcher.d.ts +51 -0
  356. package/dist/watchers/view.watcher.d.ts.map +1 -0
  357. package/dist/watchers/view.watcher.js +219 -0
  358. package/dist/watchers/view.watcher.js.map +1 -0
  359. package/package.json +86 -0
@@ -0,0 +1,634 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * RedisWatcher Tests
5
+ *
6
+ * Tests for the redis watcher that monitors Redis operations.
7
+ * Follows AAA (Arrange-Act-Assert) pattern.
8
+ */
9
+ const testing_1 = require("@nestjs/testing");
10
+ const collector_service_1 = require("../../core/collector.service");
11
+ const nestlens_config_1 = require("../../nestlens.config");
12
+ const redis_watcher_1 = require("../../watchers/redis.watcher");
13
+ describe('RedisWatcher', () => {
14
+ let watcher;
15
+ let mockCollector;
16
+ let mockConfig;
17
+ const createRedisClient = (overrides = {}) => ({
18
+ get: jest.fn().mockResolvedValue('value'),
19
+ set: jest.fn().mockResolvedValue('OK'),
20
+ del: jest.fn().mockResolvedValue(1),
21
+ exists: jest.fn().mockResolvedValue(1),
22
+ expire: jest.fn().mockResolvedValue(1),
23
+ ttl: jest.fn().mockResolvedValue(3600),
24
+ incr: jest.fn().mockResolvedValue(1),
25
+ decr: jest.fn().mockResolvedValue(0),
26
+ lpush: jest.fn().mockResolvedValue(1),
27
+ rpush: jest.fn().mockResolvedValue(1),
28
+ lpop: jest.fn().mockResolvedValue('item'),
29
+ rpop: jest.fn().mockResolvedValue('item'),
30
+ lrange: jest.fn().mockResolvedValue(['item1', 'item2']),
31
+ hget: jest.fn().mockResolvedValue('field-value'),
32
+ hset: jest.fn().mockResolvedValue(1),
33
+ hdel: jest.fn().mockResolvedValue(1),
34
+ hgetall: jest.fn().mockResolvedValue({ field: 'value' }),
35
+ sadd: jest.fn().mockResolvedValue(1),
36
+ srem: jest.fn().mockResolvedValue(1),
37
+ smembers: jest.fn().mockResolvedValue(['member1', 'member2']),
38
+ zadd: jest.fn().mockResolvedValue(1),
39
+ zrem: jest.fn().mockResolvedValue(1),
40
+ zrange: jest.fn().mockResolvedValue(['item1', 'item2']),
41
+ mget: jest.fn().mockResolvedValue(['value1', 'value2']),
42
+ mset: jest.fn().mockResolvedValue('OK'),
43
+ ...overrides,
44
+ });
45
+ const createWatcher = async (config, redisClient) => {
46
+ const providers = [
47
+ redis_watcher_1.RedisWatcher,
48
+ { provide: collector_service_1.CollectorService, useValue: mockCollector },
49
+ { provide: nestlens_config_1.NESTLENS_CONFIG, useValue: config },
50
+ ];
51
+ if (redisClient !== undefined) {
52
+ providers.push({ provide: redis_watcher_1.NESTLENS_REDIS_CLIENT, useValue: redisClient });
53
+ }
54
+ const module = await testing_1.Test.createTestingModule({
55
+ providers,
56
+ }).compile();
57
+ return module.get(redis_watcher_1.RedisWatcher);
58
+ };
59
+ beforeEach(() => {
60
+ jest.clearAllMocks();
61
+ mockCollector = {
62
+ collect: jest.fn(),
63
+ collectImmediate: jest.fn(),
64
+ };
65
+ mockConfig = {
66
+ enabled: true,
67
+ watchers: {
68
+ redis: { enabled: true },
69
+ },
70
+ };
71
+ });
72
+ // ============================================================================
73
+ // Config Handling
74
+ // ============================================================================
75
+ describe('Config Handling', () => {
76
+ it('should be enabled when redis watcher config is true', async () => {
77
+ // Arrange
78
+ mockConfig.watchers = { redis: true };
79
+ const client = createRedisClient();
80
+ watcher = await createWatcher(mockConfig, client);
81
+ // Assert
82
+ expect(watcher.config.enabled).toBe(true);
83
+ });
84
+ it('should be disabled when redis watcher config is false', async () => {
85
+ // Arrange
86
+ mockConfig.watchers = { redis: false };
87
+ const client = createRedisClient();
88
+ watcher = await createWatcher(mockConfig, client);
89
+ // Assert
90
+ expect(watcher.config.enabled).toBe(false);
91
+ });
92
+ it('should be enabled by default when watchers config is undefined', async () => {
93
+ // Arrange
94
+ mockConfig.watchers = undefined;
95
+ const client = createRedisClient();
96
+ watcher = await createWatcher(mockConfig, client);
97
+ // Assert
98
+ expect(watcher.config.enabled).toBe(true);
99
+ });
100
+ it('should use object config when provided', async () => {
101
+ // Arrange
102
+ mockConfig.watchers = { redis: { enabled: true, maxResultSize: 2048 } };
103
+ const client = createRedisClient();
104
+ watcher = await createWatcher(mockConfig, client);
105
+ // Assert
106
+ expect(watcher.config.maxResultSize).toBe(2048);
107
+ });
108
+ });
109
+ // ============================================================================
110
+ // Module Initialization
111
+ // ============================================================================
112
+ describe('Module Initialization', () => {
113
+ it('should handle missing redis client gracefully', async () => {
114
+ // Arrange
115
+ watcher = await createWatcher(mockConfig, undefined);
116
+ // Act & Assert - should not throw
117
+ expect(() => watcher.onModuleInit()).not.toThrow();
118
+ });
119
+ it('should setup interceptors when client is available', async () => {
120
+ // Arrange
121
+ const client = createRedisClient();
122
+ watcher = await createWatcher(mockConfig, client);
123
+ // Act
124
+ watcher.onModuleInit();
125
+ // Assert - methods should be wrapped
126
+ expect(typeof client.get).toBe('function');
127
+ });
128
+ it('should not setup interceptors when disabled', async () => {
129
+ // Arrange
130
+ mockConfig.watchers = { redis: false };
131
+ const client = createRedisClient();
132
+ const originalGet = client.get;
133
+ watcher = await createWatcher(mockConfig, client);
134
+ // Act
135
+ watcher.onModuleInit();
136
+ // Assert - original method should remain unchanged
137
+ expect(client.get).toBe(originalGet);
138
+ });
139
+ it('should skip ignored commands', async () => {
140
+ // Arrange
141
+ mockConfig.watchers = { redis: { enabled: true, ignoreCommands: ['get'] } };
142
+ const client = createRedisClient();
143
+ const originalGet = client.get;
144
+ watcher = await createWatcher(mockConfig, client);
145
+ // Act
146
+ watcher.onModuleInit();
147
+ // Assert - ignored command should not be wrapped
148
+ expect(client.get).toBe(originalGet);
149
+ });
150
+ });
151
+ // ============================================================================
152
+ // GET Command
153
+ // ============================================================================
154
+ describe('GET Command', () => {
155
+ it('should collect successful get operation', async () => {
156
+ // Arrange
157
+ const client = createRedisClient({
158
+ get: jest.fn().mockResolvedValue('cached-value'),
159
+ });
160
+ watcher = await createWatcher(mockConfig, client);
161
+ watcher.onModuleInit();
162
+ // Act
163
+ await client.get('user:123');
164
+ // Assert
165
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
166
+ command: 'get',
167
+ keyPattern: 'user:123',
168
+ status: 'success',
169
+ result: 'cached-value',
170
+ }));
171
+ });
172
+ it('should calculate command duration', async () => {
173
+ // Arrange
174
+ const client = createRedisClient({
175
+ get: jest.fn().mockImplementation(() => new Promise((resolve) => setTimeout(() => resolve('value'), 50))),
176
+ });
177
+ watcher = await createWatcher(mockConfig, client);
178
+ watcher.onModuleInit();
179
+ // Act
180
+ await client.get('key');
181
+ // Assert
182
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
183
+ duration: expect.any(Number),
184
+ }));
185
+ const call = mockCollector.collect.mock.calls[0][1];
186
+ expect(call.duration).toBeGreaterThanOrEqual(40);
187
+ });
188
+ it('should return original result', async () => {
189
+ // Arrange
190
+ const client = createRedisClient({
191
+ get: jest.fn().mockResolvedValue('original'),
192
+ });
193
+ watcher = await createWatcher(mockConfig, client);
194
+ watcher.onModuleInit();
195
+ // Act
196
+ const result = await client.get('key');
197
+ // Assert
198
+ expect(result).toBe('original');
199
+ });
200
+ });
201
+ // ============================================================================
202
+ // SET Command
203
+ // ============================================================================
204
+ describe('SET Command', () => {
205
+ it('should collect successful set operation', async () => {
206
+ // Arrange
207
+ const client = createRedisClient();
208
+ watcher = await createWatcher(mockConfig, client);
209
+ watcher.onModuleInit();
210
+ // Act - use non-sensitive key
211
+ await client.set('cache:abc', 'data', 'EX', 3600);
212
+ // Assert
213
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
214
+ command: 'set',
215
+ keyPattern: 'cache:abc',
216
+ status: 'success',
217
+ args: ['cache:abc', 'data', 'EX', 3600],
218
+ }));
219
+ });
220
+ });
221
+ // ============================================================================
222
+ // DELETE Command
223
+ // ============================================================================
224
+ describe('DELETE Command', () => {
225
+ it('should collect delete operation with multi-key pattern', async () => {
226
+ // Arrange
227
+ const client = createRedisClient();
228
+ watcher = await createWatcher(mockConfig, client);
229
+ watcher.onModuleInit();
230
+ // Act
231
+ await client.del('key1', 'key2', 'key3');
232
+ // Assert
233
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
234
+ command: 'del',
235
+ keyPattern: 'del(3 keys)',
236
+ }));
237
+ });
238
+ });
239
+ // ============================================================================
240
+ // Hash Commands
241
+ // ============================================================================
242
+ describe('Hash Commands', () => {
243
+ it('should collect hget operation', async () => {
244
+ // Arrange
245
+ const client = createRedisClient();
246
+ watcher = await createWatcher(mockConfig, client);
247
+ watcher.onModuleInit();
248
+ // Act
249
+ await client.hget('user:123', 'name');
250
+ // Assert
251
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
252
+ command: 'hget',
253
+ keyPattern: 'user:123',
254
+ }));
255
+ });
256
+ it('should collect hset operation', async () => {
257
+ // Arrange
258
+ const client = createRedisClient();
259
+ watcher = await createWatcher(mockConfig, client);
260
+ watcher.onModuleInit();
261
+ // Act
262
+ await client.hset('user:123', 'name', 'John');
263
+ // Assert
264
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
265
+ command: 'hset',
266
+ }));
267
+ });
268
+ it('should collect hgetall operation', async () => {
269
+ // Arrange
270
+ const client = createRedisClient();
271
+ watcher = await createWatcher(mockConfig, client);
272
+ watcher.onModuleInit();
273
+ // Act
274
+ await client.hgetall('user:123');
275
+ // Assert
276
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
277
+ command: 'hgetall',
278
+ }));
279
+ });
280
+ });
281
+ // ============================================================================
282
+ // List Commands
283
+ // ============================================================================
284
+ describe('List Commands', () => {
285
+ it('should collect lpush operation', async () => {
286
+ // Arrange
287
+ const client = createRedisClient();
288
+ watcher = await createWatcher(mockConfig, client);
289
+ watcher.onModuleInit();
290
+ // Act
291
+ await client.lpush('queue', 'item');
292
+ // Assert
293
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
294
+ command: 'lpush',
295
+ keyPattern: 'queue',
296
+ }));
297
+ });
298
+ it('should collect lrange operation', async () => {
299
+ // Arrange
300
+ const client = createRedisClient();
301
+ watcher = await createWatcher(mockConfig, client);
302
+ watcher.onModuleInit();
303
+ // Act
304
+ await client.lrange('list', 0, -1);
305
+ // Assert
306
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
307
+ command: 'lrange',
308
+ }));
309
+ });
310
+ });
311
+ // ============================================================================
312
+ // Set Commands
313
+ // ============================================================================
314
+ describe('Set Commands', () => {
315
+ it('should collect sadd operation', async () => {
316
+ // Arrange
317
+ const client = createRedisClient();
318
+ watcher = await createWatcher(mockConfig, client);
319
+ watcher.onModuleInit();
320
+ // Act
321
+ await client.sadd('tags', 'tag1', 'tag2');
322
+ // Assert
323
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
324
+ command: 'sadd',
325
+ }));
326
+ });
327
+ it('should collect smembers operation', async () => {
328
+ // Arrange
329
+ const client = createRedisClient();
330
+ watcher = await createWatcher(mockConfig, client);
331
+ watcher.onModuleInit();
332
+ // Act
333
+ await client.smembers('tags');
334
+ // Assert
335
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
336
+ command: 'smembers',
337
+ }));
338
+ });
339
+ });
340
+ // ============================================================================
341
+ // Multi-Key Commands
342
+ // ============================================================================
343
+ describe('Multi-Key Commands', () => {
344
+ it('should collect mget operation', async () => {
345
+ // Arrange
346
+ const client = createRedisClient();
347
+ watcher = await createWatcher(mockConfig, client);
348
+ watcher.onModuleInit();
349
+ // Act
350
+ await client.mget('key1', 'key2', 'key3');
351
+ // Assert
352
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
353
+ command: 'mget',
354
+ keyPattern: 'mget(3 keys)',
355
+ }));
356
+ });
357
+ it('should collect mset operation', async () => {
358
+ // Arrange
359
+ const client = createRedisClient();
360
+ watcher = await createWatcher(mockConfig, client);
361
+ watcher.onModuleInit();
362
+ // Act
363
+ await client.mset('key1', 'val1', 'key2', 'val2');
364
+ // Assert
365
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
366
+ command: 'mset',
367
+ keyPattern: 'mset(4 keys)',
368
+ }));
369
+ });
370
+ });
371
+ // ============================================================================
372
+ // Error Handling
373
+ // ============================================================================
374
+ describe('Error Handling', () => {
375
+ it('should collect error status', async () => {
376
+ // Arrange
377
+ const client = createRedisClient({
378
+ get: jest.fn().mockRejectedValue(new Error('Connection refused')),
379
+ });
380
+ watcher = await createWatcher(mockConfig, client);
381
+ watcher.onModuleInit();
382
+ // Act & Assert
383
+ await expect(client.get('key')).rejects.toThrow('Connection refused');
384
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
385
+ status: 'error',
386
+ error: 'Connection refused',
387
+ }));
388
+ });
389
+ it('should re-throw the error', async () => {
390
+ // Arrange
391
+ const client = createRedisClient({
392
+ set: jest.fn().mockRejectedValue(new Error('Timeout')),
393
+ });
394
+ watcher = await createWatcher(mockConfig, client);
395
+ watcher.onModuleInit();
396
+ // Act & Assert
397
+ await expect(client.set('key', 'value')).rejects.toThrow('Timeout');
398
+ });
399
+ it('should handle non-Error objects', async () => {
400
+ // Arrange
401
+ const client = createRedisClient({
402
+ get: jest.fn().mockRejectedValue('String error'),
403
+ });
404
+ watcher = await createWatcher(mockConfig, client);
405
+ watcher.onModuleInit();
406
+ // Act
407
+ try {
408
+ await client.get('key');
409
+ }
410
+ catch {
411
+ // Expected
412
+ }
413
+ // Assert
414
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
415
+ error: 'String error',
416
+ }));
417
+ });
418
+ });
419
+ // ============================================================================
420
+ // Sensitive Key Masking
421
+ // ============================================================================
422
+ describe('Sensitive Key Masking', () => {
423
+ it('should mask password key values', async () => {
424
+ // Arrange
425
+ const client = createRedisClient({
426
+ get: jest.fn().mockResolvedValue('secret-password'),
427
+ });
428
+ watcher = await createWatcher(mockConfig, client);
429
+ watcher.onModuleInit();
430
+ // Act
431
+ await client.get('user:password');
432
+ // Assert
433
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
434
+ result: '***MASKED***',
435
+ }));
436
+ });
437
+ it('should mask token key values', async () => {
438
+ // Arrange
439
+ const client = createRedisClient({
440
+ get: jest.fn().mockResolvedValue('jwt-token-123'),
441
+ });
442
+ watcher = await createWatcher(mockConfig, client);
443
+ watcher.onModuleInit();
444
+ // Act
445
+ await client.get('auth:token:user1');
446
+ // Assert
447
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
448
+ result: '***MASKED***',
449
+ }));
450
+ });
451
+ it('should mask secret key values', async () => {
452
+ // Arrange
453
+ const client = createRedisClient({
454
+ get: jest.fn().mockResolvedValue('api-secret'),
455
+ });
456
+ watcher = await createWatcher(mockConfig, client);
457
+ watcher.onModuleInit();
458
+ // Act
459
+ await client.get('app:secret');
460
+ // Assert
461
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
462
+ result: '***MASKED***',
463
+ }));
464
+ });
465
+ it('should mask session key values', async () => {
466
+ // Arrange
467
+ const client = createRedisClient({
468
+ get: jest.fn().mockResolvedValue('session-data'),
469
+ });
470
+ watcher = await createWatcher(mockConfig, client);
471
+ watcher.onModuleInit();
472
+ // Act
473
+ await client.get('session:abc123');
474
+ // Assert
475
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
476
+ result: '***MASKED***',
477
+ }));
478
+ });
479
+ it('should mask args but keep key visible', async () => {
480
+ // Arrange
481
+ const client = createRedisClient();
482
+ watcher = await createWatcher(mockConfig, client);
483
+ watcher.onModuleInit();
484
+ // Act
485
+ await client.set('user:password', 'secret123', 'EX', 3600);
486
+ // Assert
487
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
488
+ args: ['user:password', '***MASKED***', '***MASKED***', '***MASKED***'],
489
+ }));
490
+ });
491
+ it('should not mask non-sensitive keys', async () => {
492
+ // Arrange
493
+ const client = createRedisClient({
494
+ get: jest.fn().mockResolvedValue('normal-value'),
495
+ });
496
+ watcher = await createWatcher(mockConfig, client);
497
+ watcher.onModuleInit();
498
+ // Act
499
+ await client.get('user:profile');
500
+ // Assert
501
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
502
+ result: 'normal-value',
503
+ }));
504
+ });
505
+ });
506
+ // ============================================================================
507
+ // Size Limits
508
+ // ============================================================================
509
+ describe('Size Limits', () => {
510
+ it('should truncate large result', async () => {
511
+ // Arrange
512
+ const largeValue = 'x'.repeat(5000);
513
+ const client = createRedisClient({
514
+ get: jest.fn().mockResolvedValue(largeValue),
515
+ });
516
+ watcher = await createWatcher(mockConfig, client);
517
+ watcher.onModuleInit();
518
+ // Act - use non-sensitive key (not containing 'key', 'token', 'secret', etc.)
519
+ await client.get('cache:large');
520
+ // Assert
521
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
522
+ result: expect.objectContaining({
523
+ _truncated: true,
524
+ _size: expect.any(Number),
525
+ }),
526
+ }));
527
+ });
528
+ it('should truncate large args', async () => {
529
+ // Arrange
530
+ const largeValue = 'x'.repeat(5000);
531
+ const client = createRedisClient();
532
+ watcher = await createWatcher(mockConfig, client);
533
+ watcher.onModuleInit();
534
+ // Act - use non-sensitive key
535
+ await client.set('cache:item', largeValue);
536
+ // Assert
537
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
538
+ args: [expect.objectContaining({ _truncated: true })],
539
+ }));
540
+ });
541
+ it('should use custom maxResultSize', async () => {
542
+ // Arrange
543
+ mockConfig.watchers = { redis: { enabled: true, maxResultSize: 100 } };
544
+ const mediumValue = 'x'.repeat(200);
545
+ const client = createRedisClient({
546
+ get: jest.fn().mockResolvedValue(mediumValue),
547
+ });
548
+ watcher = await createWatcher(mockConfig, client);
549
+ watcher.onModuleInit();
550
+ // Act - use non-sensitive key
551
+ await client.get('cache:medium');
552
+ // Assert
553
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
554
+ result: expect.objectContaining({ _truncated: true }),
555
+ }));
556
+ });
557
+ });
558
+ // ============================================================================
559
+ // Edge Cases
560
+ // ============================================================================
561
+ describe('Edge Cases', () => {
562
+ it('should handle null result', async () => {
563
+ // Arrange
564
+ const client = createRedisClient({
565
+ get: jest.fn().mockResolvedValue(null),
566
+ });
567
+ watcher = await createWatcher(mockConfig, client);
568
+ watcher.onModuleInit();
569
+ // Act
570
+ await client.get('nonexistent');
571
+ // Assert
572
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
573
+ result: undefined,
574
+ }));
575
+ });
576
+ it('should handle empty args', async () => {
577
+ // Arrange
578
+ const client = createRedisClient({
579
+ get: jest.fn().mockResolvedValue(null),
580
+ });
581
+ watcher = await createWatcher(mockConfig, client);
582
+ watcher.onModuleInit();
583
+ // Act
584
+ await client.get();
585
+ // Assert
586
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
587
+ keyPattern: undefined,
588
+ }));
589
+ });
590
+ it('should handle non-string key', async () => {
591
+ // Arrange
592
+ const client = createRedisClient();
593
+ watcher = await createWatcher(mockConfig, client);
594
+ watcher.onModuleInit();
595
+ // Act
596
+ await client.get(123);
597
+ // Assert
598
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
599
+ keyPattern: undefined,
600
+ }));
601
+ });
602
+ it('should handle non-serializable args', async () => {
603
+ // Arrange
604
+ const client = createRedisClient();
605
+ watcher = await createWatcher(mockConfig, client);
606
+ watcher.onModuleInit();
607
+ const circularObj = {};
608
+ circularObj.self = circularObj;
609
+ // Act - use non-sensitive key
610
+ await client.set('cache:item', circularObj);
611
+ // Assert
612
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
613
+ args: [expect.objectContaining({ _error: 'Unable to serialize arguments' })],
614
+ }));
615
+ });
616
+ it('should handle non-serializable result', async () => {
617
+ // Arrange
618
+ const circularObj = {};
619
+ circularObj.self = circularObj;
620
+ const client = createRedisClient({
621
+ hgetall: jest.fn().mockResolvedValue(circularObj),
622
+ });
623
+ watcher = await createWatcher(mockConfig, client);
624
+ watcher.onModuleInit();
625
+ // Act
626
+ await client.hgetall('hash');
627
+ // Assert
628
+ expect(mockCollector.collect).toHaveBeenCalledWith('redis', expect.objectContaining({
629
+ result: expect.objectContaining({ _error: 'Unable to serialize result' }),
630
+ }));
631
+ });
632
+ });
633
+ });
634
+ //# sourceMappingURL=redis.watcher.spec.js.map