devtools-nestjs 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/dist/collectors/base-collector.d.ts +12 -0
  2. package/dist/collectors/base-collector.d.ts.map +1 -0
  3. package/dist/collectors/base-collector.js +23 -0
  4. package/dist/collectors/base-collector.js.map +1 -0
  5. package/dist/collectors/cache-collector.d.ts +21 -0
  6. package/dist/collectors/cache-collector.d.ts.map +1 -0
  7. package/dist/collectors/cache-collector.js +61 -0
  8. package/dist/collectors/cache-collector.js.map +1 -0
  9. package/dist/collectors/collector.registry.d.ts +18 -0
  10. package/dist/collectors/collector.registry.d.ts.map +1 -0
  11. package/dist/collectors/collector.registry.js +54 -0
  12. package/dist/collectors/collector.registry.js.map +1 -0
  13. package/dist/collectors/database-collector.d.ts +22 -0
  14. package/dist/collectors/database-collector.d.ts.map +1 -0
  15. package/dist/collectors/database-collector.js +64 -0
  16. package/dist/collectors/database-collector.js.map +1 -0
  17. package/dist/collectors/exception-collector.d.ts +10 -0
  18. package/dist/collectors/exception-collector.d.ts.map +1 -0
  19. package/dist/collectors/exception-collector.js +45 -0
  20. package/dist/collectors/exception-collector.js.map +1 -0
  21. package/dist/collectors/log-collector.d.ts +21 -0
  22. package/dist/collectors/log-collector.d.ts.map +1 -0
  23. package/dist/collectors/log-collector.js +53 -0
  24. package/dist/collectors/log-collector.js.map +1 -0
  25. package/dist/collectors/request-collector.d.ts +11 -0
  26. package/dist/collectors/request-collector.d.ts.map +1 -0
  27. package/dist/collectors/request-collector.js +85 -0
  28. package/dist/collectors/request-collector.js.map +1 -0
  29. package/dist/collectors/route-collector.d.ts +10 -0
  30. package/dist/collectors/route-collector.d.ts.map +1 -0
  31. package/dist/collectors/route-collector.js +40 -0
  32. package/dist/collectors/route-collector.js.map +1 -0
  33. package/dist/collectors/time-collector.d.ts +16 -0
  34. package/dist/collectors/time-collector.d.ts.map +1 -0
  35. package/dist/collectors/time-collector.js +81 -0
  36. package/dist/collectors/time-collector.js.map +1 -0
  37. package/dist/controllers/profiler.controller.d.ts +16 -0
  38. package/dist/controllers/profiler.controller.d.ts.map +1 -0
  39. package/dist/controllers/profiler.controller.js +155 -0
  40. package/dist/controllers/profiler.controller.js.map +1 -0
  41. package/dist/controllers/toolbar.controller.d.ts +11 -0
  42. package/dist/controllers/toolbar.controller.d.ts.map +1 -0
  43. package/dist/controllers/toolbar.controller.js +57 -0
  44. package/dist/controllers/toolbar.controller.js.map +1 -0
  45. package/dist/index.d.ts +20 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +41 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/interceptors/log.interceptor.d.ts +10 -0
  50. package/dist/interceptors/log.interceptor.d.ts.map +1 -0
  51. package/dist/interceptors/log.interceptor.js +59 -0
  52. package/dist/interceptors/log.interceptor.js.map +1 -0
  53. package/dist/interceptors/profiler.interceptor.d.ts +11 -0
  54. package/dist/interceptors/profiler.interceptor.d.ts.map +1 -0
  55. package/dist/interceptors/profiler.interceptor.js +79 -0
  56. package/dist/interceptors/profiler.interceptor.js.map +1 -0
  57. package/dist/interceptors/toolbar.interceptor.d.ts +14 -0
  58. package/dist/interceptors/toolbar.interceptor.d.ts.map +1 -0
  59. package/dist/interceptors/toolbar.interceptor.js +72 -0
  60. package/dist/interceptors/toolbar.interceptor.js.map +1 -0
  61. package/dist/profiler/profile.model.d.ts +22 -0
  62. package/dist/profiler/profile.model.d.ts.map +1 -0
  63. package/dist/profiler/profile.model.js +77 -0
  64. package/dist/profiler/profile.model.js.map +1 -0
  65. package/dist/profiler/profiler.service.d.ts +33 -0
  66. package/dist/profiler/profiler.service.d.ts.map +1 -0
  67. package/dist/profiler/profiler.service.js +95 -0
  68. package/dist/profiler/profiler.service.js.map +1 -0
  69. package/dist/profiler.module.d.ts +7 -0
  70. package/dist/profiler.module.d.ts.map +1 -0
  71. package/dist/profiler.module.js +120 -0
  72. package/dist/profiler.module.js.map +1 -0
  73. package/dist/profiler.types.d.ts +61 -0
  74. package/dist/profiler.types.d.ts.map +1 -0
  75. package/dist/profiler.types.js +6 -0
  76. package/dist/profiler.types.js.map +1 -0
  77. package/dist/storage/file-storage.service.d.ts +22 -0
  78. package/dist/storage/file-storage.service.d.ts.map +1 -0
  79. package/dist/storage/file-storage.service.js +259 -0
  80. package/dist/storage/file-storage.service.js.map +1 -0
  81. package/dist/storage/memory-storage.service.d.ts +11 -0
  82. package/dist/storage/memory-storage.service.d.ts.map +1 -0
  83. package/dist/storage/memory-storage.service.js +56 -0
  84. package/dist/storage/memory-storage.service.js.map +1 -0
  85. package/dist/storage/storage.interface.d.ts +18 -0
  86. package/dist/storage/storage.interface.d.ts.map +1 -0
  87. package/dist/storage/storage.interface.js +3 -0
  88. package/dist/storage/storage.interface.js.map +1 -0
  89. package/dist/views/layout.d.ts +15 -0
  90. package/dist/views/layout.d.ts.map +1 -0
  91. package/dist/views/layout.js +143 -0
  92. package/dist/views/layout.js.map +1 -0
  93. package/dist/views/panels/cache-panel.d.ts +2 -0
  94. package/dist/views/panels/cache-panel.d.ts.map +1 -0
  95. package/dist/views/panels/cache-panel.js +46 -0
  96. package/dist/views/panels/cache-panel.js.map +1 -0
  97. package/dist/views/panels/database-panel.d.ts +2 -0
  98. package/dist/views/panels/database-panel.d.ts.map +1 -0
  99. package/dist/views/panels/database-panel.js +59 -0
  100. package/dist/views/panels/database-panel.js.map +1 -0
  101. package/dist/views/panels/exception-panel.d.ts +2 -0
  102. package/dist/views/panels/exception-panel.d.ts.map +1 -0
  103. package/dist/views/panels/exception-panel.js +30 -0
  104. package/dist/views/panels/exception-panel.js.map +1 -0
  105. package/dist/views/panels/log-panel.d.ts +2 -0
  106. package/dist/views/panels/log-panel.d.ts.map +1 -0
  107. package/dist/views/panels/log-panel.js +60 -0
  108. package/dist/views/panels/log-panel.js.map +1 -0
  109. package/dist/views/panels/request-panel.d.ts +2 -0
  110. package/dist/views/panels/request-panel.d.ts.map +1 -0
  111. package/dist/views/panels/request-panel.js +27 -0
  112. package/dist/views/panels/request-panel.js.map +1 -0
  113. package/dist/views/panels/route-panel.d.ts +2 -0
  114. package/dist/views/panels/route-panel.d.ts.map +1 -0
  115. package/dist/views/panels/route-panel.js +21 -0
  116. package/dist/views/panels/route-panel.js.map +1 -0
  117. package/dist/views/panels/time-panel.d.ts +2 -0
  118. package/dist/views/panels/time-panel.d.ts.map +1 -0
  119. package/dist/views/panels/time-panel.js +30 -0
  120. package/dist/views/panels/time-panel.js.map +1 -0
  121. package/dist/views/toolbar.d.ts +8 -0
  122. package/dist/views/toolbar.d.ts.map +1 -0
  123. package/dist/views/toolbar.js +165 -0
  124. package/dist/views/toolbar.js.map +1 -0
  125. package/package.json +28 -0
