nitrostack 1.0.73 → 1.0.74
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/dist/auth/__tests__/api-key.test.d.ts +2 -0
- package/dist/auth/__tests__/api-key.test.d.ts.map +1 -0
- package/dist/auth/__tests__/api-key.test.js +136 -0
- package/dist/auth/__tests__/api-key.test.js.map +1 -0
- package/dist/auth/__tests__/middleware.test.d.ts +2 -0
- package/dist/auth/__tests__/middleware.test.d.ts.map +1 -0
- package/dist/auth/__tests__/middleware.test.js +186 -0
- package/dist/auth/__tests__/middleware.test.js.map +1 -0
- package/dist/auth/__tests__/pkce.test.d.ts +2 -0
- package/dist/auth/__tests__/pkce.test.d.ts.map +1 -0
- package/dist/auth/__tests__/pkce.test.js +61 -0
- package/dist/auth/__tests__/pkce.test.js.map +1 -0
- package/dist/auth/__tests__/secure-secret.test.d.ts +2 -0
- package/dist/auth/__tests__/secure-secret.test.d.ts.map +1 -0
- package/dist/auth/__tests__/secure-secret.test.js +42 -0
- package/dist/auth/__tests__/secure-secret.test.js.map +1 -0
- package/dist/auth/__tests__/simple-jwt.test.d.ts +2 -0
- package/dist/auth/__tests__/simple-jwt.test.d.ts.map +1 -0
- package/dist/auth/__tests__/simple-jwt.test.js +68 -0
- package/dist/auth/__tests__/simple-jwt.test.js.map +1 -0
- package/dist/auth/__tests__/token-store.test.d.ts +2 -0
- package/dist/auth/__tests__/token-store.test.d.ts.map +1 -0
- package/dist/auth/__tests__/token-store.test.js +79 -0
- package/dist/auth/__tests__/token-store.test.js.map +1 -0
- package/dist/auth/__tests__/token-validation.test.d.ts +2 -0
- package/dist/auth/__tests__/token-validation.test.d.ts.map +1 -0
- package/dist/auth/__tests__/token-validation.test.js +23 -0
- package/dist/auth/__tests__/token-validation.test.js.map +1 -0
- package/dist/cli/__tests__/cli-dev.test.d.ts +2 -0
- package/dist/cli/__tests__/cli-dev.test.d.ts.map +1 -0
- package/dist/cli/__tests__/cli-dev.test.js +83 -0
- package/dist/cli/__tests__/cli-dev.test.js.map +1 -0
- package/dist/cli/__tests__/cli-start.test.d.ts +2 -0
- package/dist/cli/__tests__/cli-start.test.d.ts.map +1 -0
- package/dist/cli/__tests__/cli-start.test.js +61 -0
- package/dist/cli/__tests__/cli-start.test.js.map +1 -0
- package/dist/cli/__tests__/cli.test.d.ts +2 -0
- package/dist/cli/__tests__/cli.test.d.ts.map +1 -0
- package/dist/cli/__tests__/cli.test.js +73 -0
- package/dist/cli/__tests__/cli.test.js.map +1 -0
- package/dist/cli/__tests__/commands.test.d.ts +2 -0
- package/dist/cli/__tests__/commands.test.d.ts.map +1 -0
- package/dist/cli/__tests__/commands.test.js +64 -0
- package/dist/cli/__tests__/commands.test.js.map +1 -0
- package/dist/cli/index.d.ts +2 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +68 -45
- package/dist/cli/index.js.map +1 -1
- package/dist/core/__tests__/core-modules.test.d.ts +2 -0
- package/dist/core/__tests__/core-modules.test.d.ts.map +1 -0
- package/dist/core/__tests__/core-modules.test.js +36 -0
- package/dist/core/__tests__/core-modules.test.js.map +1 -0
- package/dist/core/__tests__/models.test.d.ts +2 -0
- package/dist/core/__tests__/models.test.d.ts.map +1 -0
- package/dist/core/__tests__/models.test.js +142 -0
- package/dist/core/__tests__/models.test.js.map +1 -0
- package/dist/core/__tests__/module.test.d.ts +2 -0
- package/dist/core/__tests__/module.test.d.ts.map +1 -0
- package/dist/core/__tests__/module.test.js +60 -0
- package/dist/core/__tests__/module.test.js.map +1 -0
- package/dist/core/__tests__/server.test.d.ts +2 -0
- package/dist/core/__tests__/server.test.d.ts.map +1 -0
- package/dist/core/__tests__/server.test.js +120 -0
- package/dist/core/__tests__/server.test.js.map +1 -0
- package/dist/core/__tests__/transports.test.d.ts +2 -0
- package/dist/core/__tests__/transports.test.d.ts.map +1 -0
- package/dist/core/__tests__/transports.test.js +12 -0
- package/dist/core/__tests__/transports.test.js.map +1 -0
- package/dist/core/decorators/__tests__/decorators.test.d.ts +2 -0
- package/dist/core/decorators/__tests__/decorators.test.d.ts.map +1 -0
- package/dist/core/decorators/__tests__/decorators.test.js +103 -0
- package/dist/core/decorators/__tests__/decorators.test.js.map +1 -0
- package/dist/core/decorators/__tests__/extended-decorators.test.d.ts +2 -0
- package/dist/core/decorators/__tests__/extended-decorators.test.d.ts.map +1 -0
- package/dist/core/decorators/__tests__/extended-decorators.test.js +194 -0
- package/dist/core/decorators/__tests__/extended-decorators.test.js.map +1 -0
- package/dist/core/di/__tests__/container.test.d.ts +2 -0
- package/dist/core/di/__tests__/container.test.d.ts.map +1 -0
- package/dist/core/di/__tests__/container.test.js +88 -0
- package/dist/core/di/__tests__/container.test.js.map +1 -0
- package/dist/core/events/__tests__/events.test.d.ts +2 -0
- package/dist/core/events/__tests__/events.test.d.ts.map +1 -0
- package/dist/core/events/__tests__/events.test.js +177 -0
- package/dist/core/events/__tests__/events.test.js.map +1 -0
- package/dist/core/filters/__tests__/filters.test.d.ts +2 -0
- package/dist/core/filters/__tests__/filters.test.d.ts.map +1 -0
- package/dist/core/filters/__tests__/filters.test.js +72 -0
- package/dist/core/filters/__tests__/filters.test.js.map +1 -0
- package/dist/core/guards/__tests__/guards.test.d.ts +2 -0
- package/dist/core/guards/__tests__/guards.test.d.ts.map +1 -0
- package/dist/core/guards/__tests__/guards.test.js +55 -0
- package/dist/core/guards/__tests__/guards.test.js.map +1 -0
- package/dist/core/health/__tests__/health.test.d.ts +2 -0
- package/dist/core/health/__tests__/health.test.d.ts.map +1 -0
- package/dist/core/health/__tests__/health.test.js +31 -0
- package/dist/core/health/__tests__/health.test.js.map +1 -0
- package/dist/core/interceptors/__tests__/interceptors.test.d.ts +2 -0
- package/dist/core/interceptors/__tests__/interceptors.test.d.ts.map +1 -0
- package/dist/core/interceptors/__tests__/interceptors.test.js +52 -0
- package/dist/core/interceptors/__tests__/interceptors.test.js.map +1 -0
- package/dist/core/middleware/__tests__/middleware.test.d.ts +2 -0
- package/dist/core/middleware/__tests__/middleware.test.d.ts.map +1 -0
- package/dist/core/middleware/__tests__/middleware.test.js +105 -0
- package/dist/core/middleware/__tests__/middleware.test.js.map +1 -0
- package/dist/core/pipes/__tests__/pipes.test.d.ts +2 -0
- package/dist/core/pipes/__tests__/pipes.test.d.ts.map +1 -0
- package/dist/core/pipes/__tests__/pipes.test.js +52 -0
- package/dist/core/pipes/__tests__/pipes.test.js.map +1 -0
- package/dist/core/transports/__tests__/transports.test.d.ts +2 -0
- package/dist/core/transports/__tests__/transports.test.d.ts.map +1 -0
- package/dist/core/transports/__tests__/transports.test.js +249 -0
- package/dist/core/transports/__tests__/transports.test.js.map +1 -0
- package/dist/core/widgets/__tests__/registry.test.d.ts +2 -0
- package/dist/core/widgets/__tests__/registry.test.d.ts.map +1 -0
- package/dist/core/widgets/__tests__/registry.test.js +69 -0
- package/dist/core/widgets/__tests__/registry.test.js.map +1 -0
- package/dist/testing/__tests__/testing.test.d.ts +2 -0
- package/dist/testing/__tests__/testing.test.d.ts.map +1 -0
- package/dist/testing/__tests__/testing.test.js +167 -0
- package/dist/testing/__tests__/testing.test.js.map +1 -0
- package/dist/testing/index.d.ts +0 -6
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/ui-next/__tests__/ui-next.test.d.ts +2 -0
- package/dist/ui-next/__tests__/ui-next.test.d.ts.map +1 -0
- package/dist/ui-next/__tests__/ui-next.test.js +74 -0
- package/dist/ui-next/__tests__/ui-next.test.js.map +1 -0
- package/dist/widgets/__tests__/utils.test.d.ts +2 -0
- package/dist/widgets/__tests__/utils.test.d.ts.map +1 -0
- package/dist/widgets/__tests__/utils.test.js +80 -0
- package/dist/widgets/__tests__/utils.test.js.map +1 -0
- package/dist/widgets/__tests__/widgets.test.d.ts +2 -0
- package/dist/widgets/__tests__/widgets.test.d.ts.map +1 -0
- package/dist/widgets/__tests__/widgets.test.js +245 -0
- package/dist/widgets/__tests__/widgets.test.js.map +1 -0
- package/package.json +1 -1
- package/src/studio/components/WidgetErrorBoundary.tsx +1 -0
- package/src/studio/components/ops/index.ts +1 -0
- package/src/studio/components/ops/nodes/index.ts +1 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { jest, describe, it, expect, beforeEach } from '@jest/globals';
|
|
11
|
+
import 'reflect-metadata';
|
|
12
|
+
// Cache Decorator Tests
|
|
13
|
+
import { Cache, getCacheMetadata, clearCache } from '../cache.decorator.js';
|
|
14
|
+
describe('Cache Decorator', () => {
|
|
15
|
+
beforeEach(async () => {
|
|
16
|
+
await clearCache();
|
|
17
|
+
});
|
|
18
|
+
it('should register cache metadata', () => {
|
|
19
|
+
class TestClass {
|
|
20
|
+
method() { }
|
|
21
|
+
}
|
|
22
|
+
__decorate([
|
|
23
|
+
Cache({ ttl: 60 }),
|
|
24
|
+
__metadata("design:type", Function),
|
|
25
|
+
__metadata("design:paramtypes", []),
|
|
26
|
+
__metadata("design:returntype", void 0)
|
|
27
|
+
], TestClass.prototype, "method", null);
|
|
28
|
+
const instance = new TestClass();
|
|
29
|
+
const metadata = getCacheMetadata(instance, 'method');
|
|
30
|
+
expect(metadata).toEqual(expect.objectContaining({ ttl: 60 }));
|
|
31
|
+
});
|
|
32
|
+
it('should cache method results', async () => {
|
|
33
|
+
const mockMethod = jest.fn((x) => x * 2);
|
|
34
|
+
class TestClass {
|
|
35
|
+
method(x) {
|
|
36
|
+
return mockMethod(x);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
__decorate([
|
|
40
|
+
Cache({ ttl: 100 }),
|
|
41
|
+
__metadata("design:type", Function),
|
|
42
|
+
__metadata("design:paramtypes", [Number]),
|
|
43
|
+
__metadata("design:returntype", void 0)
|
|
44
|
+
], TestClass.prototype, "method", null);
|
|
45
|
+
const instance = new TestClass();
|
|
46
|
+
// First call
|
|
47
|
+
const result1 = await instance.method(2);
|
|
48
|
+
expect(result1).toBe(4);
|
|
49
|
+
expect(mockMethod).toHaveBeenCalledTimes(1);
|
|
50
|
+
// Second call - should be cached
|
|
51
|
+
const result2 = await instance.method(2);
|
|
52
|
+
expect(result2).toBe(4);
|
|
53
|
+
expect(mockMethod).toHaveBeenCalledTimes(1);
|
|
54
|
+
// Different arg - should call method
|
|
55
|
+
const result3 = await instance.method(3);
|
|
56
|
+
expect(result3).toBe(6);
|
|
57
|
+
expect(mockMethod).toHaveBeenCalledTimes(2);
|
|
58
|
+
});
|
|
59
|
+
it('should respect TTL', async () => {
|
|
60
|
+
const mockMethod = jest.fn(() => 'value');
|
|
61
|
+
// Mock Date.now
|
|
62
|
+
const realNow = Date.now;
|
|
63
|
+
let currentTime = 1000;
|
|
64
|
+
Date.now = jest.fn(() => currentTime);
|
|
65
|
+
class TestClass {
|
|
66
|
+
method() { return mockMethod(); }
|
|
67
|
+
}
|
|
68
|
+
__decorate([
|
|
69
|
+
Cache({ ttl: 1 }) // 1 second TTL
|
|
70
|
+
,
|
|
71
|
+
__metadata("design:type", Function),
|
|
72
|
+
__metadata("design:paramtypes", []),
|
|
73
|
+
__metadata("design:returntype", void 0)
|
|
74
|
+
], TestClass.prototype, "method", null);
|
|
75
|
+
const instance = new TestClass();
|
|
76
|
+
await instance.method();
|
|
77
|
+
expect(mockMethod).toHaveBeenCalledTimes(1);
|
|
78
|
+
// Advance time past TTL
|
|
79
|
+
currentTime += 2000;
|
|
80
|
+
await instance.method();
|
|
81
|
+
expect(mockMethod).toHaveBeenCalledTimes(2);
|
|
82
|
+
// Cleanup
|
|
83
|
+
Date.now = realNow;
|
|
84
|
+
});
|
|
85
|
+
it('should generate keys using custom generator', async () => {
|
|
86
|
+
const mockMethod = jest.fn(() => 'k');
|
|
87
|
+
class TestClass {
|
|
88
|
+
method(i) { return mockMethod(); }
|
|
89
|
+
}
|
|
90
|
+
__decorate([
|
|
91
|
+
Cache({ ttl: 10, key: (i) => `key:${i}` }),
|
|
92
|
+
__metadata("design:type", Function),
|
|
93
|
+
__metadata("design:paramtypes", [Number]),
|
|
94
|
+
__metadata("design:returntype", void 0)
|
|
95
|
+
], TestClass.prototype, "method", null);
|
|
96
|
+
const instance = new TestClass();
|
|
97
|
+
await instance.method(1);
|
|
98
|
+
await instance.method(1);
|
|
99
|
+
expect(mockMethod).toHaveBeenCalledTimes(1);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
// RateLimit Decorator Tests
|
|
103
|
+
import { RateLimit, getRateLimitMetadata, resetRateLimit } from '../rate-limit.decorator.js';
|
|
104
|
+
describe('RateLimit Decorator', () => {
|
|
105
|
+
beforeEach(() => {
|
|
106
|
+
// Reset storage manually if needed, but we used different types mostly
|
|
107
|
+
// The implementation uses a defaultStorage that is exported indirectly via resetRateLimit
|
|
108
|
+
});
|
|
109
|
+
it('should register rate limit metadata', () => {
|
|
110
|
+
class TestClass {
|
|
111
|
+
method() { }
|
|
112
|
+
}
|
|
113
|
+
__decorate([
|
|
114
|
+
RateLimit({ requests: 5, window: '1m' }),
|
|
115
|
+
__metadata("design:type", Function),
|
|
116
|
+
__metadata("design:paramtypes", []),
|
|
117
|
+
__metadata("design:returntype", void 0)
|
|
118
|
+
], TestClass.prototype, "method", null);
|
|
119
|
+
const instance = new TestClass();
|
|
120
|
+
const metadata = getRateLimitMetadata(instance, 'method');
|
|
121
|
+
expect(metadata).toEqual(expect.objectContaining({ requests: 5, window: '1m' }));
|
|
122
|
+
});
|
|
123
|
+
it('should enforce limits', async () => {
|
|
124
|
+
class TestClass {
|
|
125
|
+
method() { return 'ok'; }
|
|
126
|
+
}
|
|
127
|
+
__decorate([
|
|
128
|
+
RateLimit({ requests: 2, window: '1m' }),
|
|
129
|
+
__metadata("design:type", Function),
|
|
130
|
+
__metadata("design:paramtypes", []),
|
|
131
|
+
__metadata("design:returntype", void 0)
|
|
132
|
+
], TestClass.prototype, "method", null);
|
|
133
|
+
const instance = new TestClass();
|
|
134
|
+
// Reset purely for test isolation in case of shared state
|
|
135
|
+
await resetRateLimit('TestClass:method:anonymous');
|
|
136
|
+
await expect(instance.method()).resolves.toBe('ok');
|
|
137
|
+
await expect(instance.method()).resolves.toBe('ok');
|
|
138
|
+
await expect(instance.method()).rejects.toThrow(/Rate limit exceeded/);
|
|
139
|
+
});
|
|
140
|
+
it('should parse window strings', () => {
|
|
141
|
+
// Indirectly testing via success
|
|
142
|
+
class TestClass {
|
|
143
|
+
method() { return 'ok'; }
|
|
144
|
+
}
|
|
145
|
+
__decorate([
|
|
146
|
+
RateLimit({ requests: 1, window: '1s' }),
|
|
147
|
+
__metadata("design:type", Function),
|
|
148
|
+
__metadata("design:paramtypes", []),
|
|
149
|
+
__metadata("design:returntype", void 0)
|
|
150
|
+
], TestClass.prototype, "method", null);
|
|
151
|
+
expect(getRateLimitMetadata(new TestClass(), 'method').window).toBe('1s');
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
// HealthCheck Decorator Tests
|
|
155
|
+
import { HealthCheck, registerHealthCheck, getAllHealthChecks, getOverallHealth, isHealthCheck } from '../health-check.decorator.js';
|
|
156
|
+
describe('HealthCheck Decorator', () => {
|
|
157
|
+
// Need to clear the global registry? It's not exposed well for clearing.
|
|
158
|
+
// We can just use unique names for tests.
|
|
159
|
+
it('should mark class as health check', () => {
|
|
160
|
+
let MyCheck = class MyCheck {
|
|
161
|
+
check() { return { status: 'up' }; }
|
|
162
|
+
};
|
|
163
|
+
MyCheck = __decorate([
|
|
164
|
+
HealthCheck({ name: 'test-hc' })
|
|
165
|
+
], MyCheck);
|
|
166
|
+
expect(isHealthCheck(MyCheck)).toBe(true);
|
|
167
|
+
});
|
|
168
|
+
it('should register and execute checks', async () => {
|
|
169
|
+
const checker = {
|
|
170
|
+
check: jest.fn().mockResolvedValue({ status: 'up' })
|
|
171
|
+
};
|
|
172
|
+
registerHealthCheck(checker, { name: 'reg-check' });
|
|
173
|
+
const results = await getAllHealthChecks();
|
|
174
|
+
expect(results['reg-check'].status).toBe('up');
|
|
175
|
+
expect(checker.check).toHaveBeenCalled();
|
|
176
|
+
});
|
|
177
|
+
it('should report overall health', async () => {
|
|
178
|
+
// Override with known state
|
|
179
|
+
const good = { check: () => ({ status: 'up' }) };
|
|
180
|
+
const bad = { check: () => ({ status: 'down' }) };
|
|
181
|
+
registerHealthCheck(good, { name: 'good' });
|
|
182
|
+
// At this point, if 'bad' from previous test exists?
|
|
183
|
+
// The registry is global module state.
|
|
184
|
+
// We might need to be careful.
|
|
185
|
+
// registerHealthCheck just sets in map.
|
|
186
|
+
// Let's rely on map overwrite.
|
|
187
|
+
registerHealthCheck(bad, { name: 'bad' });
|
|
188
|
+
const health = await getOverallHealth();
|
|
189
|
+
expect(health.status).toBe('unhealthy');
|
|
190
|
+
expect(health.checks['good'].status).toBe('up');
|
|
191
|
+
expect(health.checks['bad'].status).toBe('down');
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
//# sourceMappingURL=extended-decorators.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extended-decorators.test.js","sourceRoot":"","sources":["../../../../src/core/decorators/__tests__/extended-decorators.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container.test.d.ts","sourceRoot":"","sources":["../../../../src/core/di/__tests__/container.test.ts"],"names":[],"mappings":"AACA,OAAO,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { describe, it, expect, beforeEach } from '@jest/globals';
|
|
11
|
+
import 'reflect-metadata';
|
|
12
|
+
import { DIContainer } from '../container';
|
|
13
|
+
describe('DIContainer', () => {
|
|
14
|
+
let container;
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
container = DIContainer.getInstance();
|
|
17
|
+
container.clear();
|
|
18
|
+
});
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
container.clear();
|
|
21
|
+
});
|
|
22
|
+
it('should be a singleton', () => {
|
|
23
|
+
const instance1 = DIContainer.getInstance();
|
|
24
|
+
const instance2 = DIContainer.getInstance();
|
|
25
|
+
expect(instance1).toBe(instance2);
|
|
26
|
+
});
|
|
27
|
+
it('should register and resolve a class provider', () => {
|
|
28
|
+
class TestService {
|
|
29
|
+
getValue() { return 'test'; }
|
|
30
|
+
}
|
|
31
|
+
container.register(TestService);
|
|
32
|
+
const instance = container.resolve(TestService);
|
|
33
|
+
expect(instance).toBeInstanceOf(TestService);
|
|
34
|
+
expect(instance.getValue()).toBe('test');
|
|
35
|
+
});
|
|
36
|
+
it('should return the same instance for singleton scope', () => {
|
|
37
|
+
class TestService {
|
|
38
|
+
}
|
|
39
|
+
container.register(TestService);
|
|
40
|
+
const instance1 = container.resolve(TestService);
|
|
41
|
+
const instance2 = container.resolve(TestService);
|
|
42
|
+
expect(instance1).toBe(instance2);
|
|
43
|
+
});
|
|
44
|
+
it('should register and resolve a value provider', () => {
|
|
45
|
+
const token = 'CONFIG';
|
|
46
|
+
const value = { apiKey: '123' };
|
|
47
|
+
container.registerValue(token, value);
|
|
48
|
+
const resolved = container.resolve(token);
|
|
49
|
+
expect(resolved).toBe(value);
|
|
50
|
+
});
|
|
51
|
+
it('should resolve dependencies recursively', () => {
|
|
52
|
+
class DepService {
|
|
53
|
+
getName() { return 'dep'; }
|
|
54
|
+
}
|
|
55
|
+
// We need to simulate metadata decoration or manually register generic class dependency
|
|
56
|
+
// Since we can't easily mock Reflect.metadata in the test without the decorator,
|
|
57
|
+
// we can assume the container works if we verify basic registration.
|
|
58
|
+
// However, for true integration, let's use a mock decorator approach or manual setup.
|
|
59
|
+
// Simulating @Injectable() behavior manually for the test environment
|
|
60
|
+
const Injectable = () => {
|
|
61
|
+
return (target) => { };
|
|
62
|
+
};
|
|
63
|
+
let ParentService = class ParentService {
|
|
64
|
+
dep;
|
|
65
|
+
constructor(dep) {
|
|
66
|
+
this.dep = dep;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
ParentService = __decorate([
|
|
70
|
+
Injectable(),
|
|
71
|
+
__metadata("design:paramtypes", [DepService])
|
|
72
|
+
], ParentService);
|
|
73
|
+
// Polyfill metadata for the test
|
|
74
|
+
Reflect.defineMetadata('design:paramtypes', [DepService], ParentService);
|
|
75
|
+
container.register(DepService);
|
|
76
|
+
container.register(ParentService);
|
|
77
|
+
const parent = container.resolve(ParentService);
|
|
78
|
+
expect(parent).toBeInstanceOf(ParentService);
|
|
79
|
+
expect(parent.dep).toBeInstanceOf(DepService);
|
|
80
|
+
expect(parent.dep.getName()).toBe('dep');
|
|
81
|
+
});
|
|
82
|
+
it('should throw error when resolving unregistered token', () => {
|
|
83
|
+
expect(() => {
|
|
84
|
+
container.resolve('UNREGISTERED');
|
|
85
|
+
}).toThrow(/Cannot resolve token/);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=container.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container.test.js","sourceRoot":"","sources":["../../../../src/core/di/__tests__/container.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.test.d.ts","sourceRoot":"","sources":["../../../../src/core/events/__tests__/events.test.ts"],"names":[],"mappings":"AACA,OAAO,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { jest, describe, it, expect, beforeEach, afterEach } from '@jest/globals';
|
|
11
|
+
import 'reflect-metadata';
|
|
12
|
+
import { EventEmitter } from '../event-emitter.js';
|
|
13
|
+
import { OnEvent } from '../event.decorator.js';
|
|
14
|
+
describe('Events Module', () => {
|
|
15
|
+
describe('EventEmitter', () => {
|
|
16
|
+
let eventEmitter;
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
eventEmitter = EventEmitter.getInstance();
|
|
19
|
+
eventEmitter.removeAllListeners();
|
|
20
|
+
});
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
eventEmitter.removeAllListeners();
|
|
23
|
+
});
|
|
24
|
+
it('should be a singleton', () => {
|
|
25
|
+
const instance1 = EventEmitter.getInstance();
|
|
26
|
+
const instance2 = EventEmitter.getInstance();
|
|
27
|
+
expect(instance1).toBe(instance2);
|
|
28
|
+
});
|
|
29
|
+
it('should emit and listen to events', () => {
|
|
30
|
+
const callback = jest.fn();
|
|
31
|
+
eventEmitter.on('test-event', callback);
|
|
32
|
+
eventEmitter.emit('test-event', { data: 'test' });
|
|
33
|
+
expect(callback).toHaveBeenCalledWith({ data: 'test' });
|
|
34
|
+
});
|
|
35
|
+
it('should handle multiple listeners', () => {
|
|
36
|
+
const callback1 = jest.fn();
|
|
37
|
+
const callback2 = jest.fn();
|
|
38
|
+
eventEmitter.on('multi-event', callback1);
|
|
39
|
+
eventEmitter.on('multi-event', callback2);
|
|
40
|
+
eventEmitter.emit('multi-event', 'payload');
|
|
41
|
+
expect(callback1).toHaveBeenCalledWith('payload');
|
|
42
|
+
expect(callback2).toHaveBeenCalledWith('payload');
|
|
43
|
+
});
|
|
44
|
+
it('should remove listener with off()', () => {
|
|
45
|
+
const callback = jest.fn();
|
|
46
|
+
eventEmitter.on('removable-event', callback);
|
|
47
|
+
eventEmitter.emit('removable-event', 'first');
|
|
48
|
+
expect(callback).toHaveBeenCalledTimes(1);
|
|
49
|
+
eventEmitter.off('removable-event', callback);
|
|
50
|
+
eventEmitter.emit('removable-event', 'second');
|
|
51
|
+
expect(callback).toHaveBeenCalledTimes(1);
|
|
52
|
+
});
|
|
53
|
+
it('should handle off() for non-existent event', () => {
|
|
54
|
+
const callback = jest.fn();
|
|
55
|
+
// Should not throw
|
|
56
|
+
eventEmitter.off('non-existent', callback);
|
|
57
|
+
});
|
|
58
|
+
it('should handle off() for non-existent listener', () => {
|
|
59
|
+
const callback1 = jest.fn();
|
|
60
|
+
const callback2 = jest.fn();
|
|
61
|
+
eventEmitter.on('some-event', callback1);
|
|
62
|
+
// Should not throw
|
|
63
|
+
eventEmitter.off('some-event', callback2);
|
|
64
|
+
// Original listener should still work
|
|
65
|
+
eventEmitter.emit('some-event', 'test');
|
|
66
|
+
expect(callback1).toHaveBeenCalled();
|
|
67
|
+
});
|
|
68
|
+
it('should support once() for one-time listeners', async () => {
|
|
69
|
+
const callback = jest.fn();
|
|
70
|
+
eventEmitter.once('once-event', callback);
|
|
71
|
+
await eventEmitter.emit('once-event', 'first');
|
|
72
|
+
await eventEmitter.emit('once-event', 'second');
|
|
73
|
+
expect(callback).toHaveBeenCalledTimes(1);
|
|
74
|
+
expect(callback).toHaveBeenCalledWith('first');
|
|
75
|
+
});
|
|
76
|
+
it('should emit synchronously with emitSync()', () => {
|
|
77
|
+
const callback = jest.fn();
|
|
78
|
+
eventEmitter.on('sync-event', callback);
|
|
79
|
+
eventEmitter.emitSync('sync-event', 'sync-payload');
|
|
80
|
+
expect(callback).toHaveBeenCalledWith('sync-payload');
|
|
81
|
+
});
|
|
82
|
+
it('should removeAllListeners for specific event', () => {
|
|
83
|
+
const callback1 = jest.fn();
|
|
84
|
+
const callback2 = jest.fn();
|
|
85
|
+
eventEmitter.on('event1', callback1);
|
|
86
|
+
eventEmitter.on('event2', callback2);
|
|
87
|
+
eventEmitter.removeAllListeners('event1');
|
|
88
|
+
eventEmitter.emit('event1', 'test1');
|
|
89
|
+
eventEmitter.emit('event2', 'test2');
|
|
90
|
+
expect(callback1).not.toHaveBeenCalled();
|
|
91
|
+
expect(callback2).toHaveBeenCalledWith('test2');
|
|
92
|
+
});
|
|
93
|
+
it('should removeAllListeners for all events', () => {
|
|
94
|
+
const callback1 = jest.fn();
|
|
95
|
+
const callback2 = jest.fn();
|
|
96
|
+
eventEmitter.on('event1', callback1);
|
|
97
|
+
eventEmitter.on('event2', callback2);
|
|
98
|
+
eventEmitter.removeAllListeners();
|
|
99
|
+
eventEmitter.emit('event1', 'test1');
|
|
100
|
+
eventEmitter.emit('event2', 'test2');
|
|
101
|
+
expect(callback1).not.toHaveBeenCalled();
|
|
102
|
+
expect(callback2).not.toHaveBeenCalled();
|
|
103
|
+
});
|
|
104
|
+
it('should return listenerCount', () => {
|
|
105
|
+
const callback1 = jest.fn();
|
|
106
|
+
const callback2 = jest.fn();
|
|
107
|
+
expect(eventEmitter.listenerCount('count-event')).toBe(0);
|
|
108
|
+
eventEmitter.on('count-event', callback1);
|
|
109
|
+
expect(eventEmitter.listenerCount('count-event')).toBe(1);
|
|
110
|
+
eventEmitter.on('count-event', callback2);
|
|
111
|
+
expect(eventEmitter.listenerCount('count-event')).toBe(2);
|
|
112
|
+
});
|
|
113
|
+
it('should return eventNames', () => {
|
|
114
|
+
const callback = jest.fn();
|
|
115
|
+
eventEmitter.on('event-a', callback);
|
|
116
|
+
eventEmitter.on('event-b', callback);
|
|
117
|
+
eventEmitter.on('event-c', callback);
|
|
118
|
+
const names = eventEmitter.eventNames();
|
|
119
|
+
expect(names).toContain('event-a');
|
|
120
|
+
expect(names).toContain('event-b');
|
|
121
|
+
expect(names).toContain('event-c');
|
|
122
|
+
expect(names).toHaveLength(3);
|
|
123
|
+
});
|
|
124
|
+
it('should handle emit with no listeners', async () => {
|
|
125
|
+
// Should not throw
|
|
126
|
+
await eventEmitter.emit('no-listeners', 'data');
|
|
127
|
+
});
|
|
128
|
+
it('should handle emitSync with no listeners', () => {
|
|
129
|
+
// Should not throw
|
|
130
|
+
eventEmitter.emitSync('no-listeners-sync', 'data');
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
describe('@OnEvent Decorator', () => {
|
|
134
|
+
it('should register event listener metadata', () => {
|
|
135
|
+
const callback = jest.fn();
|
|
136
|
+
class TestListener {
|
|
137
|
+
handleEvent(payload) {
|
|
138
|
+
callback(payload);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
__decorate([
|
|
142
|
+
OnEvent('decorator-event'),
|
|
143
|
+
__metadata("design:type", Function),
|
|
144
|
+
__metadata("design:paramtypes", [Object]),
|
|
145
|
+
__metadata("design:returntype", void 0)
|
|
146
|
+
], TestListener.prototype, "handleEvent", null);
|
|
147
|
+
const instance = new TestListener();
|
|
148
|
+
const key = 'nitrostack:event_handler';
|
|
149
|
+
const metadata = Reflect.getMetadata(key, instance.constructor);
|
|
150
|
+
expect(metadata).toEqual([{ event: 'decorator-event', methodName: 'handleEvent' }]);
|
|
151
|
+
});
|
|
152
|
+
it('should register multiple event handlers', () => {
|
|
153
|
+
class MultiHandler {
|
|
154
|
+
handleOne(payload) { }
|
|
155
|
+
handleTwo(payload) { }
|
|
156
|
+
}
|
|
157
|
+
__decorate([
|
|
158
|
+
OnEvent('event-one'),
|
|
159
|
+
__metadata("design:type", Function),
|
|
160
|
+
__metadata("design:paramtypes", [Object]),
|
|
161
|
+
__metadata("design:returntype", void 0)
|
|
162
|
+
], MultiHandler.prototype, "handleOne", null);
|
|
163
|
+
__decorate([
|
|
164
|
+
OnEvent('event-two'),
|
|
165
|
+
__metadata("design:type", Function),
|
|
166
|
+
__metadata("design:paramtypes", [Object]),
|
|
167
|
+
__metadata("design:returntype", void 0)
|
|
168
|
+
], MultiHandler.prototype, "handleTwo", null);
|
|
169
|
+
const key = 'nitrostack:event_handler';
|
|
170
|
+
const metadata = Reflect.getMetadata(key, MultiHandler);
|
|
171
|
+
expect(metadata).toHaveLength(2);
|
|
172
|
+
expect(metadata).toContainEqual({ event: 'event-one', methodName: 'handleOne' });
|
|
173
|
+
expect(metadata).toContainEqual({ event: 'event-two', methodName: 'handleTwo' });
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
//# sourceMappingURL=events.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.test.js","sourceRoot":"","sources":["../../../../src/core/events/__tests__/events.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.test.d.ts","sourceRoot":"","sources":["../../../../src/core/filters/__tests__/filters.test.ts"],"names":[],"mappings":"AACA,OAAO,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { describe, it, expect } from '@jest/globals';
|
|
11
|
+
import 'reflect-metadata';
|
|
12
|
+
import { UseFilters, getExceptionFilterMetadata } from '../exception-filter.decorator';
|
|
13
|
+
// Verify what was actually exported
|
|
14
|
+
// The previous view showed:
|
|
15
|
+
// export const EXCEPTION_FILTERS_METADATA = Symbol('filters:exception');
|
|
16
|
+
// export function UseFilters(...filters: ExceptionFilterConstructor[]) ...
|
|
17
|
+
// export function getExceptionFiltersMetadata(target: object, methodName: string): ExceptionFilterConstructor[] ...
|
|
18
|
+
// And interface:
|
|
19
|
+
// export interface ExceptionFilter<T = any> { catch(exception: T, host: ArgumentsHost): void; }
|
|
20
|
+
// Wait, the lint said "Module ... has no exported member 'ExceptionFilter'".
|
|
21
|
+
// Maybe I missed something in view_file 384 output? No output was shown for view_file there?
|
|
22
|
+
// Ah, I viewed file 387 in step 387 but didn't see content?
|
|
23
|
+
// In Step 387/388/389 I listed dir and wrote file. I didn't actually READ the filter interface file content in the prompt history I have.
|
|
24
|
+
// I requested view_file in step 401 (this step).
|
|
25
|
+
// I will see the content NOW. So I should wait for output before replace?
|
|
26
|
+
// But I can guess or try to start pipe test.
|
|
27
|
+
// Actually I am in step 401 generation. I can't read the file yet.
|
|
28
|
+
// I will blindly assume I need to read first.
|
|
29
|
+
// Oh wait, I am generating 401. I requested view_file.
|
|
30
|
+
// I can't do replace_file_content immediately if I rely on that info.
|
|
31
|
+
// But I can queue it if I am confident.
|
|
32
|
+
// I'll wait.
|
|
33
|
+
describe('Filters Module', () => {
|
|
34
|
+
describe('@UseFilters Decorator', () => {
|
|
35
|
+
it('should register filters metadata', () => {
|
|
36
|
+
class MockFilter {
|
|
37
|
+
catch(exception, host) { }
|
|
38
|
+
}
|
|
39
|
+
class TestController {
|
|
40
|
+
method() { }
|
|
41
|
+
}
|
|
42
|
+
__decorate([
|
|
43
|
+
UseFilters(MockFilter),
|
|
44
|
+
__metadata("design:type", Function),
|
|
45
|
+
__metadata("design:paramtypes", []),
|
|
46
|
+
__metadata("design:returntype", void 0)
|
|
47
|
+
], TestController.prototype, "method", null);
|
|
48
|
+
const metadata = getExceptionFilterMetadata(TestController.prototype, 'method');
|
|
49
|
+
expect(metadata).toEqual([MockFilter]);
|
|
50
|
+
});
|
|
51
|
+
it('should register multiple filters', () => {
|
|
52
|
+
class Filter1 {
|
|
53
|
+
catch() { }
|
|
54
|
+
}
|
|
55
|
+
class Filter2 {
|
|
56
|
+
catch() { }
|
|
57
|
+
}
|
|
58
|
+
class TestController {
|
|
59
|
+
method() { }
|
|
60
|
+
}
|
|
61
|
+
__decorate([
|
|
62
|
+
UseFilters(Filter1, Filter2),
|
|
63
|
+
__metadata("design:type", Function),
|
|
64
|
+
__metadata("design:paramtypes", []),
|
|
65
|
+
__metadata("design:returntype", void 0)
|
|
66
|
+
], TestController.prototype, "method", null);
|
|
67
|
+
const metadata = getExceptionFilterMetadata(TestController.prototype, 'method');
|
|
68
|
+
expect(metadata).toEqual([Filter1, Filter2]);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=filters.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.test.js","sourceRoot":"","sources":["../../../../src/core/filters/__tests__/filters.test.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAQ,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAGvF,oCAAoC;AACpC,4BAA4B;AAC5B,yEAAyE;AACzE,2EAA2E;AAC3E,oHAAoH;AAEpH,iBAAiB;AACjB,gGAAgG;AAEhG,6EAA6E;AAC7E,6FAA6F;AAC7F,4DAA4D;AAC5D,0IAA0I;AAC1I,iDAAiD;AACjD,0EAA0E;AAC1E,6CAA6C;AAC7C,mEAAmE;AACnE,8CAA8C;AAE9C,uDAAuD;AACvD,sEAAsE;AACtE,wCAAwC;AACxC,aAAa;AAGb,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YACxC,MAAM,UAAU;gBACZ,KAAK,CAAC,SAAkB,EAAE,IAAS,IAAI,CAAC;aAC3C;YAED,MAAM,cAAc;gBAEhB,MAAM,KAAK,CAAC;aACf;YADG;gBADC,UAAU,CAAC,UAAU,CAAC;;;;wDACX;YAGhB,MAAM,QAAQ,GAAG,0BAA0B,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAChF,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YACxC,MAAM,OAAO;gBAAuC,KAAK,KAAK,CAAC;aAAE;YACjE,MAAM,OAAO;gBAAuC,KAAK,KAAK,CAAC;aAAE;YAEjE,MAAM,cAAc;gBAEhB,MAAM,KAAK,CAAC;aACf;YADG;gBADC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC;;;;wDACjB;YAGhB,MAAM,QAAQ,GAAG,0BAA0B,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAChF,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guards.test.d.ts","sourceRoot":"","sources":["../../../../src/core/guards/__tests__/guards.test.ts"],"names":[],"mappings":"AACA,OAAO,kBAAkB,CAAC"}
|