nestlens 0.4.0 → 0.4.2

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 (108) hide show
  1. package/README.md +1 -1
  2. package/dist/__tests__/api/dashboard.controller.spec.js +103 -419
  3. package/dist/__tests__/api/dashboard.controller.spec.js.map +1 -1
  4. package/dist/__tests__/docs-consistency.spec.d.ts +2 -0
  5. package/dist/__tests__/docs-consistency.spec.d.ts.map +1 -0
  6. package/dist/__tests__/docs-consistency.spec.js +74 -0
  7. package/dist/__tests__/docs-consistency.spec.js.map +1 -0
  8. package/dist/__tests__/integration/adapter-compat.integration.spec.d.ts +2 -0
  9. package/dist/__tests__/integration/adapter-compat.integration.spec.d.ts.map +1 -0
  10. package/dist/__tests__/integration/adapter-compat.integration.spec.js +139 -0
  11. package/dist/__tests__/integration/adapter-compat.integration.spec.js.map +1 -0
  12. package/dist/__tests__/integration/schedule-watcher.integration.spec.d.ts +2 -0
  13. package/dist/__tests__/integration/schedule-watcher.integration.spec.d.ts.map +1 -0
  14. package/dist/__tests__/integration/schedule-watcher.integration.spec.js +87 -0
  15. package/dist/__tests__/integration/schedule-watcher.integration.spec.js.map +1 -0
  16. package/dist/__tests__/integration/watcher-coexistence.integration.spec.d.ts +2 -0
  17. package/dist/__tests__/integration/watcher-coexistence.integration.spec.d.ts.map +1 -0
  18. package/dist/__tests__/integration/watcher-coexistence.integration.spec.js +88 -0
  19. package/dist/__tests__/integration/watcher-coexistence.integration.spec.js.map +1 -0
  20. package/dist/__tests__/watchers/exception.watcher.spec.js +10 -0
  21. package/dist/__tests__/watchers/exception.watcher.spec.js.map +1 -1
  22. package/dist/__tests__/watchers/query/typeorm-integration.spec.d.ts +2 -0
  23. package/dist/__tests__/watchers/query/typeorm-integration.spec.d.ts.map +1 -0
  24. package/dist/__tests__/watchers/query/typeorm-integration.spec.js +100 -0
  25. package/dist/__tests__/watchers/query/typeorm-integration.spec.js.map +1 -0
  26. package/dist/__tests__/watchers/query/types.spec.js +48 -263
  27. package/dist/__tests__/watchers/query/types.spec.js.map +1 -1
  28. package/dist/__tests__/watchers/query.watcher.spec.js +173 -522
  29. package/dist/__tests__/watchers/query.watcher.spec.js.map +1 -1
  30. package/dist/__tests__/watchers/request.watcher.spec.js +30 -0
  31. package/dist/__tests__/watchers/request.watcher.spec.js.map +1 -1
  32. package/dist/__tests__/watchers/schedule.watcher.spec.js +32 -27
  33. package/dist/__tests__/watchers/schedule.watcher.spec.js.map +1 -1
  34. package/dist/api/dashboard.controller.d.ts +51 -43
  35. package/dist/api/dashboard.controller.d.ts.map +1 -1
  36. package/dist/api/dashboard.controller.js +222 -248
  37. package/dist/api/dashboard.controller.js.map +1 -1
  38. package/dist/api/filters/api-exception.filter.d.ts +3 -0
  39. package/dist/api/filters/api-exception.filter.d.ts.map +1 -1
  40. package/dist/api/filters/api-exception.filter.js +9 -3
  41. package/dist/api/filters/api-exception.filter.js.map +1 -1
  42. package/dist/dashboard/public/assets/{BatchesPage-DmqbLFCs.js → BatchesPage-BqqMGRhb.js} +1 -1
  43. package/dist/dashboard/public/assets/{CachePage-CfA-UrdM.js → CachePage-4XesQGrB.js} +1 -1
  44. package/dist/dashboard/public/assets/{ClickableBadge-CW4jdcpl.js → ClickableBadge-CULXhkUR.js} +1 -1
  45. package/dist/dashboard/public/assets/{CommandsPage-DJ1ZxHj8.js → CommandsPage-qA9zZJLY.js} +1 -1
  46. package/dist/dashboard/public/assets/{DashboardPage-BnnZ3TMF.js → DashboardPage-6gpSO6p8.js} +1 -1
  47. package/dist/dashboard/public/assets/{DumpsPage-fshG-ETf.js → DumpsPage-BJUH8RX8.js} +1 -1
  48. package/dist/dashboard/public/assets/{EntryDetailPage-Cf7K34er.js → EntryDetailPage-BybD_jd2.js} +1 -1
  49. package/dist/dashboard/public/assets/{EventsPage-DiPB0Sfy.js → EventsPage-Bk5E2ZLC.js} +1 -1
  50. package/dist/dashboard/public/assets/{ExceptionsPage-BoauuDFu.js → ExceptionsPage-eCyE84NP.js} +1 -1
  51. package/dist/dashboard/public/assets/{GatesPage-CB0kqyp_.js → GatesPage-CE9Sa3BN.js} +1 -1
  52. package/dist/dashboard/public/assets/{GraphQLPage-_inMfKh4.js → GraphQLPage-B2XmilbU.js} +1 -1
  53. package/dist/dashboard/public/assets/{HttpClientPage-5vVzz7TU.js → HttpClientPage-DMdyMJmo.js} +1 -1
  54. package/dist/dashboard/public/assets/{JobsPage-CHYjmhlh.js → JobsPage-Cza23TpJ.js} +1 -1
  55. package/dist/dashboard/public/assets/{LogsPage-z4yYJ1qQ.js → LogsPage-BfFjxmzL.js} +1 -1
  56. package/dist/dashboard/public/assets/{MailPage-DQ2PuRS9.js → MailPage-C7qOueDJ.js} +1 -1
  57. package/dist/dashboard/public/assets/{ModelsPage-PBBI9K5M.js → ModelsPage-CdnaDoYH.js} +1 -1
  58. package/dist/dashboard/public/assets/{NotificationsPage-CjleWNhr.js → NotificationsPage-t0AlQJeY.js} +1 -1
  59. package/dist/dashboard/public/assets/{PageHeader-QBzFo308.js → PageHeader-CcbxBdii.js} +1 -1
  60. package/dist/dashboard/public/assets/{QueriesPage-Cpi1b2Mz.js → QueriesPage-Da9Zl09P.js} +1 -1
  61. package/dist/dashboard/public/assets/{RedisPage-C7vFV3r4.js → RedisPage-C8Elpfq1.js} +1 -1
  62. package/dist/dashboard/public/assets/{RequestsPage-B9-Qq2vH.js → RequestsPage-Bobnh4sB.js} +1 -1
  63. package/dist/dashboard/public/assets/{SchedulePage-BXPldddV.js → SchedulePage-vBUwBEW5.js} +1 -1
  64. package/dist/dashboard/public/assets/{ViewsPage-COo7BNBc.js → ViewsPage-DO70tKip.js} +1 -1
  65. package/dist/dashboard/public/assets/{calendar-WMtbNas7.js → calendar-36iGdS4K.js} +1 -1
  66. package/dist/dashboard/public/assets/{circle-check-big-U-4nHjTQ.js → circle-check-big--KQSq_oR.js} +1 -1
  67. package/dist/dashboard/public/assets/{eye-Bc29awES.js → eye-B9uY1FJW.js} +1 -1
  68. package/dist/dashboard/public/assets/{index-C8he4ZUV.js → index-C1yiPBCx.js} +2 -2
  69. package/dist/dashboard/public/assets/{types-BYamMo0R.js → types-DM4HdBI5.js} +1 -1
  70. package/dist/dashboard/public/assets/{zap-BxD9CCmf.js → zap-ChtSEZU9.js} +1 -1
  71. package/dist/dashboard/public/index.html +1 -1
  72. package/dist/nestlens.module.d.ts.map +1 -1
  73. package/dist/nestlens.module.js +21 -2
  74. package/dist/nestlens.module.js.map +1 -1
  75. package/dist/watchers/exception.watcher.d.ts +5 -2
  76. package/dist/watchers/exception.watcher.d.ts.map +1 -1
  77. package/dist/watchers/exception.watcher.js +22 -10
  78. package/dist/watchers/exception.watcher.js.map +1 -1
  79. package/dist/watchers/graphql/graphql.watcher.d.ts +1 -1
  80. package/dist/watchers/query/index.d.ts +2 -0
  81. package/dist/watchers/query/index.d.ts.map +1 -1
  82. package/dist/watchers/query/index.js +2 -0
  83. package/dist/watchers/query/index.js.map +1 -1
  84. package/dist/watchers/query/query.watcher.d.ts +12 -8
  85. package/dist/watchers/query/query.watcher.d.ts.map +1 -1
  86. package/dist/watchers/query/query.watcher.js +80 -78
  87. package/dist/watchers/query/query.watcher.js.map +1 -1
  88. package/dist/watchers/query/typeorm-logger.d.ts +21 -0
  89. package/dist/watchers/query/typeorm-logger.d.ts.map +1 -0
  90. package/dist/watchers/query/typeorm-logger.js +53 -0
  91. package/dist/watchers/query/typeorm-logger.js.map +1 -0
  92. package/dist/watchers/query/typeorm-subscriber.d.ts +20 -0
  93. package/dist/watchers/query/typeorm-subscriber.d.ts.map +1 -0
  94. package/dist/watchers/query/typeorm-subscriber.js +34 -0
  95. package/dist/watchers/query/typeorm-subscriber.js.map +1 -0
  96. package/dist/watchers/query/types.d.ts +50 -29
  97. package/dist/watchers/query/types.d.ts.map +1 -1
  98. package/dist/watchers/query/types.js +21 -16
  99. package/dist/watchers/query/types.js.map +1 -1
  100. package/dist/watchers/request.watcher.d.ts +4 -1
  101. package/dist/watchers/request.watcher.d.ts.map +1 -1
  102. package/dist/watchers/request.watcher.js +24 -8
  103. package/dist/watchers/request.watcher.js.map +1 -1
  104. package/dist/watchers/schedule.watcher.d.ts +8 -8
  105. package/dist/watchers/schedule.watcher.d.ts.map +1 -1
  106. package/dist/watchers/schedule.watcher.js +30 -13
  107. package/dist/watchers/schedule.watcher.js.map +1 -1
  108. package/package.json +8 -1