@@ -0,0 +1,259 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ 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;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var FileStorageService_1;
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.FileStorageService = void 0;
47
+ const common_1 = require("@nestjs/common");
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ const profile_model_1 = require("../profiler/profile.model");
51
+ let FileStorageService = FileStorageService_1 = class FileStorageService {
52
+ logger = new common_1.Logger(FileStorageService_1.name);
53
+ storageDir;
54
+ maxAge = 2 * 24 * 60 * 60 * 1000;
55
+ constructor(storageDir) {
56
+ this.storageDir = storageDir;
57
+ if (!fs.existsSync(this.storageDir)) {
58
+ fs.mkdirSync(this.storageDir, { recursive: true });
59
+ }
60
+ }
61
+ async write(profile) {
62
+ try {
63
+ const filePath = this.getFilePath(profile.token);
64
+ const dir = path.dirname(filePath);
65
+ if (!fs.existsSync(dir)) {
66
+ fs.mkdirSync(dir, { recursive: true });
67
+ }
68
+ const data = JSON.stringify(profile.toJSON());
69
+ fs.writeFileSync(filePath, data, 'utf-8');
70
+ this.appendToIndex(profile);
71
+ this.probabilisticCleanup();
72
+ return true;
73
+ }
74
+ catch (err) {
75
+ this.logger.error(`Failed to write profile ${profile.token}`, err);
76
+ return false;
77
+ }
78
+ }
79
+ async read(token) {
80
+ try {
81
+ const filePath = this.getFilePath(token);
82
+ if (!fs.existsSync(filePath))
83
+ return null;
84
+ const raw = fs.readFileSync(filePath, 'utf-8');
85
+ const json = JSON.parse(raw);
86
+ return profile_model_1.ProfileModel.fromJSON(json);
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ }
92
+ async find(options = {}) {
93
+ const indexFile = path.join(this.storageDir, 'index.csv');
94
+ if (!fs.existsSync(indexFile))
95
+ return [];
96
+ try {
97
+ const lines = fs.readFileSync(indexFile, 'utf-8').split('\n').filter(Boolean);
98
+ const results = [];
99
+ for (let i = lines.length - 1; i >= 0; i--) {
100
+ const parts = this.parseCsvLine(lines[i]);
101
+ if (!parts)
102
+ continue;
103
+ const [token, ip, method, url, time, statusCode, duration, parentToken] = parts;
104
+ if (options.ip && ip !== options.ip)
105
+ continue;
106
+ if (options.method && method !== options.method)
107
+ continue;
108
+ if (options.url && !url.includes(options.url))
109
+ continue;
110
+ if (options.start && parseInt(time) < options.start)
111
+ continue;
112
+ if (options.end && parseInt(time) > options.end)
113
+ continue;
114
+ if (options.statusCode && parseInt(statusCode) !== options.statusCode)
115
+ continue;
116
+ const parsedTime = parseInt(time);
117
+ if (this.isExpired(parsedTime))
118
+ continue;
119
+ results.push({
120
+ token,
121
+ ip,
122
+ method,
123
+ url,
124
+ path: new URL(url).pathname,
125
+ statusCode: parseInt(statusCode),
126
+ time: parsedTime,
127
+ duration: parseInt(duration),
128
+ parentToken: parentToken || null,
129
+ });
130
+ if (options.limit && results.length >= options.limit)
131
+ break;
132
+ }
133
+ return results;
134
+ }
135
+ catch {
136
+ return [];
137
+ }
138
+ }
139
+ async purge() {
140
+ this.deleteRecursive(this.storageDir);
141
+ if (!fs.existsSync(this.storageDir)) {
142
+ fs.mkdirSync(this.storageDir, { recursive: true });
143
+ }
144
+ }
145
+ getFilePath(token) {
146
+ const part1 = token.slice(-2);
147
+ const part2 = token.slice(-4, -2);
148
+ return path.join(this.storageDir, part1, part2, token);
149
+ }
150
+ appendToIndex(profile) {
151
+ const line = this.toCsvLine([
152
+ profile.token,
153
+ profile.ip,
154
+ profile.method,
155
+ profile.url,
156
+ String(profile.time),
157
+ String(profile.statusCode),
158
+ String(profile.duration),
159
+ profile.parentToken || '',
160
+ ]);
161
+ const indexFile = path.join(this.storageDir, 'index.csv');
162
+ fs.appendFileSync(indexFile, line + '\n', 'utf-8');
163
+ }
164
+ isExpired(timestamp) {
165
+ return Date.now() - timestamp > this.maxAge;
166
+ }
167
+ probabilisticCleanup() {
168
+ if (Math.random() > 0.1)
169
+ return;
170
+ const indexFile = path.join(this.storageDir, 'index.csv');
171
+ if (!fs.existsSync(indexFile))
172
+ return;
173
+ try {
174
+ const lines = fs.readFileSync(indexFile, 'utf-8').split('\n').filter(Boolean);
175
+ const valid = [];
176
+ for (const line of lines) {
177
+ const parts = this.parseCsvLine(line);
178
+ if (!parts)
179
+ continue;
180
+ const time = parseInt(parts[4]);
181
+ if (!this.isExpired(time)) {
182
+ valid.push(line);
183
+ }
184
+ }
185
+ fs.writeFileSync(indexFile, valid.join('\n') + '\n', 'utf-8');
186
+ for (const entry of fs.readdirSync(this.storageDir, { withFileTypes: true })) {
187
+ if (entry.isDirectory()) {
188
+ this.deleteEmptyDirs(path.join(this.storageDir, entry.name));
189
+ }
190
+ }
191
+ }
192
+ catch {
193
+ // ignore cleanup errors
194
+ }
195
+ }
196
+ deleteEmptyDirs(dir) {
197
+ try {
198
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
199
+ for (const entry of entries) {
200
+ if (entry.isDirectory()) {
201
+ this.deleteEmptyDirs(path.join(dir, entry.name));
202
+ }
203
+ }
204
+ if (fs.readdirSync(dir).length === 0) {
205
+ fs.rmdirSync(dir);
206
+ }
207
+ }
208
+ catch {
209
+ // ignore
210
+ }
211
+ }
212
+ deleteRecursive(dir) {
213
+ try {
214
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
215
+ const fullPath = path.join(dir, entry.name);
216
+ if (entry.isDirectory()) {
217
+ this.deleteRecursive(fullPath);
218
+ }
219
+ else {
220
+ fs.unlinkSync(fullPath);
221
+ }
222
+ }
223
+ fs.rmdirSync(dir);
224
+ }
225
+ catch {
226
+ // ignore
227
+ }
228
+ }
229
+ toCsvLine(fields) {
230
+ return fields.map(f => `"${f.replace(/"/g, '\\"')}"`).join(',');
231
+ }
232
+ parseCsvLine(line) {
233
+ const parts = [];
234
+ let current = '';
235
+ let inQuotes = false;
236
+ for (const char of line) {
237
+ if (char === '"') {
238
+ inQuotes = !inQuotes;
239
+ }
240
+ else if (char === ',' && !inQuotes) {
241
+ parts.push(current);
242
+ current = '';
243
+ }
244
+ else {
245
+ current += char;
246
+ }
247
+ }
248
+ parts.push(current);
249
+ if (parts.length < 6)
250
+ return null;
251
+ return parts;
252
+ }
253
+ };
254
+ exports.FileStorageService = FileStorageService;
255
+ exports.FileStorageService = FileStorageService = FileStorageService_1 = __decorate([
256
+ (0, common_1.Injectable)(),
257
+ __metadata("design:paramtypes", [String])
258
+ ], FileStorageService);
259
+ //# sourceMappingURL=file-storage.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-storage.service.js","sourceRoot":"","sources":["../../src/storage/file-storage.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { StorageInterface, FindOptions } from './storage.interface';
2
+ import { ProfileModel } from '../profiler/profile.model';
3
+ import { ProfileSummary } from '../profiler.types';
4
+ export declare class MemoryStorageService implements StorageInterface {
5
+ private profiles;
6
+ read(token: string): Promise<ProfileModel | null>;
7
+ write(profile: ProfileModel): Promise<boolean>;
8
+ find(options?: FindOptions): Promise<ProfileSummary[]>;
9
+ purge(): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=memory-storage.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-storage.service.d.ts","sourceRoot":"","sources":["../../src/storage/memory-storage.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,qBACa,oBAAqB,YAAW,gBAAgB;IAC3D,OAAO,CAAC,QAAQ,CAAmC;IAE7C,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAIjD,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAK9C,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA0B1D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -0,0 +1,56 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.MemoryStorageService = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ let MemoryStorageService = class MemoryStorageService {
12
+ profiles = new Map();
13
+ async read(token) {
14
+ return this.profiles.get(token) || null;
15
+ }
16
+ async write(profile) {
17
+ this.profiles.set(profile.token, profile);
18
+ return true;
19
+ }
20
+ async find(options = {}) {
21
+ let results = Array.from(this.profiles.values());
22
+ if (options.ip)
23
+ results = results.filter(p => p.ip === options.ip);
24
+ if (options.method)
25
+ results = results.filter(p => p.method === options.method);
26
+ if (options.url)
27
+ results = results.filter(p => p.url.includes(options.url));
28
+ if (options.start)
29
+ results = results.filter(p => p.time >= options.start);
30
+ if (options.end)
31
+ results = results.filter(p => p.time <= options.end);
32
+ if (options.statusCode)
33
+ results = results.filter(p => p.statusCode === options.statusCode);
34
+ results.sort((a, b) => b.time - a.time);
35
+ const limit = options.limit || 50;
36
+ return results.slice(0, limit).map(p => ({
37
+ token: p.token,
38
+ ip: p.ip,
39
+ method: p.method,
40
+ url: p.url,
41
+ path: p.path,
42
+ statusCode: p.statusCode,
43
+ time: p.time,
44
+ duration: p.duration,
45
+ parentToken: p.parentToken,
46
+ }));
47
+ }
48
+ async purge() {
49
+ this.profiles.clear();
50
+ }
51
+ };
52
+ exports.MemoryStorageService = MemoryStorageService;
53
+ exports.MemoryStorageService = MemoryStorageService = __decorate([
54
+ (0, common_1.Injectable)()
55
+ ], MemoryStorageService);
56
+ //# sourceMappingURL=memory-storage.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-storage.service.js","sourceRoot":"","sources":["../../src/storage/memory-storage.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAMrC,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IACvB,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEnD,KAAK,CAAC,IAAI,CAAC,KAAa;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAqB;QAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAuB,EAAE;QAClC,IAAI,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAEjD,IAAI,OAAO,CAAC,EAAE;YAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;QACnE,IAAI,OAAO,CAAC,MAAM;YAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/E,IAAI,OAAO,CAAC,GAAG;YAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAI,CAAC,CAAC,CAAC;QAC7E,IAAI,OAAO,CAAC,KAAK;YAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,KAAM,CAAC,CAAC;QAC3E,IAAI,OAAO,CAAC,GAAG;YAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,GAAI,CAAC,CAAC;QACvE,IAAI,OAAO,CAAC,UAAU;YAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;QAE3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QAExC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QAClC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvC,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF,CAAA;AAzCY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;GACA,oBAAoB,CAyChC"}
@@ -0,0 +1,18 @@
1
+ import { ProfileModel } from '../profiler/profile.model';
2
+ import { ProfileSummary } from '../profiler.types';
3
+ export interface StorageInterface {
4
+ read(token: string): Promise<ProfileModel | null>;
5
+ write(profile: ProfileModel): Promise<boolean>;
6
+ find(options?: FindOptions): Promise<ProfileSummary[]>;
7
+ purge(): Promise<void>;
8
+ }
9
+ export interface FindOptions {
10
+ ip?: string;
11
+ url?: string;
12
+ limit?: number;
13
+ method?: string;
14
+ start?: number;
15
+ end?: number;
16
+ statusCode?: number;
17
+ }
18
+ //# sourceMappingURL=storage.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.interface.d.ts","sourceRoot":"","sources":["../../src/storage/storage.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAClD,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACvD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=storage.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.interface.js","sourceRoot":"","sources":["../../src/storage/storage.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import { ProfileSummary } from '../profiler.types';
2
+ import { ProfileModel } from '../profiler/profile.model';
3
+ export interface PanelPageData {
4
+ profile: ProfileModel;
5
+ panel: string;
6
+ collectorData: Record<string, unknown>;
7
+ token: string;
8
+ }
9
+ export declare function renderProfilerLayout(title: string, content: string, profile: ProfileModel, panels: {
10
+ name: string;
11
+ label: string;
12
+ }[], activePanel: string, searchResults?: ProfileSummary[]): string;
13
+ export declare function renderPanelContent(title: string, bodyHtml: string): string;
14
+ export declare function renderKeyValueTable(items: Record<string, unknown>, keyLabel?: string, valueLabel?: string): string;
15
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/views/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,EACzC,WAAW,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,cAAc,EAAE,GAC/B,MAAM,CA0ER;AAiCD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,MAAM,CAER;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,QAAQ,SAAQ,EAChB,UAAU,SAAU,GACnB,MAAM,CAQR"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderProfilerLayout = renderProfilerLayout;
4
+ exports.renderPanelContent = renderPanelContent;
5
+ exports.renderKeyValueTable = renderKeyValueTable;
6
+ function renderProfilerLayout(title, content, profile, panels, activePanel, searchResults) {
7
+ const sidebarItems = panels
8
+ .map(p => {
9
+ const active = p.name === activePanel ? 'class="active"' : '';
10
+ const hasData = profile.hasCollector(p.name) ? '' : 'data-empty';
11
+ return `<li ${active} ${hasData}><a href="?panel=${p.name}">${p.label}</a></li>`;
12
+ })
13
+ .join('\n');
14
+ const searchHtml = searchResults
15
+ ? renderSearchResults(searchResults)
16
+ : '';
17
+ return `<!DOCTYPE html>
18
+ <html lang="en">
19
+ <head>
20
+ <meta charset="UTF-8">
21
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
22
+ <title>${title} - Profiler</title>
23
+ <style>
24
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
25
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #0f0f1a; color: #e0e0e0; font-size: 14px; line-height: 1.5; }
26
+ .header { background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%); padding: 16px 24px; border-bottom: 1px solid #2a2a3e; display: flex; align-items: center; gap: 16px; }
27
+ .header h1 { font-size: 18px; font-weight: 600; color: #fff; }
28
+ .header .meta { font-size: 12px; color: #888; }
29
+ .header .badge { background: #2a2a3e; padding: 2px 8px; border-radius: 4px; font-size: 11px; }
30
+ .layout { display: flex; min-height: calc(100vh - 60px); }
31
+ .sidebar { width: 220px; background: #14142a; border-right: 1px solid #2a2a3e; padding: 12px 0; flex-shrink: 0; }
32
+ .sidebar ul { list-style: none; }
33
+ .sidebar li { padding: 2px 0; }
34
+ .sidebar li a { display: block; padding: 8px 16px; color: #aaa; text-decoration: none; font-size: 13px; transition: background 0.15s; }
35
+ .sidebar li a:hover { background: #1a1a3e; color: #fff; }
36
+ .sidebar li.active a { background: #1a1a3e; color: #4fc3f7; border-left: 3px solid #4fc3f7; }
37
+ .sidebar li[data-empty] a { opacity: 0.4; }
38
+ .content { flex: 1; padding: 24px; overflow-x: auto; }
39
+ .content h2 { font-size: 20px; font-weight: 600; margin-bottom: 16px; color: #fff; }
40
+ .content h3 { font-size: 16px; font-weight: 600; margin: 16px 0 8px; color: #ccc; }
41
+ table { width: 100%; border-collapse: collapse; margin-bottom: 16px; }
42
+ th, td { text-align: left; padding: 8px 12px; border-bottom: 1px solid #2a2a3e; font-size: 13px; }
43
+ th { color: #888; font-weight: 500; text-transform: uppercase; font-size: 11px; letter-spacing: 0.5px; }
44
+ td { color: #ccc; }
45
+ td .value { font-family: 'JetBrains Mono', 'Fira Code', monospace; font-size: 12px; }
46
+ tr:hover td { background: #1a1a2e; }
47
+ .summary-bar { display: flex; gap: 16px; margin-bottom: 24px; flex-wrap: wrap; }
48
+ .summary-item { background: #1a1a2e; border: 1px solid #2a2a3e; border-radius: 8px; padding: 12px 16px; flex: 1; min-width: 120px; }
49
+ .summary-item .label { font-size: 11px; color: #888; text-transform: uppercase; letter-spacing: 0.5px; }
50
+ .summary-item .value { font-size: 18px; font-weight: 600; color: #fff; margin-top: 4px; }
51
+ .search-bar { padding: 12px 16px; background: #1a1a2e; border-bottom: 1px solid #2a2a3e; }
52
+ .search-bar input { background: #0f0f1a; border: 1px solid #2a2a3e; color: #e0e0e0; padding: 6px 12px; border-radius: 4px; font-size: 13px; width: 300px; }
53
+ .search-bar button { background: #4fc3f7; color: #000; border: none; padding: 6px 16px; border-radius: 4px; cursor: pointer; font-size: 13px; font-weight: 500; }
54
+ pre { background: #0f0f1a; padding: 12px; border-radius: 4px; overflow-x: auto; font-size: 12px; line-height: 1.6; }
55
+ code { font-family: 'JetBrains Mono', 'Fira Code', monospace; }
56
+ </style>
57
+ </head>
58
+ <body>
59
+ <div class="header">
60
+ <h1>NestJS Profiler</h1>
61
+ <span class="badge">${profile.method}</span>
62
+ <span class="badge">${profile.statusCode}</span>
63
+ <span class="badge">${profile.duration} ms</span>
64
+ <span class="meta">${new Date(profile.time).toLocaleString()}</span>
65
+ <span class="meta">TOKEN: ${profile.token}</span>
66
+ </div>
67
+ ${searchHtml}
68
+ <div class="layout">
69
+ <div class="sidebar">
70
+ <ul>${sidebarItems}</ul>
71
+ </div>
72
+ <div class="content">
73
+ ${content}
74
+ </div>
75
+ </div>
76
+ </body>
77
+ </html>`;
78
+ }
79
+ function renderSearchResults(results) {
80
+ if (!results.length)
81
+ return '';
82
+ return `<div class="search-bar">
83
+ <table>
84
+ <tr>
85
+ <th>Token</th>
86
+ <th>Method</th>
87
+ <th>URL</th>
88
+ <th>Status</th>
89
+ <th>Time</th>
90
+ <th>Duration</th>
91
+ <th>IP</th>
92
+ </tr>
93
+ ${results
94
+ .map(r => `<tr>
95
+ <td><a href="?token=${r.token}" style="color:#4fc3f7">${r.token}</a></td>
96
+ <td>${r.method}</td>
97
+ <td>${r.url}</td>
98
+ <td>${r.statusCode}</td>
99
+ <td>${new Date(r.time).toLocaleString()}</td>
100
+ <td>${r.duration} ms</td>
101
+ <td>${r.ip}</td>
102
+ </tr>`)
103
+ .join('')}
104
+ </table>
105
+ </div>`;
106
+ }
107
+ function renderPanelContent(title, bodyHtml) {
108
+ return `<h2>${title}</h2>${bodyHtml}`;
109
+ }
110
+ function renderKeyValueTable(items, keyLabel = 'Key', valueLabel = 'Value') {
111
+ const rows = Object.entries(items)
112
+ .map(([key, val]) => `<tr><td style="font-weight:500;color:#888">${key}</td><td>${formatValue(val)}</td></tr>`)
113
+ .join('');
114
+ return `<table><thead><tr><th>${keyLabel}</th><th>${valueLabel}</th></tr></thead><tbody>${rows}</tbody></table>`;
115
+ }
116
+ function formatValue(val) {
117
+ if (val === null || val === undefined)
118
+ return '<span class="value">-</span>';
119
+ if (typeof val === 'boolean')
120
+ return `<span class="value">${val}</span>`;
121
+ if (typeof val === 'number')
122
+ return `<span class="value">${val}</span>`;
123
+ if (typeof val === 'string') {
124
+ if (val.length > 200)
125
+ return `<span class="value">${escapeHtml(val.slice(0, 200))}...</span>`;
126
+ return `<span class="value">${escapeHtml(val)}</span>`;
127
+ }
128
+ if (Array.isArray(val)) {
129
+ return `<pre>${escapeHtml(JSON.stringify(val, null, 2))}</pre>`;
130
+ }
131
+ if (typeof val === 'object') {
132
+ return `<pre>${escapeHtml(JSON.stringify(val, null, 2))}</pre>`;
133
+ }
134
+ return `<span class="value">${escapeHtml(String(val))}</span>`;
135
+ }
136
+ function escapeHtml(str) {
137
+ return str
138
+ .replace(/&/g, '&amp;')
139
+ .replace(/</g, '&lt;')
140
+ .replace(/>/g, '&gt;')
141
+ .replace(/"/g, '&quot;');
142
+ }
143
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/views/layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function renderCachePanel(data: Record<string, unknown>): string;
2
+ //# sourceMappingURL=cache-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-panel.d.ts","sourceRoot":"","sources":["../../../src/views/panels/cache-panel.ts"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CA2CtE"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderCachePanel = renderCachePanel;
4
+ const layout_1 = require("../layout");
5
+ function renderCachePanel(data) {
6
+ const typeCounts = data.operationsByType || {};
7
+ const recentOps = data.recentOperations || [];
8
+ const typeRows = Object.entries(typeCounts)
9
+ .map(([type, count]) => `<tr><td>${type}</td><td>${count}</td></tr>`)
10
+ .join('');
11
+ const opRows = recentOps
12
+ .reverse()
13
+ .map((op, i) => `<tr>
14
+ <td>${op.action}</td>
15
+ <td><code>${escapeHtml(String(op.key || ''))}</code></td>
16
+ <td>${op.hit === true ? '✓' : op.hit === false ? '✗' : '-'}</td>
17
+ <td>${Math.round(op.duration * 100) / 100} ms</td>
18
+ </tr>`)
19
+ .join('');
20
+ const body = `
21
+ <div class="summary-bar">
22
+ <div class="summary-item"><div class="label">Operations</div><div class="value">${data.totalOperations || 0}</div></div>
23
+ <div class="summary-item"><div class="label">Hits</div><div class="value">${data.totalHits || 0}</div></div>
24
+ <div class="summary-item"><div class="label">Misses</div><div class="value">${data.totalMisses || 0}</div></div>
25
+ <div class="summary-item"><div class="label">Hit Rate</div><div class="value">${data.hitRate || 0}%</div></div>
26
+ <div class="summary-item"><div class="label">Total Time</div><div class="value">${data.totalDuration || 0} ms</div></div>
27
+ </div>
28
+
29
+ <h3>Operations by Type</h3>
30
+ <table>
31
+ <thead><tr><th>Type</th><th>Count</th></tr></thead>
32
+ <tbody>${typeRows || '<tr><td colspan="2">No operations</td></tr>'}</tbody>
33
+ </table>
34
+
35
+ <h3>Recent Operations</h3>
36
+ <table>
37
+ <thead><tr><th>Action</th><th>Key</th><th>Hit</th><th>Duration</th></tr></thead>
38
+ <tbody>${opRows || '<tr><td colspan="4">No operations</td></tr>'}</tbody>
39
+ </table>
40
+ `;
41
+ return (0, layout_1.renderPanelContent)('Cache', body);
42
+ }
43
+ function escapeHtml(str) {
44
+ return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
45
+ }
46
+ //# sourceMappingURL=cache-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-panel.js","sourceRoot":"","sources":["../../../src/views/panels/cache-panel.ts"],"names":[],"mappings":";;AAEA,4CA2CC;AA7CD,sCAA+C;AAE/C,SAAgB,gBAAgB,CAAC,IAA6B;IAC5D,MAAM,UAAU,GAAI,IAAI,CAAC,gBAA2C,IAAI,EAAE,CAAC;IAC3E,MAAM,SAAS,GAAI,IAAI,CAAC,gBAAmD,IAAI,EAAE,CAAC;IAElF,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;SACxC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,WAAW,IAAI,YAAY,KAAK,YAAY,CAAC;SACpE,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,MAAM,MAAM,GAAG,SAAS;SACrB,OAAO,EAAE;SACT,GAAG,CACF,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;cACH,EAAE,CAAC,MAAM;oBACH,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;cACtC,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;cACpD,IAAI,CAAC,KAAK,CAAE,EAAE,CAAC,QAAmB,GAAG,GAAG,CAAC,GAAG,GAAG;YACjD,CACP;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,MAAM,IAAI,GAAG;;wFAEyE,IAAI,CAAC,eAAe,IAAI,CAAC;kFAC/B,IAAI,CAAC,SAAS,IAAI,CAAC;oFACjB,IAAI,CAAC,WAAW,IAAI,CAAC;sFACnB,IAAI,CAAC,OAAO,IAAI,CAAC;wFACf,IAAI,CAAC,aAAa,IAAI,CAAC;;;;;;eAMhG,QAAQ,IAAI,6CAA6C;;;;;;eAMzD,MAAM,IAAI,6CAA6C;;GAEnE,CAAC;IAEF,OAAO,IAAA,2BAAkB,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAChF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function renderDatabasePanel(data: Record<string, unknown>): string;
2
+ //# sourceMappingURL=database-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-panel.d.ts","sourceRoot":"","sources":["../../../src/views/panels/database-panel.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CA2DzE"}