@deepkit/http 1.0.1-alpha.16 → 1.0.1-alpha.160

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 (124) hide show
  1. package/CHANGELOG.md +236 -0
  2. package/dist/cjs/index.d.ts +14 -10
  3. package/dist/cjs/index.js +19 -11
  4. package/dist/cjs/index.js.map +1 -1
  5. package/dist/cjs/src/controllers.d.ts +10 -3
  6. package/dist/cjs/src/controllers.js +7 -3
  7. package/dist/cjs/src/controllers.js.map +1 -1
  8. package/dist/cjs/src/decorator.d.ts +144 -70
  9. package/dist/cjs/src/decorator.js +277 -102
  10. package/dist/cjs/src/decorator.js.map +1 -1
  11. package/dist/cjs/src/filter.d.ts +49 -0
  12. package/dist/cjs/src/filter.js +215 -0
  13. package/dist/cjs/src/filter.js.map +1 -0
  14. package/dist/cjs/src/http-app.d.ts +8 -0
  15. package/dist/cjs/src/http-app.js +16 -0
  16. package/dist/cjs/src/http-app.js.map +1 -0
  17. package/dist/cjs/src/http.d.ts +131 -32
  18. package/dist/cjs/src/http.js +523 -122
  19. package/dist/cjs/src/http.js.map +1 -1
  20. package/dist/cjs/src/kernel.d.ts +50 -9
  21. package/dist/cjs/src/kernel.js +109 -98
  22. package/dist/cjs/src/kernel.js.map +1 -1
  23. package/dist/cjs/src/logger.d.ts +3 -3
  24. package/dist/cjs/src/logger.js +9 -12
  25. package/dist/cjs/src/logger.js.map +1 -1
  26. package/dist/cjs/src/middleware.d.ts +61 -0
  27. package/dist/cjs/src/middleware.js +95 -0
  28. package/dist/cjs/src/middleware.js.map +1 -0
  29. package/dist/cjs/src/model.d.ts +270 -4
  30. package/dist/cjs/src/model.js +401 -3
  31. package/dist/cjs/src/model.js.map +1 -1
  32. package/dist/cjs/src/module.config.d.ts +149 -4
  33. package/dist/cjs/src/module.config.js +11 -6
  34. package/dist/cjs/src/module.config.js.map +1 -1
  35. package/dist/cjs/src/module.d.ts +14 -32
  36. package/dist/cjs/src/module.js +122 -7
  37. package/dist/cjs/src/module.js.map +1 -1
  38. package/dist/cjs/src/request-parser.d.ts +37 -0
  39. package/dist/cjs/src/request-parser.js +382 -0
  40. package/dist/cjs/src/request-parser.js.map +1 -0
  41. package/dist/cjs/src/router.d.ts +174 -75
  42. package/dist/cjs/src/router.js +469 -288
  43. package/dist/cjs/src/router.js.map +1 -1
  44. package/dist/cjs/src/static-serving.d.ts +32 -4
  45. package/dist/cjs/src/static-serving.js +115 -71
  46. package/dist/cjs/src/static-serving.js.map +1 -1
  47. package/dist/cjs/src/utils.js +2 -2
  48. package/dist/cjs/src/utils.js.map +1 -1
  49. package/dist/cjs/tsconfig.tsbuildinfo +1 -2916
  50. package/dist/esm/index.d.ts +14 -10
  51. package/dist/esm/index.js +14 -10
  52. package/dist/esm/index.js.map +1 -1
  53. package/dist/esm/src/controllers.d.ts +10 -3
  54. package/dist/esm/src/controllers.js +7 -3
  55. package/dist/esm/src/controllers.js.map +1 -1
  56. package/dist/esm/src/decorator.d.ts +144 -70
  57. package/dist/esm/src/decorator.js +272 -99
  58. package/dist/esm/src/decorator.js.map +1 -1
  59. package/dist/esm/src/filter.d.ts +49 -0
  60. package/dist/esm/src/filter.js +209 -0
  61. package/dist/esm/src/filter.js.map +1 -0
  62. package/dist/esm/src/http-app.d.ts +8 -0
  63. package/dist/esm/src/http-app.js +12 -0
  64. package/dist/esm/src/http-app.js.map +1 -0
  65. package/dist/esm/src/http.d.ts +131 -32
  66. package/dist/esm/src/http.js +504 -121
  67. package/dist/esm/src/http.js.map +1 -1
  68. package/dist/esm/src/kernel.d.ts +50 -9
  69. package/dist/esm/src/kernel.js +110 -100
  70. package/dist/esm/src/kernel.js.map +1 -1
  71. package/dist/esm/src/logger.d.ts +3 -3
  72. package/dist/esm/src/logger.js +7 -11
  73. package/dist/esm/src/logger.js.map +1 -1
  74. package/dist/esm/src/middleware.d.ts +61 -0
  75. package/dist/esm/src/middleware.js +90 -0
  76. package/dist/esm/src/middleware.js.map +1 -0
  77. package/dist/esm/src/model.d.ts +270 -4
  78. package/dist/esm/src/model.js +357 -1
  79. package/dist/esm/src/model.js.map +1 -1
  80. package/dist/esm/src/module.config.d.ts +149 -4
  81. package/dist/esm/src/module.config.js +9 -5
  82. package/dist/esm/src/module.config.js.map +1 -1
  83. package/dist/esm/src/module.d.ts +14 -32
  84. package/dist/esm/src/module.js +121 -7
  85. package/dist/esm/src/module.js.map +1 -1
  86. package/dist/esm/src/request-parser.d.ts +37 -0
  87. package/dist/esm/src/request-parser.js +372 -0
  88. package/dist/esm/src/request-parser.js.map +1 -0
  89. package/dist/esm/src/router.d.ts +174 -75
  90. package/dist/esm/src/router.js +463 -285
  91. package/dist/esm/src/router.js.map +1 -1
  92. package/dist/esm/src/static-serving.d.ts +32 -4
  93. package/dist/esm/src/static-serving.js +107 -65
  94. package/dist/esm/src/static-serving.js.map +1 -1
  95. package/dist/esm/src/utils.js +1 -0
  96. package/dist/esm/src/utils.js.map +1 -1
  97. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -2916
  98. package/index.ts +14 -10
  99. package/package.json +30 -19
  100. package/src/controllers.ts +4 -3
  101. package/src/decorator.ts +242 -104
  102. package/src/filter.ts +224 -0
  103. package/src/http-app.ts +11 -0
  104. package/src/http.ts +501 -100
  105. package/src/kernel.ts +128 -80
  106. package/src/logger.ts +4 -6
  107. package/src/middleware.ts +116 -0
  108. package/src/model.ts +516 -5
  109. package/src/module.config.ts +168 -5
  110. package/src/module.ts +120 -7
  111. package/src/request-parser.ts +430 -0
  112. package/src/router.ts +546 -317
  113. package/src/static-serving.ts +120 -50
  114. package/src/utils.ts +0 -2
  115. package/tsconfig.esm.json +7 -7
  116. package/tsconfig.json +18 -11
  117. package/tsconfig.spec.json +8 -0
  118. package/dist/cjs/tests/router.spec.d.ts +0 -1
  119. package/dist/cjs/tests/router.spec.js +0 -481
  120. package/dist/cjs/tests/router.spec.js.map +0 -1
  121. package/dist/esm/tests/router.spec.d.ts +0 -1
  122. package/dist/esm/tests/router.spec.js +0 -479
  123. package/dist/esm/tests/router.spec.js.map +0 -1
  124. package/tests/router.spec.ts +0 -347
