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,675 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * ModelWatcher Tests
5
+ *
6
+ * Tests for the model watcher that monitors ORM 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 model_watcher_1 = require("../../watchers/model.watcher");
13
+ describe('ModelWatcher', () => {
14
+ let watcher;
15
+ let mockCollector;
16
+ let mockConfig;
17
+ const createEntitySubscriber = (overrides = {}) => ({
18
+ afterLoad: jest.fn(),
19
+ beforeInsert: jest.fn(),
20
+ afterInsert: jest.fn(),
21
+ beforeUpdate: jest.fn(),
22
+ afterUpdate: jest.fn(),
23
+ beforeRemove: jest.fn(),
24
+ afterRemove: jest.fn(),
25
+ ...overrides,
26
+ });
27
+ const createWatcher = async (config, subscriber) => {
28
+ const providers = [
29
+ model_watcher_1.ModelWatcher,
30
+ { provide: collector_service_1.CollectorService, useValue: mockCollector },
31
+ { provide: nestlens_config_1.NESTLENS_CONFIG, useValue: config },
32
+ ];
33
+ if (subscriber !== undefined) {
34
+ providers.push({ provide: model_watcher_1.NESTLENS_MODEL_SUBSCRIBER, useValue: subscriber });
35
+ }
36
+ const module = await testing_1.Test.createTestingModule({
37
+ providers,
38
+ }).compile();
39
+ return module.get(model_watcher_1.ModelWatcher);
40
+ };
41
+ beforeEach(() => {
42
+ jest.clearAllMocks();
43
+ mockCollector = {
44
+ collect: jest.fn(),
45
+ collectImmediate: jest.fn(),
46
+ };
47
+ mockConfig = {
48
+ enabled: true,
49
+ watchers: {
50
+ model: { enabled: true },
51
+ },
52
+ };
53
+ });
54
+ // ============================================================================
55
+ // Config Handling
56
+ // ============================================================================
57
+ describe('Config Handling', () => {
58
+ it('should be enabled when model watcher config is true', async () => {
59
+ // Arrange
60
+ mockConfig.watchers = { model: true };
61
+ const subscriber = createEntitySubscriber();
62
+ watcher = await createWatcher(mockConfig, subscriber);
63
+ // Assert
64
+ expect(watcher.config.enabled).toBe(true);
65
+ });
66
+ it('should be disabled when model watcher config is false', async () => {
67
+ // Arrange
68
+ mockConfig.watchers = { model: false };
69
+ const subscriber = createEntitySubscriber();
70
+ watcher = await createWatcher(mockConfig, subscriber);
71
+ // Assert
72
+ expect(watcher.config.enabled).toBe(false);
73
+ });
74
+ it('should be enabled by default when watchers config is undefined', async () => {
75
+ // Arrange
76
+ mockConfig.watchers = undefined;
77
+ const subscriber = createEntitySubscriber();
78
+ watcher = await createWatcher(mockConfig, subscriber);
79
+ // Assert
80
+ expect(watcher.config.enabled).toBe(true);
81
+ });
82
+ it('should use object config when provided', async () => {
83
+ // Arrange
84
+ mockConfig.watchers = { model: { enabled: true, captureData: true } };
85
+ const subscriber = createEntitySubscriber();
86
+ watcher = await createWatcher(mockConfig, subscriber);
87
+ // Assert
88
+ expect(watcher.config.captureData).toBe(true);
89
+ });
90
+ });
91
+ // ============================================================================
92
+ // Module Initialization
93
+ // ============================================================================
94
+ describe('Module Initialization', () => {
95
+ it('should handle missing entity subscriber gracefully', async () => {
96
+ // Arrange
97
+ watcher = await createWatcher(mockConfig, undefined);
98
+ // Act & Assert - should not throw
99
+ expect(() => watcher.onModuleInit()).not.toThrow();
100
+ });
101
+ it('should setup interceptors when subscriber is available', async () => {
102
+ // Arrange
103
+ const subscriber = createEntitySubscriber();
104
+ watcher = await createWatcher(mockConfig, subscriber);
105
+ // Act
106
+ watcher.onModuleInit();
107
+ // Assert - methods should be wrapped
108
+ expect(typeof subscriber.afterLoad).toBe('function');
109
+ });
110
+ it('should not setup interceptors when disabled', async () => {
111
+ // Arrange
112
+ mockConfig.watchers = { model: false };
113
+ const subscriber = createEntitySubscriber();
114
+ const originalAfterLoad = subscriber.afterLoad;
115
+ watcher = await createWatcher(mockConfig, subscriber);
116
+ // Act
117
+ watcher.onModuleInit();
118
+ // Assert - original method should remain unchanged
119
+ expect(subscriber.afterLoad).toBe(originalAfterLoad);
120
+ });
121
+ });
122
+ // ============================================================================
123
+ // TypeORM - AfterLoad
124
+ // ============================================================================
125
+ describe('TypeORM - AfterLoad', () => {
126
+ it('should collect find operation', async () => {
127
+ // Arrange
128
+ const subscriber = createEntitySubscriber();
129
+ watcher = await createWatcher(mockConfig, subscriber);
130
+ watcher.onModuleInit();
131
+ // Act
132
+ subscriber.afterLoad({}, { metadata: { name: 'User' } });
133
+ // Assert
134
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
135
+ action: 'find',
136
+ entity: 'User',
137
+ source: 'typeorm',
138
+ recordCount: 1,
139
+ }));
140
+ });
141
+ it('should use unknown for missing entity name', async () => {
142
+ // Arrange
143
+ const subscriber = createEntitySubscriber();
144
+ watcher = await createWatcher(mockConfig, subscriber);
145
+ watcher.onModuleInit();
146
+ // Act
147
+ subscriber.afterLoad({}, {});
148
+ // Assert
149
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
150
+ entity: 'unknown',
151
+ }));
152
+ });
153
+ it('should skip ignored entities', async () => {
154
+ // Arrange
155
+ mockConfig.watchers = { model: { enabled: true, ignoreEntities: ['Session'] } };
156
+ const subscriber = createEntitySubscriber();
157
+ watcher = await createWatcher(mockConfig, subscriber);
158
+ watcher.onModuleInit();
159
+ // Act
160
+ subscriber.afterLoad({}, { metadata: { name: 'Session' } });
161
+ // Assert
162
+ expect(mockCollector.collect).not.toHaveBeenCalled();
163
+ });
164
+ });
165
+ // ============================================================================
166
+ // TypeORM - Insert Operations
167
+ // ============================================================================
168
+ describe('TypeORM - Insert Operations', () => {
169
+ it('should collect create operation', async () => {
170
+ // Arrange
171
+ const subscriber = createEntitySubscriber();
172
+ watcher = await createWatcher(mockConfig, subscriber);
173
+ watcher.onModuleInit();
174
+ // Act
175
+ subscriber.beforeInsert({ metadata: { name: 'Post' } });
176
+ subscriber.afterInsert({ metadata: { name: 'Post' }, entity: { id: 1, title: 'Test' } });
177
+ // Assert
178
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
179
+ action: 'create',
180
+ entity: 'Post',
181
+ source: 'typeorm',
182
+ recordCount: 1,
183
+ }));
184
+ });
185
+ it('should capture data when enabled', async () => {
186
+ // Arrange
187
+ mockConfig.watchers = { model: { enabled: true, captureData: true } };
188
+ const subscriber = createEntitySubscriber();
189
+ watcher = await createWatcher(mockConfig, subscriber);
190
+ watcher.onModuleInit();
191
+ // Act
192
+ subscriber.beforeInsert({ metadata: { name: 'Comment' } });
193
+ subscriber.afterInsert({ metadata: { name: 'Comment' }, entity: { id: 1, text: 'Hello' } });
194
+ // Assert
195
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
196
+ data: { id: 1, text: 'Hello' },
197
+ }));
198
+ });
199
+ it('should calculate insert duration', async () => {
200
+ // Arrange
201
+ const subscriber = createEntitySubscriber();
202
+ watcher = await createWatcher(mockConfig, subscriber);
203
+ watcher.onModuleInit();
204
+ // Act
205
+ subscriber.beforeInsert({ metadata: { name: 'User' } });
206
+ // Simulate some delay
207
+ await new Promise((resolve) => setTimeout(resolve, 10));
208
+ subscriber.afterInsert({ metadata: { name: 'User' }, entity: {} });
209
+ // Assert
210
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
211
+ duration: expect.any(Number),
212
+ }));
213
+ });
214
+ it('should skip ignored entities on insert', async () => {
215
+ // Arrange
216
+ mockConfig.watchers = { model: { enabled: true, ignoreEntities: ['Log'] } };
217
+ const subscriber = createEntitySubscriber();
218
+ watcher = await createWatcher(mockConfig, subscriber);
219
+ watcher.onModuleInit();
220
+ // Act
221
+ subscriber.beforeInsert({ metadata: { name: 'Log' } });
222
+ subscriber.afterInsert({ metadata: { name: 'Log' }, entity: {} });
223
+ // Assert
224
+ expect(mockCollector.collect).not.toHaveBeenCalled();
225
+ });
226
+ });
227
+ // ============================================================================
228
+ // TypeORM - Update Operations
229
+ // ============================================================================
230
+ describe('TypeORM - Update Operations', () => {
231
+ it('should collect update operation', async () => {
232
+ // Arrange
233
+ const subscriber = createEntitySubscriber();
234
+ watcher = await createWatcher(mockConfig, subscriber);
235
+ watcher.onModuleInit();
236
+ // Act
237
+ subscriber.beforeUpdate({ metadata: { name: 'Article' } });
238
+ subscriber.afterUpdate({ metadata: { name: 'Article' }, entity: { id: 1, title: 'Updated' } });
239
+ // Assert
240
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
241
+ action: 'update',
242
+ entity: 'Article',
243
+ source: 'typeorm',
244
+ }));
245
+ });
246
+ });
247
+ // ============================================================================
248
+ // TypeORM - Remove Operations
249
+ // ============================================================================
250
+ describe('TypeORM - Remove Operations', () => {
251
+ it('should collect delete operation', async () => {
252
+ // Arrange
253
+ const subscriber = createEntitySubscriber();
254
+ watcher = await createWatcher(mockConfig, subscriber);
255
+ watcher.onModuleInit();
256
+ // Act
257
+ subscriber.beforeRemove({ metadata: { name: 'Comment' } });
258
+ subscriber.afterRemove({ metadata: { name: 'Comment' } });
259
+ // Assert
260
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
261
+ action: 'delete',
262
+ entity: 'Comment',
263
+ source: 'typeorm',
264
+ }));
265
+ });
266
+ });
267
+ // ============================================================================
268
+ // Prisma Client Setup
269
+ // ============================================================================
270
+ describe('Prisma Client Setup', () => {
271
+ it('should setup Prisma middleware', async () => {
272
+ // Arrange
273
+ watcher = await createWatcher(mockConfig, undefined);
274
+ const prismaClient = {
275
+ $use: jest.fn(),
276
+ };
277
+ // Act
278
+ watcher.setupPrismaClient(prismaClient);
279
+ // Assert
280
+ expect(prismaClient.$use).toHaveBeenCalledWith(expect.any(Function));
281
+ });
282
+ it('should handle invalid Prisma client', async () => {
283
+ // Arrange
284
+ watcher = await createWatcher(mockConfig, undefined);
285
+ // Act & Assert - should not throw
286
+ expect(() => watcher.setupPrismaClient(null)).not.toThrow();
287
+ expect(() => watcher.setupPrismaClient({})).not.toThrow();
288
+ });
289
+ it('should collect Prisma find operations', async () => {
290
+ // Arrange
291
+ watcher = await createWatcher(mockConfig, undefined);
292
+ let middleware;
293
+ const prismaClient = {
294
+ $use: jest.fn((fn) => { middleware = fn; }),
295
+ };
296
+ watcher.setupPrismaClient(prismaClient);
297
+ const next = jest.fn().mockResolvedValue([{ id: 1 }, { id: 2 }]);
298
+ const params = { model: 'User', action: 'findMany', args: { where: { active: true } } };
299
+ // Act
300
+ await middleware(params, next);
301
+ // Assert
302
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
303
+ action: 'find',
304
+ entity: 'User',
305
+ source: 'prisma',
306
+ recordCount: 2,
307
+ }));
308
+ });
309
+ it('should collect Prisma create operations', async () => {
310
+ // Arrange
311
+ watcher = await createWatcher(mockConfig, undefined);
312
+ let middleware;
313
+ const prismaClient = {
314
+ $use: jest.fn((fn) => { middleware = fn; }),
315
+ };
316
+ watcher.setupPrismaClient(prismaClient);
317
+ const next = jest.fn().mockResolvedValue({ id: 1, name: 'New' });
318
+ const params = { model: 'Post', action: 'create', args: {} };
319
+ // Act
320
+ await middleware(params, next);
321
+ // Assert
322
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
323
+ action: 'create',
324
+ entity: 'Post',
325
+ source: 'prisma',
326
+ }));
327
+ });
328
+ it('should collect Prisma update operations', async () => {
329
+ // Arrange
330
+ watcher = await createWatcher(mockConfig, undefined);
331
+ let middleware;
332
+ const prismaClient = {
333
+ $use: jest.fn((fn) => { middleware = fn; }),
334
+ };
335
+ watcher.setupPrismaClient(prismaClient);
336
+ const next = jest.fn().mockResolvedValue({ id: 1 });
337
+ const params = { model: 'Comment', action: 'update', args: { where: { id: 1 } } };
338
+ // Act
339
+ await middleware(params, next);
340
+ // Assert
341
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
342
+ action: 'update',
343
+ entity: 'Comment',
344
+ }));
345
+ });
346
+ it('should collect Prisma delete operations', async () => {
347
+ // Arrange
348
+ watcher = await createWatcher(mockConfig, undefined);
349
+ let middleware;
350
+ const prismaClient = {
351
+ $use: jest.fn((fn) => { middleware = fn; }),
352
+ };
353
+ watcher.setupPrismaClient(prismaClient);
354
+ const next = jest.fn().mockResolvedValue({ id: 1 });
355
+ const params = { model: 'Session', action: 'delete', args: { where: { id: 1 } } };
356
+ // Act
357
+ await middleware(params, next);
358
+ // Assert
359
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
360
+ action: 'delete',
361
+ entity: 'Session',
362
+ }));
363
+ });
364
+ it('should collect Prisma upsert as save', async () => {
365
+ // Arrange
366
+ watcher = await createWatcher(mockConfig, undefined);
367
+ let middleware;
368
+ const prismaClient = {
369
+ $use: jest.fn((fn) => { middleware = fn; }),
370
+ };
371
+ watcher.setupPrismaClient(prismaClient);
372
+ const next = jest.fn().mockResolvedValue({ id: 1 });
373
+ const params = { model: 'Profile', action: 'upsert', args: {} };
374
+ // Act
375
+ await middleware(params, next);
376
+ // Assert
377
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
378
+ action: 'save',
379
+ }));
380
+ });
381
+ it('should skip ignored entities in Prisma', async () => {
382
+ // Arrange
383
+ mockConfig.watchers = { model: { enabled: true, ignoreEntities: ['Log'] } };
384
+ watcher = await createWatcher(mockConfig, undefined);
385
+ let middleware;
386
+ const prismaClient = {
387
+ $use: jest.fn((fn) => { middleware = fn; }),
388
+ };
389
+ watcher.setupPrismaClient(prismaClient);
390
+ const next = jest.fn().mockResolvedValue([]);
391
+ const params = { model: 'Log', action: 'findMany', args: {} };
392
+ // Act
393
+ await middleware(params, next);
394
+ // Assert
395
+ expect(mockCollector.collect).not.toHaveBeenCalled();
396
+ });
397
+ it('should return original Prisma result', async () => {
398
+ // Arrange
399
+ watcher = await createWatcher(mockConfig, undefined);
400
+ let middleware;
401
+ const prismaClient = {
402
+ $use: jest.fn((fn) => { middleware = fn; }),
403
+ };
404
+ watcher.setupPrismaClient(prismaClient);
405
+ const expectedResult = { id: 1, name: 'Test' };
406
+ const next = jest.fn().mockResolvedValue(expectedResult);
407
+ const params = { model: 'User', action: 'findUnique', args: {} };
408
+ // Act
409
+ const result = await middleware(params, next);
410
+ // Assert
411
+ expect(result).toEqual(expectedResult);
412
+ });
413
+ it('should handle Prisma errors', async () => {
414
+ // Arrange
415
+ watcher = await createWatcher(mockConfig, undefined);
416
+ let middleware;
417
+ const prismaClient = {
418
+ $use: jest.fn((fn) => { middleware = fn; }),
419
+ };
420
+ watcher.setupPrismaClient(prismaClient);
421
+ const next = jest.fn().mockRejectedValue(new Error('Prisma error'));
422
+ const params = { model: 'User', action: 'create', args: {} };
423
+ // Act & Assert
424
+ await expect(middleware(params, next)).rejects.toThrow('Prisma error');
425
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
426
+ error: 'Prisma error',
427
+ }));
428
+ });
429
+ });
430
+ // ============================================================================
431
+ // Sensitive Data Masking
432
+ // ============================================================================
433
+ describe('Sensitive Data Masking', () => {
434
+ it('should mask password field', async () => {
435
+ // Arrange
436
+ mockConfig.watchers = { model: { enabled: true, captureData: true } };
437
+ const subscriber = createEntitySubscriber();
438
+ watcher = await createWatcher(mockConfig, subscriber);
439
+ watcher.onModuleInit();
440
+ // Act
441
+ subscriber.beforeInsert({ metadata: { name: 'User' } });
442
+ subscriber.afterInsert({
443
+ metadata: { name: 'User' },
444
+ entity: { id: 1, email: 'test@example.com', password: 'secret123' },
445
+ });
446
+ // Assert
447
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
448
+ data: expect.objectContaining({
449
+ email: 'test@example.com',
450
+ password: '***MASKED***',
451
+ }),
452
+ }));
453
+ });
454
+ it('should mask token field', async () => {
455
+ // Arrange
456
+ mockConfig.watchers = { model: { enabled: true, captureData: true } };
457
+ const subscriber = createEntitySubscriber();
458
+ watcher = await createWatcher(mockConfig, subscriber);
459
+ watcher.onModuleInit();
460
+ // Act
461
+ subscriber.beforeInsert({ metadata: { name: 'Session' } });
462
+ subscriber.afterInsert({
463
+ metadata: { name: 'Session' },
464
+ entity: { id: 1, token: 'abc123', userId: 1 },
465
+ });
466
+ // Assert
467
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
468
+ data: expect.objectContaining({
469
+ token: '***MASKED***',
470
+ userId: 1,
471
+ }),
472
+ }));
473
+ });
474
+ it('should mask apiKey field', async () => {
475
+ // Arrange
476
+ mockConfig.watchers = { model: { enabled: true, captureData: true } };
477
+ const subscriber = createEntitySubscriber();
478
+ watcher = await createWatcher(mockConfig, subscriber);
479
+ watcher.onModuleInit();
480
+ // Act
481
+ subscriber.beforeInsert({ metadata: { name: 'ApiCredential' } });
482
+ subscriber.afterInsert({
483
+ metadata: { name: 'ApiCredential' },
484
+ entity: { id: 1, apiKey: 'key-123', name: 'My API' },
485
+ });
486
+ // Assert
487
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
488
+ data: expect.objectContaining({
489
+ apiKey: '***MASKED***',
490
+ name: 'My API',
491
+ }),
492
+ }));
493
+ });
494
+ it('should mask nested sensitive fields', async () => {
495
+ // Arrange
496
+ mockConfig.watchers = { model: { enabled: true, captureData: true } };
497
+ const subscriber = createEntitySubscriber();
498
+ watcher = await createWatcher(mockConfig, subscriber);
499
+ watcher.onModuleInit();
500
+ // Act
501
+ subscriber.beforeInsert({ metadata: { name: 'Config' } });
502
+ subscriber.afterInsert({
503
+ metadata: { name: 'Config' },
504
+ entity: { id: 1, settings: { secret: 'hidden', visible: 'shown' } },
505
+ });
506
+ // Assert
507
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
508
+ data: expect.objectContaining({
509
+ settings: expect.objectContaining({
510
+ secret: '***MASKED***',
511
+ visible: 'shown',
512
+ }),
513
+ }),
514
+ }));
515
+ });
516
+ it('should mask sensitive fields in arrays', async () => {
517
+ // Arrange
518
+ mockConfig.watchers = { model: { enabled: true, captureData: true } };
519
+ watcher = await createWatcher(mockConfig, undefined);
520
+ let middleware;
521
+ const prismaClient = {
522
+ $use: jest.fn((fn) => { middleware = fn; }),
523
+ };
524
+ watcher.setupPrismaClient(prismaClient);
525
+ const next = jest.fn().mockResolvedValue([
526
+ { id: 1, email: 'a@example.com', password: 'pass1' },
527
+ { id: 2, email: 'b@example.com', password: 'pass2' },
528
+ ]);
529
+ const params = { model: 'User', action: 'findMany', args: {} };
530
+ // Act
531
+ await middleware(params, next);
532
+ // Assert
533
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
534
+ data: [
535
+ { id: 1, email: 'a@example.com', password: '***MASKED***' },
536
+ { id: 2, email: 'b@example.com', password: '***MASKED***' },
537
+ ],
538
+ }));
539
+ });
540
+ });
541
+ // ============================================================================
542
+ // Where Condition Capture
543
+ // ============================================================================
544
+ describe('Where Condition Capture', () => {
545
+ it('should capture where condition', async () => {
546
+ // Arrange
547
+ watcher = await createWatcher(mockConfig, undefined);
548
+ let middleware;
549
+ const prismaClient = {
550
+ $use: jest.fn((fn) => { middleware = fn; }),
551
+ };
552
+ watcher.setupPrismaClient(prismaClient);
553
+ const next = jest.fn().mockResolvedValue({ id: 1 });
554
+ const params = { model: 'User', action: 'findUnique', args: { where: { id: 1 } } };
555
+ // Act
556
+ await middleware(params, next);
557
+ // Assert
558
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
559
+ where: { id: 1 },
560
+ }));
561
+ });
562
+ it('should truncate large where condition', async () => {
563
+ // Arrange
564
+ watcher = await createWatcher(mockConfig, undefined);
565
+ let middleware;
566
+ const prismaClient = {
567
+ $use: jest.fn((fn) => { middleware = fn; }),
568
+ };
569
+ watcher.setupPrismaClient(prismaClient);
570
+ const next = jest.fn().mockResolvedValue([]);
571
+ const largeWhere = { ids: Array(1000).fill(0).map((_, i) => i) };
572
+ const params = { model: 'User', action: 'findMany', args: { where: largeWhere } };
573
+ // Act
574
+ await middleware(params, next);
575
+ // Assert
576
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
577
+ where: expect.objectContaining({
578
+ _truncated: true,
579
+ _size: expect.any(Number),
580
+ }),
581
+ }));
582
+ });
583
+ it('should handle non-serializable where condition', async () => {
584
+ // Arrange
585
+ watcher = await createWatcher(mockConfig, undefined);
586
+ let middleware;
587
+ const prismaClient = {
588
+ $use: jest.fn((fn) => { middleware = fn; }),
589
+ };
590
+ watcher.setupPrismaClient(prismaClient);
591
+ const next = jest.fn().mockResolvedValue([]);
592
+ const circularWhere = {};
593
+ circularWhere.self = circularWhere;
594
+ const params = { model: 'User', action: 'findMany', args: { where: circularWhere } };
595
+ // Act
596
+ await middleware(params, next);
597
+ // Assert
598
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
599
+ where: { _error: 'Unable to serialize where condition' },
600
+ }));
601
+ });
602
+ });
603
+ // ============================================================================
604
+ // Edge Cases
605
+ // ============================================================================
606
+ describe('Edge Cases', () => {
607
+ it('should handle null entity', async () => {
608
+ // Arrange
609
+ mockConfig.watchers = { model: { enabled: true, captureData: true } };
610
+ watcher = await createWatcher(mockConfig, undefined);
611
+ let middleware;
612
+ const prismaClient = {
613
+ $use: jest.fn((fn) => { middleware = fn; }),
614
+ };
615
+ watcher.setupPrismaClient(prismaClient);
616
+ const next = jest.fn().mockResolvedValue(null);
617
+ const params = { model: 'User', action: 'findUnique', args: {} };
618
+ // Act
619
+ await middleware(params, next);
620
+ // Assert
621
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
622
+ recordCount: 0,
623
+ }));
624
+ });
625
+ it('should handle missing model name', async () => {
626
+ // Arrange
627
+ watcher = await createWatcher(mockConfig, undefined);
628
+ let middleware;
629
+ const prismaClient = {
630
+ $use: jest.fn((fn) => { middleware = fn; }),
631
+ };
632
+ watcher.setupPrismaClient(prismaClient);
633
+ const next = jest.fn().mockResolvedValue({});
634
+ const params = { action: 'findUnique', args: {} };
635
+ // Act
636
+ await middleware(params, next);
637
+ // Assert
638
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
639
+ entity: 'unknown',
640
+ }));
641
+ });
642
+ it('should handle unknown Prisma action', async () => {
643
+ // Arrange
644
+ watcher = await createWatcher(mockConfig, undefined);
645
+ let middleware;
646
+ const prismaClient = {
647
+ $use: jest.fn((fn) => { middleware = fn; }),
648
+ };
649
+ watcher.setupPrismaClient(prismaClient);
650
+ const next = jest.fn().mockResolvedValue({});
651
+ const params = { model: 'User', action: 'unknownAction', args: {} };
652
+ // Act
653
+ await middleware(params, next);
654
+ // Assert
655
+ expect(mockCollector.collect).toHaveBeenCalledWith('model', expect.objectContaining({
656
+ action: 'find', // defaults to find
657
+ }));
658
+ });
659
+ it('should not call original callback if missing for afterInsert', async () => {
660
+ // Arrange - use partial subscriber to test missing methods
661
+ const subscriber = {
662
+ afterLoad: jest.fn(),
663
+ beforeInsert: jest.fn(),
664
+ beforeUpdate: jest.fn(),
665
+ afterUpdate: jest.fn(),
666
+ beforeRemove: jest.fn(),
667
+ afterRemove: jest.fn(),
668
+ };
669
+ watcher = await createWatcher(mockConfig, subscriber);
670
+ // Act & Assert - should not throw
671
+ expect(() => watcher.onModuleInit()).not.toThrow();
672
+ });
673
+ });
674
+ });
675
+ //# sourceMappingURL=model.watcher.spec.js.map