@tsed/platform-http 8.0.1 → 8.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/package.json +18 -16
  2. package/src/common/builder/PlatformBuilder.spec.ts +331 -0
  3. package/src/common/builder/PlatformBuilder.ts +426 -0
  4. package/src/common/builder/__fixtures__/PlatformCustom.ts +39 -0
  5. package/src/common/config/interfaces/PlatformJsonMapperSettings.ts +11 -0
  6. package/src/common/config/interfaces/PlatformMulterSettings.ts +21 -0
  7. package/src/common/config/interfaces/PlatformRouterSettings.ts +11 -0
  8. package/src/common/config/interfaces/PlatformStaticsSettings.ts +23 -0
  9. package/src/common/config/services/PlatformConfiguration.spec.ts +181 -0
  10. package/src/common/config/services/PlatformConfiguration.ts +157 -0
  11. package/src/common/constants/routerOptions.ts +1 -0
  12. package/src/common/decorators/PlatformProvider.ts +14 -0
  13. package/src/common/decorators/multer/multerFileSize.spec.ts +22 -0
  14. package/src/common/decorators/multer/multerFileSize.ts +32 -0
  15. package/src/common/decorators/multer/multerOptions.spec.ts +21 -0
  16. package/src/common/decorators/multer/multerOptions.ts +53 -0
  17. package/src/common/decorators/multer/multipartFile.spec.ts +259 -0
  18. package/src/common/decorators/multer/multipartFile.ts +88 -0
  19. package/src/common/decorators/params/error.spec.ts +15 -0
  20. package/src/common/decorators/params/error.ts +16 -0
  21. package/src/common/decorators/params/next.spec.ts +15 -0
  22. package/src/common/decorators/params/next.ts +31 -0
  23. package/src/common/decorators/params/request.spec.ts +49 -0
  24. package/src/common/decorators/params/request.ts +85 -0
  25. package/src/common/decorators/params/response.spec.ts +36 -0
  26. package/src/common/decorators/params/response.ts +73 -0
  27. package/src/common/domain/AnyToPromiseWithCtx.spec.ts +20 -0
  28. package/src/common/domain/AnyToPromiseWithCtx.ts +30 -0
  29. package/src/common/domain/EndpointMetadata.ts +1 -0
  30. package/src/common/domain/PlatformContext.spec.ts +124 -0
  31. package/src/common/domain/PlatformContext.ts +135 -0
  32. package/src/common/domain/PlatformRouteDetails.ts +7 -0
  33. package/src/common/exports.ts +4 -0
  34. package/src/common/fn/adapter.ts +23 -0
  35. package/src/common/fn/application.ts +11 -0
  36. package/src/common/index.ts +62 -0
  37. package/src/common/interfaces/AfterInit.ts +3 -0
  38. package/src/common/interfaces/AfterListen.ts +3 -0
  39. package/src/common/interfaces/AfterRoutesInit.ts +3 -0
  40. package/src/common/interfaces/BeforeInit.ts +3 -0
  41. package/src/common/interfaces/BeforeListen.ts +3 -0
  42. package/src/common/interfaces/BeforeRoutesInit.ts +3 -0
  43. package/src/common/interfaces/HandlerType.ts +12 -0
  44. package/src/common/interfaces/IncomingEvent.ts +6 -0
  45. package/src/common/interfaces/OnReady.ts +3 -0
  46. package/src/common/interfaces/OnRequest.ts +5 -0
  47. package/src/common/interfaces/OnResponse.ts +5 -0
  48. package/src/common/interfaces/OnRoutesInit.ts +3 -0
  49. package/src/common/interfaces/PlatformRouteOptions.ts +17 -0
  50. package/src/common/interfaces/ResponseErrorObject.ts +8 -0
  51. package/src/common/interfaces/Route.ts +12 -0
  52. package/src/common/middlewares/PlatformAcceptMimesMiddleware.spec.ts +215 -0
  53. package/src/common/middlewares/PlatformAcceptMimesMiddleware.ts +24 -0
  54. package/src/common/middlewares/PlatformMulterMiddleware.spec.ts +97 -0
  55. package/src/common/middlewares/PlatformMulterMiddleware.ts +59 -0
  56. package/src/common/services/Platform.spec.ts +145 -0
  57. package/src/common/services/Platform.ts +79 -0
  58. package/src/common/services/PlatformAdapter.ts +89 -0
  59. package/src/common/services/PlatformApplication.spec.ts +101 -0
  60. package/src/common/services/PlatformApplication.ts +54 -0
  61. package/src/common/services/PlatformHandler.spec.ts +152 -0
  62. package/src/common/services/PlatformHandler.ts +140 -0
  63. package/src/common/services/PlatformMiddlewaresChain.spec.ts +96 -0
  64. package/src/common/services/PlatformMiddlewaresChain.ts +55 -0
  65. package/src/common/services/PlatformRequest.spec.ts +185 -0
  66. package/src/common/services/PlatformRequest.ts +181 -0
  67. package/src/common/services/PlatformResponse.spec.ts +344 -0
  68. package/src/common/services/PlatformResponse.ts +388 -0
  69. package/src/common/utils/closeServer.spec.ts +11 -0
  70. package/src/common/utils/closeServer.ts +7 -0
  71. package/src/common/utils/createContext.spec.ts +111 -0
  72. package/src/common/utils/createContext.ts +52 -0
  73. package/src/common/utils/createHttpServer.spec.ts +74 -0
  74. package/src/common/utils/createHttpServer.ts +15 -0
  75. package/src/common/utils/createHttpsServer.spec.ts +73 -0
  76. package/src/common/utils/createHttpsServer.ts +16 -0
  77. package/src/common/utils/createInjector.spec.ts +42 -0
  78. package/src/common/utils/createInjector.ts +55 -0
  79. package/src/common/utils/createServer.ts +51 -0
  80. package/src/common/utils/ensureContext.spec.ts +41 -0
  81. package/src/common/utils/ensureContext.ts +17 -0
  82. package/src/common/utils/getConfiguration.spec.ts +163 -0
  83. package/src/common/utils/getConfiguration.ts +34 -0
  84. package/src/common/utils/getStaticsOptions.spec.ts +27 -0
  85. package/src/common/utils/getStaticsOptions.ts +24 -0
  86. package/src/common/utils/listenServer.ts +17 -0
  87. package/src/common/utils/mapReturnedResponse.spec.ts +35 -0
  88. package/src/common/utils/mapReturnedResponse.ts +10 -0
  89. package/src/common/utils/printRoutes.spec.ts +19 -0
  90. package/src/common/utils/printRoutes.ts +40 -0
  91. package/src/common/utils/resolveControllers.spec.ts +40 -0
  92. package/src/common/utils/resolveControllers.ts +54 -0
  93. package/src/common/utils/setResponseHeaders.spec.ts +84 -0
  94. package/src/common/utils/setResponseHeaders.ts +31 -0
  95. package/src/index.ts +2 -0
  96. package/src/testing/FakeAdapter.ts +69 -0
  97. package/src/testing/FakeResponse.ts +72 -0
  98. package/src/testing/PlatformTest.spec.ts +53 -0
  99. package/src/testing/PlatformTest.ts +157 -0
  100. package/src/testing/index.ts +5 -0
