nestlens 0.1.2 → 0.2.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 (39) hide show
  1. package/dist/__tests__/core/storage/memory.storage.spec.d.ts +2 -0
  2. package/dist/__tests__/core/storage/memory.storage.spec.d.ts.map +1 -0
  3. package/dist/__tests__/core/storage/memory.storage.spec.js +450 -0
  4. package/dist/__tests__/core/storage/memory.storage.spec.js.map +1 -0
  5. package/dist/__tests__/core/storage/redis.storage.spec.d.ts +10 -0
  6. package/dist/__tests__/core/storage/redis.storage.spec.d.ts.map +1 -0
  7. package/dist/__tests__/core/storage/redis.storage.spec.js +660 -0
  8. package/dist/__tests__/core/storage/redis.storage.spec.js.map +1 -0
  9. package/dist/__tests__/core/storage/storage.factory.spec.d.ts +2 -0
  10. package/dist/__tests__/core/storage/storage.factory.spec.d.ts.map +1 -0
  11. package/dist/__tests__/core/storage/storage.factory.spec.js +151 -0
  12. package/dist/__tests__/core/storage/storage.factory.spec.js.map +1 -0
  13. package/dist/core/storage/index.d.ts +2 -1
  14. package/dist/core/storage/index.d.ts.map +1 -1
  15. package/dist/core/storage/index.js +17 -1
  16. package/dist/core/storage/index.js.map +1 -1
  17. package/dist/core/storage/memory.storage.d.ts +59 -0
  18. package/dist/core/storage/memory.storage.d.ts.map +1 -0
  19. package/dist/core/storage/memory.storage.js +629 -0
  20. package/dist/core/storage/memory.storage.js.map +1 -0
  21. package/dist/core/storage/redis.storage.d.ts +77 -0
  22. package/dist/core/storage/redis.storage.d.ts.map +1 -0
  23. package/dist/core/storage/redis.storage.js +595 -0
  24. package/dist/core/storage/redis.storage.js.map +1 -0
  25. package/dist/core/storage/storage.factory.d.ts +28 -0
  26. package/dist/core/storage/storage.factory.d.ts.map +1 -0
  27. package/dist/core/storage/storage.factory.js +169 -0
  28. package/dist/core/storage/storage.factory.js.map +1 -0
  29. package/dist/index.d.ts +3 -1
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +5 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/nestlens.config.d.ts +54 -0
  34. package/dist/nestlens.config.d.ts.map +1 -1
  35. package/dist/nestlens.config.js +16 -2
  36. package/dist/nestlens.config.js.map +1 -1
  37. package/dist/nestlens.module.js +3 -3
  38. package/dist/nestlens.module.js.map +1 -1
  39. package/package.json +16 -3
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory.storage.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.storage.spec.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/core/storage/memory.storage.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,450 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const memory_storage_1 = require("../../../core/storage/memory.storage");
4
+ describe('MemoryStorage', () => {
5
+ let storage;
6
+ beforeEach(async () => {
7
+ storage = new memory_storage_1.MemoryStorage({ maxEntries: 100 });
8
+ await storage.initialize();
9
+ });
10
+ afterEach(async () => {
11
+ await storage.close();
12
+ });
13
+ // ==================== Helper Functions ====================
14
+ function createEntry(type, payload = {}) {
15
+ return {
16
+ type,
17
+ payload,
18
+ requestId: `req-${Date.now()}`,
19
+ };
20
+ }
21
+ // ==================== Core CRUD Tests ====================
22
+ describe('save', () => {
23
+ it('should save an entry and return it with id and createdAt', async () => {
24
+ // Arrange
25
+ const entry = createEntry('request', { method: 'GET', path: '/test' });
26
+ // Act
27
+ const saved = await storage.save(entry);
28
+ // Assert
29
+ expect(saved.id).toBeDefined();
30
+ expect(saved.id).toBeGreaterThan(0);
31
+ expect(saved.createdAt).toBeDefined();
32
+ expect(saved.type).toBe('request');
33
+ expect(saved.payload).toEqual({ method: 'GET', path: '/test' });
34
+ });
35
+ it('should assign incrementing IDs', async () => {
36
+ // Arrange & Act
37
+ const saved1 = await storage.save(createEntry('request'));
38
+ const saved2 = await storage.save(createEntry('query'));
39
+ const saved3 = await storage.save(createEntry('log'));
40
+ // Assert
41
+ expect(saved2.id).toBe(saved1.id + 1);
42
+ expect(saved3.id).toBe(saved2.id + 1);
43
+ });
44
+ });
45
+ describe('saveBatch', () => {
46
+ it('should save multiple entries at once', async () => {
47
+ // Arrange
48
+ const entries = [
49
+ createEntry('request', { path: '/1' }),
50
+ createEntry('request', { path: '/2' }),
51
+ createEntry('request', { path: '/3' }),
52
+ ];
53
+ // Act
54
+ const saved = await storage.saveBatch(entries);
55
+ // Assert
56
+ expect(saved).toHaveLength(3);
57
+ expect(saved[0].id).toBeDefined();
58
+ expect(saved[1].id).toBe(saved[0].id + 1);
59
+ expect(saved[2].id).toBe(saved[1].id + 1);
60
+ });
61
+ it('should return empty array for empty input', async () => {
62
+ // Act
63
+ const saved = await storage.saveBatch([]);
64
+ // Assert
65
+ expect(saved).toEqual([]);
66
+ });
67
+ });
68
+ describe('find', () => {
69
+ beforeEach(async () => {
70
+ await storage.saveBatch([
71
+ createEntry('request', { path: '/a' }),
72
+ createEntry('query', { sql: 'SELECT 1' }),
73
+ createEntry('request', { path: '/b' }),
74
+ createEntry('exception', { name: 'Error' }),
75
+ ]);
76
+ });
77
+ it('should find entries by type', async () => {
78
+ // Act
79
+ const requests = await storage.find({ type: 'request' });
80
+ // Assert
81
+ expect(requests).toHaveLength(2);
82
+ expect(requests.every((e) => e.type === 'request')).toBe(true);
83
+ });
84
+ it('should return entries in descending order by createdAt', async () => {
85
+ // Act
86
+ const all = await storage.find({});
87
+ // Assert
88
+ expect(all).toHaveLength(4);
89
+ // Entries should be sorted (newest first based on createdAt, then by ID)
90
+ for (let i = 0; i < all.length - 1; i++) {
91
+ const current = new Date(all[i].createdAt).getTime();
92
+ const next = new Date(all[i + 1].createdAt).getTime();
93
+ // Either current is newer, or same time with higher ID
94
+ expect(current >= next).toBe(true);
95
+ }
96
+ });
97
+ it('should apply limit', async () => {
98
+ // Act
99
+ const limited = await storage.find({ limit: 2 });
100
+ // Assert
101
+ expect(limited).toHaveLength(2);
102
+ });
103
+ it('should apply offset', async () => {
104
+ // Act
105
+ const all = await storage.find({});
106
+ const offset = await storage.find({ offset: 2 });
107
+ // Assert
108
+ expect(offset).toHaveLength(2);
109
+ expect(offset[0].id).toBe(all[2].id);
110
+ });
111
+ });
112
+ describe('findById', () => {
113
+ it('should find entry by id', async () => {
114
+ // Arrange
115
+ const saved = await storage.save(createEntry('log', { message: 'test' }));
116
+ // Act
117
+ const found = await storage.findById(saved.id);
118
+ // Assert
119
+ expect(found).not.toBeNull();
120
+ expect(found.id).toBe(saved.id);
121
+ expect(found.type).toBe('log');
122
+ });
123
+ it('should return null for non-existent id', async () => {
124
+ // Act
125
+ const found = await storage.findById(99999);
126
+ // Assert
127
+ expect(found).toBeNull();
128
+ });
129
+ });
130
+ describe('count', () => {
131
+ it('should count all entries', async () => {
132
+ // Arrange
133
+ await storage.saveBatch([
134
+ createEntry('request'),
135
+ createEntry('query'),
136
+ createEntry('exception'),
137
+ ]);
138
+ // Act
139
+ const total = await storage.count();
140
+ // Assert
141
+ expect(total).toBe(3);
142
+ });
143
+ it('should count entries by type', async () => {
144
+ // Arrange
145
+ await storage.saveBatch([
146
+ createEntry('request'),
147
+ createEntry('request'),
148
+ createEntry('query'),
149
+ ]);
150
+ // Act
151
+ const requestCount = await storage.count('request');
152
+ const queryCount = await storage.count('query');
153
+ // Assert
154
+ expect(requestCount).toBe(2);
155
+ expect(queryCount).toBe(1);
156
+ });
157
+ });
158
+ describe('clear', () => {
159
+ it('should remove all entries', async () => {
160
+ // Arrange
161
+ await storage.saveBatch([createEntry('request'), createEntry('query')]);
162
+ // Act
163
+ await storage.clear();
164
+ const count = await storage.count();
165
+ // Assert
166
+ expect(count).toBe(0);
167
+ });
168
+ });
169
+ // ==================== Tag Tests ====================
170
+ describe('tags', () => {
171
+ let entryId;
172
+ beforeEach(async () => {
173
+ const saved = await storage.save(createEntry('exception', { name: 'Error' }));
174
+ entryId = saved.id;
175
+ });
176
+ it('should add and retrieve tags', async () => {
177
+ // Act
178
+ await storage.addTags(entryId, ['critical', 'production']);
179
+ const tags = await storage.getEntryTags(entryId);
180
+ // Assert
181
+ expect(tags).toContain('critical');
182
+ expect(tags).toContain('production');
183
+ });
184
+ it('should remove tags', async () => {
185
+ // Arrange
186
+ await storage.addTags(entryId, ['tag1', 'tag2', 'tag3']);
187
+ // Act
188
+ await storage.removeTags(entryId, ['tag2']);
189
+ const tags = await storage.getEntryTags(entryId);
190
+ // Assert
191
+ expect(tags).toContain('tag1');
192
+ expect(tags).toContain('tag3');
193
+ expect(tags).not.toContain('tag2');
194
+ });
195
+ it('should get all tags with counts', async () => {
196
+ // Arrange
197
+ const entry2 = await storage.save(createEntry('log'));
198
+ await storage.addTags(entryId, ['shared', 'unique1']);
199
+ await storage.addTags(entry2.id, ['shared', 'unique2']);
200
+ // Act
201
+ const allTags = await storage.getAllTags();
202
+ // Assert
203
+ const sharedTag = allTags.find((t) => t.tag === 'shared');
204
+ expect(sharedTag?.count).toBe(2);
205
+ });
206
+ it('should find entries by tags with OR logic', async () => {
207
+ // Arrange
208
+ const entry2 = await storage.save(createEntry('log'));
209
+ await storage.addTags(entryId, ['tag1']);
210
+ await storage.addTags(entry2.id, ['tag2']);
211
+ // Act
212
+ const found = await storage.findByTags(['tag1', 'tag2'], 'OR');
213
+ // Assert
214
+ expect(found).toHaveLength(2);
215
+ });
216
+ it('should find entries by tags with AND logic', async () => {
217
+ // Arrange
218
+ const entry2 = await storage.save(createEntry('log'));
219
+ await storage.addTags(entryId, ['tag1', 'tag2']);
220
+ await storage.addTags(entry2.id, ['tag1']);
221
+ // Act
222
+ const found = await storage.findByTags(['tag1', 'tag2'], 'AND');
223
+ // Assert
224
+ expect(found).toHaveLength(1);
225
+ expect(found[0].id).toBe(entryId);
226
+ });
227
+ });
228
+ // ==================== Monitored Tags Tests ====================
229
+ describe('monitored tags', () => {
230
+ it('should add and retrieve monitored tags', async () => {
231
+ // Act
232
+ const monitored = await storage.addMonitoredTag('important');
233
+ const all = await storage.getMonitoredTags();
234
+ // Assert
235
+ expect(monitored.tag).toBe('important');
236
+ expect(monitored.id).toBeDefined();
237
+ expect(all).toHaveLength(1);
238
+ });
239
+ it('should not duplicate monitored tags', async () => {
240
+ // Act
241
+ await storage.addMonitoredTag('tag');
242
+ await storage.addMonitoredTag('tag');
243
+ const all = await storage.getMonitoredTags();
244
+ // Assert
245
+ expect(all).toHaveLength(1);
246
+ });
247
+ it('should remove monitored tags', async () => {
248
+ // Arrange
249
+ await storage.addMonitoredTag('tag');
250
+ // Act
251
+ await storage.removeMonitoredTag('tag');
252
+ const all = await storage.getMonitoredTags();
253
+ // Assert
254
+ expect(all).toHaveLength(0);
255
+ });
256
+ });
257
+ // ==================== Resolution Tests ====================
258
+ describe('resolution', () => {
259
+ it('should resolve an entry', async () => {
260
+ // Arrange
261
+ const saved = await storage.save(createEntry('exception'));
262
+ // Act
263
+ await storage.resolveEntry(saved.id);
264
+ const found = await storage.findById(saved.id);
265
+ // Assert
266
+ expect(found.resolvedAt).toBeDefined();
267
+ });
268
+ it('should unresolve an entry', async () => {
269
+ // Arrange
270
+ const saved = await storage.save(createEntry('exception'));
271
+ await storage.resolveEntry(saved.id);
272
+ // Act
273
+ await storage.unresolveEntry(saved.id);
274
+ const found = await storage.findById(saved.id);
275
+ // Assert
276
+ expect(found.resolvedAt).toBeUndefined();
277
+ });
278
+ });
279
+ // ==================== Family Hash Tests ====================
280
+ describe('family hash', () => {
281
+ it('should update family hash', async () => {
282
+ // Arrange
283
+ const saved = await storage.save(createEntry('exception'));
284
+ // Act
285
+ await storage.updateFamilyHash(saved.id, 'hash123');
286
+ const found = await storage.findById(saved.id);
287
+ // Assert
288
+ expect(found.familyHash).toBe('hash123');
289
+ });
290
+ it('should find entries by family hash', async () => {
291
+ // Arrange
292
+ const entry1 = await storage.save(createEntry('exception'));
293
+ const entry2 = await storage.save(createEntry('exception'));
294
+ await storage.updateFamilyHash(entry1.id, 'same-hash');
295
+ await storage.updateFamilyHash(entry2.id, 'same-hash');
296
+ // Act
297
+ const found = await storage.findByFamilyHash('same-hash');
298
+ // Assert
299
+ expect(found).toHaveLength(2);
300
+ });
301
+ it('should get grouped by family hash', async () => {
302
+ // Arrange
303
+ const entry1 = await storage.save(createEntry('exception'));
304
+ const entry2 = await storage.save(createEntry('exception'));
305
+ const entry3 = await storage.save(createEntry('exception'));
306
+ await storage.updateFamilyHash(entry1.id, 'hash-a');
307
+ await storage.updateFamilyHash(entry2.id, 'hash-a');
308
+ await storage.updateFamilyHash(entry3.id, 'hash-b');
309
+ // Act
310
+ const grouped = await storage.getGroupedByFamilyHash();
311
+ // Assert
312
+ expect(grouped).toHaveLength(2);
313
+ const hashA = grouped.find((g) => g.familyHash === 'hash-a');
314
+ expect(hashA?.count).toBe(2);
315
+ });
316
+ });
317
+ // ==================== Statistics Tests ====================
318
+ describe('getStats', () => {
319
+ it('should return correct statistics', async () => {
320
+ // Arrange
321
+ await storage.saveBatch([
322
+ createEntry('request', { duration: 100 }),
323
+ createEntry('request', { duration: 200 }),
324
+ createEntry('query', { slow: true }),
325
+ createEntry('exception'),
326
+ ]);
327
+ // Act
328
+ const stats = await storage.getStats();
329
+ // Assert
330
+ expect(stats.total).toBe(4);
331
+ expect(stats.byType.request).toBe(2);
332
+ expect(stats.byType.query).toBe(1);
333
+ expect(stats.byType.exception).toBe(1);
334
+ expect(stats.avgResponseTime).toBe(150);
335
+ expect(stats.slowQueries).toBe(1);
336
+ });
337
+ });
338
+ describe('getStorageStats', () => {
339
+ it('should return storage statistics', async () => {
340
+ // Arrange
341
+ await storage.saveBatch([createEntry('request'), createEntry('query')]);
342
+ // Act
343
+ const stats = await storage.getStorageStats();
344
+ // Assert
345
+ expect(stats.total).toBe(2);
346
+ expect(stats.oldestEntry).toBeDefined();
347
+ expect(stats.newestEntry).toBeDefined();
348
+ expect(stats.databaseSize).toBeUndefined(); // Memory storage doesn't have file size
349
+ });
350
+ });
351
+ // ==================== Pruning Tests ====================
352
+ describe('prune', () => {
353
+ it('should delete entries older than given date', async () => {
354
+ // Arrange
355
+ await storage.save(createEntry('request'));
356
+ // Wait a bit
357
+ await new Promise((resolve) => setTimeout(resolve, 10));
358
+ const cutoff = new Date();
359
+ await storage.save(createEntry('request'));
360
+ // Act
361
+ const deleted = await storage.prune(cutoff);
362
+ const remaining = await storage.count();
363
+ // Assert
364
+ expect(deleted).toBe(1);
365
+ expect(remaining).toBe(1);
366
+ });
367
+ });
368
+ describe('pruneByType', () => {
369
+ it('should delete entries of specific type older than given date', async () => {
370
+ // Arrange
371
+ await storage.save(createEntry('request'));
372
+ await storage.save(createEntry('query'));
373
+ await new Promise((resolve) => setTimeout(resolve, 10));
374
+ const cutoff = new Date();
375
+ await storage.save(createEntry('request'));
376
+ // Act
377
+ const deleted = await storage.pruneByType('request', cutoff);
378
+ const requestCount = await storage.count('request');
379
+ const queryCount = await storage.count('query');
380
+ // Assert
381
+ expect(deleted).toBe(1);
382
+ expect(requestCount).toBe(1);
383
+ expect(queryCount).toBe(1); // Query should remain
384
+ });
385
+ });
386
+ // ==================== Max Entries Tests ====================
387
+ describe('maxEntries enforcement', () => {
388
+ it('should remove oldest entries when max is exceeded', async () => {
389
+ // Arrange - create storage with small limit
390
+ const smallStorage = new memory_storage_1.MemoryStorage({ maxEntries: 5 });
391
+ await smallStorage.initialize();
392
+ // Save 7 entries
393
+ for (let i = 0; i < 7; i++) {
394
+ await smallStorage.save(createEntry('request', { index: i }));
395
+ }
396
+ // Act
397
+ const count = await smallStorage.count();
398
+ const entries = await smallStorage.find({});
399
+ // Assert
400
+ expect(count).toBe(5);
401
+ // Oldest entries (index 0, 1) should be removed
402
+ const indices = entries.map((e) => e.payload.index);
403
+ expect(indices).not.toContain(0);
404
+ expect(indices).not.toContain(1);
405
+ await smallStorage.close();
406
+ });
407
+ });
408
+ // ==================== Cursor Pagination Tests ====================
409
+ describe('findWithCursor', () => {
410
+ beforeEach(async () => {
411
+ for (let i = 0; i < 10; i++) {
412
+ await storage.save(createEntry('request', { index: i }));
413
+ }
414
+ });
415
+ it('should paginate with beforeSequence', async () => {
416
+ // Arrange
417
+ const all = await storage.find({});
418
+ const middleId = all[4].id;
419
+ // Act
420
+ const result = await storage.findWithCursor('request', {
421
+ beforeSequence: middleId,
422
+ limit: 3,
423
+ });
424
+ // Assert
425
+ expect(result.data).toHaveLength(3);
426
+ expect(result.data.every((e) => e.id < middleId)).toBe(true);
427
+ expect(result.meta.hasMore).toBe(true);
428
+ });
429
+ it('should paginate with afterSequence', async () => {
430
+ // Arrange
431
+ const all = await storage.find({});
432
+ const middleId = all[5].id;
433
+ // Act
434
+ const result = await storage.findWithCursor('request', {
435
+ afterSequence: middleId,
436
+ limit: 3,
437
+ });
438
+ // Assert
439
+ expect(result.data).toHaveLength(3);
440
+ expect(result.data.every((e) => e.id > middleId)).toBe(true);
441
+ });
442
+ it('should return total count', async () => {
443
+ // Act
444
+ const result = await storage.findWithCursor('request', { limit: 3 });
445
+ // Assert
446
+ expect(result.meta.total).toBe(10);
447
+ });
448
+ });
449
+ });
450
+ //# sourceMappingURL=memory.storage.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.storage.spec.js","sourceRoot":"","sources":["../../../../src/__tests__/core/storage/memory.storage.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Redis Storage Tests
3
+ *
4
+ * These tests verify the RedisStorage implementation using mocked Redis operations.
5
+ * Since RedisStorage uses dynamic imports, we test the class by:
6
+ * 1. Creating a testable subclass that allows injecting a mock client
7
+ * 2. Testing all public methods with the mock client
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=redis.storage.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.storage.spec.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/core/storage/redis.storage.spec.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}