@hazeljs/core 0.2.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +522 -0
- package/dist/__tests__/container.test.d.ts +2 -0
- package/dist/__tests__/container.test.d.ts.map +1 -0
- package/dist/__tests__/container.test.js +454 -0
- package/dist/__tests__/decorators.test.d.ts +2 -0
- package/dist/__tests__/decorators.test.d.ts.map +1 -0
- package/dist/__tests__/decorators.test.js +693 -0
- package/dist/__tests__/errors/http.error.test.d.ts +2 -0
- package/dist/__tests__/errors/http.error.test.d.ts.map +1 -0
- package/dist/__tests__/errors/http.error.test.js +117 -0
- package/dist/__tests__/filters/exception-filter.test.d.ts +2 -0
- package/dist/__tests__/filters/exception-filter.test.d.ts.map +1 -0
- package/dist/__tests__/filters/exception-filter.test.js +135 -0
- package/dist/__tests__/filters/http-exception.filter.test.d.ts +2 -0
- package/dist/__tests__/filters/http-exception.filter.test.d.ts.map +1 -0
- package/dist/__tests__/filters/http-exception.filter.test.js +119 -0
- package/dist/__tests__/hazel-app.test.d.ts +2 -0
- package/dist/__tests__/hazel-app.test.d.ts.map +1 -0
- package/dist/__tests__/hazel-app.test.js +682 -0
- package/dist/__tests__/hazel-module.test.d.ts +2 -0
- package/dist/__tests__/hazel-module.test.d.ts.map +1 -0
- package/dist/__tests__/hazel-module.test.js +408 -0
- package/dist/__tests__/hazel-response.test.d.ts +2 -0
- package/dist/__tests__/hazel-response.test.d.ts.map +1 -0
- package/dist/__tests__/hazel-response.test.js +138 -0
- package/dist/__tests__/health.test.d.ts +2 -0
- package/dist/__tests__/health.test.d.ts.map +1 -0
- package/dist/__tests__/health.test.js +147 -0
- package/dist/__tests__/index.test.d.ts +2 -0
- package/dist/__tests__/index.test.d.ts.map +1 -0
- package/dist/__tests__/index.test.js +239 -0
- package/dist/__tests__/interceptors/interceptor.test.d.ts +2 -0
- package/dist/__tests__/interceptors/interceptor.test.d.ts.map +1 -0
- package/dist/__tests__/interceptors/interceptor.test.js +166 -0
- package/dist/__tests__/logger.test.d.ts +2 -0
- package/dist/__tests__/logger.test.d.ts.map +1 -0
- package/dist/__tests__/logger.test.js +141 -0
- package/dist/__tests__/middleware/cors.test.d.ts +2 -0
- package/dist/__tests__/middleware/cors.test.d.ts.map +1 -0
- package/dist/__tests__/middleware/cors.test.js +129 -0
- package/dist/__tests__/middleware/csrf.test.d.ts +2 -0
- package/dist/__tests__/middleware/csrf.test.d.ts.map +1 -0
- package/dist/__tests__/middleware/csrf.test.js +247 -0
- package/dist/__tests__/middleware/global-middleware.test.d.ts +2 -0
- package/dist/__tests__/middleware/global-middleware.test.d.ts.map +1 -0
- package/dist/__tests__/middleware/global-middleware.test.js +259 -0
- package/dist/__tests__/middleware/rate-limit.test.d.ts +2 -0
- package/dist/__tests__/middleware/rate-limit.test.d.ts.map +1 -0
- package/dist/__tests__/middleware/rate-limit.test.js +264 -0
- package/dist/__tests__/middleware/security-headers.test.d.ts +2 -0
- package/dist/__tests__/middleware/security-headers.test.d.ts.map +1 -0
- package/dist/__tests__/middleware/security-headers.test.js +229 -0
- package/dist/__tests__/middleware/timeout.test.d.ts +2 -0
- package/dist/__tests__/middleware/timeout.test.d.ts.map +1 -0
- package/dist/__tests__/middleware/timeout.test.js +132 -0
- package/dist/__tests__/middleware.test.d.ts +2 -0
- package/dist/__tests__/middleware.test.d.ts.map +1 -0
- package/dist/__tests__/middleware.test.js +180 -0
- package/dist/__tests__/pipes/pipe.test.d.ts +2 -0
- package/dist/__tests__/pipes/pipe.test.d.ts.map +1 -0
- package/dist/__tests__/pipes/pipe.test.js +245 -0
- package/dist/__tests__/pipes/validation.pipe.test.d.ts +2 -0
- package/dist/__tests__/pipes/validation.pipe.test.d.ts.map +1 -0
- package/dist/__tests__/pipes/validation.pipe.test.js +297 -0
- package/dist/__tests__/request-parser.test.d.ts +2 -0
- package/dist/__tests__/request-parser.test.d.ts.map +1 -0
- package/dist/__tests__/request-parser.test.js +182 -0
- package/dist/__tests__/router.test.d.ts +2 -0
- package/dist/__tests__/router.test.d.ts.map +1 -0
- package/dist/__tests__/router.test.js +680 -0
- package/dist/__tests__/routing/route-matcher.test.d.ts +2 -0
- package/dist/__tests__/routing/route-matcher.test.d.ts.map +1 -0
- package/dist/__tests__/routing/route-matcher.test.js +219 -0
- package/dist/__tests__/routing/version.decorator.test.d.ts +2 -0
- package/dist/__tests__/routing/version.decorator.test.d.ts.map +1 -0
- package/dist/__tests__/routing/version.decorator.test.js +298 -0
- package/dist/__tests__/service.test.d.ts +2 -0
- package/dist/__tests__/service.test.d.ts.map +1 -0
- package/dist/__tests__/service.test.js +121 -0
- package/dist/__tests__/shutdown.test.d.ts +2 -0
- package/dist/__tests__/shutdown.test.d.ts.map +1 -0
- package/dist/__tests__/shutdown.test.js +250 -0
- package/dist/__tests__/testing/testing.module.test.d.ts +2 -0
- package/dist/__tests__/testing/testing.module.test.d.ts.map +1 -0
- package/dist/__tests__/testing/testing.module.test.js +370 -0
- package/dist/__tests__/upload/file-upload.test.d.ts +2 -0
- package/dist/__tests__/upload/file-upload.test.d.ts.map +1 -0
- package/dist/__tests__/upload/file-upload.test.js +498 -0
- package/dist/__tests__/utils/sanitize.test.d.ts +2 -0
- package/dist/__tests__/utils/sanitize.test.d.ts.map +1 -0
- package/dist/__tests__/utils/sanitize.test.js +291 -0
- package/dist/__tests__/validator.test.d.ts +2 -0
- package/dist/__tests__/validator.test.d.ts.map +1 -0
- package/dist/__tests__/validator.test.js +300 -0
- package/dist/container.d.ts +80 -0
- package/dist/container.d.ts.map +1 -0
- package/dist/container.js +271 -0
- package/dist/decorators.d.ts +92 -0
- package/dist/decorators.d.ts.map +1 -0
- package/dist/decorators.js +343 -0
- package/dist/errors/http.error.d.ts +31 -0
- package/dist/errors/http.error.d.ts.map +1 -0
- package/dist/errors/http.error.js +62 -0
- package/dist/filters/exception-filter.d.ts +39 -0
- package/dist/filters/exception-filter.d.ts.map +1 -0
- package/dist/filters/exception-filter.js +38 -0
- package/dist/filters/http-exception.filter.d.ts +9 -0
- package/dist/filters/http-exception.filter.d.ts.map +1 -0
- package/dist/filters/http-exception.filter.js +42 -0
- package/dist/hazel-app.d.ts +78 -0
- package/dist/hazel-app.d.ts.map +1 -0
- package/dist/hazel-app.js +453 -0
- package/dist/hazel-module.d.ts +20 -0
- package/dist/hazel-module.d.ts.map +1 -0
- package/dist/hazel-module.js +109 -0
- package/dist/hazel-response.d.ts +20 -0
- package/dist/hazel-response.d.ts.map +1 -0
- package/dist/hazel-response.js +68 -0
- package/dist/health.d.ts +73 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +174 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +140 -0
- package/dist/interceptors/interceptor.d.ts +22 -0
- package/dist/interceptors/interceptor.d.ts.map +1 -0
- package/dist/interceptors/interceptor.js +46 -0
- package/dist/logger.d.ts +8 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +238 -0
- package/dist/middleware/cors.middleware.d.ts +44 -0
- package/dist/middleware/cors.middleware.d.ts.map +1 -0
- package/dist/middleware/cors.middleware.js +118 -0
- package/dist/middleware/csrf.middleware.d.ts +82 -0
- package/dist/middleware/csrf.middleware.d.ts.map +1 -0
- package/dist/middleware/csrf.middleware.js +183 -0
- package/dist/middleware/global-middleware.d.ts +111 -0
- package/dist/middleware/global-middleware.d.ts.map +1 -0
- package/dist/middleware/global-middleware.js +179 -0
- package/dist/middleware/rate-limit.middleware.d.ts +73 -0
- package/dist/middleware/rate-limit.middleware.d.ts.map +1 -0
- package/dist/middleware/rate-limit.middleware.js +124 -0
- package/dist/middleware/security-headers.middleware.d.ts +76 -0
- package/dist/middleware/security-headers.middleware.d.ts.map +1 -0
- package/dist/middleware/security-headers.middleware.js +123 -0
- package/dist/middleware/timeout.middleware.d.ts +25 -0
- package/dist/middleware/timeout.middleware.d.ts.map +1 -0
- package/dist/middleware/timeout.middleware.js +74 -0
- package/dist/middleware.d.ts +13 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +47 -0
- package/dist/pipes/pipe.d.ts +50 -0
- package/dist/pipes/pipe.d.ts.map +1 -0
- package/dist/pipes/pipe.js +96 -0
- package/dist/pipes/validation.pipe.d.ts +6 -0
- package/dist/pipes/validation.pipe.d.ts.map +1 -0
- package/dist/pipes/validation.pipe.js +61 -0
- package/dist/request-context.d.ts +17 -0
- package/dist/request-context.d.ts.map +1 -0
- package/dist/request-context.js +2 -0
- package/dist/request-parser.d.ts +7 -0
- package/dist/request-parser.d.ts.map +1 -0
- package/dist/request-parser.js +60 -0
- package/dist/router.d.ts +33 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +426 -0
- package/dist/routing/route-matcher.d.ts +39 -0
- package/dist/routing/route-matcher.d.ts.map +1 -0
- package/dist/routing/route-matcher.js +93 -0
- package/dist/routing/version.decorator.d.ts +36 -0
- package/dist/routing/version.decorator.d.ts.map +1 -0
- package/dist/routing/version.decorator.js +89 -0
- package/dist/service.d.ts +9 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +39 -0
- package/dist/shutdown.d.ts +32 -0
- package/dist/shutdown.d.ts.map +1 -0
- package/dist/shutdown.js +109 -0
- package/dist/testing/testing.module.d.ts +83 -0
- package/dist/testing/testing.module.d.ts.map +1 -0
- package/dist/testing/testing.module.js +164 -0
- package/dist/types.d.ts +76 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/upload/file-upload.d.ts +75 -0
- package/dist/upload/file-upload.d.ts.map +1 -0
- package/dist/upload/file-upload.js +261 -0
- package/dist/utils/sanitize.d.ts +45 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/sanitize.js +165 -0
- package/dist/validator.d.ts +7 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +119 -0
- package/package.json +65 -0
|
@@ -0,0 +1,408 @@
|
|
|
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
|
+
const hazel_module_1 = require("../hazel-module");
|
|
10
|
+
require("reflect-metadata");
|
|
11
|
+
// Mock logger
|
|
12
|
+
jest.mock('../logger', () => ({
|
|
13
|
+
debug: jest.fn(),
|
|
14
|
+
info: jest.fn(),
|
|
15
|
+
warn: jest.fn(),
|
|
16
|
+
error: jest.fn(),
|
|
17
|
+
isDebugEnabled: jest.fn().mockReturnValue(false),
|
|
18
|
+
}));
|
|
19
|
+
// Mock container
|
|
20
|
+
jest.mock('../container', () => {
|
|
21
|
+
const actualContainer = jest.requireActual('../container');
|
|
22
|
+
return {
|
|
23
|
+
...actualContainer,
|
|
24
|
+
Container: {
|
|
25
|
+
getInstance: jest.fn(() => actualContainer.Container.createTestInstance()),
|
|
26
|
+
createTestInstance: actualContainer.Container.createTestInstance,
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
describe('HazelModule', () => {
|
|
31
|
+
describe('HazelModule decorator', () => {
|
|
32
|
+
it('should set module metadata', () => {
|
|
33
|
+
let TestModule = class TestModule {
|
|
34
|
+
};
|
|
35
|
+
TestModule = __decorate([
|
|
36
|
+
(0, hazel_module_1.HazelModule)({
|
|
37
|
+
controllers: [],
|
|
38
|
+
providers: [],
|
|
39
|
+
})
|
|
40
|
+
], TestModule);
|
|
41
|
+
const metadata = (0, hazel_module_1.getModuleMetadata)(TestModule);
|
|
42
|
+
expect(metadata).toBeDefined();
|
|
43
|
+
expect(metadata?.controllers).toEqual([]);
|
|
44
|
+
expect(metadata?.providers).toEqual([]);
|
|
45
|
+
});
|
|
46
|
+
it('should set metadata with imports', () => {
|
|
47
|
+
class ImportedModule {
|
|
48
|
+
}
|
|
49
|
+
let TestModule = class TestModule {
|
|
50
|
+
};
|
|
51
|
+
TestModule = __decorate([
|
|
52
|
+
(0, hazel_module_1.HazelModule)({
|
|
53
|
+
imports: [ImportedModule],
|
|
54
|
+
})
|
|
55
|
+
], TestModule);
|
|
56
|
+
const metadata = (0, hazel_module_1.getModuleMetadata)(TestModule);
|
|
57
|
+
expect(metadata?.imports).toEqual([ImportedModule]);
|
|
58
|
+
});
|
|
59
|
+
it('should set metadata with exports', () => {
|
|
60
|
+
class ExportedService {
|
|
61
|
+
}
|
|
62
|
+
let TestModule = class TestModule {
|
|
63
|
+
};
|
|
64
|
+
TestModule = __decorate([
|
|
65
|
+
(0, hazel_module_1.HazelModule)({
|
|
66
|
+
exports: [ExportedService],
|
|
67
|
+
})
|
|
68
|
+
], TestModule);
|
|
69
|
+
const metadata = (0, hazel_module_1.getModuleMetadata)(TestModule);
|
|
70
|
+
expect(metadata?.exports).toEqual([ExportedService]);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe('Module alias', () => {
|
|
74
|
+
it('should work as alias for HazelModule', () => {
|
|
75
|
+
let TestModule = class TestModule {
|
|
76
|
+
};
|
|
77
|
+
TestModule = __decorate([
|
|
78
|
+
(0, hazel_module_1.Module)({
|
|
79
|
+
controllers: [],
|
|
80
|
+
})
|
|
81
|
+
], TestModule);
|
|
82
|
+
const metadata = (0, hazel_module_1.getModuleMetadata)(TestModule);
|
|
83
|
+
expect(metadata).toBeDefined();
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
describe('getModuleMetadata', () => {
|
|
87
|
+
it('should return undefined for class without metadata', () => {
|
|
88
|
+
class PlainClass {
|
|
89
|
+
}
|
|
90
|
+
const metadata = (0, hazel_module_1.getModuleMetadata)(PlainClass);
|
|
91
|
+
expect(metadata).toBeUndefined();
|
|
92
|
+
});
|
|
93
|
+
it('should return metadata for decorated class', () => {
|
|
94
|
+
let TestModule = class TestModule {
|
|
95
|
+
};
|
|
96
|
+
TestModule = __decorate([
|
|
97
|
+
(0, hazel_module_1.HazelModule)({
|
|
98
|
+
providers: [],
|
|
99
|
+
})
|
|
100
|
+
], TestModule);
|
|
101
|
+
const metadata = (0, hazel_module_1.getModuleMetadata)(TestModule);
|
|
102
|
+
expect(metadata).toBeDefined();
|
|
103
|
+
expect(metadata?.providers).toEqual([]);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe('HazelModuleInstance', () => {
|
|
107
|
+
describe('initialization', () => {
|
|
108
|
+
it('should initialize module without metadata', () => {
|
|
109
|
+
class TestModule {
|
|
110
|
+
}
|
|
111
|
+
const instance = new hazel_module_1.HazelModuleInstance(TestModule);
|
|
112
|
+
expect(instance).toBeDefined();
|
|
113
|
+
expect(instance.getContainer()).toBeDefined();
|
|
114
|
+
});
|
|
115
|
+
it('should initialize module with providers', () => {
|
|
116
|
+
class TestService {
|
|
117
|
+
getValue() {
|
|
118
|
+
return 'test';
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
let TestModule = class TestModule {
|
|
122
|
+
};
|
|
123
|
+
TestModule = __decorate([
|
|
124
|
+
(0, hazel_module_1.HazelModule)({
|
|
125
|
+
providers: [TestService],
|
|
126
|
+
})
|
|
127
|
+
], TestModule);
|
|
128
|
+
const instance = new hazel_module_1.HazelModuleInstance(TestModule);
|
|
129
|
+
expect(instance).toBeDefined();
|
|
130
|
+
});
|
|
131
|
+
it('should initialize module with controllers', () => {
|
|
132
|
+
class TestController {
|
|
133
|
+
getStatus() {
|
|
134
|
+
return 'ok';
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
let TestModule = class TestModule {
|
|
138
|
+
};
|
|
139
|
+
TestModule = __decorate([
|
|
140
|
+
(0, hazel_module_1.HazelModule)({
|
|
141
|
+
controllers: [TestController],
|
|
142
|
+
})
|
|
143
|
+
], TestModule);
|
|
144
|
+
const instance = new hazel_module_1.HazelModuleInstance(TestModule);
|
|
145
|
+
expect(instance).toBeDefined();
|
|
146
|
+
});
|
|
147
|
+
it('should initialize module with imports', () => {
|
|
148
|
+
let ImportedModule = class ImportedModule {
|
|
149
|
+
};
|
|
150
|
+
ImportedModule = __decorate([
|
|
151
|
+
(0, hazel_module_1.HazelModule)({})
|
|
152
|
+
], ImportedModule);
|
|
153
|
+
let TestModule = class TestModule {
|
|
154
|
+
};
|
|
155
|
+
TestModule = __decorate([
|
|
156
|
+
(0, hazel_module_1.HazelModule)({
|
|
157
|
+
imports: [ImportedModule],
|
|
158
|
+
})
|
|
159
|
+
], TestModule);
|
|
160
|
+
const instance = new hazel_module_1.HazelModuleInstance(TestModule);
|
|
161
|
+
expect(instance).toBeDefined();
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
describe('request-scoped providers', () => {
|
|
165
|
+
it('should handle request-scoped providers', () => {
|
|
166
|
+
class RequestScopedService {
|
|
167
|
+
}
|
|
168
|
+
Reflect.defineMetadata('hazel:scope', 'request', RequestScopedService);
|
|
169
|
+
let TestModule = class TestModule {
|
|
170
|
+
};
|
|
171
|
+
TestModule = __decorate([
|
|
172
|
+
(0, hazel_module_1.HazelModule)({
|
|
173
|
+
providers: [RequestScopedService],
|
|
174
|
+
})
|
|
175
|
+
], TestModule);
|
|
176
|
+
const instance = new hazel_module_1.HazelModuleInstance(TestModule);
|
|
177
|
+
expect(instance).toBeDefined();
|
|
178
|
+
});
|
|
179
|
+
it('should handle singleton providers', () => {
|
|
180
|
+
class SingletonService {
|
|
181
|
+
}
|
|
182
|
+
let TestModule = class TestModule {
|
|
183
|
+
};
|
|
184
|
+
TestModule = __decorate([
|
|
185
|
+
(0, hazel_module_1.HazelModule)({
|
|
186
|
+
providers: [SingletonService],
|
|
187
|
+
})
|
|
188
|
+
], TestModule);
|
|
189
|
+
const instance = new hazel_module_1.HazelModuleInstance(TestModule);
|
|
190
|
+
expect(instance).toBeDefined();
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
describe('controllers with dependencies', () => {
|
|
194
|
+
it('should handle controller with request-scoped dependencies', () => {
|
|
195
|
+
class RequestScopedService {
|
|
196
|
+
}
|
|
197
|
+
Reflect.defineMetadata('hazel:scope', 'request', RequestScopedService);
|
|
198
|
+
class TestController {
|
|
199
|
+
constructor(service) {
|
|
200
|
+
this.service = service;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
Reflect.defineMetadata('design:paramtypes', [RequestScopedService], TestController);
|
|
204
|
+
let TestModule = class TestModule {
|
|
205
|
+
};
|
|
206
|
+
TestModule = __decorate([
|
|
207
|
+
(0, hazel_module_1.HazelModule)({
|
|
208
|
+
providers: [RequestScopedService],
|
|
209
|
+
controllers: [TestController],
|
|
210
|
+
})
|
|
211
|
+
], TestModule);
|
|
212
|
+
const instance = new hazel_module_1.HazelModuleInstance(TestModule);
|
|
213
|
+
expect(instance).toBeDefined();
|
|
214
|
+
});
|
|
215
|
+
it('should handle controller without request-scoped dependencies', () => {
|
|
216
|
+
class NormalService {
|
|
217
|
+
}
|
|
218
|
+
class TestController {
|
|
219
|
+
constructor(service) {
|
|
220
|
+
this.service = service;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
Reflect.defineMetadata('design:paramtypes', [NormalService], TestController);
|
|
224
|
+
let TestModule = class TestModule {
|
|
225
|
+
};
|
|
226
|
+
TestModule = __decorate([
|
|
227
|
+
(0, hazel_module_1.HazelModule)({
|
|
228
|
+
providers: [NormalService],
|
|
229
|
+
controllers: [TestController],
|
|
230
|
+
})
|
|
231
|
+
], TestModule);
|
|
232
|
+
const instance = new hazel_module_1.HazelModuleInstance(TestModule);
|
|
233
|
+
expect(instance).toBeDefined();
|
|
234
|
+
});
|
|
235
|
+
it('should handle controller without dependencies', () => {
|
|
236
|
+
class TestController {
|
|
237
|
+
getStatus() {
|
|
238
|
+
return 'ok';
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
let TestModule = class TestModule {
|
|
242
|
+
};
|
|
243
|
+
TestModule = __decorate([
|
|
244
|
+
(0, hazel_module_1.HazelModule)({
|
|
245
|
+
controllers: [TestController],
|
|
246
|
+
})
|
|
247
|
+
], TestModule);
|
|
248
|
+
const instance = new hazel_module_1.HazelModuleInstance(TestModule);
|
|
249
|
+
expect(instance).toBeDefined();
|
|
250
|
+
});
|
|
251
|
+
it('should handle controller with null paramTypes', () => {
|
|
252
|
+
class TestController {
|
|
253
|
+
}
|
|
254
|
+
Reflect.defineMetadata('design:paramtypes', [null], TestController);
|
|
255
|
+
let TestModule = class TestModule {
|
|
256
|
+
};
|
|
257
|
+
TestModule = __decorate([
|
|
258
|
+
(0, hazel_module_1.HazelModule)({
|
|
259
|
+
controllers: [TestController],
|
|
260
|
+
})
|
|
261
|
+
], TestModule);
|
|
262
|
+
const instance = new hazel_module_1.HazelModuleInstance(TestModule);
|
|
263
|
+
expect(instance).toBeDefined();
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
describe('route registration', () => {
|
|
267
|
+
it('should register controller routes', () => {
|
|
268
|
+
class TestController {
|
|
269
|
+
getUsers() {
|
|
270
|
+
return [];
|
|
271
|
+
}
|
|
272
|
+
getUser() {
|
|
273
|
+
return {};
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
Reflect.defineMetadata('hazel:route', { method: 'GET', path: '/users' }, TestController.prototype, 'getUsers');
|
|
277
|
+
Reflect.defineMetadata('hazel:route', { method: 'GET', path: '/users/:id' }, TestController.prototype, 'getUser');
|
|
278
|
+
let TestModule = class TestModule {
|
|
279
|
+
};
|
|
280
|
+
TestModule = __decorate([
|
|
281
|
+
(0, hazel_module_1.HazelModule)({
|
|
282
|
+
controllers: [TestController],
|
|
283
|
+
})
|
|
284
|
+
], TestModule);
|
|
285
|
+
const instance = new hazel_module_1.HazelModuleInstance(TestModule);
|
|
286
|
+
expect(instance).toBeDefined();
|
|
287
|
+
});
|
|
288
|
+
it('should handle controller without routes', () => {
|
|
289
|
+
class TestController {
|
|
290
|
+
someMethod() {
|
|
291
|
+
return 'test';
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
let TestModule = class TestModule {
|
|
295
|
+
};
|
|
296
|
+
TestModule = __decorate([
|
|
297
|
+
(0, hazel_module_1.HazelModule)({
|
|
298
|
+
controllers: [TestController],
|
|
299
|
+
})
|
|
300
|
+
], TestModule);
|
|
301
|
+
const instance = new hazel_module_1.HazelModuleInstance(TestModule);
|
|
302
|
+
expect(instance).toBeDefined();
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
describe('nested modules', () => {
|
|
306
|
+
it('should initialize nested imported modules', () => {
|
|
307
|
+
let Level3Module = class Level3Module {
|
|
308
|
+
};
|
|
309
|
+
Level3Module = __decorate([
|
|
310
|
+
(0, hazel_module_1.HazelModule)({})
|
|
311
|
+
], Level3Module);
|
|
312
|
+
let Level2Module = class Level2Module {
|
|
313
|
+
};
|
|
314
|
+
Level2Module = __decorate([
|
|
315
|
+
(0, hazel_module_1.HazelModule)({
|
|
316
|
+
imports: [Level3Module],
|
|
317
|
+
})
|
|
318
|
+
], Level2Module);
|
|
319
|
+
let Level1Module = class Level1Module {
|
|
320
|
+
};
|
|
321
|
+
Level1Module = __decorate([
|
|
322
|
+
(0, hazel_module_1.HazelModule)({
|
|
323
|
+
imports: [Level2Module],
|
|
324
|
+
})
|
|
325
|
+
], Level1Module);
|
|
326
|
+
const instance = new hazel_module_1.HazelModuleInstance(Level1Module);
|
|
327
|
+
expect(instance).toBeDefined();
|
|
328
|
+
});
|
|
329
|
+
it('should handle multiple imports', () => {
|
|
330
|
+
let Module1 = class Module1 {
|
|
331
|
+
};
|
|
332
|
+
Module1 = __decorate([
|
|
333
|
+
(0, hazel_module_1.HazelModule)({})
|
|
334
|
+
], Module1);
|
|
335
|
+
let Module2 = class Module2 {
|
|
336
|
+
};
|
|
337
|
+
Module2 = __decorate([
|
|
338
|
+
(0, hazel_module_1.HazelModule)({})
|
|
339
|
+
], Module2);
|
|
340
|
+
let Module3 = class Module3 {
|
|
341
|
+
};
|
|
342
|
+
Module3 = __decorate([
|
|
343
|
+
(0, hazel_module_1.HazelModule)({})
|
|
344
|
+
], Module3);
|
|
345
|
+
let TestModule = class TestModule {
|
|
346
|
+
};
|
|
347
|
+
TestModule = __decorate([
|
|
348
|
+
(0, hazel_module_1.HazelModule)({
|
|
349
|
+
imports: [Module1, Module2, Module3],
|
|
350
|
+
})
|
|
351
|
+
], TestModule);
|
|
352
|
+
const instance = new hazel_module_1.HazelModuleInstance(TestModule);
|
|
353
|
+
expect(instance).toBeDefined();
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
describe('getContainer', () => {
|
|
357
|
+
it('should return container instance', () => {
|
|
358
|
+
let TestModule = class TestModule {
|
|
359
|
+
};
|
|
360
|
+
TestModule = __decorate([
|
|
361
|
+
(0, hazel_module_1.HazelModule)({})
|
|
362
|
+
], TestModule);
|
|
363
|
+
const instance = new hazel_module_1.HazelModuleInstance(TestModule);
|
|
364
|
+
const container = instance.getContainer();
|
|
365
|
+
expect(container).toBeDefined();
|
|
366
|
+
});
|
|
367
|
+
});
|
|
368
|
+
describe('complex scenarios', () => {
|
|
369
|
+
it('should handle module with all options', () => {
|
|
370
|
+
class SharedService {
|
|
371
|
+
}
|
|
372
|
+
let SharedModule = class SharedModule {
|
|
373
|
+
};
|
|
374
|
+
SharedModule = __decorate([
|
|
375
|
+
(0, hazel_module_1.HazelModule)({
|
|
376
|
+
providers: [SharedService],
|
|
377
|
+
exports: [SharedService],
|
|
378
|
+
})
|
|
379
|
+
], SharedModule);
|
|
380
|
+
class AppService {
|
|
381
|
+
}
|
|
382
|
+
class AppController {
|
|
383
|
+
}
|
|
384
|
+
let AppModule = class AppModule {
|
|
385
|
+
};
|
|
386
|
+
AppModule = __decorate([
|
|
387
|
+
(0, hazel_module_1.HazelModule)({
|
|
388
|
+
imports: [SharedModule],
|
|
389
|
+
providers: [AppService],
|
|
390
|
+
controllers: [AppController],
|
|
391
|
+
exports: [AppService],
|
|
392
|
+
})
|
|
393
|
+
], AppModule);
|
|
394
|
+
const instance = new hazel_module_1.HazelModuleInstance(AppModule);
|
|
395
|
+
expect(instance).toBeDefined();
|
|
396
|
+
});
|
|
397
|
+
it('should handle empty module options', () => {
|
|
398
|
+
let EmptyModule = class EmptyModule {
|
|
399
|
+
};
|
|
400
|
+
EmptyModule = __decorate([
|
|
401
|
+
(0, hazel_module_1.HazelModule)({})
|
|
402
|
+
], EmptyModule);
|
|
403
|
+
const instance = new hazel_module_1.HazelModuleInstance(EmptyModule);
|
|
404
|
+
expect(instance).toBeDefined();
|
|
405
|
+
});
|
|
406
|
+
});
|
|
407
|
+
});
|
|
408
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hazel-response.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/hazel-response.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const hazel_response_1 = require("../hazel-response");
|
|
4
|
+
describe('HazelExpressResponse', () => {
|
|
5
|
+
let mockRes;
|
|
6
|
+
let hazelResponse;
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
mockRes = {
|
|
9
|
+
setHeader: jest.fn(),
|
|
10
|
+
status: jest.fn().mockReturnThis(),
|
|
11
|
+
json: jest.fn(),
|
|
12
|
+
send: jest.fn(),
|
|
13
|
+
end: jest.fn(),
|
|
14
|
+
};
|
|
15
|
+
hazelResponse = new hazel_response_1.HazelExpressResponse(mockRes);
|
|
16
|
+
});
|
|
17
|
+
describe('setHeader', () => {
|
|
18
|
+
it('should set header when headers not sent', () => {
|
|
19
|
+
hazelResponse.setHeader('Content-Type', 'application/json');
|
|
20
|
+
expect(mockRes.setHeader).toHaveBeenCalledWith('Content-Type', 'application/json');
|
|
21
|
+
});
|
|
22
|
+
it('should not set header after headers are sent', () => {
|
|
23
|
+
// Trigger header sending by writing
|
|
24
|
+
hazelResponse.write('test');
|
|
25
|
+
jest.clearAllMocks();
|
|
26
|
+
hazelResponse.setHeader('X-Custom', 'value');
|
|
27
|
+
expect(mockRes.setHeader).not.toHaveBeenCalled();
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe('status', () => {
|
|
31
|
+
it('should set status code', () => {
|
|
32
|
+
const result = hazelResponse.status(404);
|
|
33
|
+
expect(mockRes.status).toHaveBeenCalledWith(404);
|
|
34
|
+
expect(result).toBe(hazelResponse);
|
|
35
|
+
});
|
|
36
|
+
it('should return this for chaining', () => {
|
|
37
|
+
const result = hazelResponse.status(200);
|
|
38
|
+
expect(result).toBeInstanceOf(hazel_response_1.HazelExpressResponse);
|
|
39
|
+
});
|
|
40
|
+
it('should not set status after headers are sent', () => {
|
|
41
|
+
hazelResponse.write('test');
|
|
42
|
+
jest.clearAllMocks();
|
|
43
|
+
hazelResponse.status(500);
|
|
44
|
+
expect(mockRes.status).not.toHaveBeenCalled();
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe('write', () => {
|
|
48
|
+
it('should set streaming headers on first write', () => {
|
|
49
|
+
hazelResponse.write('chunk1');
|
|
50
|
+
expect(mockRes.setHeader).toHaveBeenCalledWith('Content-Type', 'text/plain');
|
|
51
|
+
expect(mockRes.setHeader).toHaveBeenCalledWith('Transfer-Encoding', 'chunked');
|
|
52
|
+
expect(mockRes.send).toHaveBeenCalledWith('chunk1');
|
|
53
|
+
});
|
|
54
|
+
it('should send subsequent chunks without setting headers', () => {
|
|
55
|
+
hazelResponse.write('chunk1');
|
|
56
|
+
jest.clearAllMocks();
|
|
57
|
+
hazelResponse.write('chunk2');
|
|
58
|
+
expect(mockRes.setHeader).not.toHaveBeenCalled();
|
|
59
|
+
expect(mockRes.send).toHaveBeenCalledWith('chunk2');
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe('end', () => {
|
|
63
|
+
it('should end response when streaming', () => {
|
|
64
|
+
hazelResponse.write('test');
|
|
65
|
+
hazelResponse.end();
|
|
66
|
+
expect(mockRes.end).toHaveBeenCalled();
|
|
67
|
+
});
|
|
68
|
+
it('should not end response when not streaming', () => {
|
|
69
|
+
hazelResponse.end();
|
|
70
|
+
expect(mockRes.end).not.toHaveBeenCalled();
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe('json', () => {
|
|
74
|
+
it('should send JSON data', () => {
|
|
75
|
+
const data = { message: 'success' };
|
|
76
|
+
hazelResponse.json(data);
|
|
77
|
+
expect(mockRes.json).toHaveBeenCalledWith(data);
|
|
78
|
+
});
|
|
79
|
+
it('should handle error objects specially', () => {
|
|
80
|
+
const data = { error: 'Something went wrong' };
|
|
81
|
+
hazelResponse.json(data);
|
|
82
|
+
expect(mockRes.json).toHaveBeenCalledWith({ error: 'Something went wrong' });
|
|
83
|
+
});
|
|
84
|
+
it('should not send JSON if streaming', () => {
|
|
85
|
+
hazelResponse.write('streaming');
|
|
86
|
+
hazelResponse.json({ data: 'test' });
|
|
87
|
+
expect(mockRes.json).not.toHaveBeenCalled();
|
|
88
|
+
});
|
|
89
|
+
it('should not send JSON if headers already sent', () => {
|
|
90
|
+
hazelResponse.write('test');
|
|
91
|
+
hazelResponse.json({ data: 'test' });
|
|
92
|
+
expect(mockRes.json).not.toHaveBeenCalled();
|
|
93
|
+
});
|
|
94
|
+
it('should handle circular references safely', () => {
|
|
95
|
+
const data = { name: 'test' };
|
|
96
|
+
data.res = mockRes;
|
|
97
|
+
hazelResponse.json(data);
|
|
98
|
+
expect(mockRes.json).toHaveBeenCalledWith({
|
|
99
|
+
name: 'test',
|
|
100
|
+
res: '[Response Object]',
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
it('should handle primitive values', () => {
|
|
104
|
+
hazelResponse.json('string value');
|
|
105
|
+
expect(mockRes.json).toHaveBeenCalledWith('string value');
|
|
106
|
+
jest.clearAllMocks();
|
|
107
|
+
hazelResponse = new hazel_response_1.HazelExpressResponse(mockRes);
|
|
108
|
+
hazelResponse.json(123);
|
|
109
|
+
expect(mockRes.json).toHaveBeenCalledWith(123);
|
|
110
|
+
jest.clearAllMocks();
|
|
111
|
+
hazelResponse = new hazel_response_1.HazelExpressResponse(mockRes);
|
|
112
|
+
hazelResponse.json(true);
|
|
113
|
+
expect(mockRes.json).toHaveBeenCalledWith(true);
|
|
114
|
+
});
|
|
115
|
+
it('should handle null and undefined', () => {
|
|
116
|
+
hazelResponse.json(null);
|
|
117
|
+
expect(mockRes.json).toHaveBeenCalledWith(null);
|
|
118
|
+
jest.clearAllMocks();
|
|
119
|
+
hazelResponse = new hazel_response_1.HazelExpressResponse(mockRes);
|
|
120
|
+
hazelResponse.json(undefined);
|
|
121
|
+
expect(mockRes.json).toHaveBeenCalledWith(undefined);
|
|
122
|
+
});
|
|
123
|
+
it('should handle JSON stringify errors', () => {
|
|
124
|
+
// Create an object that will fail JSON.stringify
|
|
125
|
+
const circular = {};
|
|
126
|
+
circular.self = circular;
|
|
127
|
+
// Mock JSON.stringify to throw
|
|
128
|
+
const originalStringify = JSON.stringify;
|
|
129
|
+
JSON.stringify = jest.fn().mockImplementation(() => {
|
|
130
|
+
throw new Error('Stringify failed');
|
|
131
|
+
});
|
|
132
|
+
hazelResponse.json(circular);
|
|
133
|
+
expect(mockRes.json).toHaveBeenCalledWith({ error: 'Failed to serialize response' });
|
|
134
|
+
// Restore original
|
|
135
|
+
JSON.stringify = originalStringify;
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/health.test.ts"],"names":[],"mappings":""}
|