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.
- package/README.md +1 -1
- package/dist/__tests__/api/dashboard.controller.spec.js +103 -419
- package/dist/__tests__/api/dashboard.controller.spec.js.map +1 -1
- package/dist/__tests__/docs-consistency.spec.d.ts +2 -0
- package/dist/__tests__/docs-consistency.spec.d.ts.map +1 -0
- package/dist/__tests__/docs-consistency.spec.js +74 -0
- package/dist/__tests__/docs-consistency.spec.js.map +1 -0
- package/dist/__tests__/integration/adapter-compat.integration.spec.d.ts +2 -0
- package/dist/__tests__/integration/adapter-compat.integration.spec.d.ts.map +1 -0
- package/dist/__tests__/integration/adapter-compat.integration.spec.js +139 -0
- package/dist/__tests__/integration/adapter-compat.integration.spec.js.map +1 -0
- package/dist/__tests__/integration/schedule-watcher.integration.spec.d.ts +2 -0
- package/dist/__tests__/integration/schedule-watcher.integration.spec.d.ts.map +1 -0
- package/dist/__tests__/integration/schedule-watcher.integration.spec.js +87 -0
- package/dist/__tests__/integration/schedule-watcher.integration.spec.js.map +1 -0
- package/dist/__tests__/integration/watcher-coexistence.integration.spec.d.ts +2 -0
- package/dist/__tests__/integration/watcher-coexistence.integration.spec.d.ts.map +1 -0
- package/dist/__tests__/integration/watcher-coexistence.integration.spec.js +88 -0
- package/dist/__tests__/integration/watcher-coexistence.integration.spec.js.map +1 -0
- package/dist/__tests__/watchers/exception.watcher.spec.js +10 -0
- package/dist/__tests__/watchers/exception.watcher.spec.js.map +1 -1
- package/dist/__tests__/watchers/query/typeorm-integration.spec.d.ts +2 -0
- package/dist/__tests__/watchers/query/typeorm-integration.spec.d.ts.map +1 -0
- package/dist/__tests__/watchers/query/typeorm-integration.spec.js +100 -0
- package/dist/__tests__/watchers/query/typeorm-integration.spec.js.map +1 -0
- package/dist/__tests__/watchers/query/types.spec.js +48 -263
- package/dist/__tests__/watchers/query/types.spec.js.map +1 -1
- package/dist/__tests__/watchers/query.watcher.spec.js +173 -522
- package/dist/__tests__/watchers/query.watcher.spec.js.map +1 -1
- package/dist/__tests__/watchers/request.watcher.spec.js +30 -0
- package/dist/__tests__/watchers/request.watcher.spec.js.map +1 -1
- package/dist/__tests__/watchers/schedule.watcher.spec.js +32 -27
- package/dist/__tests__/watchers/schedule.watcher.spec.js.map +1 -1
- package/dist/api/dashboard.controller.d.ts +51 -43
- package/dist/api/dashboard.controller.d.ts.map +1 -1
- package/dist/api/dashboard.controller.js +222 -248
- package/dist/api/dashboard.controller.js.map +1 -1
- package/dist/api/filters/api-exception.filter.d.ts +3 -0
- package/dist/api/filters/api-exception.filter.d.ts.map +1 -1
- package/dist/api/filters/api-exception.filter.js +9 -3
- package/dist/api/filters/api-exception.filter.js.map +1 -1
- package/dist/dashboard/public/assets/{BatchesPage-DmqbLFCs.js → BatchesPage-BqqMGRhb.js} +1 -1
- package/dist/dashboard/public/assets/{CachePage-CfA-UrdM.js → CachePage-4XesQGrB.js} +1 -1
- package/dist/dashboard/public/assets/{ClickableBadge-CW4jdcpl.js → ClickableBadge-CULXhkUR.js} +1 -1
- package/dist/dashboard/public/assets/{CommandsPage-DJ1ZxHj8.js → CommandsPage-qA9zZJLY.js} +1 -1
- package/dist/dashboard/public/assets/{DashboardPage-BnnZ3TMF.js → DashboardPage-6gpSO6p8.js} +1 -1
- package/dist/dashboard/public/assets/{DumpsPage-fshG-ETf.js → DumpsPage-BJUH8RX8.js} +1 -1
- package/dist/dashboard/public/assets/{EntryDetailPage-Cf7K34er.js → EntryDetailPage-BybD_jd2.js} +1 -1
- package/dist/dashboard/public/assets/{EventsPage-DiPB0Sfy.js → EventsPage-Bk5E2ZLC.js} +1 -1
- package/dist/dashboard/public/assets/{ExceptionsPage-BoauuDFu.js → ExceptionsPage-eCyE84NP.js} +1 -1
- package/dist/dashboard/public/assets/{GatesPage-CB0kqyp_.js → GatesPage-CE9Sa3BN.js} +1 -1
- package/dist/dashboard/public/assets/{GraphQLPage-_inMfKh4.js → GraphQLPage-B2XmilbU.js} +1 -1
- package/dist/dashboard/public/assets/{HttpClientPage-5vVzz7TU.js → HttpClientPage-DMdyMJmo.js} +1 -1
- package/dist/dashboard/public/assets/{JobsPage-CHYjmhlh.js → JobsPage-Cza23TpJ.js} +1 -1
- package/dist/dashboard/public/assets/{LogsPage-z4yYJ1qQ.js → LogsPage-BfFjxmzL.js} +1 -1
- package/dist/dashboard/public/assets/{MailPage-DQ2PuRS9.js → MailPage-C7qOueDJ.js} +1 -1
- package/dist/dashboard/public/assets/{ModelsPage-PBBI9K5M.js → ModelsPage-CdnaDoYH.js} +1 -1
- package/dist/dashboard/public/assets/{NotificationsPage-CjleWNhr.js → NotificationsPage-t0AlQJeY.js} +1 -1
- package/dist/dashboard/public/assets/{PageHeader-QBzFo308.js → PageHeader-CcbxBdii.js} +1 -1
- package/dist/dashboard/public/assets/{QueriesPage-Cpi1b2Mz.js → QueriesPage-Da9Zl09P.js} +1 -1
- package/dist/dashboard/public/assets/{RedisPage-C7vFV3r4.js → RedisPage-C8Elpfq1.js} +1 -1
- package/dist/dashboard/public/assets/{RequestsPage-B9-Qq2vH.js → RequestsPage-Bobnh4sB.js} +1 -1
- package/dist/dashboard/public/assets/{SchedulePage-BXPldddV.js → SchedulePage-vBUwBEW5.js} +1 -1
- package/dist/dashboard/public/assets/{ViewsPage-COo7BNBc.js → ViewsPage-DO70tKip.js} +1 -1
- package/dist/dashboard/public/assets/{calendar-WMtbNas7.js → calendar-36iGdS4K.js} +1 -1
- package/dist/dashboard/public/assets/{circle-check-big-U-4nHjTQ.js → circle-check-big--KQSq_oR.js} +1 -1
- package/dist/dashboard/public/assets/{eye-Bc29awES.js → eye-B9uY1FJW.js} +1 -1
- package/dist/dashboard/public/assets/{index-C8he4ZUV.js → index-C1yiPBCx.js} +2 -2
- package/dist/dashboard/public/assets/{types-BYamMo0R.js → types-DM4HdBI5.js} +1 -1
- package/dist/dashboard/public/assets/{zap-BxD9CCmf.js → zap-ChtSEZU9.js} +1 -1
- package/dist/dashboard/public/index.html +1 -1
- package/dist/nestlens.module.d.ts.map +1 -1
- package/dist/nestlens.module.js +21 -2
- package/dist/nestlens.module.js.map +1 -1
- package/dist/watchers/exception.watcher.d.ts +5 -2
- package/dist/watchers/exception.watcher.d.ts.map +1 -1
- package/dist/watchers/exception.watcher.js +22 -10
- package/dist/watchers/exception.watcher.js.map +1 -1
- package/dist/watchers/graphql/graphql.watcher.d.ts +1 -1
- package/dist/watchers/query/index.d.ts +2 -0
- package/dist/watchers/query/index.d.ts.map +1 -1
- package/dist/watchers/query/index.js +2 -0
- package/dist/watchers/query/index.js.map +1 -1
- package/dist/watchers/query/query.watcher.d.ts +12 -8
- package/dist/watchers/query/query.watcher.d.ts.map +1 -1
- package/dist/watchers/query/query.watcher.js +80 -78
- package/dist/watchers/query/query.watcher.js.map +1 -1
- package/dist/watchers/query/typeorm-logger.d.ts +21 -0
- package/dist/watchers/query/typeorm-logger.d.ts.map +1 -0
- package/dist/watchers/query/typeorm-logger.js +53 -0
- package/dist/watchers/query/typeorm-logger.js.map +1 -0
- package/dist/watchers/query/typeorm-subscriber.d.ts +20 -0
- package/dist/watchers/query/typeorm-subscriber.d.ts.map +1 -0
- package/dist/watchers/query/typeorm-subscriber.js +34 -0
- package/dist/watchers/query/typeorm-subscriber.js.map +1 -0
- package/dist/watchers/query/types.d.ts +50 -29
- package/dist/watchers/query/types.d.ts.map +1 -1
- package/dist/watchers/query/types.js +21 -16
- package/dist/watchers/query/types.js.map +1 -1
- package/dist/watchers/request.watcher.d.ts +4 -1
- package/dist/watchers/request.watcher.d.ts.map +1 -1
- package/dist/watchers/request.watcher.js +24 -8
- package/dist/watchers/request.watcher.js.map +1 -1
- package/dist/watchers/schedule.watcher.d.ts +8 -8
- package/dist/watchers/schedule.watcher.d.ts.map +1 -1
- package/dist/watchers/schedule.watcher.js +30 -13
- package/dist/watchers/schedule.watcher.js.map +1 -1
- 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
|
|
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 +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 {
|
|
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
|
|
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
|
-
|
|
19
|
-
private
|
|
20
|
-
private
|
|
21
|
-
private
|
|
22
|
-
private
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
42
|
+
this.attachTypeORM();
|
|
39
43
|
}
|
|
40
|
-
// Initialize Prisma adapter
|
|
41
44
|
if ((0, types_1.isModuleAvailable)('@prisma/client')) {
|
|
42
|
-
|
|
45
|
+
this.attachPrisma();
|
|
43
46
|
}
|
|
44
47
|
}
|
|
45
|
-
|
|
48
|
+
attachTypeORM() {
|
|
46
49
|
try {
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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 (
|
|
67
|
-
this.logger.log(
|
|
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
|
|
62
|
+
this.logger.debug(`TypeORM attach skipped: ${String(error)}`);
|
|
72
63
|
}
|
|
73
64
|
}
|
|
74
|
-
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
|
78
|
+
return out;
|
|
94
79
|
}
|
|
95
|
-
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
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
|
|
106
|
+
this.logger.log('Prisma query watcher attached (global instance)');
|
|
119
107
|
}
|
|
120
108
|
}
|
|
121
109
|
catch (error) {
|
|
122
|
-
this.logger.debug(`Prisma
|
|
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
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
|
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(
|
|
165
|
-
__metadata("design:paramtypes", [collector_service_1.CollectorService,
|
|
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":";;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"query.watcher.js","sourceRoot":"","sources":["../../../src/watchers/query/query.watcher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAoF;AACpF,uCAAgD;AAChD,oEAAgE;AAChE,2DAA4F;AAE5F,mCAQiB;AACjB,6DAA+D;AAC/D,qDAAyD;AAazD,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;AAGxE,IAAM,YAAY,oBAAlB,MAAM,YAAY;IAIvB,YACmB,SAA2B,EAC3B,gBAAkC,EAEnD,cAA+C;QAH9B,cAAS,GAAT,SAAS,CAAkB;QAC3B,qBAAgB,GAAhB,gBAAgB,CAAkB;QAElC,mBAAc,GAAd,cAAc,CAAgB;QAPhC,WAAM,GAAG,IAAI,eAAM,CAAC,cAAY,CAAC,IAAI,CAAC,CAAC;QAStD,MAAM,aAAa,GAAG,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC;QACrD,IAAI,CAAC,MAAM;YACT,OAAO,aAAa,KAAK,QAAQ;gBAC/B,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,KAAK,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC;IACjE,CAAC;IAED,sBAAsB;QACpB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,IAAI,IAAA,yBAAiB,EAAC,SAAS,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;QAED,IAAI,IAAA,yBAAiB,EAAC,gBAAgB,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;YACtD,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;gBAC7B,IAAI,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC;oBAChC,QAAQ,EAAE,CAAC;gBACb,CAAC;YACH,CAAC;YACD,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACjB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qCAAqC,QAAQ,gBAAgB,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAEO,0BAA0B;QAChC,MAAM,IAAI,GAAG,IAAI,OAAO,EAAU,CAAC;QACnC,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,EAAE,CAAC;YAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAmB,CAAC;YAC7C,IACE,QAAQ;gBACR,OAAO,QAAQ,KAAK,QAAQ;gBAC5B,CAAC,IAAI,CAAC,GAAG,CAAC,QAAkB,CAAC;gBAC7B,IAAA,iCAAyB,EAAC,QAAQ,CAAC,EACnC,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,QAAkB,CAAC,CAAC;gBAC7B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,kBAAkB,CAAC,EAAyB;QAClD,MAAM,MAAM,GAAG,EAAoD,CAAC;QACpE,IAAI,MAAM,CAAC,gBAAgB,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3C,MAAM,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;QAEhC,MAAM,cAAc,GAAG,EAAE,CAAC,OAAO,EAAE,IAAI,IAAI,SAAS,CAAC;QAErD,MAAM,UAAU,GAAG,IAAI,4CAAuB,CAC5C,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAChC,cAAc,CACf,CAAC;QACF,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;YAClC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,UAAqB,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,sCAAqB,CACvC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAChC,cAAc,EACd,QAAQ,CACT,CAAC;QACF,IAAI,CAAC;YACF,EAAoC,CAAC,MAAM,GAAG,OAAO,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,mEAAmE;YACnE,+DAA+D;QACjE,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,YAAY;QAClB,IAAI,CAAC;YACH,MAAM,YAAY,GAAI,MAAkC,CAAC,QAAQ,CAAC,CAAC;YACnE,IAAI,IAAA,sBAAc,EAAC,YAAY,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;gBAC1C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,MAAoB;QACjD,IAAI,CAAC,MAAM,CAAC,IAAI;YAAE,OAAO;QACzB,MAAM,CAAC,IAAI,CACT,KAAK,EACH,MAA8B,EAC9B,IAA0D,EAC1D,EAAE;YACF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClC,IAAI,CAAC,WAAW,CAAC;oBACf,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE;oBACtD,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;oBACnD,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;oBAC5B,MAAM,EAAE,QAAQ;oBAChB,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;gBACH,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,WAAW,CAAC;oBACf,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE;oBACtD,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;oBACnD,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;oBAC5B,MAAM,EAAE,QAAQ;oBAChB,OAAO,EAAE,KAAK;oBACd,KAAK;iBACN,CAAC,CAAC;gBACH,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAEO,WAAW,CAAC,IAAe;QACjC,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAChE,OAAO;QACT,CAAC;QACD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,GAAG,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC;QAE7C,MAAM,OAAO,GAA0B;YACrC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;YACnC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3D,CAAC;IAEO,WAAW,CAAC,KAAa;QAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,CAAC;CACF,CAAA;AApKY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;IAQR,WAAA,IAAA,eAAM,EAAC,iCAAe,CAAC,CAAA;qCAFI,oCAAgB;QACT,uBAAgB;GAN1C,YAAY,CAoKxB"}
|
|
@@ -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
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
17
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
53
|
-
*
|
|
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;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/watchers/query/types.ts"],"names":[],"mappings":"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"}
|