@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,91 +1,114 @@
1
1
  import { ClassType, CompilerContext } from '@deepkit/core';
2
- import { PropertySchema, ValidationFailedItem } from '@deepkit/type';
3
- import { HttpRequest, HttpRequestQuery, HttpRequestResolvedParameters } from './model';
4
- import { BasicInjector, NormalizedProvider, Tag } from '@deepkit/injector';
5
- import { Logger } from '@deepkit/logger';
6
- import { TagProviders } from '@deepkit/app';
7
- import { HttpControllers } from './controllers';
8
- export declare type RouteParameterResolverForInjector = ((injector: BasicInjector) => any[] | Promise<any[]>);
9
- declare type ResolvedController = {
2
+ import { ReflectionFunction, ReflectionParameter, SerializationOptions, Serializer, Type } from '@deepkit/type';
3
+ import { HttpDecorator } from './decorator.js';
4
+ import { HttpRequest, HttpRequestPositionedParameters, HttpRequestQuery, HttpRequestResolvedParameters } from './model.js';
5
+ import { InjectorContext, InjectorModule } from '@deepkit/injector';
6
+ import { LoggerInterface } from '@deepkit/logger';
7
+ import { HttpControllers } from './controllers.js';
8
+ import { MiddlewareRegistry } from '@deepkit/app';
9
+ import { HttpMiddlewareConfig, HttpMiddlewareFn } from './middleware.js';
10
+ import { ParameterForRequestParser } from './request-parser.js';
11
+ import { HttpConfig } from './module.config.js';
12
+ export type RouteParameterResolverForInjector = ((injector: InjectorContext) => HttpRequestPositionedParameters | Promise<HttpRequestPositionedParameters>);
13
+ interface ResolvedController {
10
14
  parameters: RouteParameterResolverForInjector;
11
15
  routeConfig: RouteConfig;
12
- };
13
- export interface RouteControllerAction {
14
- controller: ClassType;
15
- methodName: string;
16
+ uploadedFiles: {
17
+ [name: string]: UploadedFile;
18
+ };
19
+ middlewares?: (injector: InjectorContext) => {
20
+ fn: HttpMiddlewareFn;
21
+ timeout?: number;
22
+ }[];
16
23
  }
17
- export interface RouteParameterConfig {
18
- type?: 'body' | 'query';
24
+ export declare const UploadedFileSymbol: unique symbol;
25
+ export declare class UploadedFile {
26
+ /**
27
+ * Validator to ensure the file was provided by the framework, and not the user spoofing it.
28
+ */
29
+ validator: typeof UploadedFileSymbol | null;
19
30
  /**
20
- * undefined = propertyName, '' === root, else given path
31
+ * The size of the uploaded file in bytes.
21
32
  */
22
- typePath?: string;
23
- optional: boolean;
24
- name: string;
33
+ size: number;
34
+ /**
35
+ * The local path this file is being written to. Will be deleted when request is handled.
36
+ */
37
+ path: string;
38
+ /**
39
+ * The name this file had according to the uploading client.
40
+ */
41
+ name: string | null;
42
+ /**
43
+ * The mime type of this file, according to the uploading client.
44
+ */
45
+ type: string | null;
46
+ /**
47
+ * A Date object (or `null`) containing the time this file was last written to.
48
+ * Mostly here for compatibility with the [W3C File API Draft](http://dev.w3.org/2006/webapi/FileAPI/).
49
+ */
50
+ lastModifiedDate: Date | null;
51
+ }
52
+ export interface RouteFunctionControllerAction {
53
+ type: 'function';
54
+ module?: InjectorModule<any>;
55
+ fn: (...args: any[]) => any;
56
+ }
57
+ export interface RouteClassControllerAction {
58
+ type: 'controller';
59
+ module?: InjectorModule<any>;
60
+ controller: ClassType;
61
+ methodName: string;
25
62
  }
63
+ export declare function getRouteActionLabel(action: RouteClassControllerAction | RouteFunctionControllerAction): string;
26
64
  export declare class RouteConfig {
27
65
  readonly name: string;
28
- readonly httpMethod: string;
66
+ readonly httpMethods: string[];
29
67
  readonly path: string;
30
- readonly action: RouteControllerAction;
68
+ readonly action: RouteClassControllerAction | RouteFunctionControllerAction;
69
+ internal: boolean;
31
70
  baseUrl: string;
32
- parameterRegularExpressions: {
33
- [name: string]: any;
34
- };
35
- throws: {
36
- errorType: ClassType;
37
- message?: string;
71
+ responses: {
72
+ statusCode: number;
73
+ description: string;
74
+ type?: Type;
38
75
  }[];
39
76
  description: string;
40
77
  groups: string[];
41
78
  category: string;
79
+ returnType?: Type;
80
+ serializationOptions?: SerializationOptions;
81
+ serializer?: Serializer;
82
+ /**
83
+ * When assigned defines where this route came from.
84
+ */
85
+ module?: InjectorModule<any>;
86
+ resolverForToken: Map<any, ClassType>;
87
+ middlewares: {
88
+ config: HttpMiddlewareConfig;
89
+ module?: InjectorModule<any>;
90
+ }[];
91
+ resolverForParameterName: Map<string, ClassType>;
42
92
  /**
43
93
  * An arbitrary data container the user can use to store app specific settings/values.
44
94
  */
45
95
  data: Map<any, any>;
46
- parameters: {
47
- [name: string]: RouteParameterConfig;
48
- };
49
- constructor(name: string, httpMethod: string, path: string, action: RouteControllerAction);
96
+ constructor(name: string, httpMethods: string[], path: string, action: RouteClassControllerAction | RouteFunctionControllerAction, internal?: boolean);
97
+ getReflectionFunction(): ReflectionFunction;
98
+ getSchemaForResponse(statusCode: number): Type | undefined;
50
99
  getFullPath(): string;
51
100
  }
52
- /**
53
- * When this class is injected into a route, then validation errors are not automatically thrown (using onHttpControllerValidationError event),
54
- * but injected to the route itself. The user is then responsible to handle the errors.
55
- *
56
- * Note: The body parameter is still passed, however it might contain now invalid data. The BodyValidation tells what data is invalid.
57
- */
58
- export declare class BodyValidation {
59
- readonly errors: ValidationFailedItem[];
60
- constructor(errors?: ValidationFailedItem[]);
61
- hasErrors(prefix?: string): boolean;
62
- getErrors(prefix?: string): ValidationFailedItem[];
63
- getErrorsForPath(path: string): ValidationFailedItem[];
64
- getErrorMessageForPath(path: string): string;
65
- }
66
- declare class ParsedRoute {
101
+ export declare class ParsedRoute {
67
102
  routeConfig: RouteConfig;
68
103
  regex?: string;
69
- customValidationErrorHandling?: ParsedRouteParameter;
70
104
  pathParameterNames: {
71
105
  [name: string]: number;
72
106
  };
73
- protected parameters: ParsedRouteParameter[];
107
+ protected parameters: ParameterForRequestParser[];
74
108
  constructor(routeConfig: RouteConfig);
75
- addParameter(property: PropertySchema, config?: RouteParameterConfig): ParsedRouteParameter;
76
- getParameters(): ParsedRouteParameter[];
77
- getParameter(name: string): ParsedRouteParameter;
78
- }
79
- declare class ParsedRouteParameter {
80
- property: PropertySchema;
81
- config?: RouteParameterConfig | undefined;
82
- regexPosition?: number;
83
- constructor(property: PropertySchema, config?: RouteParameterConfig | undefined);
84
- get body(): boolean;
85
- get query(): boolean;
86
- get typePath(): string | undefined;
87
- getName(): string;
88
- isPartOfPath(): boolean;
109
+ addParameter(property: ReflectionParameter): ParameterForRequestParser;
110
+ getParameters(): ParameterForRequestParser[];
111
+ getParameter(name: string): ParameterForRequestParser;
89
112
  }
90
113
  export declare function parseRouteControllerAction(routeConfig: RouteConfig): ParsedRoute;
91
114
  export declare function dotToUrlPath(dotPath: string): string;
@@ -93,35 +116,105 @@ export interface RouteParameterResolver {
93
116
  resolve(context: RouteParameterResolverContext): any | Promise<any>;
94
117
  }
95
118
  export interface RouteParameterResolverContext {
96
- classType: ClassType;
119
+ token: ClassType | string | symbol | any;
97
120
  route: RouteConfig;
98
121
  request: HttpRequest;
122
+ /**
123
+ * The parameter name (variable name).
124
+ */
125
+ name: any;
126
+ /**
127
+ * The raw parameter value from the path, if the parameter is defined in the path (e.g. /user/:name).
128
+ * If not in the path, you have to use `parameters.<name>` instead.
129
+ */
130
+ value: any;
99
131
  query: HttpRequestQuery;
100
132
  parameters: HttpRequestResolvedParameters;
133
+ type: ReflectionParameter;
101
134
  }
102
- export declare class RouteParameterResolverTag extends Tag<RouteParameterResolver> {
103
- provider: NormalizedProvider;
104
- classTypes: ClassType[];
105
- constructor(provider: NormalizedProvider);
106
- forClassType(...classTypes: ClassType[]): this;
135
+ export interface HttpRouterFunctionOptions {
136
+ path: string;
137
+ name?: string;
138
+ methods?: string[];
139
+ description?: string;
140
+ category?: string;
141
+ groups?: string[];
142
+ /**
143
+ * An arbitrary data container the user can use to store app specific settings/values.
144
+ */
145
+ data?: Record<any, any>;
146
+ baseUrl?: string;
147
+ middlewares?: (() => HttpMiddlewareConfig)[];
148
+ serializer?: Serializer;
149
+ serializationOptions?: SerializationOptions;
150
+ resolverForToken?: Map<any, ClassType>;
151
+ resolverForParameterName?: Map<string, ClassType>;
152
+ responses?: {
153
+ statusCode: number;
154
+ description: string;
155
+ type?: Type;
156
+ }[];
157
+ }
158
+ export declare abstract class HttpRouterRegistryFunctionRegistrar {
159
+ protected defaultOptions: Partial<HttpRouterFunctionOptions>;
160
+ abstract addRoute(routeConfig: RouteConfig): void;
161
+ /**
162
+ * Returns a new registrar object with default options that apply to each registered route through this registrar.
163
+ *
164
+ * ```typescript
165
+ * const registry: HttpRouterRegistry = ...;
166
+ *
167
+ * const secretRegistry = registry.forOptions({groups: ['secret']});
168
+ *
169
+ * secretRegistry.get('/admin/groups', () => {
170
+ * });
171
+ *
172
+ * secretRegistry.get('/admin/users', () => {
173
+ * });
174
+ * ```
175
+ */
176
+ forOptions(options: Partial<HttpRouterFunctionOptions>): HttpRouterRegistryFunctionRegistrar;
177
+ any(pathOrOptions: string | HttpRouterFunctionOptions, callback: (...args: any[]) => any): void;
178
+ add(decorator: HttpDecorator, callback: (...args: any[]) => any): void;
179
+ get(pathOrOptions: string | HttpRouterFunctionOptions, callback: (...args: any[]) => any): void;
180
+ post(pathOrOptions: string | HttpRouterFunctionOptions, callback: (...args: any[]) => any): void;
181
+ put(pathOrOptions: string | HttpRouterFunctionOptions, callback: (...args: any[]) => any): void;
182
+ patch(pathOrOptions: string | HttpRouterFunctionOptions, callback: (...args: any[]) => any): void;
183
+ delete(pathOrOptions: string | HttpRouterFunctionOptions, callback: (...args: any[]) => any): void;
184
+ options(pathOrOptions: string | HttpRouterFunctionOptions, callback: (...args: any[]) => any): void;
185
+ trace(pathOrOptions: string | HttpRouterFunctionOptions, callback: (...args: any[]) => any): void;
186
+ head(pathOrOptions: string | HttpRouterFunctionOptions, callback: (...args: any[]) => any): void;
187
+ private register;
107
188
  }
108
- export declare class Router {
189
+ export declare class HttpRouterRegistry extends HttpRouterRegistryFunctionRegistrar {
190
+ protected routes: RouteConfig[];
191
+ private buildId;
192
+ getBuildId(): number;
193
+ getRoutes(): RouteConfig[];
194
+ addRouteForController(controller: ClassType, module: InjectorModule<any>): void;
195
+ addRoute(routeConfig: RouteConfig): void;
196
+ }
197
+ export declare class HttpRouter {
109
198
  private logger;
199
+ private config;
200
+ private middlewareRegistry;
201
+ private registry;
110
202
  protected fn?: (request: HttpRequest) => ResolvedController | undefined;
203
+ protected buildId: number;
111
204
  protected resolveFn?: (name: string, parameters: {
112
205
  [name: string]: any;
113
206
  }) => string;
114
- protected routes: RouteConfig[];
115
- protected parameterResolverTags: RouteParameterResolverTag[];
116
- protected form: any;
117
- constructor(controllers: HttpControllers, logger: Logger, tagProviders: TagProviders);
207
+ constructor(controllers: HttpControllers, logger: LoggerInterface, config: HttpConfig, middlewareRegistry?: MiddlewareRegistry, registry?: HttpRouterRegistry);
118
208
  getRoutes(): RouteConfig[];
119
- static forControllers(controllers: ClassType[], tagProviders?: TagProviders): Router;
209
+ static forControllers(controllers: (ClassType | {
210
+ module: InjectorModule<any>;
211
+ controller: ClassType;
212
+ })[], middlewareRegistry?: MiddlewareRegistry, module?: InjectorModule<any>, config?: HttpConfig): HttpRouter;
120
213
  protected getRouteCode(compiler: CompilerContext, routeConfig: RouteConfig): string;
121
214
  protected getRouteUrlResolveCode(compiler: CompilerContext, routeConfig: RouteConfig): string;
122
215
  addRoute(routeConfig: RouteConfig): void;
123
- addRouteForController(controller: ClassType): void;
124
- protected build(): any;
216
+ addRouteForController(controller: ClassType, module: InjectorModule<any>): void;
217
+ protected build(): (request: HttpRequest) => ResolvedController | undefined;
125
218
  protected buildUrlResolver(): any;
126
219
  resolveUrl(routeName: string, parameters?: {
127
220
  [name: string]: any;
@@ -130,3 +223,9 @@ export declare class Router {
130
223
  resolve(method: string, url: string): ResolvedController | undefined;
131
224
  }
132
225
  export {};
226
+ export declare type __ΩRouteParameterResolverForInjector = any[];
227
+ export declare type __ΩRouteFunctionControllerAction = any[];
228
+ export declare type __ΩRouteClassControllerAction = any[];
229
+ export declare type __ΩRouteParameterResolver = any[];
230
+ export declare type __ΩRouteParameterResolverContext = any[];
231
+ export declare type __ΩHttpRouterFunctionOptions = any[];