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,724 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * DumpWatcher Tests
5
+ *
6
+ * Tests for the dump watcher that monitors database dumps, exports, imports, and migrations.
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 dump_watcher_1 = require("../../watchers/dump.watcher");
13
+ describe('DumpWatcher', () => {
14
+ let watcher;
15
+ let mockCollector;
16
+ let mockConfig;
17
+ const createDumpService = (overrides = {}) => ({
18
+ export: jest.fn().mockResolvedValue({ recordCount: 100, fileSize: 1024 }),
19
+ import: jest.fn().mockResolvedValue({ records: 50 }),
20
+ backup: jest.fn().mockResolvedValue({ size: 2048 }),
21
+ restore: jest.fn().mockResolvedValue({ rows: 200 }),
22
+ migrate: jest.fn().mockResolvedValue({ count: 10 }),
23
+ dump: jest.fn().mockResolvedValue({ recordCount: 500 }),
24
+ ...overrides,
25
+ });
26
+ const createWatcher = async (config, dumpService) => {
27
+ const providers = [
28
+ dump_watcher_1.DumpWatcher,
29
+ { provide: collector_service_1.CollectorService, useValue: mockCollector },
30
+ { provide: nestlens_config_1.NESTLENS_CONFIG, useValue: config },
31
+ ];
32
+ if (dumpService !== undefined) {
33
+ providers.push({ provide: dump_watcher_1.NESTLENS_DUMP_SERVICE, useValue: dumpService });
34
+ }
35
+ const module = await testing_1.Test.createTestingModule({
36
+ providers,
37
+ }).compile();
38
+ return module.get(dump_watcher_1.DumpWatcher);
39
+ };
40
+ beforeEach(() => {
41
+ jest.clearAllMocks();
42
+ mockCollector = {
43
+ collect: jest.fn(),
44
+ collectImmediate: jest.fn(),
45
+ };
46
+ mockConfig = {
47
+ enabled: true,
48
+ watchers: {
49
+ dump: { enabled: true },
50
+ },
51
+ };
52
+ });
53
+ // ============================================================================
54
+ // Config Handling
55
+ // ============================================================================
56
+ describe('Config Handling', () => {
57
+ it('should be enabled when dump watcher config is true', async () => {
58
+ // Arrange
59
+ mockConfig.watchers = { dump: true };
60
+ const service = createDumpService();
61
+ watcher = await createWatcher(mockConfig, service);
62
+ // Assert
63
+ expect(watcher.config.enabled).toBe(true);
64
+ });
65
+ it('should be disabled when dump watcher config is false', async () => {
66
+ // Arrange
67
+ mockConfig.watchers = { dump: false };
68
+ const service = createDumpService();
69
+ watcher = await createWatcher(mockConfig, service);
70
+ // Assert
71
+ expect(watcher.config.enabled).toBe(false);
72
+ });
73
+ it('should be enabled by default when watchers config is undefined', async () => {
74
+ // Arrange
75
+ mockConfig.watchers = undefined;
76
+ const service = createDumpService();
77
+ watcher = await createWatcher(mockConfig, service);
78
+ // Assert
79
+ expect(watcher.config.enabled).toBe(true);
80
+ });
81
+ });
82
+ // ============================================================================
83
+ // Module Initialization
84
+ // ============================================================================
85
+ describe('Module Initialization', () => {
86
+ it('should handle missing dump service gracefully', async () => {
87
+ // Arrange
88
+ watcher = await createWatcher(mockConfig, undefined);
89
+ // Act & Assert - should not throw
90
+ expect(() => watcher.onModuleInit()).not.toThrow();
91
+ });
92
+ it('should setup interceptors when service is available', async () => {
93
+ // Arrange
94
+ const service = createDumpService();
95
+ watcher = await createWatcher(mockConfig, service);
96
+ // Act
97
+ watcher.onModuleInit();
98
+ // Assert - methods should be wrapped
99
+ expect(typeof service.export).toBe('function');
100
+ });
101
+ it('should not setup interceptors when disabled', async () => {
102
+ // Arrange
103
+ mockConfig.watchers = { dump: false };
104
+ const service = createDumpService();
105
+ const originalExport = service.export;
106
+ watcher = await createWatcher(mockConfig, service);
107
+ // Act
108
+ watcher.onModuleInit();
109
+ // Assert - original method should remain unchanged
110
+ expect(service.export).toBe(originalExport);
111
+ });
112
+ });
113
+ // ============================================================================
114
+ // Export Operations
115
+ // ============================================================================
116
+ describe('Export Operations', () => {
117
+ it('should collect export completed event', async () => {
118
+ // Arrange
119
+ const service = createDumpService({
120
+ export: jest.fn().mockResolvedValue({
121
+ format: 'json',
122
+ recordCount: 100,
123
+ fileSize: 2048,
124
+ source: 'users',
125
+ destination: '/backup/users.json',
126
+ }),
127
+ });
128
+ watcher = await createWatcher(mockConfig, service);
129
+ watcher.onModuleInit();
130
+ // Act
131
+ await service.export({ table: 'users' });
132
+ // Assert
133
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
134
+ operation: 'export',
135
+ status: 'completed',
136
+ format: 'json',
137
+ recordCount: 100,
138
+ fileSize: 2048,
139
+ }));
140
+ });
141
+ it('should calculate export duration', async () => {
142
+ // Arrange
143
+ const service = createDumpService({
144
+ export: jest.fn().mockImplementation(() => new Promise((resolve) => setTimeout(() => resolve({}), 50))),
145
+ });
146
+ watcher = await createWatcher(mockConfig, service);
147
+ watcher.onModuleInit();
148
+ // Act
149
+ await service.export();
150
+ // Assert
151
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
152
+ duration: expect.any(Number),
153
+ }));
154
+ const call = mockCollector.collect.mock.calls[0][1];
155
+ expect(call.duration).toBeGreaterThanOrEqual(40);
156
+ });
157
+ it('should return original result', async () => {
158
+ // Arrange
159
+ const expectedResult = { success: true, file: '/backup/data.json' };
160
+ const service = createDumpService({
161
+ export: jest.fn().mockResolvedValue(expectedResult),
162
+ });
163
+ watcher = await createWatcher(mockConfig, service);
164
+ watcher.onModuleInit();
165
+ // Act
166
+ const result = await service.export();
167
+ // Assert
168
+ expect(result).toEqual(expectedResult);
169
+ });
170
+ });
171
+ // ============================================================================
172
+ // Import Operations
173
+ // ============================================================================
174
+ describe('Import Operations', () => {
175
+ it('should collect import completed event', async () => {
176
+ // Arrange
177
+ const service = createDumpService({
178
+ import: jest.fn().mockResolvedValue({
179
+ format: 'csv',
180
+ recordCount: 500,
181
+ source: '/data/import.csv',
182
+ destination: 'products',
183
+ }),
184
+ });
185
+ watcher = await createWatcher(mockConfig, service);
186
+ watcher.onModuleInit();
187
+ // Act
188
+ await service.import({ file: '/data/import.csv' });
189
+ // Assert
190
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
191
+ operation: 'import',
192
+ status: 'completed',
193
+ format: 'csv',
194
+ }));
195
+ });
196
+ it('should handle import failure', async () => {
197
+ // Arrange
198
+ const service = createDumpService({
199
+ import: jest.fn().mockRejectedValue(new Error('Import failed: invalid format')),
200
+ });
201
+ watcher = await createWatcher(mockConfig, service);
202
+ watcher.onModuleInit();
203
+ // Act & Assert
204
+ await expect(service.import())
205
+ .rejects.toThrow('Import failed: invalid format');
206
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
207
+ operation: 'import',
208
+ status: 'failed',
209
+ error: 'Import failed: invalid format',
210
+ }));
211
+ });
212
+ });
213
+ // ============================================================================
214
+ // Backup Operations
215
+ // ============================================================================
216
+ describe('Backup Operations', () => {
217
+ it('should collect backup completed event', async () => {
218
+ // Arrange
219
+ const service = createDumpService({
220
+ backup: jest.fn().mockResolvedValue({
221
+ format: 'sql',
222
+ fileSize: 10240,
223
+ compressed: true,
224
+ encrypted: true,
225
+ destination: '/backups/db-2024-01-01.sql.gz',
226
+ }),
227
+ });
228
+ watcher = await createWatcher(mockConfig, service);
229
+ watcher.onModuleInit();
230
+ // Act
231
+ await service.backup({ compress: true, encrypt: true });
232
+ // Assert
233
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
234
+ operation: 'backup',
235
+ status: 'completed',
236
+ format: 'sql',
237
+ compressed: true,
238
+ encrypted: true,
239
+ }));
240
+ });
241
+ });
242
+ // ============================================================================
243
+ // Restore Operations
244
+ // ============================================================================
245
+ describe('Restore Operations', () => {
246
+ it('should collect restore completed event', async () => {
247
+ // Arrange
248
+ const service = createDumpService({
249
+ restore: jest.fn().mockResolvedValue({
250
+ format: 'binary',
251
+ recordCount: 1000,
252
+ source: '/backups/db-snapshot.bin',
253
+ }),
254
+ });
255
+ watcher = await createWatcher(mockConfig, service);
256
+ watcher.onModuleInit();
257
+ // Act
258
+ await service.restore({ file: '/backups/db-snapshot.bin' });
259
+ // Assert
260
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
261
+ operation: 'restore',
262
+ status: 'completed',
263
+ format: 'binary',
264
+ }));
265
+ });
266
+ });
267
+ // ============================================================================
268
+ // Migrate Operations
269
+ // ============================================================================
270
+ describe('Migrate Operations', () => {
271
+ it('should collect migrate completed event', async () => {
272
+ // Arrange
273
+ const service = createDumpService({
274
+ migrate: jest.fn().mockResolvedValue({
275
+ count: 15,
276
+ source: 'old_db',
277
+ destination: 'new_db',
278
+ }),
279
+ });
280
+ watcher = await createWatcher(mockConfig, service);
281
+ watcher.onModuleInit();
282
+ // Act
283
+ await service.migrate();
284
+ // Assert
285
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
286
+ operation: 'migrate',
287
+ status: 'completed',
288
+ }));
289
+ });
290
+ });
291
+ // ============================================================================
292
+ // Dump Operations
293
+ // ============================================================================
294
+ describe('Dump Operations', () => {
295
+ it('should map dump method to export operation', async () => {
296
+ // Arrange
297
+ const service = createDumpService();
298
+ watcher = await createWatcher(mockConfig, service);
299
+ watcher.onModuleInit();
300
+ // Act
301
+ await service.dump();
302
+ // Assert
303
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
304
+ operation: 'export',
305
+ }));
306
+ });
307
+ });
308
+ // ============================================================================
309
+ // Format Detection
310
+ // ============================================================================
311
+ describe('Format Detection', () => {
312
+ it('should detect sql format', async () => {
313
+ // Arrange
314
+ const service = createDumpService({
315
+ export: jest.fn().mockResolvedValue({ format: 'sql' }),
316
+ });
317
+ watcher = await createWatcher(mockConfig, service);
318
+ watcher.onModuleInit();
319
+ // Act
320
+ await service.export();
321
+ // Assert
322
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
323
+ format: 'sql',
324
+ }));
325
+ });
326
+ it('should detect json format', async () => {
327
+ // Arrange
328
+ const service = createDumpService({
329
+ export: jest.fn().mockResolvedValue({ type: 'json' }),
330
+ });
331
+ watcher = await createWatcher(mockConfig, service);
332
+ watcher.onModuleInit();
333
+ // Act
334
+ await service.export();
335
+ // Assert
336
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
337
+ format: 'json',
338
+ }));
339
+ });
340
+ it('should detect csv format', async () => {
341
+ // Arrange
342
+ const service = createDumpService({
343
+ export: jest.fn().mockResolvedValue({ format: 'CSV' }),
344
+ });
345
+ watcher = await createWatcher(mockConfig, service);
346
+ watcher.onModuleInit();
347
+ // Act
348
+ await service.export();
349
+ // Assert
350
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
351
+ format: 'csv',
352
+ }));
353
+ });
354
+ it('should detect binary format', async () => {
355
+ // Arrange
356
+ const service = createDumpService({
357
+ export: jest.fn().mockResolvedValue({ format: 'binary' }),
358
+ });
359
+ watcher = await createWatcher(mockConfig, service);
360
+ watcher.onModuleInit();
361
+ // Act
362
+ await service.export();
363
+ // Assert
364
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
365
+ format: 'binary',
366
+ }));
367
+ });
368
+ it('should default to json format', async () => {
369
+ // Arrange
370
+ const service = createDumpService({
371
+ export: jest.fn().mockResolvedValue({}),
372
+ });
373
+ watcher = await createWatcher(mockConfig, service);
374
+ watcher.onModuleInit();
375
+ // Act
376
+ await service.export();
377
+ // Assert
378
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
379
+ format: 'json',
380
+ }));
381
+ });
382
+ it('should detect format from options when result has none', async () => {
383
+ // Arrange
384
+ const service = createDumpService({
385
+ export: jest.fn().mockResolvedValue({}),
386
+ });
387
+ watcher = await createWatcher(mockConfig, service);
388
+ watcher.onModuleInit();
389
+ // Act
390
+ await service.export({ format: 'csv' });
391
+ // Assert
392
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
393
+ format: 'csv',
394
+ }));
395
+ });
396
+ });
397
+ // ============================================================================
398
+ // Field Extraction
399
+ // ============================================================================
400
+ describe('Field Extraction', () => {
401
+ it('should extract source from result', async () => {
402
+ // Arrange
403
+ const service = createDumpService({
404
+ export: jest.fn().mockResolvedValue({ source: 'users_table' }),
405
+ });
406
+ watcher = await createWatcher(mockConfig, service);
407
+ watcher.onModuleInit();
408
+ // Act
409
+ await service.export();
410
+ // Assert
411
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
412
+ source: 'users_table',
413
+ }));
414
+ });
415
+ it('should extract from field as source', async () => {
416
+ // Arrange
417
+ const service = createDumpService({
418
+ export: jest.fn().mockResolvedValue({ from: 'products' }),
419
+ });
420
+ watcher = await createWatcher(mockConfig, service);
421
+ watcher.onModuleInit();
422
+ // Act
423
+ await service.export();
424
+ // Assert
425
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
426
+ source: 'products',
427
+ }));
428
+ });
429
+ it('should extract destination from result', async () => {
430
+ // Arrange
431
+ const service = createDumpService({
432
+ export: jest.fn().mockResolvedValue({ destination: '/backups/data.json' }),
433
+ });
434
+ watcher = await createWatcher(mockConfig, service);
435
+ watcher.onModuleInit();
436
+ // Act
437
+ await service.export();
438
+ // Assert
439
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
440
+ destination: '/backups/data.json',
441
+ }));
442
+ });
443
+ it('should extract file field as destination', async () => {
444
+ // Arrange
445
+ const service = createDumpService({
446
+ export: jest.fn().mockResolvedValue({ file: '/tmp/export.sql' }),
447
+ });
448
+ watcher = await createWatcher(mockConfig, service);
449
+ watcher.onModuleInit();
450
+ // Act
451
+ await service.export();
452
+ // Assert
453
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
454
+ destination: '/tmp/export.sql',
455
+ }));
456
+ });
457
+ it('should extract recordCount from various fields', async () => {
458
+ // Arrange
459
+ const service = createDumpService({
460
+ export: jest.fn().mockResolvedValue({ rows: 150 }),
461
+ });
462
+ watcher = await createWatcher(mockConfig, service);
463
+ watcher.onModuleInit();
464
+ // Act
465
+ await service.export();
466
+ // Assert
467
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
468
+ recordCount: 150,
469
+ }));
470
+ });
471
+ it('should extract fileSize from bytes field', async () => {
472
+ // Arrange
473
+ const service = createDumpService({
474
+ export: jest.fn().mockResolvedValue({ bytes: 4096 }),
475
+ });
476
+ watcher = await createWatcher(mockConfig, service);
477
+ watcher.onModuleInit();
478
+ // Act
479
+ await service.export();
480
+ // Assert
481
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
482
+ fileSize: 4096,
483
+ }));
484
+ });
485
+ it('should extract compressed flag', async () => {
486
+ // Arrange
487
+ const service = createDumpService({
488
+ export: jest.fn().mockResolvedValue({ gzip: true }),
489
+ });
490
+ watcher = await createWatcher(mockConfig, service);
491
+ watcher.onModuleInit();
492
+ // Act
493
+ await service.export();
494
+ // Assert
495
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
496
+ compressed: true,
497
+ }));
498
+ });
499
+ it('should extract encrypted flag', async () => {
500
+ // Arrange
501
+ const service = createDumpService({
502
+ export: jest.fn().mockResolvedValue({ secure: true }),
503
+ });
504
+ watcher = await createWatcher(mockConfig, service);
505
+ watcher.onModuleInit();
506
+ // Act
507
+ await service.export();
508
+ // Assert
509
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
510
+ encrypted: true,
511
+ }));
512
+ });
513
+ });
514
+ // ============================================================================
515
+ // Manual Tracking
516
+ // ============================================================================
517
+ describe('Manual Tracking (trackDump)', () => {
518
+ it('should track export operation', async () => {
519
+ // Arrange
520
+ watcher = await createWatcher(mockConfig, undefined);
521
+ // Act
522
+ watcher.trackDump('export', 'json', 1000, 'completed', {
523
+ source: 'users',
524
+ destination: '/backup/users.json',
525
+ recordCount: 100,
526
+ fileSize: 2048,
527
+ });
528
+ // Assert
529
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
530
+ operation: 'export',
531
+ format: 'json',
532
+ duration: 1000,
533
+ status: 'completed',
534
+ source: 'users',
535
+ destination: '/backup/users.json',
536
+ recordCount: 100,
537
+ fileSize: 2048,
538
+ }));
539
+ });
540
+ it('should track import operation', async () => {
541
+ // Arrange
542
+ watcher = await createWatcher(mockConfig, undefined);
543
+ // Act
544
+ watcher.trackDump('import', 'csv', 500, 'completed', {
545
+ source: '/data/import.csv',
546
+ destination: 'products',
547
+ recordCount: 50,
548
+ });
549
+ // Assert
550
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
551
+ operation: 'import',
552
+ format: 'csv',
553
+ }));
554
+ });
555
+ it('should track backup operation', async () => {
556
+ // Arrange
557
+ watcher = await createWatcher(mockConfig, undefined);
558
+ // Act
559
+ watcher.trackDump('backup', 'sql', 2000, 'completed', {
560
+ compressed: true,
561
+ encrypted: true,
562
+ });
563
+ // Assert
564
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
565
+ operation: 'backup',
566
+ format: 'sql',
567
+ compressed: true,
568
+ encrypted: true,
569
+ }));
570
+ });
571
+ it('should track failed operation', async () => {
572
+ // Arrange
573
+ watcher = await createWatcher(mockConfig, undefined);
574
+ // Act
575
+ watcher.trackDump('restore', 'binary', 100, 'failed', {
576
+ error: 'Backup file corrupted',
577
+ });
578
+ // Assert
579
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
580
+ operation: 'restore',
581
+ status: 'failed',
582
+ error: 'Backup file corrupted',
583
+ }));
584
+ });
585
+ it('should track migrate operation', async () => {
586
+ // Arrange
587
+ watcher = await createWatcher(mockConfig, undefined);
588
+ // Act
589
+ watcher.trackDump('migrate', 'json', 5000, 'completed', {
590
+ source: 'legacy_db',
591
+ destination: 'new_db',
592
+ recordCount: 10000,
593
+ });
594
+ // Assert
595
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
596
+ operation: 'migrate',
597
+ }));
598
+ });
599
+ });
600
+ // ============================================================================
601
+ // Error Handling
602
+ // ============================================================================
603
+ describe('Error Handling', () => {
604
+ it('should collect failed event on error', async () => {
605
+ // Arrange
606
+ const service = createDumpService({
607
+ export: jest.fn().mockRejectedValue(new Error('Disk full')),
608
+ });
609
+ watcher = await createWatcher(mockConfig, service);
610
+ watcher.onModuleInit();
611
+ // Act & Assert
612
+ await expect(service.export())
613
+ .rejects.toThrow('Disk full');
614
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
615
+ status: 'failed',
616
+ error: 'Disk full',
617
+ }));
618
+ });
619
+ it('should re-throw the error', async () => {
620
+ // Arrange
621
+ const service = createDumpService({
622
+ backup: jest.fn().mockRejectedValue(new Error('Permission denied')),
623
+ });
624
+ watcher = await createWatcher(mockConfig, service);
625
+ watcher.onModuleInit();
626
+ // Act & Assert
627
+ await expect(service.backup())
628
+ .rejects.toThrow('Permission denied');
629
+ });
630
+ it('should handle non-Error objects', async () => {
631
+ // Arrange
632
+ const service = createDumpService({
633
+ import: jest.fn().mockRejectedValue('String error'),
634
+ });
635
+ watcher = await createWatcher(mockConfig, service);
636
+ watcher.onModuleInit();
637
+ // Act
638
+ try {
639
+ await service.import();
640
+ }
641
+ catch {
642
+ // Expected
643
+ }
644
+ // Assert
645
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
646
+ error: 'String error',
647
+ }));
648
+ });
649
+ it('should extract options on failure', async () => {
650
+ // Arrange
651
+ const service = createDumpService({
652
+ export: jest.fn().mockRejectedValue(new Error('Failed')),
653
+ });
654
+ watcher = await createWatcher(mockConfig, service);
655
+ watcher.onModuleInit();
656
+ // Act
657
+ try {
658
+ await service.export({ format: 'csv', source: 'users' });
659
+ }
660
+ catch {
661
+ // Expected
662
+ }
663
+ // Assert
664
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
665
+ format: 'csv',
666
+ source: 'users',
667
+ }));
668
+ });
669
+ });
670
+ // ============================================================================
671
+ // Edge Cases
672
+ // ============================================================================
673
+ describe('Edge Cases', () => {
674
+ it('should skip non-function methods', async () => {
675
+ // Arrange
676
+ const service = {
677
+ ...createDumpService(),
678
+ export: 'not a function',
679
+ };
680
+ watcher = await createWatcher(mockConfig, service);
681
+ // Act & Assert - should not throw
682
+ expect(() => watcher.onModuleInit()).not.toThrow();
683
+ });
684
+ it('should handle null result', async () => {
685
+ // Arrange
686
+ const service = createDumpService({
687
+ export: jest.fn().mockResolvedValue(null),
688
+ });
689
+ watcher = await createWatcher(mockConfig, service);
690
+ watcher.onModuleInit();
691
+ // Act
692
+ await service.export();
693
+ // Assert
694
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
695
+ format: 'json', // default
696
+ }));
697
+ });
698
+ it('should handle undefined options', async () => {
699
+ // Arrange
700
+ const service = createDumpService();
701
+ watcher = await createWatcher(mockConfig, service);
702
+ watcher.onModuleInit();
703
+ // Act
704
+ await service.export(undefined);
705
+ // Assert
706
+ expect(mockCollector.collect).toHaveBeenCalled();
707
+ });
708
+ it('should handle non-object result', async () => {
709
+ // Arrange
710
+ const service = createDumpService({
711
+ export: jest.fn().mockResolvedValue('success'),
712
+ });
713
+ watcher = await createWatcher(mockConfig, service);
714
+ watcher.onModuleInit();
715
+ // Act
716
+ await service.export();
717
+ // Assert
718
+ expect(mockCollector.collect).toHaveBeenCalledWith('dump', expect.objectContaining({
719
+ format: 'json', // default
720
+ }));
721
+ });
722
+ });
723
+ });
724
+ //# sourceMappingURL=dump.watcher.spec.js.map