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.
- package/LICENSE +21 -0
- package/README.md +145 -0
- package/dist/__tests__/api/api.controller.spec.d.ts +2 -0
- package/dist/__tests__/api/api.controller.spec.d.ts.map +1 -0
- package/dist/__tests__/api/api.controller.spec.js +982 -0
- package/dist/__tests__/api/api.controller.spec.js.map +1 -0
- package/dist/__tests__/api/api.guard.spec.d.ts +2 -0
- package/dist/__tests__/api/api.guard.spec.d.ts.map +1 -0
- package/dist/__tests__/api/api.guard.spec.js +572 -0
- package/dist/__tests__/api/api.guard.spec.js.map +1 -0
- package/dist/__tests__/api/dashboard.controller.spec.d.ts +2 -0
- package/dist/__tests__/api/dashboard.controller.spec.d.ts.map +1 -0
- package/dist/__tests__/api/dashboard.controller.spec.js +474 -0
- package/dist/__tests__/api/dashboard.controller.spec.js.map +1 -0
- package/dist/__tests__/api/tag.controller.spec.d.ts +2 -0
- package/dist/__tests__/api/tag.controller.spec.d.ts.map +1 -0
- package/dist/__tests__/api/tag.controller.spec.js +280 -0
- package/dist/__tests__/api/tag.controller.spec.js.map +1 -0
- package/dist/__tests__/collector.service.spec.d.ts +2 -0
- package/dist/__tests__/collector.service.spec.d.ts.map +1 -0
- package/dist/__tests__/collector.service.spec.js +240 -0
- package/dist/__tests__/collector.service.spec.js.map +1 -0
- package/dist/__tests__/core/collector.service.spec.d.ts +2 -0
- package/dist/__tests__/core/collector.service.spec.d.ts.map +1 -0
- package/dist/__tests__/core/collector.service.spec.js +526 -0
- package/dist/__tests__/core/collector.service.spec.js.map +1 -0
- package/dist/__tests__/core/family-hash.service.spec.d.ts +2 -0
- package/dist/__tests__/core/family-hash.service.spec.d.ts.map +1 -0
- package/dist/__tests__/core/family-hash.service.spec.js +1117 -0
- package/dist/__tests__/core/family-hash.service.spec.js.map +1 -0
- package/dist/__tests__/core/pruning.service.spec.d.ts +2 -0
- package/dist/__tests__/core/pruning.service.spec.d.ts.map +1 -0
- package/dist/__tests__/core/pruning.service.spec.js +224 -0
- package/dist/__tests__/core/pruning.service.spec.js.map +1 -0
- package/dist/__tests__/core/storage/sqlite.storage.spec.d.ts +2 -0
- package/dist/__tests__/core/storage/sqlite.storage.spec.d.ts.map +1 -0
- package/dist/__tests__/core/storage/sqlite.storage.spec.js +853 -0
- package/dist/__tests__/core/storage/sqlite.storage.spec.js.map +1 -0
- package/dist/__tests__/core/tag.service.spec.d.ts +2 -0
- package/dist/__tests__/core/tag.service.spec.d.ts.map +1 -0
- package/dist/__tests__/core/tag.service.spec.js +994 -0
- package/dist/__tests__/core/tag.service.spec.js.map +1 -0
- package/dist/__tests__/family-hash.service.spec.d.ts +2 -0
- package/dist/__tests__/family-hash.service.spec.d.ts.map +1 -0
- package/dist/__tests__/family-hash.service.spec.js +325 -0
- package/dist/__tests__/family-hash.service.spec.js.map +1 -0
- package/dist/__tests__/filters/api-filters.spec.d.ts +2 -0
- package/dist/__tests__/filters/api-filters.spec.d.ts.map +1 -0
- package/dist/__tests__/filters/api-filters.spec.js +172 -0
- package/dist/__tests__/filters/api-filters.spec.js.map +1 -0
- package/dist/__tests__/filters/entry-factories.d.ts +20 -0
- package/dist/__tests__/filters/entry-factories.d.ts.map +1 -0
- package/dist/__tests__/filters/entry-factories.js +288 -0
- package/dist/__tests__/filters/entry-factories.js.map +1 -0
- package/dist/__tests__/filters/filter-contract.spec.d.ts +2 -0
- package/dist/__tests__/filters/filter-contract.spec.d.ts.map +1 -0
- package/dist/__tests__/filters/filter-contract.spec.js +230 -0
- package/dist/__tests__/filters/filter-contract.spec.js.map +1 -0
- package/dist/__tests__/filters/filter-test-data.d.ts +26 -0
- package/dist/__tests__/filters/filter-test-data.d.ts.map +1 -0
- package/dist/__tests__/filters/filter-test-data.js +374 -0
- package/dist/__tests__/filters/filter-test-data.js.map +1 -0
- package/dist/__tests__/filters/storage-filters.spec.d.ts +2 -0
- package/dist/__tests__/filters/storage-filters.spec.d.ts.map +1 -0
- package/dist/__tests__/filters/storage-filters.spec.js +699 -0
- package/dist/__tests__/filters/storage-filters.spec.js.map +1 -0
- package/dist/__tests__/filters/test-utils.d.ts +23 -0
- package/dist/__tests__/filters/test-utils.d.ts.map +1 -0
- package/dist/__tests__/filters/test-utils.js +54 -0
- package/dist/__tests__/filters/test-utils.js.map +1 -0
- package/dist/__tests__/nestlens.module.spec.d.ts +2 -0
- package/dist/__tests__/nestlens.module.spec.d.ts.map +1 -0
- package/dist/__tests__/nestlens.module.spec.js +620 -0
- package/dist/__tests__/nestlens.module.spec.js.map +1 -0
- package/dist/__tests__/pruning.service.spec.d.ts +2 -0
- package/dist/__tests__/pruning.service.spec.d.ts.map +1 -0
- package/dist/__tests__/pruning.service.spec.js +142 -0
- package/dist/__tests__/pruning.service.spec.js.map +1 -0
- package/dist/__tests__/setup.d.ts +7 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +24 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/__tests__/tag.service.spec.d.ts +2 -0
- package/dist/__tests__/tag.service.spec.d.ts.map +1 -0
- package/dist/__tests__/tag.service.spec.js +482 -0
- package/dist/__tests__/tag.service.spec.js.map +1 -0
- package/dist/__tests__/watchers/batch.watcher.spec.d.ts +2 -0
- package/dist/__tests__/watchers/batch.watcher.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/batch.watcher.spec.js +515 -0
- package/dist/__tests__/watchers/batch.watcher.spec.js.map +1 -0
- package/dist/__tests__/watchers/cache.watcher.spec.d.ts +2 -0
- package/dist/__tests__/watchers/cache.watcher.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/cache.watcher.spec.js +395 -0
- package/dist/__tests__/watchers/cache.watcher.spec.js.map +1 -0
- package/dist/__tests__/watchers/command.watcher.spec.d.ts +2 -0
- package/dist/__tests__/watchers/command.watcher.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/command.watcher.spec.js +598 -0
- package/dist/__tests__/watchers/command.watcher.spec.js.map +1 -0
- package/dist/__tests__/watchers/dump.watcher.spec.d.ts +2 -0
- package/dist/__tests__/watchers/dump.watcher.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/dump.watcher.spec.js +724 -0
- package/dist/__tests__/watchers/dump.watcher.spec.js.map +1 -0
- package/dist/__tests__/watchers/event.watcher.spec.d.ts +2 -0
- package/dist/__tests__/watchers/event.watcher.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/event.watcher.spec.js +316 -0
- package/dist/__tests__/watchers/event.watcher.spec.js.map +1 -0
- package/dist/__tests__/watchers/exception.watcher.spec.d.ts +2 -0
- package/dist/__tests__/watchers/exception.watcher.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/exception.watcher.spec.js +495 -0
- package/dist/__tests__/watchers/exception.watcher.spec.js.map +1 -0
- package/dist/__tests__/watchers/gate.watcher.spec.d.ts +2 -0
- package/dist/__tests__/watchers/gate.watcher.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/gate.watcher.spec.js +683 -0
- package/dist/__tests__/watchers/gate.watcher.spec.js.map +1 -0
- package/dist/__tests__/watchers/http-client.watcher.spec.d.ts +2 -0
- package/dist/__tests__/watchers/http-client.watcher.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/http-client.watcher.spec.js +888 -0
- package/dist/__tests__/watchers/http-client.watcher.spec.js.map +1 -0
- package/dist/__tests__/watchers/job.watcher.spec.d.ts +2 -0
- package/dist/__tests__/watchers/job.watcher.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/job.watcher.spec.js +513 -0
- package/dist/__tests__/watchers/job.watcher.spec.js.map +1 -0
- package/dist/__tests__/watchers/log.watcher.spec.d.ts +2 -0
- package/dist/__tests__/watchers/log.watcher.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/log.watcher.spec.js +428 -0
- package/dist/__tests__/watchers/log.watcher.spec.js.map +1 -0
- package/dist/__tests__/watchers/mail.watcher.spec.d.ts +2 -0
- package/dist/__tests__/watchers/mail.watcher.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/mail.watcher.spec.js +425 -0
- package/dist/__tests__/watchers/mail.watcher.spec.js.map +1 -0
- package/dist/__tests__/watchers/model.watcher.spec.d.ts +2 -0
- package/dist/__tests__/watchers/model.watcher.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/model.watcher.spec.js +675 -0
- package/dist/__tests__/watchers/model.watcher.spec.js.map +1 -0
- package/dist/__tests__/watchers/notification.watcher.spec.d.ts +2 -0
- package/dist/__tests__/watchers/notification.watcher.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/notification.watcher.spec.js +595 -0
- package/dist/__tests__/watchers/notification.watcher.spec.js.map +1 -0
- package/dist/__tests__/watchers/query/types.spec.d.ts +2 -0
- package/dist/__tests__/watchers/query/types.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/query/types.spec.js +292 -0
- package/dist/__tests__/watchers/query/types.spec.js.map +1 -0
- package/dist/__tests__/watchers/query.watcher.spec.d.ts +2 -0
- package/dist/__tests__/watchers/query.watcher.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/query.watcher.spec.js +597 -0
- package/dist/__tests__/watchers/query.watcher.spec.js.map +1 -0
- package/dist/__tests__/watchers/redis.watcher.spec.d.ts +2 -0
- package/dist/__tests__/watchers/redis.watcher.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/redis.watcher.spec.js +634 -0
- package/dist/__tests__/watchers/redis.watcher.spec.js.map +1 -0
- package/dist/__tests__/watchers/request.watcher.spec.d.ts +2 -0
- package/dist/__tests__/watchers/request.watcher.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/request.watcher.spec.js +1017 -0
- package/dist/__tests__/watchers/request.watcher.spec.js.map +1 -0
- package/dist/__tests__/watchers/schedule.watcher.spec.d.ts +2 -0
- package/dist/__tests__/watchers/schedule.watcher.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/schedule.watcher.spec.js +338 -0
- package/dist/__tests__/watchers/schedule.watcher.spec.js.map +1 -0
- package/dist/__tests__/watchers/view.watcher.spec.d.ts +2 -0
- package/dist/__tests__/watchers/view.watcher.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/view.watcher.spec.js +564 -0
- package/dist/__tests__/watchers/view.watcher.spec.js.map +1 -0
- package/dist/api/api.controller.d.ts +193 -0
- package/dist/api/api.controller.d.ts.map +1 -0
- package/dist/api/api.controller.js +562 -0
- package/dist/api/api.controller.js.map +1 -0
- package/dist/api/api.guard.d.ts +77 -0
- package/dist/api/api.guard.d.ts.map +1 -0
- package/dist/api/api.guard.js +294 -0
- package/dist/api/api.guard.js.map +1 -0
- package/dist/api/dashboard.controller.d.ts +49 -0
- package/dist/api/dashboard.controller.d.ts.map +1 -0
- package/dist/api/dashboard.controller.js +472 -0
- package/dist/api/dashboard.controller.js.map +1 -0
- package/dist/api/index.d.ts +5 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +21 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/tag.controller.d.ts +65 -0
- package/dist/api/tag.controller.d.ts.map +1 -0
- package/dist/api/tag.controller.js +149 -0
- package/dist/api/tag.controller.js.map +1 -0
- package/dist/core/collector.service.d.ts +80 -0
- package/dist/core/collector.service.d.ts.map +1 -0
- package/dist/core/collector.service.js +255 -0
- package/dist/core/collector.service.js.map +1 -0
- package/dist/core/family-hash.service.d.ts +64 -0
- package/dist/core/family-hash.service.d.ts.map +1 -0
- package/dist/core/family-hash.service.js +281 -0
- package/dist/core/family-hash.service.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +20 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/pruning.service.d.ts +16 -0
- package/dist/core/pruning.service.d.ts.map +1 -0
- package/dist/core/pruning.service.js +71 -0
- package/dist/core/pruning.service.js.map +1 -0
- package/dist/core/storage/index.d.ts +3 -0
- package/dist/core/storage/index.d.ts.map +1 -0
- package/dist/core/storage/index.js +19 -0
- package/dist/core/storage/index.js.map +1 -0
- package/dist/core/storage/sqlite.storage.d.ts +60 -0
- package/dist/core/storage/sqlite.storage.d.ts.map +1 -0
- package/dist/core/storage/sqlite.storage.js +929 -0
- package/dist/core/storage/sqlite.storage.js.map +1 -0
- package/dist/core/storage/storage.interface.d.ts +122 -0
- package/dist/core/storage/storage.interface.d.ts.map +1 -0
- package/dist/core/storage/storage.interface.js +5 -0
- package/dist/core/storage/storage.interface.js.map +1 -0
- package/dist/core/tag.service.d.ts +71 -0
- package/dist/core/tag.service.d.ts.map +1 -0
- package/dist/core/tag.service.js +568 -0
- package/dist/core/tag.service.js.map +1 -0
- package/dist/dashboard/public/assets/BatchesPage-DFT4fKlJ.js +1 -0
- package/dist/dashboard/public/assets/CachePage-CRy1Tjb8.js +1 -0
- package/dist/dashboard/public/assets/ClickableBadge-CV5J3THx.js +1 -0
- package/dist/dashboard/public/assets/CommandsPage-DdRnTm-W.js +1 -0
- package/dist/dashboard/public/assets/DashboardPage-CjaRZXYy.js +26 -0
- package/dist/dashboard/public/assets/DataTable-B6o9H8lh.js +88 -0
- package/dist/dashboard/public/assets/DumpsPage-DO8y1RTg.js +1 -0
- package/dist/dashboard/public/assets/EntryDetailPage-By-YcAGL.js +125 -0
- package/dist/dashboard/public/assets/EventsPage-u-r4AiT4.js +1 -0
- package/dist/dashboard/public/assets/ExceptionsPage-DXUcARr1.js +6 -0
- package/dist/dashboard/public/assets/GatesPage-DpeP7CDZ.js +1 -0
- package/dist/dashboard/public/assets/HttpClientPage-BJ4-5E6t.js +1 -0
- package/dist/dashboard/public/assets/JobsPage-Dv3KaX2x.js +1 -0
- package/dist/dashboard/public/assets/LogsPage-D0Q3yDb1.js +1 -0
- package/dist/dashboard/public/assets/MailPage-Bf8C6WF6.js +1 -0
- package/dist/dashboard/public/assets/ModelsPage-BMHncI5y.js +1 -0
- package/dist/dashboard/public/assets/NotificationsPage-D5-I-Oxb.js +1 -0
- package/dist/dashboard/public/assets/QueriesPage-oNp0i6Gt.js +1 -0
- package/dist/dashboard/public/assets/RedisPage-_GeS2OD8.js +1 -0
- package/dist/dashboard/public/assets/RequestsPage-BCwqu9US.js +1 -0
- package/dist/dashboard/public/assets/SchedulePage-CR0P-oX6.js +1 -0
- package/dist/dashboard/public/assets/ViewsPage-Dsy5ECRA.js +1 -0
- package/dist/dashboard/public/assets/calendar-DfK3x-6B.js +6 -0
- package/dist/dashboard/public/assets/circle-check-big-DcsYW8y8.js +6 -0
- package/dist/dashboard/public/assets/format-BFldcnCk.js +1 -0
- package/dist/dashboard/public/assets/index-DmeA1maE.css +1 -0
- package/dist/dashboard/public/assets/index-rkbGYdU7.js +351 -0
- package/dist/dashboard/public/assets/types-Cldoe2db.js +1 -0
- package/dist/dashboard/public/assets/vendor-B2nVRih0.js +43 -0
- package/dist/dashboard/public/assets/zap-DqtRi0JM.js +6 -0
- package/dist/dashboard/public/index.html +15 -0
- package/dist/dashboard/public/nestlens-icon.svg +9 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/nestlens.config.d.ts +216 -0
- package/dist/nestlens.config.d.ts.map +1 -0
- package/dist/nestlens.config.js +57 -0
- package/dist/nestlens.config.js.map +1 -0
- package/dist/nestlens.module.d.ts +10 -0
- package/dist/nestlens.module.d.ts.map +1 -0
- package/dist/nestlens.module.js +211 -0
- package/dist/nestlens.module.js.map +1 -0
- package/dist/types/entry.types.d.ts +368 -0
- package/dist/types/entry.types.d.ts.map +1 -0
- package/dist/types/entry.types.js +3 -0
- package/dist/types/entry.types.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +20 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/request.types.d.ts +9 -0
- package/dist/types/request.types.d.ts.map +1 -0
- package/dist/types/request.types.js +3 -0
- package/dist/types/request.types.js.map +1 -0
- package/dist/types/tag.types.d.ts +32 -0
- package/dist/types/tag.types.d.ts.map +1 -0
- package/dist/types/tag.types.js +3 -0
- package/dist/types/tag.types.js.map +1 -0
- package/dist/watchers/batch.watcher.d.ts +48 -0
- package/dist/watchers/batch.watcher.d.ts.map +1 -0
- package/dist/watchers/batch.watcher.js +185 -0
- package/dist/watchers/batch.watcher.js.map +1 -0
- package/dist/watchers/cache.watcher.d.ts +19 -0
- package/dist/watchers/cache.watcher.d.ts.map +1 -0
- package/dist/watchers/cache.watcher.js +158 -0
- package/dist/watchers/cache.watcher.js.map +1 -0
- package/dist/watchers/command.watcher.d.ts +32 -0
- package/dist/watchers/command.watcher.d.ts.map +1 -0
- package/dist/watchers/command.watcher.js +174 -0
- package/dist/watchers/command.watcher.js.map +1 -0
- package/dist/watchers/dump.watcher.d.ts +52 -0
- package/dist/watchers/dump.watcher.d.ts.map +1 -0
- package/dist/watchers/dump.watcher.js +234 -0
- package/dist/watchers/dump.watcher.js.map +1 -0
- package/dist/watchers/event.watcher.d.ts +20 -0
- package/dist/watchers/event.watcher.d.ts.map +1 -0
- package/dist/watchers/event.watcher.js +123 -0
- package/dist/watchers/event.watcher.js.map +1 -0
- package/dist/watchers/exception.watcher.d.ts +15 -0
- package/dist/watchers/exception.watcher.d.ts.map +1 -0
- package/dist/watchers/exception.watcher.js +117 -0
- package/dist/watchers/exception.watcher.js.map +1 -0
- package/dist/watchers/gate.watcher.d.ts +40 -0
- package/dist/watchers/gate.watcher.d.ts.map +1 -0
- package/dist/watchers/gate.watcher.js +200 -0
- package/dist/watchers/gate.watcher.js.map +1 -0
- package/dist/watchers/http-client.watcher.d.ts +34 -0
- package/dist/watchers/http-client.watcher.d.ts.map +1 -0
- package/dist/watchers/http-client.watcher.js +259 -0
- package/dist/watchers/http-client.watcher.js.map +1 -0
- package/dist/watchers/index.d.ts +19 -0
- package/dist/watchers/index.d.ts.map +1 -0
- package/dist/watchers/index.js +35 -0
- package/dist/watchers/index.js.map +1 -0
- package/dist/watchers/job.watcher.d.ts +27 -0
- package/dist/watchers/job.watcher.d.ts.map +1 -0
- package/dist/watchers/job.watcher.js +190 -0
- package/dist/watchers/job.watcher.js.map +1 -0
- package/dist/watchers/log.watcher.d.ts +26 -0
- package/dist/watchers/log.watcher.d.ts.map +1 -0
- package/dist/watchers/log.watcher.js +122 -0
- package/dist/watchers/log.watcher.js.map +1 -0
- package/dist/watchers/mail.watcher.d.ts +26 -0
- package/dist/watchers/mail.watcher.d.ts.map +1 -0
- package/dist/watchers/mail.watcher.js +154 -0
- package/dist/watchers/mail.watcher.js.map +1 -0
- package/dist/watchers/model.watcher.d.ts +54 -0
- package/dist/watchers/model.watcher.d.ts.map +1 -0
- package/dist/watchers/model.watcher.js +343 -0
- package/dist/watchers/model.watcher.js.map +1 -0
- package/dist/watchers/notification.watcher.d.ts +48 -0
- package/dist/watchers/notification.watcher.d.ts.map +1 -0
- package/dist/watchers/notification.watcher.js +215 -0
- package/dist/watchers/notification.watcher.js.map +1 -0
- package/dist/watchers/query/index.d.ts +3 -0
- package/dist/watchers/query/index.d.ts.map +1 -0
- package/dist/watchers/query/index.js +19 -0
- package/dist/watchers/query/index.js.map +1 -0
- package/dist/watchers/query/query.watcher.d.ts +27 -0
- package/dist/watchers/query/query.watcher.d.ts.map +1 -0
- package/dist/watchers/query/query.watcher.js +167 -0
- package/dist/watchers/query/query.watcher.js.map +1 -0
- package/dist/watchers/query/types.d.ts +60 -0
- package/dist/watchers/query/types.d.ts.map +1 -0
- package/dist/watchers/query/types.js +55 -0
- package/dist/watchers/query/types.js.map +1 -0
- package/dist/watchers/redis.watcher.d.ts +43 -0
- package/dist/watchers/redis.watcher.d.ts.map +1 -0
- package/dist/watchers/redis.watcher.js +225 -0
- package/dist/watchers/redis.watcher.js.map +1 -0
- package/dist/watchers/request.watcher.d.ts +21 -0
- package/dist/watchers/request.watcher.d.ts.map +1 -0
- package/dist/watchers/request.watcher.js +287 -0
- package/dist/watchers/request.watcher.js.map +1 -0
- package/dist/watchers/schedule.watcher.d.ts +25 -0
- package/dist/watchers/schedule.watcher.d.ts.map +1 -0
- package/dist/watchers/schedule.watcher.js +168 -0
- package/dist/watchers/schedule.watcher.js.map +1 -0
- package/dist/watchers/view.watcher.d.ts +51 -0
- package/dist/watchers/view.watcher.d.ts.map +1 -0
- package/dist/watchers/view.watcher.js +219 -0
- package/dist/watchers/view.watcher.js.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./query.watcher"), exports);
|
|
18
|
+
__exportStar(require("./types"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/watchers/query/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,0CAAwB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { OnModuleInit } from '@nestjs/common';
|
|
2
|
+
import { CollectorService } from '../../core/collector.service';
|
|
3
|
+
import { NestLensConfig } from '../../nestlens.config';
|
|
4
|
+
export interface QueryData {
|
|
5
|
+
query: string;
|
|
6
|
+
parameters?: unknown[];
|
|
7
|
+
duration: number;
|
|
8
|
+
source: string;
|
|
9
|
+
connection?: string;
|
|
10
|
+
requestId?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class QueryWatcher implements OnModuleInit {
|
|
13
|
+
private readonly collector;
|
|
14
|
+
private readonly nestlensConfig;
|
|
15
|
+
private readonly logger;
|
|
16
|
+
private readonly config;
|
|
17
|
+
constructor(collector: CollectorService, nestlensConfig: NestLensConfig);
|
|
18
|
+
onModuleInit(): Promise<void>;
|
|
19
|
+
private initializeTypeORM;
|
|
20
|
+
private findTypeORMDataSources;
|
|
21
|
+
private attachTypeORMLogger;
|
|
22
|
+
private initializePrisma;
|
|
23
|
+
private attachPrismaMiddleware;
|
|
24
|
+
private handleQuery;
|
|
25
|
+
private formatQuery;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=query.watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.watcher.d.ts","sourceRoot":"","sources":["../../../src/watchers/query/query.watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EACL,cAAc,EAGf,MAAM,uBAAuB,CAAC;AAa/B,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBACa,YAAa,YAAW,YAAY;IAK7C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,cAAc;IANjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;gBAGzB,SAAS,EAAE,gBAAgB,EAE3B,cAAc,EAAE,cAAc;IAS3C,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;YAgBrB,iBAAiB;IA8B/B,OAAO,CAAC,sBAAsB;IAwB9B,OAAO,CAAC,mBAAmB;YAwBb,gBAAgB;IAe9B,OAAO,CAAC,sBAAsB;IAmB9B,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,WAAW;CAGpB"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var QueryWatcher_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.QueryWatcher = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const collector_service_1 = require("../../core/collector.service");
|
|
19
|
+
const nestlens_config_1 = require("../../nestlens.config");
|
|
20
|
+
const types_1 = require("./types");
|
|
21
|
+
let QueryWatcher = QueryWatcher_1 = class QueryWatcher {
|
|
22
|
+
constructor(collector, nestlensConfig) {
|
|
23
|
+
this.collector = collector;
|
|
24
|
+
this.nestlensConfig = nestlensConfig;
|
|
25
|
+
this.logger = new common_1.Logger(QueryWatcher_1.name);
|
|
26
|
+
const watcherConfig = nestlensConfig.watchers?.query;
|
|
27
|
+
this.config =
|
|
28
|
+
typeof watcherConfig === 'object'
|
|
29
|
+
? watcherConfig
|
|
30
|
+
: { enabled: watcherConfig !== false, slowThreshold: 100 };
|
|
31
|
+
}
|
|
32
|
+
async onModuleInit() {
|
|
33
|
+
if (!this.config.enabled) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
// Initialize TypeORM adapter
|
|
37
|
+
if ((0, types_1.isModuleAvailable)('typeorm')) {
|
|
38
|
+
await this.initializeTypeORM();
|
|
39
|
+
}
|
|
40
|
+
// Initialize Prisma adapter
|
|
41
|
+
if ((0, types_1.isModuleAvailable)('@prisma/client')) {
|
|
42
|
+
await this.initializePrisma();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async initializeTypeORM() {
|
|
46
|
+
try {
|
|
47
|
+
const typeorm = (0, types_1.tryRequire)('typeorm');
|
|
48
|
+
if (!typeorm)
|
|
49
|
+
return;
|
|
50
|
+
// Try to get the default DataSource from TypeORM's global storage
|
|
51
|
+
const dataSources = this.findTypeORMDataSources(typeorm);
|
|
52
|
+
for (const dataSource of dataSources) {
|
|
53
|
+
if (dataSource.isInitialized) {
|
|
54
|
+
this.attachTypeORMLogger(dataSource);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
// Wait for initialization
|
|
58
|
+
const originalInitialize = dataSource.initialize.bind(dataSource);
|
|
59
|
+
dataSource.initialize = async () => {
|
|
60
|
+
const result = await originalInitialize();
|
|
61
|
+
this.attachTypeORMLogger(dataSource);
|
|
62
|
+
return result;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (dataSources.length > 0) {
|
|
67
|
+
this.logger.log('TypeORM query logging initialized');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
this.logger.debug(`TypeORM initialization skipped: ${error}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
findTypeORMDataSources(typeorm) {
|
|
75
|
+
const dataSources = [];
|
|
76
|
+
// TypeORM exports getDataSources() function to get all registered data sources
|
|
77
|
+
// Use Object.getOwnPropertyDescriptor for type-safe property access
|
|
78
|
+
const getDataSourcesDescriptor = Object.getOwnPropertyDescriptor(typeorm, 'getDataSources');
|
|
79
|
+
if (getDataSourcesDescriptor && typeof getDataSourcesDescriptor.value === 'function') {
|
|
80
|
+
try {
|
|
81
|
+
const getDataSources = getDataSourcesDescriptor.value;
|
|
82
|
+
const sources = getDataSources();
|
|
83
|
+
for (const source of sources) {
|
|
84
|
+
if ((0, types_1.isTypeORMDataSource)(source)) {
|
|
85
|
+
dataSources.push(source);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Registry not available
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return dataSources;
|
|
94
|
+
}
|
|
95
|
+
attachTypeORMLogger(dataSource) {
|
|
96
|
+
const driver = dataSource.driver;
|
|
97
|
+
const originalAfterQuery = driver.afterQuery;
|
|
98
|
+
driver.afterQuery = (query, parameters, _result, time) => {
|
|
99
|
+
if (originalAfterQuery) {
|
|
100
|
+
originalAfterQuery.call(driver, query, parameters, _result, time);
|
|
101
|
+
}
|
|
102
|
+
this.handleQuery({
|
|
103
|
+
query: this.formatQuery(query),
|
|
104
|
+
parameters,
|
|
105
|
+
duration: time,
|
|
106
|
+
source: 'typeorm',
|
|
107
|
+
connection: dataSource.options.name ?? 'default',
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
async initializePrisma() {
|
|
112
|
+
try {
|
|
113
|
+
// Prisma clients are typically instantiated by the user
|
|
114
|
+
// We can hook into the global Prisma instance if it exists
|
|
115
|
+
const globalPrisma = global['prisma'];
|
|
116
|
+
if ((0, types_1.isPrismaClient)(globalPrisma)) {
|
|
117
|
+
this.attachPrismaMiddleware(globalPrisma);
|
|
118
|
+
this.logger.log('Prisma query logging initialized (global instance)');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
this.logger.debug(`Prisma initialization skipped: ${error}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
attachPrismaMiddleware(client) {
|
|
126
|
+
if (!client.$use)
|
|
127
|
+
return;
|
|
128
|
+
client.$use(async (params, next) => {
|
|
129
|
+
const start = Date.now();
|
|
130
|
+
const result = await next(params);
|
|
131
|
+
const duration = Date.now() - start;
|
|
132
|
+
this.handleQuery({
|
|
133
|
+
query: `${params.model ?? 'unknown'}.${params.action}`,
|
|
134
|
+
parameters: params.args ? [params.args] : undefined,
|
|
135
|
+
duration,
|
|
136
|
+
source: 'prisma',
|
|
137
|
+
});
|
|
138
|
+
return result;
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
handleQuery(data) {
|
|
142
|
+
if (this.config.ignorePatterns?.some((p) => p.test(data.query))) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const slowThreshold = this.config.slowThreshold || 100;
|
|
146
|
+
const isSlow = data.duration > slowThreshold;
|
|
147
|
+
const payload = {
|
|
148
|
+
query: data.query,
|
|
149
|
+
parameters: data.parameters,
|
|
150
|
+
duration: data.duration,
|
|
151
|
+
slow: isSlow,
|
|
152
|
+
source: data.source,
|
|
153
|
+
connection: data.connection,
|
|
154
|
+
};
|
|
155
|
+
this.collector.collect('query', payload, data.requestId);
|
|
156
|
+
}
|
|
157
|
+
formatQuery(query) {
|
|
158
|
+
return query.replace(/\s+/g, ' ').trim();
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
exports.QueryWatcher = QueryWatcher;
|
|
162
|
+
exports.QueryWatcher = QueryWatcher = QueryWatcher_1 = __decorate([
|
|
163
|
+
(0, common_1.Injectable)(),
|
|
164
|
+
__param(1, (0, common_1.Inject)(nestlens_config_1.NESTLENS_CONFIG)),
|
|
165
|
+
__metadata("design:paramtypes", [collector_service_1.CollectorService, Object])
|
|
166
|
+
], QueryWatcher);
|
|
167
|
+
//# sourceMappingURL=query.watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.watcher.js","sourceRoot":"","sources":["../../../src/watchers/query/query.watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for optional ORM dependencies
|
|
3
|
+
* These interfaces define the minimum contract we need from each ORM
|
|
4
|
+
* without requiring the actual packages to be installed
|
|
5
|
+
*/
|
|
6
|
+
export interface TypeORMDataSource {
|
|
7
|
+
isInitialized: boolean;
|
|
8
|
+
options: TypeORMDataSourceOptions;
|
|
9
|
+
driver: TypeORMDriver;
|
|
10
|
+
initialize(): Promise<this>;
|
|
11
|
+
}
|
|
12
|
+
export interface TypeORMDataSourceOptions {
|
|
13
|
+
name?: string;
|
|
14
|
+
type: string;
|
|
15
|
+
}
|
|
16
|
+
export interface TypeORMDriver {
|
|
17
|
+
afterQuery?: TypeORMAfterQueryFn;
|
|
18
|
+
}
|
|
19
|
+
export type TypeORMAfterQueryFn = (query: string, parameters: unknown[] | undefined, result: unknown, time: number) => void;
|
|
20
|
+
export interface PrismaClient {
|
|
21
|
+
$on?: PrismaOnFn;
|
|
22
|
+
$use?: PrismaUseFn;
|
|
23
|
+
}
|
|
24
|
+
export type PrismaOnFn = (event: 'query', callback: (event: PrismaQueryEvent) => void) => void;
|
|
25
|
+
export type PrismaUseFn = (middleware: PrismaMiddleware) => void;
|
|
26
|
+
export type PrismaMiddleware = (params: PrismaMiddlewareParams, next: (params: PrismaMiddlewareParams) => Promise<unknown>) => Promise<unknown>;
|
|
27
|
+
export interface PrismaQueryEvent {
|
|
28
|
+
query: string;
|
|
29
|
+
params: string;
|
|
30
|
+
duration: number;
|
|
31
|
+
target: string;
|
|
32
|
+
}
|
|
33
|
+
export interface PrismaMiddlewareParams {
|
|
34
|
+
model?: string;
|
|
35
|
+
action: string;
|
|
36
|
+
args: unknown;
|
|
37
|
+
dataPath: string[];
|
|
38
|
+
runInTransaction: boolean;
|
|
39
|
+
}
|
|
40
|
+
export declare function isTypeORMDataSource(obj: unknown): obj is TypeORMDataSource;
|
|
41
|
+
export declare function isPrismaClient(obj: unknown): obj is PrismaClient;
|
|
42
|
+
export interface TypeORMModule {
|
|
43
|
+
DataSource: new (options: TypeORMDataSourceOptions) => TypeORMDataSource;
|
|
44
|
+
}
|
|
45
|
+
export interface NestJSTypeORMModule {
|
|
46
|
+
getDataSourceToken: (name?: string) => string | symbol;
|
|
47
|
+
}
|
|
48
|
+
export interface PrismaModule {
|
|
49
|
+
PrismaClient: new () => PrismaClient;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Safe synchronous module loader for optional peer dependencies.
|
|
53
|
+
* Uses require() instead of dynamic import() because:
|
|
54
|
+
* 1. Synchronous loading is needed for initialization
|
|
55
|
+
* 2. Optional dependencies may not exist at runtime
|
|
56
|
+
* 3. This is the standard pattern for optional peer deps in Node.js
|
|
57
|
+
*/
|
|
58
|
+
export declare function tryRequire<T>(moduleName: string): T | null;
|
|
59
|
+
export declare function isModuleAvailable(moduleName: string): boolean;
|
|
60
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/watchers/query/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,wBAAwB,CAAC;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAClC;AAED,MAAM,MAAM,mBAAmB,GAAG,CAChC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,OAAO,EAAE,GAAG,SAAS,EACjC,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,MAAM,KACT,IAAI,CAAC;AAGV,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,MAAM,UAAU,GAAG,CACvB,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,KACxC,IAAI,CAAC;AAEV,MAAM,MAAM,WAAW,GAAG,CACxB,UAAU,EAAE,gBAAgB,KACzB,IAAI,CAAC;AAEV,MAAM,MAAM,gBAAgB,GAAG,CAC7B,MAAM,EAAE,sBAAsB,EAC9B,IAAI,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC,OAAO,CAAC,KACvD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAGD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,iBAAiB,CAS1E;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,YAAY,CAOhE;AAGD,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,KAAK,OAAO,EAAE,wBAAwB,KAAK,iBAAiB,CAAC;CAC1E;AAED,MAAM,WAAW,mBAAmB;IAClC,kBAAkB,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC;CACxD;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,UAAU,YAAY,CAAC;CACtC;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAQ1D;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAO7D"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Type definitions for optional ORM dependencies
|
|
4
|
+
* These interfaces define the minimum contract we need from each ORM
|
|
5
|
+
* without requiring the actual packages to be installed
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.isTypeORMDataSource = isTypeORMDataSource;
|
|
9
|
+
exports.isPrismaClient = isPrismaClient;
|
|
10
|
+
exports.tryRequire = tryRequire;
|
|
11
|
+
exports.isModuleAvailable = isModuleAvailable;
|
|
12
|
+
// Type guards
|
|
13
|
+
function isTypeORMDataSource(obj) {
|
|
14
|
+
if (!obj || typeof obj !== 'object')
|
|
15
|
+
return false;
|
|
16
|
+
const candidate = obj;
|
|
17
|
+
return ('isInitialized' in candidate &&
|
|
18
|
+
'options' in candidate &&
|
|
19
|
+
'driver' in candidate &&
|
|
20
|
+
typeof candidate.isInitialized === 'boolean');
|
|
21
|
+
}
|
|
22
|
+
function isPrismaClient(obj) {
|
|
23
|
+
if (!obj || typeof obj !== 'object')
|
|
24
|
+
return false;
|
|
25
|
+
const candidate = obj;
|
|
26
|
+
return (typeof candidate.$on === 'function' ||
|
|
27
|
+
typeof candidate.$use === 'function');
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Safe synchronous module loader for optional peer dependencies.
|
|
31
|
+
* Uses require() instead of dynamic import() because:
|
|
32
|
+
* 1. Synchronous loading is needed for initialization
|
|
33
|
+
* 2. Optional dependencies may not exist at runtime
|
|
34
|
+
* 3. This is the standard pattern for optional peer deps in Node.js
|
|
35
|
+
*/
|
|
36
|
+
function tryRequire(moduleName) {
|
|
37
|
+
try {
|
|
38
|
+
// Using require for synchronous optional dependency loading
|
|
39
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
40
|
+
return require(moduleName);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function isModuleAvailable(moduleName) {
|
|
47
|
+
try {
|
|
48
|
+
require.resolve(moduleName);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/watchers/query/types.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AA8DH,kDASC;AAED,wCAOC;AAsBD,gCAQC;AAED,8CAOC;AA1DD,cAAc;AACd,SAAgB,mBAAmB,CAAC,GAAY;IAC9C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,SAAS,GAAG,GAA8B,CAAC;IACjD,OAAO,CACL,eAAe,IAAI,SAAS;QAC5B,SAAS,IAAI,SAAS;QACtB,QAAQ,IAAI,SAAS;QACrB,OAAO,SAAS,CAAC,aAAa,KAAK,SAAS,CAC7C,CAAC;AACJ,CAAC;AAED,SAAgB,cAAc,CAAC,GAAY;IACzC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,SAAS,GAAG,GAA8B,CAAC;IACjD,OAAO,CACL,OAAO,SAAS,CAAC,GAAG,KAAK,UAAU;QACnC,OAAO,SAAS,CAAC,IAAI,KAAK,UAAU,CACrC,CAAC;AACJ,CAAC;AAeD;;;;;;GAMG;AACH,SAAgB,UAAU,CAAI,UAAkB;IAC9C,IAAI,CAAC;QACH,4DAA4D;QAC5D,8DAA8D;QAC9D,OAAO,OAAO,CAAC,UAAU,CAAM,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,iBAAiB,CAAC,UAAkB;IAClD,IAAI,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { OnModuleInit } from '@nestjs/common';
|
|
2
|
+
import { CollectorService } from '../core/collector.service';
|
|
3
|
+
import { NestLensConfig } from '../nestlens.config';
|
|
4
|
+
type RedisClient = any;
|
|
5
|
+
/**
|
|
6
|
+
* Token for injecting Redis client
|
|
7
|
+
*/
|
|
8
|
+
export declare const NESTLENS_REDIS_CLIENT: unique symbol;
|
|
9
|
+
/**
|
|
10
|
+
* RedisWatcher monitors Redis operations and tracks command execution,
|
|
11
|
+
* performance metrics, and results while masking sensitive data.
|
|
12
|
+
*/
|
|
13
|
+
export declare class RedisWatcher implements OnModuleInit {
|
|
14
|
+
private readonly collector;
|
|
15
|
+
private readonly nestlensConfig;
|
|
16
|
+
private readonly redisClient?;
|
|
17
|
+
private readonly logger;
|
|
18
|
+
private readonly config;
|
|
19
|
+
private originalMethods?;
|
|
20
|
+
constructor(collector: CollectorService, nestlensConfig: NestLensConfig, redisClient?: RedisClient | undefined);
|
|
21
|
+
onModuleInit(): void;
|
|
22
|
+
private setupInterceptors;
|
|
23
|
+
private wrapCommand;
|
|
24
|
+
private collectEntry;
|
|
25
|
+
/**
|
|
26
|
+
* Extract the key pattern from command arguments
|
|
27
|
+
*/
|
|
28
|
+
private extractKeyPattern;
|
|
29
|
+
/**
|
|
30
|
+
* Check if a key contains sensitive information
|
|
31
|
+
*/
|
|
32
|
+
private isSensitiveKey;
|
|
33
|
+
/**
|
|
34
|
+
* Capture and potentially mask command arguments
|
|
35
|
+
*/
|
|
36
|
+
private captureArgs;
|
|
37
|
+
/**
|
|
38
|
+
* Capture and potentially mask result data
|
|
39
|
+
*/
|
|
40
|
+
private captureResult;
|
|
41
|
+
}
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=redis.watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.watcher.d.ts","sourceRoot":"","sources":["../../src/watchers/redis.watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,YAAY,EAAY,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAEL,cAAc,EAEf,MAAM,oBAAoB,CAAC;AAI5B,KAAK,WAAW,GAAG,GAAG,CAAC;AAEvB;;GAEG;AACH,eAAO,MAAM,qBAAqB,eAAkC,CAAC;AAerE;;;GAGG;AACH,qBACa,YAAa,YAAW,YAAY;IAM7C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAG/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAV/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,eAAe,CAAC,CAAwB;gBAG7B,SAAS,EAAE,gBAAgB,EAE3B,cAAc,EAAE,cAAc,EAG9B,WAAW,CAAC,EAAE,WAAW,YAAA;IAS5C,YAAY;IAiBZ,OAAO,CAAC,iBAAiB;IA2DzB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,YAAY;IAwBpB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAczB;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,WAAW;IAwBnB;;OAEG;IACH,OAAO,CAAC,aAAa;CAmBtB"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var RedisWatcher_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.RedisWatcher = exports.NESTLENS_REDIS_CLIENT = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const collector_service_1 = require("../core/collector.service");
|
|
19
|
+
const nestlens_config_1 = require("../nestlens.config");
|
|
20
|
+
/**
|
|
21
|
+
* Token for injecting Redis client
|
|
22
|
+
*/
|
|
23
|
+
exports.NESTLENS_REDIS_CLIENT = Symbol('NESTLENS_REDIS_CLIENT');
|
|
24
|
+
/**
|
|
25
|
+
* Sensitive key patterns that should be masked in results
|
|
26
|
+
*/
|
|
27
|
+
const SENSITIVE_KEY_PATTERNS = [
|
|
28
|
+
'password',
|
|
29
|
+
'token',
|
|
30
|
+
'secret',
|
|
31
|
+
'auth',
|
|
32
|
+
'key',
|
|
33
|
+
'credential',
|
|
34
|
+
'session',
|
|
35
|
+
];
|
|
36
|
+
/**
|
|
37
|
+
* RedisWatcher monitors Redis operations and tracks command execution,
|
|
38
|
+
* performance metrics, and results while masking sensitive data.
|
|
39
|
+
*/
|
|
40
|
+
let RedisWatcher = RedisWatcher_1 = class RedisWatcher {
|
|
41
|
+
constructor(collector, nestlensConfig, redisClient) {
|
|
42
|
+
this.collector = collector;
|
|
43
|
+
this.nestlensConfig = nestlensConfig;
|
|
44
|
+
this.redisClient = redisClient;
|
|
45
|
+
this.logger = new common_1.Logger(RedisWatcher_1.name);
|
|
46
|
+
const watcherConfig = nestlensConfig.watchers?.redis;
|
|
47
|
+
this.config =
|
|
48
|
+
typeof watcherConfig === 'object'
|
|
49
|
+
? watcherConfig
|
|
50
|
+
: { enabled: watcherConfig !== false };
|
|
51
|
+
}
|
|
52
|
+
onModuleInit() {
|
|
53
|
+
if (!this.config.enabled) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Check if Redis client was provided
|
|
57
|
+
if (!this.redisClient) {
|
|
58
|
+
this.logger.debug('RedisWatcher: No Redis client found. ' +
|
|
59
|
+
'To enable Redis tracking, inject your Redis client with the NESTLENS_REDIS_CLIENT token.');
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
this.setupInterceptors();
|
|
63
|
+
}
|
|
64
|
+
setupInterceptors() {
|
|
65
|
+
if (!this.redisClient)
|
|
66
|
+
return;
|
|
67
|
+
this.originalMethods = new Map();
|
|
68
|
+
// Common Redis commands to track
|
|
69
|
+
const commandsToTrack = [
|
|
70
|
+
'get',
|
|
71
|
+
'set',
|
|
72
|
+
'del',
|
|
73
|
+
'exists',
|
|
74
|
+
'expire',
|
|
75
|
+
'ttl',
|
|
76
|
+
'incr',
|
|
77
|
+
'decr',
|
|
78
|
+
'lpush',
|
|
79
|
+
'rpush',
|
|
80
|
+
'lpop',
|
|
81
|
+
'rpop',
|
|
82
|
+
'lrange',
|
|
83
|
+
'hget',
|
|
84
|
+
'hset',
|
|
85
|
+
'hdel',
|
|
86
|
+
'hgetall',
|
|
87
|
+
'sadd',
|
|
88
|
+
'srem',
|
|
89
|
+
'smembers',
|
|
90
|
+
'zadd',
|
|
91
|
+
'zrem',
|
|
92
|
+
'zrange',
|
|
93
|
+
'mget',
|
|
94
|
+
'mset',
|
|
95
|
+
];
|
|
96
|
+
for (const command of commandsToTrack) {
|
|
97
|
+
// Skip if command doesn't exist or should be ignored
|
|
98
|
+
if (!this.redisClient[command] ||
|
|
99
|
+
this.config.ignoreCommands?.includes(command)) {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
// Store original method
|
|
103
|
+
this.originalMethods.set(command, this.redisClient[command].bind(this.redisClient));
|
|
104
|
+
// Wrap the command
|
|
105
|
+
this.redisClient[command] = this.wrapCommand(command, this.originalMethods.get(command));
|
|
106
|
+
}
|
|
107
|
+
this.logger.log('Redis interceptors installed');
|
|
108
|
+
}
|
|
109
|
+
wrapCommand(command, originalMethod) {
|
|
110
|
+
return async (...args) => {
|
|
111
|
+
const startTime = Date.now();
|
|
112
|
+
let status = 'success';
|
|
113
|
+
let result;
|
|
114
|
+
let error;
|
|
115
|
+
try {
|
|
116
|
+
result = await originalMethod(...args);
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
status = 'error';
|
|
121
|
+
error = err instanceof Error ? err.message : String(err);
|
|
122
|
+
throw err;
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
const duration = Date.now() - startTime;
|
|
126
|
+
this.collectEntry(command, args, duration, status, result, error);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
collectEntry(command, args, duration, status, result, error) {
|
|
131
|
+
const keyPattern = this.extractKeyPattern(command, args);
|
|
132
|
+
const isSensitive = this.isSensitiveKey(keyPattern);
|
|
133
|
+
const payload = {
|
|
134
|
+
command,
|
|
135
|
+
args: this.captureArgs(args, isSensitive),
|
|
136
|
+
duration,
|
|
137
|
+
keyPattern,
|
|
138
|
+
status,
|
|
139
|
+
result: this.captureResult(result, isSensitive),
|
|
140
|
+
error,
|
|
141
|
+
};
|
|
142
|
+
this.collector.collect('redis', payload);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Extract the key pattern from command arguments
|
|
146
|
+
*/
|
|
147
|
+
extractKeyPattern(command, args) {
|
|
148
|
+
if (args.length === 0)
|
|
149
|
+
return undefined;
|
|
150
|
+
const key = args[0];
|
|
151
|
+
if (typeof key !== 'string')
|
|
152
|
+
return undefined;
|
|
153
|
+
// For multi-key commands
|
|
154
|
+
if (['mget', 'mset', 'del'].includes(command)) {
|
|
155
|
+
return `${command}(${args.length} keys)`;
|
|
156
|
+
}
|
|
157
|
+
return key;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Check if a key contains sensitive information
|
|
161
|
+
*/
|
|
162
|
+
isSensitiveKey(keyPattern) {
|
|
163
|
+
if (!keyPattern)
|
|
164
|
+
return false;
|
|
165
|
+
const lowerKey = keyPattern.toLowerCase();
|
|
166
|
+
return SENSITIVE_KEY_PATTERNS.some((pattern) => lowerKey.includes(pattern));
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Capture and potentially mask command arguments
|
|
170
|
+
*/
|
|
171
|
+
captureArgs(args, isSensitive) {
|
|
172
|
+
if (isSensitive) {
|
|
173
|
+
return args.map((arg, index) => {
|
|
174
|
+
// Keep the key visible but mask values
|
|
175
|
+
if (index === 0 && typeof arg === 'string') {
|
|
176
|
+
return arg; // Keep key visible
|
|
177
|
+
}
|
|
178
|
+
return '***MASKED***';
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
try {
|
|
182
|
+
// Limit size to prevent huge arguments from bloating storage
|
|
183
|
+
const json = JSON.stringify(args);
|
|
184
|
+
const maxSize = this.config.maxResultSize || 1024; // 1KB default
|
|
185
|
+
if (json.length > maxSize) {
|
|
186
|
+
return [{ _truncated: true, _size: json.length }];
|
|
187
|
+
}
|
|
188
|
+
return args;
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return [{ _error: 'Unable to serialize arguments' }];
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Capture and potentially mask result data
|
|
196
|
+
*/
|
|
197
|
+
captureResult(result, isSensitive) {
|
|
198
|
+
if (result === undefined || result === null)
|
|
199
|
+
return undefined;
|
|
200
|
+
if (isSensitive) {
|
|
201
|
+
return '***MASKED***';
|
|
202
|
+
}
|
|
203
|
+
try {
|
|
204
|
+
// Limit size to prevent huge results from bloating storage
|
|
205
|
+
const json = JSON.stringify(result);
|
|
206
|
+
const maxSize = this.config.maxResultSize || 1024; // 1KB default
|
|
207
|
+
if (json.length > maxSize) {
|
|
208
|
+
return { _truncated: true, _size: json.length };
|
|
209
|
+
}
|
|
210
|
+
return result;
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
return { _error: 'Unable to serialize result' };
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
exports.RedisWatcher = RedisWatcher;
|
|
218
|
+
exports.RedisWatcher = RedisWatcher = RedisWatcher_1 = __decorate([
|
|
219
|
+
(0, common_1.Injectable)(),
|
|
220
|
+
__param(1, (0, common_1.Inject)(nestlens_config_1.NESTLENS_CONFIG)),
|
|
221
|
+
__param(2, (0, common_1.Optional)()),
|
|
222
|
+
__param(2, (0, common_1.Inject)(exports.NESTLENS_REDIS_CLIENT)),
|
|
223
|
+
__metadata("design:paramtypes", [collector_service_1.CollectorService, Object, Object])
|
|
224
|
+
], RedisWatcher);
|
|
225
|
+
//# sourceMappingURL=redis.watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.watcher.js","sourceRoot":"","sources":["../../src/watchers/redis.watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
import { CollectorService } from '../core/collector.service';
|
|
4
|
+
import { NestLensConfig } from '../nestlens.config';
|
|
5
|
+
export declare const REQUEST_ID_HEADER = "x-nestlens-request-id";
|
|
6
|
+
export declare class RequestWatcher implements NestInterceptor {
|
|
7
|
+
private readonly collector;
|
|
8
|
+
private readonly nestlensConfig;
|
|
9
|
+
private readonly config;
|
|
10
|
+
constructor(collector: CollectorService, nestlensConfig: NestLensConfig);
|
|
11
|
+
intercept(context: ExecutionContext, next: CallHandler): Observable<unknown>;
|
|
12
|
+
private captureHeaders;
|
|
13
|
+
private captureBody;
|
|
14
|
+
private getClientIp;
|
|
15
|
+
private captureControllerInfo;
|
|
16
|
+
private captureUser;
|
|
17
|
+
private captureSession;
|
|
18
|
+
private captureResponseHeaders;
|
|
19
|
+
private captureTags;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=request.watcher.d.ts.map
|