@@ -30,7 +30,7 @@ export declare const GRAPHQL_WATCHER: unique symbol;
30
30
  /**
31
31
  * Registration mode for GraphQL plugin
32
32
  * - 'pending': Not yet registered
33
- * - 'auto': Registered via @Plugin decorator (Apollo) or onApplicationBootstrap (Mercurius)
33
+ * - 'auto': Registered via the `@Plugin` decorator (Apollo) or onApplicationBootstrap (Mercurius)
34
34
  * - 'manual': Registered manually via getPlugin()
35
35
  */
36
36
  export type RegistrationMode = 'pending' | 'auto' | 'manual';
@@ -1,3 +1,5 @@
1
1
  export * from './query.watcher';
2
+ export * from './typeorm-subscriber';
3
+ export * from './typeorm-logger';
2
4
  export * from './types';
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/watchers/query/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/watchers/query/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC"}
@@ -15,5 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./query.watcher"), exports);
18
+ __exportStar(require("./typeorm-subscriber"), exports);
19
+ __exportStar(require("./typeorm-logger"), exports);
18
20
  __exportStar(require("./types"), exports);
19
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/watchers/query/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,0CAAwB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/watchers/query/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,uDAAqC;AACrC,mDAAiC;AACjC,0CAAwB"}
@@ -1,4 +1,5 @@
1
- import { OnModuleInit } from '@nestjs/common';
1
+ import { OnApplicationBootstrap } from '@nestjs/common';
2
+ import { DiscoveryService } from '@nestjs/core';
2
3
  import { CollectorService } from '../../core/collector.service';