package/package.json CHANGED
@@ -2,18 +2,20 @@
2
2
  "name": "@tsed/platform-http",
3
3
  "description": "A TypeScript Framework on top of Express",
4
4
  "type": "module",
5
- "version": "8.0.1",
5
+ "version": "8.0.2",
6
6
  "source": "./src/common/index.ts",
7
7
  "main": "./lib/esm/common/index.js",
8
8
  "module": "./lib/esm/common/index.js",
9
9
  "typings": "./lib/types/common/index.d.ts",
10
10
  "exports": {
11
11
  ".": {
12
+ "@tsed/source": "./src/index.ts",
12
13
  "types": "./lib/types/common/index.d.ts",
13
14
  "import": "./lib/esm/common/index.js",
14
15
  "default": "./lib/esm/common/index.js"
15
16
  },
16
17
  "./testing": {
18
+ "@tsed/source": "./src/testing/index.ts",
17
19
  "types": "./lib/types/testing/index.d.ts",
18
20
  "import": "./lib/esm/testing/index.js",
19
21
  "default": "./lib/esm/testing/index.js"
@@ -68,29 +70,29 @@
68
70
  }
69
71
  ],
70
72
  "dependencies": {
71
- "@tsed/core": "8.0.1",
72
- "@tsed/di": "8.0.1",
73
- "@tsed/exceptions": "8.0.1",
74
- "@tsed/hooks": "8.0.1",
75
- "@tsed/json-mapper": "8.0.1",
73
+ "@tsed/core": "8.0.2",
74
+ "@tsed/di": "8.0.2",
75
+ "@tsed/exceptions": "8.0.2",
76
+ "@tsed/hooks": "8.0.2",
77
+ "@tsed/json-mapper": "8.0.2",
76
78
  "@tsed/logger": "^6.7.8",
77
79
  "@tsed/logger-file": "^6.7.8",
78
- "@tsed/platform-exceptions": "8.0.1",
79
- "@tsed/platform-middlewares": "8.0.1",
80
- "@tsed/platform-params": "8.0.1",
81
- "@tsed/platform-response-filter": "8.0.1",
82
- "@tsed/platform-router": "8.0.1",
83
- "@tsed/platform-views": "8.0.1",
84
- "@tsed/schema": "8.0.1",
80
+ "@tsed/platform-exceptions": "8.0.2",
81
+ "@tsed/platform-middlewares": "8.0.2",
82
+ "@tsed/platform-params": "8.0.2",
83
+ "@tsed/platform-response-filter": "8.0.2",
84
+ "@tsed/platform-router": "8.0.2",
85
+ "@tsed/platform-views": "8.0.2",
86
+ "@tsed/schema": "8.0.2",
85
87
  "@types/json-schema": "7.0.15",
86
88
  "accepts": "^1.3.8",
87
89
  "tslib": "2.7.0",
88
90
  "uuid": "10.0.0"
89
91
  },