@@ -1,347 +0,0 @@
1
- import { expect, test } from '@jest/globals';
2
- import 'reflect-metadata';
3
- import { dotToUrlPath, RouteParameterResolverContext, RouteParameterResolverTag, Router } from '../src/router';
4
- import { http, httpClass } from '../src/decorator';
5
- import { t } from '@deepkit/type';
6
- import { HttpListener, JSONResponse } from '../src/http';
7
- import { HttpKernel } from '../src/kernel';
8
- import { EventDispatcher } from '@deepkit/event';
9
- import { InjectorContext, ProviderWithScope, Tag } from '@deepkit/injector';
10
- import { Logger } from '@deepkit/logger';
11
- import { HttpRequest } from '../src/model';
12
- import { ClassType } from '@deepkit/core';
13
- import { TagProviders } from '@deepkit/app';
14
-
15
- function createHttpKernel(controllers: ClassType[], providers: ProviderWithScope[] = []) {
16
- const tagProviders = new TagProviders();
17
- for (const provider of providers) if (provider instanceof Tag) tagProviders.tags.push(provider);
18
- const router = Router.forControllers(controllers, tagProviders);
19
- const injector = InjectorContext.forProviders([{ provide: Router, useValue: router }, ...controllers, HttpListener, Logger, ...providers]);
20
- const eventDispatcher = new EventDispatcher(injector);
21
- eventDispatcher.registerListener(HttpListener);
22
- return new HttpKernel(router, eventDispatcher, injector, new Logger(), false);
23
- }
24
-
25
- test('router', async () => {
26
- class Controller {
27
- @http.GET()
28
- helloWorld() {
29
- }
30
-
31
- @http.GET(':name')
32
- hello(name: string) {
33
- }
34
-
35
- @http.GET('/user/:id/static')
36
- userStatic(id: string) {
37
- }
38
-
39
- @http.GET('/user2/:id/static/:id2')
40
- userStatic2(id: string, id2: string) {
41
- }
42
-
43
- @http.GET('/static')
44
- static() {
45
- }
46
- }
47
-
48
- const router = Router.forControllers([Controller]);
49
-
50
- expect((await router.resolve('GET', '/'))?.routeConfig.action).toMatchObject({ controller: Controller, methodName: 'helloWorld' });
51
- expect((await router.resolve('GET', '/peter'))?.routeConfig.action).toMatchObject({ controller: Controller, methodName: 'hello' });
52
- expect((await router.resolve('GET', '/peter'))?.parameters!(undefined as any)).toEqual(['peter']);
53
-
54
- const userStatic = await router.resolve('GET', '/user/1233/static');
55
- expect(userStatic?.routeConfig.action).toMatchObject({ controller: Controller, methodName: 'userStatic' });
56
- expect(userStatic?.parameters!(undefined as any)).toEqual(['1233']);
57
-
58
- const userStatic2 = await router.resolve('GET', '/user2/1233/static/123');
59
- expect(userStatic2?.routeConfig.action).toMatchObject({ controller: Controller, methodName: 'userStatic2' });
60
- expect(userStatic2?.parameters!(undefined as any)).toEqual(['1233', '123']);
61
- });
62
-
63
- test('router parameters', async () => {
64
- class Controller {
65
- @http.GET('/user/:name')
66
- string(name: string) {
67
- return new JSONResponse(name);
68
- }
69
-
70
- @http.GET('/user-id/:id')
71
- number(id: number) {
72
- return new JSONResponse(id);
73
- }
74
-
75
- @http.GET('/boolean/:yes')
76
- boolean(yes: boolean) {
77
- return new JSONResponse(yes);
78
- }
79
-
80
- @http.GET(':path').regexp('path', '.*')
81
- any(path: string) {
82
- return new JSONResponse(path);
83
- }
84
- }
85
-
86
- const router = Router.forControllers([Controller]);
87
- expect((await router.resolve('GET', '/user/peter'))?.routeConfig.action).toMatchObject({ controller: Controller, methodName: 'string' });
88
-
89
- const httpKernel = createHttpKernel([Controller]);
90
-
91
- expect(await httpKernel.handleRequestFor('GET', '/user/peter')).toBe('peter');
92
- expect(await httpKernel.handleRequestFor('GET', '/user-id/123')).toBe(123);
93
- expect(await httpKernel.handleRequestFor('GET', '/user-id/asd')).toMatchObject({ message: 'Validation failed: id(No number given): invalid_number' });
94
- expect(await httpKernel.handleRequestFor('GET', '/boolean/1')).toBe(true);
95
- expect(await httpKernel.handleRequestFor('GET', '/boolean/false')).toBe(false);
96
-
97
- expect(await httpKernel.handleRequestFor('GET', '/any')).toBe('any');
98
- expect(await httpKernel.handleRequestFor('GET', '/any/path')).toBe('any/path');
99
- });
100
-
101
- test('router HttpRequest', async () => {
102
- class Controller {
103
- @http.GET(':path').regexp('path', '.*')
104
- anyReq(req: HttpRequest, path: string) {
105
- return [req.url, path];
106
- }
107
- }
108
-
109
- const httpKernel = createHttpKernel([Controller]);
110
-
111
- expect(await httpKernel.handleRequestFor('GET', '/req/any/path')).toEqual(['/req/any/path', 'req/any/path']);
112
- });
113
-
114
- test('router parameterResolver', async () => {
115
- class User {
116
- constructor(public username: string) {
117
- }
118
- }
119
-
120
- class Controller {
121
- @http.GET('user/:username')
122
- route1(user: User) {
123
- return [user.username];
124
- }
125
-
126
- @http.GET('group')
127
- route2(user: User) {
128
- return [user.username];
129
- }
130
- }
131
-
132
- class MyRouteParameterResolver {
133
- resolve(context: RouteParameterResolverContext): any | Promise<any> {
134
- if (!context.parameters.username) throw new Error('No :username specified');
135
- return new User(context.parameters.username);
136
- }
137
- }
138
-
139
- const httpKernel = createHttpKernel([Controller], [RouteParameterResolverTag.provide(MyRouteParameterResolver).forClassType(User)]);
140
-
141
- expect(await httpKernel.handleRequestFor('GET', '/user/peter')).toEqual(['peter']);
142
- expect(await httpKernel.handleRequestFor('GET', '/group')).toEqual('Internal error');
143
- });
144
-
145
- test('router body', async () => {
146
- class Body {
147
- @t username!: string;
148
- }
149
-
150
- class Controller {
151
- @http.POST()
152
- anyReq(@http.body() body: Body, req: HttpRequest) {
153
- return [body.username, body instanceof Body, req.url];
154
- }
155
- }
156
-
157
- const httpKernel = createHttpKernel([Controller]);
158
-
159
- expect(await httpKernel.handleRequestFor('POST', '/', { username: 'Peter' })).toEqual(['Peter', true, '/']);
160
- });
161
-
162
-
163
- test('router body double', async () => {
164
- class Body {
165
- @t username!: string;
166
- }
167
-
168
- class Controller {
169
- @http.POST()
170
- anyReq(@http.body() body: Body, @http.body() body2: Body, req: HttpRequest) {
171
- return [body2.username, body2 instanceof Body && body instanceof Body, req.url];
172
- }
173
- }
174
-
175
- const httpData = httpClass._fetch(Controller);
176
- if (!httpData) throw new Error('httpClass undefined');
177
- const action = [...httpData.getActions()][0];
178
- expect(action.methodName).toBe('anyReq');
179
- expect(action.httpMethod).toBe('POST');
180
- expect(action.parameters['body']).not.toBeUndefined();
181
- expect(action.parameters['body'].name).toBe('body');
182
- expect(action.parameters['body2']).not.toBeUndefined();
183
- expect(action.parameters['body2'].name).toBe('body2');
184
-
185
- const httpKernel = createHttpKernel([Controller]);
186
-
187
- expect(await httpKernel.handleRequestFor('POST', '/', { username: 'Peter' })).toEqual(['Peter', true, '/']);
188
- });
189
-
190
- test('router groups', async () => {
191
- {
192
- class Controller {
193
- @http.GET('a').group('a')
194
- a() {
195
- }
196
-
197
- @http.GET('b')
198
- b() {
199
- }
200
-
201
- @http.GET('c').group('c')
202
- c() {
203
- }
204
- }
205
-
206
- const httpData = httpClass._fetch(Controller);
207
- if (!httpData) throw new Error('httpClass undefined');
208
- expect(httpData.getAction('a').groups).toEqual(['a']);
209
- expect(httpData.getAction('b').groups).toEqual([]);
210
- expect(httpData.getAction('c').groups).toEqual(['c']);
211
- }
212
-
213
- {
214
- @http.groupAll('all')
215
- class Controller {
216
- @http.GET('a').group('a')
217
- a() {
218
- }
219
-
220
- @http.GET('b')
221
- b() {
222
- }
223
-
224
- @http.GET('c').group('c')
225
- c() {
226
- }
227
- }
228
-
229
- const httpData = httpClass._fetch(Controller);
230
- if (!httpData) throw new Error('httpClass undefined');
231
- expect(httpData.getAction('a').groups).toEqual(['a', 'all']);
232
- expect(httpData.getAction('b').groups).toEqual(['all']);
233
- expect(httpData.getAction('c').groups).toEqual(['c', 'all']);
234
- }
235
-
236
- expect(() => {
237
- @http.group('all')
238
- class ControllerC {
239
- }
240
- }).toThrow('Property decorators can only be used on class properties');
241
- });
242
-
243
- test('router query', async () => {
244
- class Controller {
245
- @http.GET('my-action')
246
- anyReq(@http.query().optional test?: number) {
247
- return test;
248
- }
249
- }
250
-
251
- const httpData = httpClass._fetch(Controller);
252
- if (!httpData) throw new Error('httpClass undefined');
253
- const action = [...httpData.getActions()][0];
254
- expect(action.methodName).toBe('anyReq');
255
- expect(action.httpMethod).toBe('GET');
256
- expect(action.parameters['test']).not.toBeUndefined();
257
- expect(action.parameters['test'].name).toBe('test');
258
- expect(action.parameters['test'].type).toBe('query');
259
-
260
- const httpKernel = createHttpKernel([Controller]);
261
-
262
- expect(await httpKernel.handleRequestFor('GET', '/my-action?test=123')).toEqual(123);
263
- expect(await httpKernel.handleRequestFor('GET', '/my-action')).toEqual(undefined);
264
- });
265
-
266
- test('router query all', async () => {
267
- class AnyReqQuery {
268
- @t.optional test?: string;
269
- @t.optional filter?: string;
270
- @t.optional page?: number;
271
- }
272
-
273
- class Controller {
274
- @http.GET('my-action')
275
- anyReq(@http.queries() anyReqQuery: AnyReqQuery) {
276
- return anyReqQuery;
277
- }
278
- }
279
-
280
- const httpKernel = createHttpKernel([Controller]);
281
-
282
- expect(await httpKernel.handleRequestFor('GET', '/my-action?test=123')).toEqual({ test: '123' });
283
- expect(await httpKernel.handleRequestFor('GET', '/my-action')).toEqual({});
284
- expect(await httpKernel.handleRequestFor('GET', '/my-action?filter=page&page=5')).toEqual({ filter: 'page', page: 5 });
285
- });
286
-
287
-
288
- test('router dotToUrlPath', () => {
289
- expect(dotToUrlPath('peter')).toBe('peter');
290
- expect(dotToUrlPath('foo.bar')).toBe('foo[bar]');
291
- expect(dotToUrlPath('foo.bar.deep')).toBe('foo[bar][deep]');
292
- expect(dotToUrlPath('foo.bar.deep.very')).toBe('foo[bar][deep][very]');
293
- });
294
-
295
- test('router url resolve', async () => {
296
- class AnyReqQuery {
297
- @t.optional test?: string;
298
- @t.optional filter?: string;
299
- @t.optional page?: number;
300
- }
301
-
302
- class Controller {
303
- @http.GET('').name('first')
304
- first() {
305
- return '';
306
- }
307
-
308
- @http.GET(':peter').name('second')
309
- second(peter: string) {
310
- return '';
311
- }
312
-
313
- @http.GET('').name('secondQuery')
314
- secondQuery(@http.query() peter: string) {
315
- return '';
316
- }
317
-
318
- @http.GET('').name('secondQuery2')
319
- secondQuery2(@http.query('changed') peter: string) {
320
- return '';
321
- }
322
-
323
- @http.GET('third').name('third')
324
- third(@http.queries() params: AnyReqQuery) {
325
- return params;
326
- }
327
-
328
- @http.GET('third2').name('third2')
329
- third2(@http.queries('deep') params: AnyReqQuery) {
330
- return params;
331
- }
332
- }
333
-
334
- const router = Router.forControllers([Controller]);
335
-
336
- expect(router.resolveUrl('first')).toBe('/');
337
- expect(router.resolveUrl('second', { peter: 'foo' })).toBe('/foo');
338
- expect(router.resolveUrl('secondQuery', { peter: 'foo' })).toBe('/?peter=foo');
339
- expect(router.resolveUrl('secondQuery2', { peter: 'foo' })).toBe('/?changed=foo');
340
- expect(router.resolveUrl('third', {})).toBe('/third');
341
- expect(router.resolveUrl('third', { params: { test: 123 } })).toBe('/third?test=123');
342
- expect(router.resolveUrl('third', { params: { test: 123, filter: 'peter' } })).toBe('/third?test=123&filter=peter');
343
-
344
- expect(router.resolveUrl('third2', {})).toBe('/third2');
345
- expect(router.resolveUrl('third2', { params: { test: 123 } })).toBe('/third2?deep[test]=123');
346
- expect(router.resolveUrl('third2', { params: { test: 123, filter: 'peter' } })).toBe('/third2?deep[test]=123&deep[filter]=peter');
347
- });