3
4
  import { NestLensConfig } from '../../nestlens.config';
4
5
  export interface QueryData {
@@ -8,18 +9,21 @@ export interface QueryData {
8
9
  source: string;
9
10
  connection?: string;
10
11
  requestId?: string;
12
+ success?: boolean;
13
+ error?: unknown;
11
14
  }
12
- export declare class QueryWatcher implements OnModuleInit {
15
+ export declare class QueryWatcher implements OnApplicationBootstrap {
13
16
  private readonly collector;
17
+ private readonly discoveryService;
14
18
  private readonly nestlensConfig;
15
19
  private readonly logger;
16
20
  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;
21
+ constructor(collector: CollectorService, discoveryService: DiscoveryService, nestlensConfig: NestLensConfig);
22
+ onApplicationBootstrap(): void;
23
+ private attachTypeORM;
24
+ private discoverTypeORMDataSources;
25
+ private attachToDataSource;
26
+ private attachPrisma;
23
27
  private attachPrismaMiddleware;
24
28
  private handleQuery;
25
29
  private formatQuery;
@@ -1 +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,EAAE,cAAc,EAAuC,MAAM,uBAAuB,CAAC;AAa5F,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;IAwB9B,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,WAAW;CAGpB"}
1
+ {"version":3,"file":"query.watcher.d.ts","sourceRoot":"","sources":["../../../src/watchers/query/query.watcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAuC,MAAM,uBAAuB,CAAC;AAc5F,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;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAID,qBACa,YAAa,YAAW,sBAAsB;IAKvD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAEjC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAPjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;gBAGzB,SAAS,EAAE,gBAAgB,EAC3B,gBAAgB,EAAE,gBAAgB,EAElC,cAAc,EAAE,cAAc;IASjD,sBAAsB,IAAI,IAAI;IAc9B,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,0BAA0B;IAkBlC,OAAO,CAAC,kBAAkB;IA+B1B,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,sBAAsB;IAiC9B,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,WAAW;CAGpB"}
@@ -15,12 +15,17 @@ var QueryWatcher_1;
15
15
  Object.defineProperty(exports, "__esModule", { value: true });
16
16
  exports.QueryWatcher = void 0;
17
17
  const common_1 = require("@nestjs/common");
18
+ const core_1 = require("@nestjs/core");
18
19
  const collector_service_1 = require("../../core/collector.service");
19
20
  const nestlens_config_1 = require("../../nestlens.config");
20
21
  const types_1 = require("./types");
22
+ const typeorm_subscriber_1 = require("./typeorm-subscriber");
23
+ const typeorm_logger_1 = require("./typeorm-logger");
24
+ const TYPEORM_ATTACHED = Symbol.for('nestlens:typeorm-query-watcher-attached');
21
25
  let QueryWatcher = QueryWatcher_1 = class QueryWatcher {
22
- constructor(collector, nestlensConfig) {
26
+ constructor(collector, discoveryService, nestlensConfig) {
23
27
  this.collector = collector;
28
+ this.discoveryService = discoveryService;
24
29
  this.nestlensConfig = nestlensConfig;
25
30
  this.logger = new common_1.Logger(QueryWatcher_1.name);
26
31
  const watcherConfig = nestlensConfig.watchers?.query;
@@ -29,97 +34,80 @@ let QueryWatcher = QueryWatcher_1 = class QueryWatcher {
29
34
  ? watcherConfig
30
35
  : { enabled: watcherConfig !== false, slowThreshold: 100 };
31
36
  }
32
- async onModuleInit() {
37
+ onApplicationBootstrap() {
33
38
  if (!this.config.enabled) {
34
39
  return;
35
40
  }
36
- // Initialize TypeORM adapter
37
41
  if ((0, types_1.isModuleAvailable)('typeorm')) {
38
- await this.initializeTypeORM();
42
+ this.attachTypeORM();
39
43
  }
40
- // Initialize Prisma adapter
41
44
  if ((0, types_1.isModuleAvailable)('@prisma/client')) {
42
- await this.initializePrisma();
45
+ this.attachPrisma();
43
46
  }
44
47
  }
45
- async initializeTypeORM() {
48
+ attachTypeORM() {
46
49
  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
- };
50
+ const dataSources = this.discoverTypeORMDataSources();
51
+ let attached = 0;
52
+ for (const ds of dataSources) {
53
+ if (this.attachToDataSource(ds)) {
54
+ attached++;
64
55
  }
65
56
  }
66
- if (dataSources.length > 0) {
67
- this.logger.log('TypeORM query logging initialized');
57
+ if (attached > 0) {
58
+ this.logger.log(`TypeORM query watcher attached to ${attached} DataSource(s)`);
68
59
  }
69
60
  }
70
61
  catch (error) {
71
- this.logger.debug(`TypeORM initialization skipped: ${error}`);
62
+ this.logger.debug(`TypeORM attach skipped: ${String(error)}`);
72
63
  }
73
64
  }
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
65
+ discoverTypeORMDataSources() {
66
+ const seen = new WeakSet();
67
+ const out = [];
68
+ for (const wrapper of this.discoveryService.getProviders()) {
69
+ const instance = wrapper.instance;
70
+ if (instance &&
71
+ typeof instance === 'object' &&
72
+ !seen.has(instance) &&
73
+ (0, types_1.isLikelyTypeORMDataSource)(instance)) {
74
+ seen.add(instance);
75
+ out.push(instance);
91
76
  }
92
77
  }
93
- return dataSources;
78
+ return out;
94
79
  }
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
- };
80
+ attachToDataSource(ds) {
81
+ const marked = ds;
82
+ if (marked[TYPEORM_ATTACHED])
83
+ return false;
84
+ marked[TYPEORM_ATTACHED] = true;
85
+ const connectionName = ds.options?.name ?? 'default';
86
+ const subscriber = new typeorm_subscriber_1.NestLensQuerySubscriber((data) => this.handleQuery(data), connectionName);
87
+ if (Array.isArray(ds.subscribers)) {
88
+ ds.subscribers.push(subscriber);
89
+ }
90
+ const original = ds.logger;
91
+ const wrapped = new typeorm_logger_1.NestLensTypeOrmLogger((data) => this.handleQuery(data), connectionName, original);
92
+ try {
93
+ ds.logger = wrapped;
94
+ }
95
+ catch {
96
+ // Some DataSource implementations expose logger via a getter only.
97
+ // Subscriber alone still covers the success path in that case.
98
+ }
99
+ return true;
110
100
  }
111
- async initializePrisma() {
101
+ attachPrisma() {
112
102
  try {
113
- // Prisma clients are typically instantiated by the user
114
- // We can hook into the global Prisma instance if it exists
115
103
  const globalPrisma = global['prisma'];
116
104
  if ((0, types_1.isPrismaClient)(globalPrisma)) {
117
105
  this.attachPrismaMiddleware(globalPrisma);
118
- this.logger.log('Prisma query logging initialized (global instance)');
106
+ this.logger.log('Prisma query watcher attached (global instance)');
119
107
  }
120
108
  }
121
109
  catch (error) {
122
- this.logger.debug(`Prisma initialization skipped: ${error}`);
110
+ this.logger.debug(`Prisma attach skipped: ${String(error)}`);
123
111
  }
124
112
  }
125
113
  attachPrismaMiddleware(client) {
@@ -127,25 +115,38 @@ let QueryWatcher = QueryWatcher_1 = class QueryWatcher {
127
115
  return;
128
116
  client.$use(async (params, next) => {
129
117
  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;
118
+ try {
119
+ const result = await next(params);
120
+ this.handleQuery({
121
+ query: `${params.model ?? 'unknown'}.${params.action}`,
122
+ parameters: params.args ? [params.args] : undefined,
123
+ duration: Date.now() - start,
124
+ source: 'prisma',
125
+ success: true,
126
+ });
127
+ return result;
128
+ }
129
+ catch (error) {
130
+ this.handleQuery({
131
+ query: `${params.model ?? 'unknown'}.${params.action}`,
132
+ parameters: params.args ? [params.args] : undefined,
133
+ duration: Date.now() - start,
134
+ source: 'prisma',
135
+ success: false,
136
+ error,
137
+ });
138
+ throw error;
139
+ }
139
140
  });
140
141
  }
141
142
  handleQuery(data) {
142
143
  if (this.config.ignorePatterns?.some((p) => p.test(data.query))) {
143
144
  return;
144
145
  }
145
- const slowThreshold = this.config.slowThreshold || 100;
146
+ const slowThreshold = this.config.slowThreshold ?? 100;
146
147
  const isSlow = data.duration > slowThreshold;
147
148
  const payload = {
148
- query: data.query,
149
+ query: this.formatQuery(data.query),
149
150
  parameters: data.parameters,
150
151
  duration: data.duration,
151
152
  slow: isSlow,
@@ -161,7 +162,8 @@ let QueryWatcher = QueryWatcher_1 = class QueryWatcher {
161
162
  exports.QueryWatcher = QueryWatcher;
162
163
  exports.QueryWatcher = QueryWatcher = QueryWatcher_1 = __decorate([
163
164
  (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])
165
+ __param(2, (0, common_1.Inject)(nestlens_config_1.NESTLENS_CONFIG)),
166
+ __metadata("design:paramtypes", [collector_service_1.CollectorService,
167
+ core_1.DiscoveryService, Object])
166
168
  ], QueryWatcher);
167
169
  //# sourceMappingURL=query.watcher.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.watcher.js","sourceRoot":"","sources":["../../../src/watchers/query/query.watcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query.watcher.js","sourceRoot":"","sources":["../../../src/watchers/query/query.watcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { TypeORMLoggerLike } from './types';
2
+ import type { QueryHandler } from './typeorm-subscriber';
3
+ /**
4
+ * TypeORM Logger that records query errors and slow queries while delegating
5
+ * every method to the user's pre-existing logger. Used as a safety net for
6
+ * driver code paths that do not broadcast `afterQuery` (notably better-sqlite3
7
+ * prepare-time failures).
8
+ */
9
+ export declare class NestLensTypeOrmLogger implements TypeORMLoggerLike {
10
+ private readonly handler;
11
+ private readonly connectionName;
12
+ private readonly delegate?;
13
+ constructor(handler: QueryHandler, connectionName: string, delegate?: TypeORMLoggerLike | undefined);
14
+ logQuery(query: string, parameters?: unknown[], queryRunner?: unknown): void;
15
+ logQuerySlow(time: number, query: string, parameters?: unknown[], queryRunner?: unknown): void;
16
+ logQueryError(error: string | Error, query: string, parameters?: unknown[], queryRunner?: unknown): void;
17
+ logSchemaBuild(message: string, queryRunner?: unknown): void;
18
+ logMigration(message: string, queryRunner?: unknown): void;
19
+ log(level: 'log' | 'info' | 'warn', message: unknown, queryRunner?: unknown): void;
20
+ }
21
+ //# sourceMappingURL=typeorm-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeorm-logger.d.ts","sourceRoot":"","sources":["../../../src/watchers/query/typeorm-logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD;;;;;GAKG;AACH,qBAAa,qBAAsB,YAAW,iBAAiB;IAE3D,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAFT,OAAO,EAAE,YAAY,EACrB,cAAc,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE,iBAAiB,YAAA;IAG/C,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI;IAI5E,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI;IAY9F,aAAa,CACX,KAAK,EAAE,MAAM,GAAG,KAAK,EACrB,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,OAAO,EAAE,EACtB,WAAW,CAAC,EAAE,OAAO,GACpB,IAAI;IAaP,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI;IAI5D,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI;IAI1D,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI;CAGnF"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NestLensTypeOrmLogger = void 0;
4
+ /**
5
+ * TypeORM Logger that records query errors and slow queries while delegating
6
+ * every method to the user's pre-existing logger. Used as a safety net for
7
+ * driver code paths that do not broadcast `afterQuery` (notably better-sqlite3
8
+ * prepare-time failures).
9
+ */
10
+ class NestLensTypeOrmLogger {
11
+ constructor(handler, connectionName, delegate) {
12
+ this.handler = handler;
13
+ this.connectionName = connectionName;
14
+ this.delegate = delegate;
15
+ }
16
+ logQuery(query, parameters, queryRunner) {
17
+ this.delegate?.logQuery?.(query, parameters, queryRunner);
18
+ }
19
+ logQuerySlow(time, query, parameters, queryRunner) {
20
+ this.handler({
21
+ query,
22
+ parameters,
23
+ duration: time,
24
+ source: 'typeorm',
25
+ connection: this.connectionName,
26
+ success: true,
27
+ });
28
+ this.delegate?.logQuerySlow?.(time, query, parameters, queryRunner);
29
+ }
30
+ logQueryError(error, query, parameters, queryRunner) {
31
+ this.handler({
32
+ query,
33
+ parameters,
34
+ duration: 0,
35
+ source: 'typeorm',
36
+ connection: this.connectionName,
37
+ success: false,
38
+ error,
39
+ });
40
+ this.delegate?.logQueryError?.(error, query, parameters, queryRunner);
41
+ }
42
+ logSchemaBuild(message, queryRunner) {
43
+ this.delegate?.logSchemaBuild?.(message, queryRunner);
44
+ }
45
+ logMigration(message, queryRunner) {
46
+ this.delegate?.logMigration?.(message, queryRunner);
47
+ }
48
+ log(level, message, queryRunner) {
49
+ this.delegate?.log?.(level, message, queryRunner);
50
+ }
51
+ }
52
+ exports.NestLensTypeOrmLogger = NestLensTypeOrmLogger;
53
+ //# sourceMappingURL=typeorm-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeorm-logger.js","sourceRoot":"","sources":["../../../src/watchers/query/typeorm-logger.ts"],"names":[],"mappings":";;;AAGA;;;;;GAKG;AACH,MAAa,qBAAqB;IAChC,YACmB,OAAqB,EACrB,cAAsB,EACtB,QAA4B;QAF5B,YAAO,GAAP,OAAO,CAAc;QACrB,mBAAc,GAAd,cAAc,CAAQ;QACtB,aAAQ,GAAR,QAAQ,CAAoB;IAC5C,CAAC;IAEJ,QAAQ,CAAC,KAAa,EAAE,UAAsB,EAAE,WAAqB;QACnE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IAC5D,CAAC;IAED,YAAY,CAAC,IAAY,EAAE,KAAa,EAAE,UAAsB,EAAE,WAAqB;QACrF,IAAI,CAAC,OAAO,CAAC;YACX,KAAK;YACL,UAAU;YACV,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,IAAI,CAAC,cAAc;YAC/B,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IACtE,CAAC;IAED,aAAa,CACX,KAAqB,EACrB,KAAa,EACb,UAAsB,EACtB,WAAqB;QAErB,IAAI,CAAC,OAAO,CAAC;YACX,KAAK;YACL,UAAU;YACV,QAAQ,EAAE,CAAC;YACX,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,IAAI,CAAC,cAAc;YAC/B,OAAO,EAAE,KAAK;YACd,KAAK;SACN,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;IACxE,CAAC;IAED,cAAc,CAAC,OAAe,EAAE,WAAqB;QACnD,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;IAED,YAAY,CAAC,OAAe,EAAE,WAAqB;QACjD,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACtD,CAAC;IAED,GAAG,CAAC,KAA8B,EAAE,OAAgB,EAAE,WAAqB;QACzE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACpD,CAAC;CACF;AApDD,sDAoDC"}
@@ -0,0 +1,20 @@
1
+ import type { TypeORMQueryEvent } from './types';
2
+ import type { QueryData } from './query.watcher';
3
+ export type QueryHandler = (data: QueryData) => void;
4
+ /**
5
+ * TypeORM EntitySubscriber that captures every query via the `afterQuery`
6
+ * lifecycle hook. The event carries `executionTime`, `success`, `error` and
7
+ * `parameters` directly, so no monkey-patching of the driver is needed.
8
+ *
9
+ * TypeORM invokes this for every query the QueryRunner executes (including
10
+ * raw queries, query builder, repository methods, transactions, schema
11
+ * synchronisation). On error paths some drivers (e.g. better-sqlite3) skip
12
+ * the broadcast — the wrapped Logger covers that gap.
13
+ */
14
+ export declare class NestLensQuerySubscriber {
15
+ private readonly handler;
16
+ private readonly connectionName;
17
+ constructor(handler: QueryHandler, connectionName: string);
18
+ afterQuery(event: TypeORMQueryEvent): void;
19
+ }
20
+ //# sourceMappingURL=typeorm-subscriber.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeorm-subscriber.d.ts","sourceRoot":"","sources":["../../../src/watchers/query/typeorm-subscriber.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;AAErD;;;;;;;;;GASG;AACH,qBAAa,uBAAuB;IAEhC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,cAAc;gBADd,OAAO,EAAE,YAAY,EACrB,cAAc,EAAE,MAAM;IAGzC,UAAU,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;CAY3C"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NestLensQuerySubscriber = void 0;
4
+ /**
5
+ * TypeORM EntitySubscriber that captures every query via the `afterQuery`
6
+ * lifecycle hook. The event carries `executionTime`, `success`, `error` and
7
+ * `parameters` directly, so no monkey-patching of the driver is needed.
8
+ *
9
+ * TypeORM invokes this for every query the QueryRunner executes (including
10
+ * raw queries, query builder, repository methods, transactions, schema
11
+ * synchronisation). On error paths some drivers (e.g. better-sqlite3) skip
12
+ * the broadcast — the wrapped Logger covers that gap.
13
+ */
14
+ class NestLensQuerySubscriber {
15
+ constructor(handler, connectionName) {
16
+ this.handler = handler;
17
+ this.connectionName = connectionName;
18
+ }
19
+ afterQuery(event) {
20
+ if (!event || typeof event.query !== 'string')
21
+ return;
22
+ this.handler({
23
+ query: event.query,
24
+ parameters: event.parameters,
25
+ duration: event.executionTime ?? 0,
26
+ source: 'typeorm',
27
+ connection: this.connectionName,
28
+ success: event.success !== false,
29
+ error: event.error,
30
+ });
31
+ }
32
+ }
33
+ exports.NestLensQuerySubscriber = NestLensQuerySubscriber;
34
+ //# sourceMappingURL=typeorm-subscriber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeorm-subscriber.js","sourceRoot":"","sources":["../../../src/watchers/query/typeorm-subscriber.ts"],"names":[],"mappings":";;;AAKA;;;;;;;;;GASG;AACH,MAAa,uBAAuB;IAClC,YACmB,OAAqB,EACrB,cAAsB;QADtB,YAAO,GAAP,OAAO,CAAc;QACrB,mBAAc,GAAd,cAAc,CAAQ;IACtC,CAAC;IAEJ,UAAU,CAAC,KAAwB;QACjC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO;QACtD,IAAI,CAAC,OAAO,CAAC;YACX,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,KAAK,CAAC,aAAa,IAAI,CAAC;YAClC,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,IAAI,CAAC,cAAc;YAC/B,OAAO,EAAE,KAAK,CAAC,OAAO,KAAK,KAAK;YAChC,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAC;IACL,CAAC;CACF;AAlBD,0DAkBC"}
@@ -1,22 +1,56 @@
1
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
2
+ * Type definitions for optional ORM dependencies.
3
+ * These interfaces describe the minimum contract we need from each ORM
4
+ * without requiring the actual packages to be installed.
5
5
  */
6
- export interface TypeORMDataSource {
7
- isInitialized: boolean;
8
- options: TypeORMDataSourceOptions;
9
- driver: TypeORMDriver;
10
- initialize(): Promise<this>;
6
+ /**
7
+ * Subset of TypeORM DataSource that the watcher needs to interact with.
8
+ * The watcher attaches an EntitySubscriber for the success path and wraps
9
+ * the logger for the error path; nothing else is touched.
10
+ */
11
+ export interface TypeORMDataSourceLike {
12
+ isInitialized?: boolean;
13
+ options?: {
14
+ name?: string;
15
+ type?: string;
16
+ };
17
+ subscribers?: unknown[];
18
+ logger?: TypeORMLoggerLike;
11
19
  }
12
- export interface TypeORMDataSourceOptions {
13
- name?: string;
14
- type: string;
20
+ /**
21
+ * Event payload TypeORM passes to EntitySubscriberInterface.afterQuery.
22
+ * Source: typeorm/src/subscriber/event/QueryEvent.ts
23
+ */
24
+ export interface TypeORMQueryEvent {
25
+ query: string;
26
+ parameters?: unknown[];
27
+ executionTime?: number;
28
+ success?: boolean;
29
+ error?: unknown;
30
+ rawResults?: unknown;
31
+ connection?: {
32
+ name?: string;
33
+ };
34
+ queryRunner?: unknown;
15
35
  }
16
- export interface TypeORMDriver {
17
- afterQuery?: TypeORMAfterQueryFn;
36
+ /**
37
+ * Subset of TypeORM Logger interface used by the watcher.
38
+ * Source: typeorm/src/logger/Logger.ts
39
+ */
40
+ export interface TypeORMLoggerLike {
41
+ logQuery?(query: string, parameters?: unknown[], queryRunner?: unknown): void;
42
+ logQuerySlow?(time: number, query: string, parameters?: unknown[], queryRunner?: unknown): void;
43
+ logQueryError?(error: string | Error, query: string, parameters?: unknown[], queryRunner?: unknown): void;
44
+ logSchemaBuild?(message: string, queryRunner?: unknown): void;
45
+ logMigration?(message: string, queryRunner?: unknown): void;
46
+ log?(level: 'log' | 'info' | 'warn', message: unknown, queryRunner?: unknown): void;
18
47
  }
19
- export type TypeORMAfterQueryFn = (query: string, parameters: unknown[] | undefined, result: unknown, time: number) => void;
48
+ /**
49
+ * Structural check for a TypeORM DataSource instance discovered via NestJS DI.
50
+ * We don't `instanceof DataSource` because typeorm is an optional peer dep
51
+ * and may not be loadable at type-check time.
52
+ */
53
+ export declare function isLikelyTypeORMDataSource(obj: unknown): obj is TypeORMDataSourceLike;
20
54
  export interface PrismaClient {
21
55
  $on?: PrismaOnFn;
22
56
  $use?: PrismaUseFn;
@@ -37,23 +71,10 @@ export interface PrismaMiddlewareParams {
37
71
  dataPath: string[];
38
72
  runInTransaction: boolean;
39
73
  }
40
- export declare function isTypeORMDataSource(obj: unknown): obj is TypeORMDataSource;
41
74
  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
75
  /**
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
76
+ * Synchronous optional-peer-dependency loader. Returns null if the module
77
+ * cannot be resolved.
57
78
  */
58
79
  export declare function tryRequire<T>(moduleName: string): T | null;
59
80
  export declare function isModuleAvailable(moduleName: string): boolean;
@@ -1 +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,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,KAAK,IAAI,CAAC;AAE/F,MAAM,MAAM,WAAW,GAAG,CAAC,UAAU,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAEjE,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,CAIhE;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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/watchers/query/types.ts"],"names":[],"mappings":"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"}