90
92
  "devDependencies": {
91
- "@tsed/barrels": "8.0.1",
92
- "@tsed/engines": "8.0.1",
93
- "@tsed/typescript": "8.0.1",
93
+ "@tsed/barrels": "8.0.2",
94
+ "@tsed/engines": "8.0.2",
95
+ "@tsed/typescript": "8.0.2",
94
96
  "cross-env": "7.0.3",
95
97
  "eslint": "9.12.0",
96
98
  "typescript": "5.4.5",
@@ -0,0 +1,331 @@
1
+ import {catchAsyncError} from "@tsed/core";
2
+ import {Configuration, configuration, Controller, destroyInjector, Injectable, injector, Module} from "@tsed/di";
3
+ import {$asyncEmit} from "@tsed/hooks";
4
+
5
+ import {FakeAdapter} from "../../testing/index.js";
6
+ import {AfterInit} from "../interfaces/AfterInit.js";
7
+ import {AfterListen} from "../interfaces/AfterListen.js";
8
+ import {AfterRoutesInit} from "../interfaces/AfterRoutesInit.js";
9
+ import {BeforeInit} from "../interfaces/BeforeInit.js";
10
+ import {BeforeListen} from "../interfaces/BeforeListen.js";
11
+ import {BeforeRoutesInit} from "../interfaces/BeforeRoutesInit.js";
12
+ import {OnReady} from "../interfaces/OnReady.js";
13
+ import {Platform} from "../services/Platform.js";
14
+ import {PlatformCustom} from "./__fixtures__/PlatformCustom.js";
15
+ import {PlatformBuilder} from "./PlatformBuilder.js";
16
+
17
+ vi.mock("@tsed/hooks", async (importOriginal) => {
18
+ const mod = await importOriginal<typeof import("@tsed/hooks")>();
19
+
20
+ return {
21
+ ...mod,
22
+ $asyncEmit: vi.fn()
23
+ };
24
+ });
25
+
26
+ @Controller("/")
27
+ class RestCtrl {}
28
+
29
+ @Controller("/")
30
+ class HealthCtrl {}
31
+
32
+ @Module({
33
+ mount: {
34
+ "/heath": [HealthCtrl]
35
+ }
36
+ })
37
+ class HealthModule {}
38
+
39
+ const settings = {
40
+ logger: {
41
+ level: "off"
42
+ },
43
+ mount: {
44
+ "/rest": [RestCtrl]
45
+ },
46
+ acceptMimes: ["application/json"],
47
+ imports: [HealthModule]
48
+ };
49
+
50
+ @Configuration(settings as any)
51
+ class ServerModule implements BeforeInit, AfterInit, BeforeRoutesInit, AfterRoutesInit, BeforeListen, AfterListen, OnReady {
52
+ constructor() {}
53
+
54
+ $beforeRoutesInit(): void | Promise<any> {
55
+ return undefined;
56
+ }
57
+
58
+ $afterRoutesInit(): void | Promise<any> {
59
+ return undefined;
60
+ }
61
+
62
+ $afterInit(): void | Promise<any> {
63
+ return undefined;
64
+ }
65
+
66
+ $afterListen(): void | Promise<any> {
67
+ return undefined;
68
+ }
69
+
70
+ $beforeInit(): void | Promise<any> {
71
+ return undefined;
72
+ }
73
+
74
+ $beforeListen(): void | Promise<any> {
75
+ return undefined;
76
+ }
77
+
78
+ $onReady(): void | Promise<any> {
79
+ return undefined;
80
+ }
81
+ }
82
+
83
+ describe("PlatformBuilder", () => {
84
+ describe("loadStatics()", () => {
85
+ it("should loadStatics", async () => {
86
+ // WHEN
87
+ const platform = await PlatformCustom.bootstrap(ServerModule, {
88
+ httpPort: false,
89
+ httpsPort: false,
90
+ statics: {
91
+ "/": ["/root", {root: "/root2", test: "test", hook: "$beforeRoutesInit"}]
92
+ }
93
+ });
94
+
95
+ vi.spyOn(platform.app, "statics").mockReturnValue(undefined as any);
96
+
97
+ await platform.loadStatics("$beforeRoutesInit");
98
+
99
+ expect(platform.app.statics).toHaveBeenCalledWith("/", {
100
+ hook: "$beforeRoutesInit",
101
+ root: "/root2",
102
+ test: "test"
103
+ });
104
+ });
105
+ });
106
+ describe("loadMiddlewaresFor()", () => {
107
+ it("should load middlewares", async () => {
108
+ const middlewares: any[] = [
109
+ {
110
+ hook: "$beforeRoutesInit",
111
+ use: vi.fn()
112
+ },
113
+ {
114
+ hook: "$afterRoutesInit",
115
+ use: vi.fn()
116
+ },
117
+ vi.fn()
118
+ ];
119
+ // WHEN
120
+ const platform = await PlatformCustom.bootstrap(ServerModule, {
121
+ httpPort: false,
122
+ httpsPort: false,
123
+ middlewares
124
+ });
125
+
126
+ vi.spyOn(platform.app, "use").mockReturnValue(undefined as any);
127
+
128
+ // @ts-ignore
129
+ platform.loadMiddlewaresFor("$beforeRoutesInit");
130
+
131
+ expect(platform.app.use).toHaveBeenCalledWith(middlewares[0].use);
132
+ expect(platform.app.use).toHaveBeenCalledWith(middlewares[2]);
133
+ });
134
+ it("should throw an error when a Ts.ED middleware is added on $afterInit hook", async () => {
135
+ const middlewares: any[] = [
136
+ {
137
+ hook: "$afterInit",
138
+ use: class TestMiddleware {}
139
+ }
140
+ ];
141
+ // WHEN
142
+ const error = await catchAsyncError(() =>
143
+ PlatformCustom.bootstrap(ServerModule, {
144
+ httpPort: false,
145
+ httpsPort: false,
146
+ middlewares
147
+ })
148
+ );
149
+
150
+ expect(error?.message).toEqual(
151
+ 'Ts.ED Middleware "TestMiddleware" middleware cannot be added on $afterInit hook. Use one of this hooks instead: $beforeRoutesInit, $onRoutesInit, $afterRoutesInit, $beforeListen, $afterListen, $onReady'
152
+ );
153
+ });
154
+ it("should throw an error when a Ts.ED middleware is added on $beforeInit hook", async () => {
155
+ const middlewares: any[] = [
156
+ {
157
+ hook: "$beforeInit",
158
+ use: class TestMiddleware {}
159
+ }
160
+ ];
161
+ // WHEN
162
+ const error = await catchAsyncError(() =>
163
+ PlatformCustom.bootstrap(ServerModule, {
164
+ httpPort: false,
165
+ httpsPort: false,
166
+ middlewares
167
+ })
168
+ );
169
+
170
+ expect(error?.message).toEqual(
171
+ 'Ts.ED Middleware "TestMiddleware" middleware cannot be added on $beforeInit hook. Use one of this hooks instead: $beforeRoutesInit, $onRoutesInit, $afterRoutesInit, $beforeListen, $afterListen, $onReady'
172
+ );
173
+ });
174
+ it("should throw an error when a Ts.ED middleware is added on $onInit hook", async () => {
175
+ const middlewares: any[] = [
176
+ {
177
+ hook: "$onInit",
178
+ use: class TestMiddleware {}
179
+ }
180
+ ];
181
+ // WHEN
182
+ const error = await catchAsyncError(() =>
183
+ PlatformCustom.bootstrap(ServerModule, {
184
+ httpPort: false,
185
+ httpsPort: false,
186
+ middlewares
187
+ })
188
+ );
189
+
190
+ expect(error?.message).toEqual(
191
+ 'Ts.ED Middleware "TestMiddleware" middleware cannot be added on $onInit hook. Use one of this hooks instead: $beforeRoutesInit, $onRoutesInit, $afterRoutesInit, $beforeListen, $afterListen, $onReady'
192
+ );
193
+ });
194
+ });
195
+ describe("boostrap", () => {
196
+ beforeEach(() => {
197
+ destroyInjector();
198
+ const inj = injector();
199
+ vi.spyOn(ServerModule.prototype, "$beforeRoutesInit").mockReturnValue(undefined);
200
+ vi.spyOn(ServerModule.prototype, "$afterRoutesInit").mockReturnValue(undefined);
201
+ vi.spyOn(ServerModule.prototype, "$afterInit").mockReturnValue(undefined);
202
+ vi.spyOn(ServerModule.prototype, "$afterListen").mockReturnValue(undefined);
203
+ vi.spyOn(ServerModule.prototype, "$beforeInit").mockReturnValue(undefined);
204
+ vi.spyOn(ServerModule.prototype, "$beforeListen").mockReturnValue(undefined);
205
+ vi.spyOn(ServerModule.prototype, "$onReady").mockReturnValue(undefined);
206
+ vi.spyOn(PlatformBuilder.prototype, "loadStatics");
207
+ // @ts-ignore
208
+ vi.spyOn(PlatformBuilder.prototype, "listenServers");
209
+ vi.spyOn(Platform.prototype, "addRoutes").mockReturnValue(undefined);
210
+ });
211
+
212
+ describe("static boostrap()", () => {
213
+ it("should boostrap a custom platform", async () => {
214
+ const result = await PlatformBuilder.bootstrap(ServerModule, {
215
+ adapter: FakeAdapter
216
+ });
217
+
218
+ expect(result).toBeInstanceOf(PlatformBuilder);
219
+ });
220
+ });
221
+ describe("static create()", () => {
222
+ it("should boostrap a custom platform", () => {
223
+ PlatformBuilder.create(ServerModule, {
224
+ adapter: FakeAdapter
225
+ });
226
+
227
+ expect(configuration().get("httpPort")).toEqual(false);
228
+ expect(configuration().get("httpsPort")).toEqual(false);
229
+ });
230
+ });
231
+ describe("bootstrap()", () => {
232
+ it("should bootstrap platform", async () => {
233
+ // WHEN
234
+ vi.mocked($asyncEmit).mockResolvedValue(undefined);
235
+
236
+ const stub = ServerModule.prototype.$beforeRoutesInit;
237
+ const server = await PlatformCustom.bootstrap(ServerModule, {
238
+ httpPort: false,
239
+ httpsPort: false
240
+ });
241
+ // THEN
242
+ await server.listen();
243
+
244
+ // THEN
245
+ // @ts-ignore
246
+ expect(server.listenServers).toHaveBeenCalledWith();
247
+ expect(server.loadStatics).toHaveBeenCalledWith("$beforeRoutesInit");
248
+ expect(server.loadStatics).toHaveBeenCalledWith("$afterRoutesInit");
249
+ expect($asyncEmit).toHaveBeenCalledWith("$afterInit", []);
250
+ expect($asyncEmit).toHaveBeenCalledWith("$beforeRoutesInit", []);
251
+ expect($asyncEmit).toHaveBeenCalledWith("$afterRoutesInit", []);
252
+ expect($asyncEmit).toHaveBeenCalledWith("$afterListen", []);
253
+ expect($asyncEmit).toHaveBeenCalledWith("$beforeListen", []);
254
+ expect($asyncEmit).toHaveBeenCalledWith("$onReady", []);
255
+
256
+ // THEN
257
+ expect(server.rootModule).toBeInstanceOf(ServerModule);
258
+ expect(stub).toHaveBeenCalled();
259
+ expect(server.name).toEqual("custom");
260
+
261
+ await server.stop();
262
+ expect($asyncEmit).toHaveBeenCalledWith("$onDestroy", []);
263
+ });
264
+ });
265
+ describe("adapter()", () => {
266
+ it("should boostrap a custom platform", async () => {
267
+ const platformBuilder = await PlatformBuilder.bootstrap(ServerModule, {
268
+ adapter: FakeAdapter
269
+ });
270
+
271
+ expect(platformBuilder.callback()).toBeInstanceOf(Function);
272
+
273
+ expect(platformBuilder.adapter).toBeInstanceOf(FakeAdapter);
274
+ });
275
+
276
+ it("should listen a custom platform", async () => {
277
+ const platform = await PlatformBuilder.create(ServerModule, {
278
+ adapter: FakeAdapter
279
+ });
280
+
281
+ await platform.listen();
282
+ });
283
+ });
284
+ });
285
+ describe("useProvider()", () => {
286
+ it("should add provider", async () => {
287
+ // WHEN
288
+ const server = PlatformCustom.create(ServerModule, {
289
+ httpPort: false,
290
+ httpsPort: false
291
+ });
292
+
293
+ @Injectable()
294
+ class Token {}
295
+
296
+ server.useProvider(Token, {});
297
+
298
+ await server.bootstrap();
299
+
300
+ expect(server.injector.get(Token)).toBeInstanceOf(Token);
301
+ });
302
+ });
303
+ describe("addControllers", () => {
304
+ beforeEach(() => destroyInjector());
305
+ it("should add controllers", async () => {
306
+ // GIVEN
307
+ const server = await PlatformCustom.bootstrap(ServerModule, {});
308
+
309
+ class MyClass {}
310
+
311
+ // WHEN
312
+ server.addControllers("/test", MyClass);
313
+
314
+ // THEN
315
+ expect(server.injector.settings.routes).toEqual([
316
+ {
317
+ route: "/heath",
318
+ token: HealthCtrl
319
+ },
320
+ {
321
+ route: "/rest",
322
+ token: RestCtrl
323
+ },
324
+ {
325
+ route: "/test",
326
+ token: MyClass
327
+ }
328
+ ]);
329
+ });
330
+ });
331
+ });