@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/middleware.ts"],"names":[],"mappings":";;;;iCAAmC,eAAe;AAAlD,wCAAmD;AACnD,sCAAyC;AACzC,wCAA2D;AAC3D,yCAAuD;AACvD,gDAAmD;;;;;;;AAkBnD,MAAa,oBAAoB;IAAjC;QAEI,gBAAW,GAAqD,EAAE,CAAC;QAEnE,WAAM,GAA0B,EAAE,CAAC;QACnC,kBAAa,GAA0B,EAAE,CAAC;QAE1C,UAAK,GAAW,CAAC,CAAC;QAElB,gBAAW,GAAgB,EAAE,CAAC;QAC9B,uBAAkB,GAAgB,EAAE,CAAC;QAErC,eAAU,GAAa,EAAE,CAAC;QAC1B,sBAAiB,GAAa,EAAE,CAAC;QAIjC,YAAO,GAA0B,EAAE,CAAC;QAEpC,eAAU,GAAY,KAAK,CAAC;KAU/B;IARG,aAAa;QACT,MAAM,UAAU,GAAgB,EAAE,CAAC;QACnC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACxC,IAAI,IAAA,cAAO,EAAC,UAAU,CAAC;gBAAE,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,UAAU,CAAC;IACtB,CAAC;;AA5BL,oDA6BC;mJA3BmE,EAAE,kEAElC,EAAE,yEACK,EAAE,mCAEzB,CAAC,6DAEU,EAAE,oEACK,EAAE,wCAEb,EAAE,+CACK,EAAE,iFAIC,EAAE,wCAEb,KAAK;AAY/B,MAAa,iBAAiB;IAA9B;QACI,MAAC,GAAG,IAAI,oBAAoB,CAAC;KA2DhC;IAzDG,IAAI,CAAC,IAAY;QACb,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,GAAG,CAAC,GAAG,WAA6D;QAChE,IAAI,CAAC,CAAC,CAAC,WAAW,GAAG,WAAW,CAAC;IACrC,CAAC;IAED,SAAS,CAAC,GAAG,MAA6B;QACtC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;IAC3B,CAAC;IAED,aAAa,CAAC,GAAG,MAA6B;QAC1C,IAAI,CAAC,CAAC,CAAC,aAAa,GAAG,MAAM,CAAC;IAClC,CAAC;IAED,aAAa,CAAC,GAAG,KAAe;QAC5B,IAAI,CAAC,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,iBAAiB,CAAC,GAAG,KAAe;QAChC,IAAI,CAAC,CAAC,CAAC,iBAAiB,GAAG,KAAK,CAAC;IACrC,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,OAAe;QACnB,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC;IAC7B,CAAC;IAED,cAAc,CAAC,GAAG,WAAwB;QACtC,IAAI,CAAC,CAAC,CAAC,WAAW,GAAG,WAAW,CAAC;IACrC,CAAC;IAED,kBAAkB,CAAC,GAAG,WAAwB;QAC1C,IAAI,CAAC,CAAC,CAAC,kBAAkB,GAAG,WAAW,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAa;QACf,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,UAAU,CAAC,GAAG,OAAyB;QACnC,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,cAAc;QACV,IAAI,CAAC,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC;IAC7B,CAAC;;AA3DL,8CA4DC;sDA3DO,IAAI,oBAAoB;AA6DnB,QAAA,cAAc,GAAG,IAAA,iCAA0B,EAAC,iBAAiB,CAAC,CAAC"}
@@ -1,14 +1,232 @@
1
- /// <reference types="node" />
2
- import { IncomingMessage, ServerResponse } from 'http';
1
+ import { IncomingMessage, OutgoingHttpHeader, OutgoingHttpHeaders, ServerResponse } from 'http';
2
+ import { UploadedFile } from './router.js';
3
+ import { Type, ValidationErrorItem } from '@deepkit/type';
4
+ import { TypeAnnotation } from '@deepkit/core';
3
5
  export declare class HttpResponse extends ServerResponse {
4
6
  status(code: number): void;
5
7
  }
6
- export declare type HttpRequestQuery = {
8
+ /**
9
+ * Reads the body of the request and returns it as a Buffer.
10
+ * The result will be cached in the request object as `request.body`.
11
+ *
12
+ * Deepkit's router will automatically use `request.body` if available.
13
+ */
14
+ export declare function readBody(request: IncomingMessage): Promise<Buffer>;
15
+ export declare function createRequestWithCachedBody(request: Partial<IncomingMessage>, body: Buffer): HttpRequest;
16
+ export type HttpRequestQuery = {
7
17
  [name: string]: string;
8
18
  };
9
- export declare type HttpRequestResolvedParameters = {
19
+ export type HttpRequestResolvedParameters = {
10
20
  [name: string]: any;
11
21
  };
22
+ export type HttpRequestPositionedParameters = {
23
+ arguments: any[];
24
+ parameters: HttpRequestResolvedParameters;
25
+ };
26
+ export declare class BodyValidationError {
27
+ readonly errors: ValidationErrorItem[];
28
+ constructor(errors?: ValidationErrorItem[]);
29
+ hasErrors(prefix?: string): boolean;
30
+ getErrors(prefix?: string): ValidationErrorItem[];
31
+ getErrorsForPath(path: string): ValidationErrorItem[];
32
+ getErrorMessageForPath(path: string): string;
33
+ }
34
+ export declare class ValidatedBody<T> {
35
+ error: BodyValidationError;
36
+ value?: T | undefined;
37
+ constructor(error: BodyValidationError, value?: T | undefined);
38
+ valid(): this is {
39
+ value: T;
40
+ };
41
+ }
42
+ /**
43
+ * Marks a parameter as HTTP body and reads the value from the request body.
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * class Controller {
48
+ * @http.GET('/api')
49
+ * route(body: HttpBody<{username: string}>) {
50
+ * //body is {username: string} and required
51
+ * //could also reference an interface or type alias via `HttpBody<MyInterface>`
52
+ * }
53
+ * }
54
+ *
55
+ * // curl /api -d '{"username":"Peter"}'
56
+ */
57
+ export type HttpBody<T> = T & TypeAnnotation<'httpBody'>;
58
+ export type HttpBodyValidation<T> = ValidatedBody<T> & TypeAnnotation<'httpBodyValidation'>;
59
+ export interface HttpRequestParserOptions {
60
+ withPath?: boolean;
61
+ withBody?: boolean;
62
+ withQuery?: boolean;
63
+ withHeader?: boolean;
64
+ }
65
+ /**
66
+ * Delays the parsing of the path/body/query/header to the very last moment, when the parameter is actually used.
67
+ *
68
+ * If no options are provided, the parser will receive data from path, header, body, and query, in this order.
69
+ * This basically allows to fetch data from all possible HTTP sources in one go.
70
+ *
71
+ * You can disable various sources by providing the options, e.g. `{withBody: false}` to disable body parsing.
72
+ * Or `{withQuery: false}` to disable query parsing. Or `{withHeader: false}` to disable header parsing.
73
+ * To only parse the body, use `{withQuery: false, withHeader: false}`.
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * async route(parser: HttpRequestParser<{authorization: string}>) {
78
+ * const data = await parser();
79
+ * console.log(data.authorization);
80
+ * }
81
+ * ```
82
+ *
83
+ * Note that the parsers is based on all defined parameters (e.g. `userId: HttpQuery<string>` => {userId: string}),
84
+ * and then starts from there applying header, body, and then query values.
85
+ * This means you also get access to defined path parameters, like:
86
+ *
87
+ * ```typescript
88
+ * @http.GET('teams/:teamId')
89
+ * async route(teamId: string) {
90
+ * //teamId is string
91
+ * }
92
+ *
93
+ * httpWorkflow.onController.listen((event, parser: HttpRequestParser<{teamId: string}>) => {
94
+ * const data = await parser();
95
+ * console.log(data.teamId);
96
+ * });
97
+ * ```
98
+ *
99
+ * HttpRequestParser is necessary in event listeners, since they are instantiated synchronously,
100
+ * but body is parsed asynchronously. So use in event listeners HttpRequestParser instead of HttpBody.
101
+ */
102
+ export type HttpRequestParser<T> = ((options?: HttpRequestParserOptions) => Promise<T>) & TypeAnnotation<'httpRequestParser', T>;
103
+ /**
104
+ * Marks a parameter as HTTP path and reads the value from the request path.
105
+ * This is normally not requires since the parameter name automatically maps to the path parameter,
106
+ * but in case of requesting the path parameter in for example listeners, this is required.
107
+ * The name option can be used to change the parameter name.
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * app.listen(httpWorkflow.onController, (event, request: HttpRequest, groupId: HttpPath<number>) => {
112
+ * console.log(groupId); //123
113
+ * });
114
+ *
115
+ * class Controller {
116
+ * @http.GET('/api/:groupId')
117
+ * route(groupId: number) {
118
+ * //groupId is number and required
119
+ * //same as `groupId: HttpPath<number>`
120
+ * }
121
+ * }
122
+ * ```
123
+ */
124
+ export type HttpPath<T, Options extends {
125
+ name?: string;
126
+ } = {}> = T & TypeAnnotation<'httpPath', Options>;
127
+ /**
128
+ * Marks a parameter as HTTP header and reads the value from the request header.
129
+ *
130
+ * @example
131
+ * ```typescript
132
+ * class Controller {
133
+ * @http.GET('/api')
134
+ * route(authorization: HttpHeader<string>) {
135
+ * //authorization is string and required
136
+ * //use `authorization?: HttpHeader<string>` to make it optional
137
+ * }
138
+ * }
139
+ *
140
+ * // curl /api -H 'Authorization: 123'
141
+ * ```
142
+ *
143
+ * To change the header name, use `param: HttpHeader<string, {name: 'X-My-Header'}>`.
144
+ */
145
+ export type HttpHeader<T, Options extends {
146
+ name?: string;
147
+ } = {}> = T & TypeAnnotation<'httpHeader', Options>;
148
+ /**
149
+ * Marks a parameter as HTTP query and reads the value from the request query string.
150
+ *
151
+ * @example
152
+ * ```typescript
153
+ * class Controller {
154
+ * @http.GET('/api')
155
+ * route(limit: HttpQuery<number>) {
156
+ * //limit is number and required
157
+ * //use `limit?: HttpQuery<number>` to make it optional
158
+ * }
159
+ * }
160
+ *
161
+ * // curl /api?limit=10
162
+ * ```
163
+ */
164
+ export type HttpQuery<T, Options extends {
165
+ name?: string;
166
+ } = {}> = T & TypeAnnotation<'httpQuery', Options>;
167
+ /**
168
+ * Marks a parameter as HTTP query objects and reads multiple values from the request query string into an object.
169
+ *
170
+ * @example
171
+ * ```typescript
172
+ * interface Query {
173
+ * limit?: number;
174
+ * offset?: number;
175
+ * sort?: 'asc' | 'desc';
176
+ * }
177
+ *
178
+ * class Controller {
179
+ * @http.GET('/api')
180
+ * route(query: HttpQueries<Query>) {
181
+ * //query is an object containing limit, offset, and sort
182
+ * }
183
+ *
184
+ * // curl /api?limit=10&offset=20&sort=asc
185
+ */
186
+ export type HttpQueries<T, Options extends {
187
+ name?: string;
188
+ } = {}> = T & TypeAnnotation<'httpQueries', Options>;
189
+ /**
190
+ * For all parameters used in the URL path, a regular expression of /[^/]+/ is used. To change that, use getRegExp.
191
+ *
192
+ * @example
193
+ * ```typescript
194
+ *
195
+ * class Controller {
196
+ * @http.GET('/user/:username')
197
+ * route(username: HttpRegExp<string, '.*'>) {
198
+ * //username is string
199
+ * }
200
+ * }
201
+ * ```
202
+ */
203
+ export type HttpRegExp<T, Pattern extends string | RegExp> = T & TypeAnnotation<'httpRegExp', Pattern>;
204
+ export declare function getRegExp(type: Type): string | RegExp | undefined;
205
+ export declare class RequestBuilder {
206
+ protected path: string;
207
+ protected method: string;
208
+ protected contentBuffer: Buffer;
209
+ protected _headers: {
210
+ [name: string]: string;
211
+ };
212
+ protected queryPath?: string;
213
+ constructor(path: string, method?: string);
214
+ getUrl(): string;
215
+ build(): HttpRequest;
216
+ headers(headers: {
217
+ [name: string]: string;
218
+ }): this;
219
+ header(name: string, value: string | number): this;
220
+ json(body: object): this;
221
+ multiPart(items: {
222
+ name: string;
223
+ file?: Uint8Array;
224
+ fileName?: string;
225
+ json?: any;
226
+ }[]): this;
227
+ body(body: string | Buffer): this;
228
+ query(query: any | string): this;
229
+ }
12
230
  export declare class HttpRequest extends IncomingMessage {
13
231
  /**
14
232
  * A store that can be used to transport data from guards/listeners to ParameterResolvers/controllers.
@@ -16,7 +234,55 @@ export declare class HttpRequest extends IncomingMessage {
16
234
  store: {
17
235
  [name: string]: any;
18
236
  };
237
+ uploadedFiles: {
238
+ [name: string]: UploadedFile;
239
+ };
240
+ throwErrorOnNotFound: boolean;
241
+ /**
242
+ * The router sets the body when it was read.
243
+ */
244
+ body?: Buffer;
245
+ readBody(): Promise<Buffer>;
246
+ readBodyText(): Promise<string>;
247
+ static GET(path: string): RequestBuilder;
248
+ static POST(path: string): RequestBuilder;
249
+ static OPTIONS(path: string): RequestBuilder;
250
+ static TRACE(path: string): RequestBuilder;
251
+ static HEAD(path: string): RequestBuilder;
252
+ static PATCH(path: string): RequestBuilder;
253
+ static PUT(path: string): RequestBuilder;
254
+ static DELETE(path: string): RequestBuilder;
19
255
  getUrl(): string;
20
256
  getMethod(): string;
21
257
  getRemoteAddress(): string;
22
258
  }
259
+ export declare function incomingMessageToHttpRequest(request: IncomingMessage): HttpRequest;
260
+ export declare function serverResponseToHttpResponse(response: ServerResponse): HttpResponse;
261
+ export declare class MemoryHttpResponse extends HttpResponse {
262
+ body: Buffer;
263
+ headers: {
264
+ [name: string]: number | string | string[] | undefined;
265
+ };
266
+ setHeader(name: string, value: number | string | ReadonlyArray<string>): this;
267
+ removeHeader(name: string): void;
268
+ getHeader(name: string): string | number | string[] | undefined;
269
+ getHeaders(): OutgoingHttpHeaders;
270
+ writeHead(statusCode: number, headersOrReasonPhrase?: string | OutgoingHttpHeaders | OutgoingHttpHeader[], headers?: OutgoingHttpHeaders | OutgoingHttpHeader[]): this;
271
+ get json(): any;
272
+ get text(): string;
273
+ get bodyString(): string;
274
+ write(chunk: any, encoding: any, callback?: any): any;
275
+ end(chunk: any, encoding?: any, callback?: any): any;
276
+ }
277
+ export declare type __ΩHttpRequestQuery = any[];
278
+ export declare type __ΩHttpRequestResolvedParameters = any[];
279
+ export declare type __ΩHttpRequestPositionedParameters = any[];
280
+ export declare type __ΩHttpBody = any[];
281
+ export declare type __ΩHttpBodyValidation = any[];
282
+ export declare type __ΩHttpRequestParserOptions = any[];
283
+ export declare type __ΩHttpRequestParser = any[];
284
+ export declare type __ΩHttpPath = any[];
285
+ export declare type __ΩHttpHeader = any[];
286
+ export declare type __ΩHttpQuery = any[];
287
+ export declare type __ΩHttpQueries = any[];
288
+ export declare type __ΩHttpRegExp = any[];