@deepkit/http 1.0.1-alpha.57 → 1.0.1-alpha.61

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 (149) hide show
  1. package/coverage/clover.xml +1086 -0
  2. package/coverage/coverage-final.json +12 -0
  3. package/coverage/lcov-report/base.css +224 -0
  4. package/coverage/lcov-report/block-navigation.js +79 -0
  5. package/coverage/lcov-report/favicon.png +0 -0
  6. package/coverage/lcov-report/index.html +126 -0
  7. package/coverage/lcov-report/prettify.css +1 -0
  8. package/coverage/lcov-report/prettify.js +2 -0
  9. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  10. package/coverage/lcov-report/sorter.js +170 -0
  11. package/coverage/lcov-report/src/controllers.ts.html +113 -0
  12. package/coverage/lcov-report/src/decorator.ts.html +1280 -0
  13. package/coverage/lcov-report/src/filter.ts.html +734 -0
  14. package/coverage/lcov-report/src/http.ts.html +2192 -0
  15. package/coverage/lcov-report/src/index.html +246 -0
  16. package/coverage/lcov-report/src/kernel.ts.html +260 -0
  17. package/coverage/lcov-report/src/middleware.ts.html +428 -0
  18. package/coverage/lcov-report/src/model.ts.html +937 -0
  19. package/coverage/lcov-report/src/module.config.ts.html +89 -0
  20. package/coverage/lcov-report/src/module.ts.html +245 -0
  21. package/coverage/lcov-report/src/router.ts.html +2318 -0
  22. package/coverage/lcov-report/tests/index.html +111 -0
  23. package/coverage/lcov-report/tests/utils.ts.html +176 -0
  24. package/coverage/lcov.info +2225 -0
  25. package/dist/cjs/index.d.ts +1 -0
  26. package/dist/cjs/index.js +1 -0
  27. package/dist/cjs/index.js.map +1 -1
  28. package/dist/cjs/src/controllers.d.ts +4 -4
  29. package/dist/cjs/src/controllers.js +3 -0
  30. package/dist/cjs/src/controllers.js.map +1 -1
  31. package/dist/cjs/src/decorator.d.ts +29 -94
  32. package/dist/cjs/src/decorator.js +53 -118
  33. package/dist/cjs/src/decorator.js.map +1 -1
  34. package/dist/cjs/src/filter.d.ts +1 -0
  35. package/dist/cjs/src/filter.js +11 -17
  36. package/dist/cjs/src/filter.js.map +1 -1
  37. package/dist/cjs/src/http.d.ts +5 -3
  38. package/dist/cjs/src/http.js +100 -56
  39. package/dist/cjs/src/http.js.map +1 -1
  40. package/dist/cjs/src/kernel.d.ts +3 -3
  41. package/dist/cjs/src/kernel.js +9 -28
  42. package/dist/cjs/src/kernel.js.map +1 -1
  43. package/dist/cjs/src/logger.d.ts +2 -2
  44. package/dist/cjs/src/logger.js +4 -8
  45. package/dist/cjs/src/logger.js.map +1 -1
  46. package/dist/cjs/src/middleware.d.ts +5 -1
  47. package/dist/cjs/src/middleware.js +15 -3
  48. package/dist/cjs/src/middleware.js.map +1 -1
  49. package/dist/cjs/src/model.d.ts +67 -0
  50. package/dist/cjs/src/model.js +95 -24
  51. package/dist/cjs/src/model.js.map +1 -1
  52. package/dist/cjs/src/module.config.d.ts +3 -4
  53. package/dist/cjs/src/module.config.js +8 -6
  54. package/dist/cjs/src/module.config.js.map +1 -1
  55. package/dist/cjs/src/module.d.ts +2 -3
  56. package/dist/cjs/src/module.js +4 -2
  57. package/dist/cjs/src/module.js.map +1 -1
  58. package/dist/cjs/src/router.d.ts +25 -54
  59. package/dist/cjs/src/router.js +162 -186
  60. package/dist/cjs/src/router.js.map +1 -1
  61. package/dist/cjs/src/static-serving.d.ts +1 -0
  62. package/dist/cjs/src/static-serving.js +38 -34
  63. package/dist/cjs/src/static-serving.js.map +1 -1
  64. package/dist/cjs/src/utils.js +1 -0
  65. package/dist/cjs/tests/filter.spec.js +61 -47
  66. package/dist/cjs/tests/filter.spec.js.map +1 -1
  67. package/dist/cjs/tests/middleware.spec.d.ts +1 -1
  68. package/dist/cjs/tests/middleware.spec.js +157 -145
  69. package/dist/cjs/tests/middleware.spec.js.map +1 -1
  70. package/dist/cjs/tests/model.spec.js +4 -4
  71. package/dist/cjs/tests/model.spec.js.map +1 -1
  72. package/dist/cjs/tests/module.spec.js +4 -3
  73. package/dist/cjs/tests/module.spec.js.map +1 -1
  74. package/dist/cjs/tests/router.spec.d.ts +1 -1
  75. package/dist/cjs/tests/router.spec.js +329 -296
  76. package/dist/cjs/tests/router.spec.js.map +1 -1
  77. package/dist/cjs/tests/utils.js +5 -2
  78. package/dist/cjs/tests/utils.js.map +1 -1
  79. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  80. package/dist/esm/index.d.ts +1 -0
  81. package/dist/esm/index.js +1 -0
  82. package/dist/esm/index.js.map +1 -1
  83. package/dist/esm/src/controllers.d.ts +4 -4
  84. package/dist/esm/src/controllers.js +3 -0
  85. package/dist/esm/src/controllers.js.map +1 -1
  86. package/dist/esm/src/decorator.d.ts +29 -94
  87. package/dist/esm/src/decorator.js +49 -114
  88. package/dist/esm/src/decorator.js.map +1 -1
  89. package/dist/esm/src/filter.d.ts +1 -0
  90. package/dist/esm/src/filter.js +11 -18
  91. package/dist/esm/src/filter.js.map +1 -1
  92. package/dist/esm/src/http.d.ts +5 -3
  93. package/dist/esm/src/http.js +98 -56
  94. package/dist/esm/src/http.js.map +1 -1
  95. package/dist/esm/src/kernel.d.ts +3 -3
  96. package/dist/esm/src/kernel.js +10 -30
  97. package/dist/esm/src/kernel.js.map +1 -1
  98. package/dist/esm/src/logger.d.ts +2 -2
  99. package/dist/esm/src/logger.js +4 -9
  100. package/dist/esm/src/logger.js.map +1 -1
  101. package/dist/esm/src/middleware.d.ts +5 -1
  102. package/dist/esm/src/middleware.js +12 -0
  103. package/dist/esm/src/middleware.js.map +1 -1
  104. package/dist/esm/src/model.d.ts +67 -0
  105. package/dist/esm/src/model.js +91 -23
  106. package/dist/esm/src/model.js.map +1 -1
  107. package/dist/esm/src/module.config.d.ts +3 -4
  108. package/dist/esm/src/module.config.js +6 -5
  109. package/dist/esm/src/module.config.js.map +1 -1
  110. package/dist/esm/src/module.d.ts +2 -3
  111. package/dist/esm/src/module.js +5 -3
  112. package/dist/esm/src/module.js.map +1 -1
  113. package/dist/esm/src/router.d.ts +25 -54
  114. package/dist/esm/src/router.js +159 -183
  115. package/dist/esm/src/router.js.map +1 -1
  116. package/dist/esm/src/static-serving.d.ts +1 -0
  117. package/dist/esm/src/static-serving.js +29 -25
  118. package/dist/esm/src/static-serving.js.map +1 -1
  119. package/dist/esm/src/utils.js +1 -0
  120. package/dist/esm/tests/filter.spec.js +14 -0
  121. package/dist/esm/tests/filter.spec.js.map +1 -1
  122. package/dist/esm/tests/middleware.spec.d.ts +1 -1
  123. package/dist/esm/tests/middleware.spec.js +60 -48
  124. package/dist/esm/tests/middleware.spec.js.map +1 -1
  125. package/dist/esm/tests/module.spec.js +1 -0
  126. package/dist/esm/tests/module.spec.js.map +1 -1
  127. package/dist/esm/tests/router.spec.d.ts +1 -1
  128. package/dist/esm/tests/router.spec.js +206 -173
  129. package/dist/esm/tests/router.spec.js.map +1 -1
  130. package/dist/esm/tests/utils.js +4 -1
  131. package/dist/esm/tests/utils.js.map +1 -1
  132. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  133. package/index.ts +1 -0
  134. package/package.json +14 -15
  135. package/src/controllers.ts +3 -3
  136. package/src/decorator.ts +42 -131
  137. package/src/filter.ts +0 -2
  138. package/src/http.ts +40 -33
  139. package/src/kernel.ts +8 -8
  140. package/src/logger.ts +2 -4
  141. package/src/middleware.ts +2 -1
  142. package/src/model.ts +83 -5
  143. package/src/module.config.ts +3 -6
  144. package/src/module.ts +2 -2
  145. package/src/router.ts +147 -193
  146. package/src/static-serving.ts +2 -4
  147. package/tests/middleware.spec.ts +0 -1
  148. package/tests/router.spec.ts +163 -106
  149. package/tsconfig.json +2 -1
@@ -4,9 +4,13 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  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;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
7
+ import { __ΩSerializationOptions as __ΩSerializationOptions } from '@deepkit/type';
8
+ import { __ΩClassType as __ΩClassType } from '@deepkit/core';
9
+ import { __ΩMiddlewareRegistryEntry as __ΩMiddlewareRegistryEntry } from '@deepkit/app';
10
+ import { __ΩLoggerInterface as __ΩLoggerInterface } from '@deepkit/logger';
11
+ import { __ΩHttpMiddlewareFn as __ΩHttpMiddlewareFn } from './middleware';
12
+ import { __ΩHttpRequestQuery as __ΩHttpRequestQuery } from './model';
13
+ import { __ΩHttpRequestResolvedParameters as __ΩHttpRequestResolvedParameters } from './model';
10
14
  /*
11
15
  * Deepkit Framework
12
16
  * Copyright (C) 2021 Deepkit UG, Marc J. Schmidt
@@ -16,58 +20,33 @@ var __metadata = (this && this.__metadata) || function (k, v) {
16
20
  *
17
21
  * You should have received a copy of the MIT License along with this program.
18
22
  */
19
- import 'reflect-metadata';
20
- import { asyncOperation, CompilerContext, getClassName, isClass, urlJoin } from '@deepkit/core';
21
- import { entity, getClassSchema, getPropertyXtoClassFunction, jitValidateProperty, jsonSerializer, t, ValidationFailed } from '@deepkit/type';
23
+ import { asyncOperation, CompilerContext, getClassName, isClass, isObject, urlJoin } from '@deepkit/core';
24
+ import { assertType, entity, findMember, getSerializeFunction, getValidatorFunction, metaAnnotation, ReflectionClass, ReflectionParameter, serializer, Serializer, stringifyType, typeToObject, ValidationError } from '@deepkit/type';
22
25
  // @ts-ignore
23
26
  import formidable from 'formidable';
24
27
  import { httpClass } from './decorator';
25
- import { injectable, TagRegistry } from '@deepkit/injector';
28
+ import { BodyValidationError, getRegExp, HttpRequest, ValidatedBody } from './model';
29
+ import { InjectorContext, InjectorModule, TagRegistry } from '@deepkit/injector';
26
30
  import { Logger } from '@deepkit/logger';
27
31
  import { HttpControllers } from './controllers';
28
- import { AppModule, MiddlewareRegistry } from '@deepkit/app';
32
+ import { MiddlewareRegistry } from '@deepkit/app';
29
33
  import { HttpMiddlewareConfig } from './middleware';
34
+ var __ΩRouteParameterResolverForInjector = [() => InjectorContext, 'injector', '', 'PP7!2"P"F"F`J/#'];
35
+ export { __ΩRouteParameterResolverForInjector };
36
+ var __ΩResolvedController = [() => __ΩRouteParameterResolverForInjector, 'parameters', () => RouteConfig, 'routeConfig', () => UploadedFile, 'uploadedFiles', () => InjectorContext, 'injector', () => __ΩHttpMiddlewareFn, 'fn', 'timeout', '', 'middlewares', 'Pn!4"P7#4$P&P7%LM4&PP7\'2(Pn)4*\'4+MF/,4-8M'];
30
37
  let UploadedFile = class UploadedFile {
31
38
  };
32
- __decorate([
33
- t.required,
34
- __metadata("design:type", Number)
35
- ], UploadedFile.prototype, "size", void 0);
36
- __decorate([
37
- t.required,
38
- __metadata("design:type", String)
39
- ], UploadedFile.prototype, "path", void 0);
40
- __decorate([
41
- t.string.required.nullable,
42
- __metadata("design:type", Object)
43
- ], UploadedFile.prototype, "name", void 0);
44
- __decorate([
45
- t.string.required.nullable,
46
- __metadata("design:type", Object)
47
- ], UploadedFile.prototype, "type", void 0);
48
- __decorate([
49
- t.date.required.nullable,
50
- __metadata("design:type", Object)
51
- ], UploadedFile.prototype, "lastModifiedDate", void 0);
39
+ UploadedFile.__type = ['size', 'path', 'name', 'type', 'lastModifiedDate', '\'3!&3"P&,J3#P&,J3$PT,J3%5'];
52
40
  UploadedFile = __decorate([
53
41
  entity.name('@deepkit/UploadedFile')
54
42
  ], UploadedFile);
55
43
  export { UploadedFile };
56
- function parseBody(form, req, files) {
57
- return asyncOperation((resolve, reject) => {
58
- form.parse(req, (err, fields, files) => {
59
- if (err) {
60
- reject(err);
61
- }
62
- else {
63
- resolve({ fields, files });
64
- }
65
- });
66
- });
67
- }
44
+ var __ΩRouteControllerAction = [() => InjectorModule, 'module', () => __ΩClassType, 'controller', 'methodName', 'PP"7!4"8n#4$&4%M'];
45
+ export { __ΩRouteControllerAction };
68
46
  function getRouterControllerActionName(action) {
69
47
  return `${getClassName(action.controller)}.${action.methodName}`;
70
48
  }
49
+ getRouterControllerActionName.__type = [() => __ΩRouteControllerAction, 'action', 'getRouterControllerActionName', 'Pn!2"&/#'];
71
50
  export class RouteConfig {
72
51
  constructor(name, httpMethods, path, action, internal = false) {
73
52
  this.name = name;
@@ -76,7 +55,6 @@ export class RouteConfig {
76
55
  this.action = action;
77
56
  this.internal = internal;
78
57
  this.baseUrl = '';
79
- this.parameterRegularExpressions = {};
80
58
  this.responses = [];
81
59
  this.description = '';
82
60
  this.groups = [];
@@ -88,7 +66,6 @@ export class RouteConfig {
88
66
  * An arbitrary data container the user can use to store app specific settings/values.
89
67
  */
90
68
  this.data = new Map();
91
- this.parameters = {};
92
69
  }
93
70
  getSchemaForResponse(statusCode) {
94
71
  if (!this.responses.length)
@@ -106,39 +83,15 @@ export class RouteConfig {
106
83
  return path;
107
84
  }
108
85
  }
109
- /**
110
- * When this class is injected into a route, then validation errors are not automatically thrown (using onHttpControllerValidationError event),
111
- * but injected to the route itself. The user is then responsible to handle the errors.
112
- *
113
- * Note: The body parameter is still passed, however it might contain now invalid data. The BodyValidation tells what data is invalid.
114
- */
115
- export class BodyValidation {
116
- constructor(errors = []) {
117
- this.errors = errors;
118
- }
119
- hasErrors(prefix) {
120
- return this.getErrors(prefix).length > 0;
121
- }
122
- getErrors(prefix) {
123
- if (prefix)
124
- return this.errors.filter(v => v.path.startsWith(prefix));
125
- return this.errors;
126
- }
127
- getErrorsForPath(path) {
128
- return this.errors.filter(v => v.path === path);
129
- }
130
- getErrorMessageForPath(path) {
131
- return this.getErrorsForPath(path).map(v => v.message).join(', ');
132
- }
133
- }
86
+ RouteConfig.__type = ['baseUrl', () => "", 'statusCode', 'description', 'type', 'responses', () => [], () => "", 'groups', () => [], 'category', () => "", 'returnType', () => __ΩSerializationOptions, 'serializationOptions', () => Serializer, 'serializer', () => InjectorModule, 'module', () => __ΩClassType, 'resolverForToken', () => new Map(), () => HttpMiddlewareConfig, 'config', () => InjectorModule, 'middlewares', () => [], () => __ΩClassType, 'resolverForParameterName', () => new Map(), 'name', 'httpMethods', 'path', () => __ΩRouteControllerAction, 'action', 'internal', () => false, 'constructor', 'getSchemaForResponse', 'getFullPath', '&3!>"P\'4#&4$"4%8MF3&>\'&3$>(&F3)>*&3+>,"3-8n.3/8P70318P"72338"n4E35>6PP7748P"7943MF3:>;&n<E3=>>P&2?:&F2@:&2A:nB2C:)2D:>E"0FP\'2#P"-J0GP&0H5'];
134
87
  class ParsedRoute {
135
88
  constructor(routeConfig) {
136
89
  this.routeConfig = routeConfig;
137
90
  this.pathParameterNames = {};
138
91
  this.parameters = [];
139
92
  }
140
- addParameter(property, config) {
141
- const parameter = new ParsedRouteParameter(property, config);
93
+ addParameter(property) {
94
+ const parameter = new ParsedRouteParameter(property);
142
95
  this.parameters.push(parameter);
143
96
  return parameter;
144
97
  }
@@ -153,69 +106,97 @@ class ParsedRoute {
153
106
  throw new Error(`No route parameter with name ${name} defined.`);
154
107
  }
155
108
  }
109
+ ParsedRoute.__type = ['regex', 'pathParameterNames', () => ({}), () => ParsedRouteParameter, 'parameters', () => [], () => RouteConfig, 'routeConfig', 'constructor', () => ReflectionParameter, 'property', () => ParsedRouteParameter, 'addParameter', () => ParsedRouteParameter, 'getParameters', 'name', () => ParsedRouteParameter, 'getParameter', '&3!8P&\'LM3">#P7$F3%<>&PP7\'2(:"0)PP7*2+P7,0-PP7.F0/P&20P71025'];
156
110
  class ParsedRouteParameter {
157
- constructor(property, config) {
158
- this.property = property;
159
- this.config = config;
111
+ constructor(parameter) {
112
+ this.parameter = parameter;
160
113
  }
161
114
  get body() {
162
- return this.config ? this.config.type === 'body' : false;
115
+ return metaAnnotation.getForName(this.parameter.type, 'httpBody') !== undefined;
116
+ }
117
+ get bodyValidation() {
118
+ return metaAnnotation.getForName(this.parameter.type, 'httpBodyValidation') !== undefined;
119
+ }
120
+ getType() {
121
+ if (this.bodyValidation) {
122
+ assertType(this.parameter.type, 20 /* class */);
123
+ const valueType = findMember('value', this.parameter.type);
124
+ if (!valueType || valueType.kind !== 15 /* property */)
125
+ throw new Error(`No property value found at ${stringifyType(this.parameter.type)}`);
126
+ return valueType.type;
127
+ }
128
+ return this.parameter.type;
163
129
  }
164
130
  get query() {
165
- return this.config ? this.config.type === 'query' : false;
131
+ return metaAnnotation.getForName(this.parameter.type, 'httpQuery') !== undefined;
166
132
  }
167
133
  get queries() {
168
- return this.config ? this.config.type === 'queries' : false;
134
+ return metaAnnotation.getForName(this.parameter.type, 'httpQueries') !== undefined;
169
135
  }
170
136
  get typePath() {
171
- return this.config ? this.config.typePath : undefined;
137
+ const typeOptions = metaAnnotation.getForName(this.parameter.type, 'httpQueries') || metaAnnotation.getForName(this.parameter.type, 'httpQuery');
138
+ if (!typeOptions)
139
+ return;
140
+ const options = typeToObject(typeOptions[0]);
141
+ if (isObject(options))
142
+ return options.name;
143
+ return;
172
144
  }
173
145
  getName() {
174
- return this.property.name;
146
+ return this.parameter.name;
175
147
  }
176
148
  isPartOfPath() {
177
149
  return this.regexPosition !== undefined;
178
150
  }
179
151
  }
152
+ ParsedRouteParameter.__type = ['regexPosition', () => ReflectionParameter, 'parameter', 'constructor', 'getType', 'getName', 'isPartOfPath', '\'3!8PP7"2#:"0$!!P"0%!!!P"0&P)0\'5'];
180
153
  function parseRoutePathToRegex(routeConfig) {
181
154
  const parameterNames = {};
182
155
  let path = routeConfig.getFullPath();
156
+ const method = ReflectionClass.from(routeConfig.action.controller).getMethod(routeConfig.action.methodName);
183
157
  let argumentIndex = 0;
184
- path = path.replace(/:(\w+)/g, (a, name) => {
158
+ path = path.replace(/:(\w+)/g, Object.assign((a, name) => {
185
159
  parameterNames[name] = argumentIndex;
186
160
  argumentIndex++;
187
- return routeConfig.parameterRegularExpressions[name] ? '(' + routeConfig.parameterRegularExpressions[name] + ')' : String.raw `([^/]+)`;
188
- });
161
+ const parameter = method.getParameterOrUndefined(name);
162
+ if (parameter) {
163
+ const regExp = getRegExp(parameter.type);
164
+ if (regExp)
165
+ return '(' + regExp + ')';
166
+ }
167
+ return String.raw `([^/]+)`;
168
+ }, { __type: ['a', 'name', '', 'P"2!"2""/#'] }));
189
169
  return { regex: path, parameterNames };
190
170
  }
171
+ parseRoutePathToRegex.__type = [() => RouteConfig, 'routeConfig', 'regex', 'parameterNames', 'parseRoutePathToRegex', 'PP7!2"P&4#P&\'LM4$M/%'];
191
172
  export function parseRouteControllerAction(routeConfig) {
192
- const schema = getClassSchema(routeConfig.action.controller);
173
+ const schema = ReflectionClass.from(routeConfig.action.controller);
193
174
  const parsedRoute = new ParsedRoute(routeConfig);
194
- const methodArgumentProperties = schema.getMethodProperties(routeConfig.action.methodName);
175
+ const methodArgumentProperties = schema.getMethodParameters(routeConfig.action.methodName);
195
176
  const parsedPath = parseRoutePathToRegex(routeConfig);
196
177
  parsedRoute.regex = parsedPath.regex;
197
178
  parsedRoute.pathParameterNames = parsedPath.parameterNames;
198
179
  for (const property of methodArgumentProperties) {
199
- const decoratorData = routeConfig.parameters[property.name];
200
- const parsedParameter = parsedRoute.addParameter(property, decoratorData);
201
- if (decoratorData && decoratorData.optional)
202
- property.isOptional = true;
203
- if (property.type === 'class' && property.classType === BodyValidation) {
204
- parsedRoute.customValidationErrorHandling = parsedParameter;
205
- }
180
+ const parsedParameter = parsedRoute.addParameter(property);
206
181
  parsedParameter.regexPosition = parsedPath.parameterNames[property.name];
207
182
  }
208
183
  return parsedRoute;
209
184
  }
185
+ parseRouteControllerAction.__type = [() => RouteConfig, 'routeConfig', () => ParsedRoute, 'parseRouteControllerAction', 'PP7!2"P7#/$'];
210
186
  export function dotToUrlPath(dotPath) {
211
187
  if (-1 === dotPath.indexOf('.'))
212
188
  return dotPath;
213
189
  return dotPath.replace(/\./g, '][').replace('][', '[') + ']';
214
190
  }
191
+ dotToUrlPath.__type = ['dotPath', 'dotToUrlPath', 'P&2!&/"'];
192
+ var __ΩRouteParameterResolver = [() => __ΩRouteParameterResolverContext, 'context', 'resolve', 'PPn!2"P""`J1#M'];
193
+ export { __ΩRouteParameterResolver };
194
+ var __ΩRouteParameterResolverContext = [() => __ΩClassType, 'token', () => RouteConfig, 'route', () => HttpRequest, 'request', 'name', 'value', () => __ΩHttpRequestQuery, 'query', () => __ΩHttpRequestResolvedParameters, 'parameters', 'PPn!&+"J4"P7#4$P7%4&"4\'"4(n)4*n+4,M'];
195
+ export { __ΩRouteParameterResolverContext };
215
196
  function filterMiddlewaresForRoute(middlewareRawConfigs, routeConfig, fullPath) {
216
197
  const middlewares = middlewareRawConfigs.slice(0);
217
198
  middlewares.push(...routeConfig.middlewares);
218
- const middlewareConfigs = middlewares.filter((v) => {
199
+ const middlewareConfigs = middlewares.filter(Object.assign((v) => {
219
200
  var _a;
220
201
  if (!(v.config instanceof HttpMiddlewareConfig))
221
202
  return false;
@@ -278,34 +259,50 @@ function filterMiddlewaresForRoute(middlewareRawConfigs, routeConfig, fullPath)
278
259
  }
279
260
  }
280
261
  return true;
281
- });
282
- middlewareConfigs.sort((a, b) => {
262
+ }, { __type: ['v', '', 'P"2!"/"'] }));
263
+ middlewareConfigs.sort(Object.assign((a, b) => {
283
264
  return a.config.order - b.config.order;
284
- });
265
+ }, { __type: ['a', 'b', '', 'P"2!"2""/#'] }));
285
266
  return middlewareConfigs;
286
267
  }
287
- let Router = class Router {
268
+ filterMiddlewaresForRoute.__type = [() => __ΩMiddlewareRegistryEntry, 'middlewareRawConfigs', () => RouteConfig, 'routeConfig', 'fullPath', () => HttpMiddlewareConfig, 'config', () => InjectorModule, 'module', 'filterMiddlewaresForRoute', 'Pn!F2"P7#2$&2%PP7&4\'P"7(4)MF/*'];
269
+ export class Router {
288
270
  constructor(controllers, logger, tagRegistry, middlewareRegistry = new MiddlewareRegistry) {
289
271
  this.logger = logger;
290
272
  this.middlewareRegistry = middlewareRegistry;
291
273
  this.routes = [];
292
- //todo, move some settings to KernelConfig
293
- this.form = formidable({
274
+ for (const controller of controllers.controllers) {
275
+ this.addRouteForController(controller.controller, controller.module);
276
+ }
277
+ }
278
+ parseBody(req, files) {
279
+ const form = formidable({
294
280
  multiples: true,
295
281
  hash: 'sha1',
296
282
  enabledPlugins: ['octetstream', 'querystring', 'json'],
297
283
  });
298
- for (const controller of controllers.controllers) {
299
- this.addRouteForController(controller.controller, controller.module);
300
- }
284
+ return asyncOperation(Object.assign((resolve, reject) => {
285
+ if (req.body) {
286
+ return resolve(req.body);
287
+ }
288
+ form.parse(req, Object.assign((err, fields, files) => {
289
+ if (err) {
290
+ reject(err);
291
+ }
292
+ else {
293
+ const body = req.body = { ...fields, ...files };
294
+ resolve(body);
295
+ }
296
+ }, { __type: ['err', 'fields', 'files', '', 'P"2!"2""2#"/$'] }));
297
+ }, { __type: ['resolve', 'reject', '', 'P"2!"2""/#'] }));
301
298
  }
302
299
  getRoutes() {
303
300
  return this.routes;
304
301
  }
305
- static forControllers(controllers, tagRegistry = new TagRegistry(), middlewareRegistry = new MiddlewareRegistry(), module = new AppModule({})) {
306
- return new this(new HttpControllers(controllers.map(v => {
302
+ static forControllers(controllers, tagRegistry = new TagRegistry(), middlewareRegistry = new MiddlewareRegistry(), module = new InjectorModule()) {
303
+ return new this(new HttpControllers(controllers.map(Object.assign(v => {
307
304
  return isClass(v) ? { controller: v, module } : v;
308
- })), new Logger([], []), tagRegistry, middlewareRegistry);
305
+ }, { __type: ['v', '', 'P"2!"/"'] }))), new Logger([], []), tagRegistry, middlewareRegistry);
309
306
  }
310
307
  getRouteCode(compiler, routeConfig) {
311
308
  const routeConfigVar = compiler.reserveVariable('routeConfigVar', routeConfig);
@@ -316,7 +313,7 @@ let Router = class Router {
316
313
  const setParameters = [];
317
314
  const parameterNames = [];
318
315
  const parameterValidator = [];
319
- let bodyValidationErrorHandling = `if (bodyErrors.length) throw ValidationFailed.from(bodyErrors);`;
316
+ let bodyValidationErrorHandling = `if (bodyErrors.length) throw ValidationError.from(bodyErrors);`;
320
317
  let enableParseBody = false;
321
318
  const hasParameters = parsedRoute.getParameters().length > 0;
322
319
  let requiresAsyncParameters = false;
@@ -324,49 +321,51 @@ let Router = class Router {
324
321
  const fullPath = routeConfig.getFullPath();
325
322
  const middlewareConfigs = filterMiddlewaresForRoute(this.middlewareRegistry.configs, routeConfig, fullPath);
326
323
  for (const parameter of parsedRoute.getParameters()) {
327
- if (parsedRoute.customValidationErrorHandling === parameter) {
328
- compiler.context.set('BodyValidation', BodyValidation);
329
- bodyValidationErrorHandling = '';
330
- setParameters.push(`parameters.${parameter.property.name} = new BodyValidation(bodyErrors);`);
331
- parameterNames.push(`parameters.${parameter.property.name}`);
332
- }
333
- else if (parameter.body) {
334
- const validatorVar = compiler.reserveVariable('argumentValidator', jitValidateProperty(parameter.property));
335
- const converterVar = compiler.reserveVariable('argumentConverter', getPropertyXtoClassFunction(parameter.property, jsonSerializer));
324
+ if (parameter.body || parameter.bodyValidation) {
325
+ const type = parameter.getType();
326
+ const validatorVar = compiler.reserveVariable('argumentValidator', getValidatorFunction(undefined, type));
327
+ const converterVar = compiler.reserveVariable('argumentConverter', getSerializeFunction(type, serializer.deserializeRegistry));
336
328
  enableParseBody = true;
337
- setParameters.push(`parameters.${parameter.property.name} = ${converterVar}(bodyFields);`);
338
- parameterValidator.push(`${validatorVar}(parameters.${parameter.property.name}, ${JSON.stringify(parameter.typePath || '')}, bodyErrors);`);
339
- parameterNames.push(`parameters.${parameter.property.name}`);
329
+ setParameters.push(`parameters.${parameter.parameter.name} = ${converterVar}(bodyFields, {loosely: true});`);
330
+ parameterValidator.push(`${validatorVar}(parameters.${parameter.parameter.name}, {errors: bodyErrors});`);
331
+ if (parameter.bodyValidation) {
332
+ compiler.context.set('BodyValidation', ValidatedBody);
333
+ compiler.context.set('BodyValidationError', BodyValidationError);
334
+ parameterNames.push(`new BodyValidation(new BodyValidationError(bodyErrors), bodyErrors.length === 0 ? parameters.${parameter.parameter.name} : undefined)`);
335
+ bodyValidationErrorHandling = '';
336
+ }
337
+ else {
338
+ parameterNames.push(`parameters.${parameter.parameter.name}`);
339
+ }
340
340
  }
341
341
  else if (parameter.query || parameter.queries) {
342
- const converted = parameter.property.type === 'any' ? (v) => v : getPropertyXtoClassFunction(parameter.property, jsonSerializer);
343
- const validator = parameter.property.type === 'any' ? (v) => undefined : jitValidateProperty(parameter.property);
342
+ const converted = getSerializeFunction(parameter.parameter.parameter, serializer.deserializeRegistry, undefined, parameter.getName());
343
+ const validator = getValidatorFunction(undefined, parameter.parameter.parameter);
344
344
  const converterVar = compiler.reserveVariable('argumentConverter', converted);
345
345
  const validatorVar = compiler.reserveVariable('argumentValidator', validator);
346
- const queryPath = parameter.typePath === undefined ? parameter.property.name : parameter.typePath;
346
+ const queryPath = parameter.typePath === undefined && parameter.query ? parameter.parameter.name : parameter.typePath;
347
347
  const accessor = queryPath ? `['` + (queryPath.replace(/\./g, `']['`)) + `']` : '';
348
348
  const queryAccessor = queryPath ? `_query${accessor}` : '_query';
349
- setParameters.push(`parameters.${parameter.property.name} = ${converterVar}(${queryAccessor});`);
350
- parameterNames.push(`parameters.${parameter.property.name}`);
351
- parameterValidator.push(`${validatorVar}(parameters.${parameter.property.name}, ${JSON.stringify(parameter.typePath)}, validationErrors);`);
349
+ setParameters.push(`parameters.${parameter.parameter.name} = ${converterVar}(${queryAccessor}, {loosely: true});`);
350
+ parameterNames.push(`parameters.${parameter.parameter.name}`);
351
+ parameterValidator.push(`${validatorVar}(parameters.${parameter.parameter.name}, {errors: validationErrors}, ${JSON.stringify(parameter.typePath || parameter.getName())});`);
352
352
  }
353
353
  else {
354
- parameterNames.push(`parameters.${parameter.property.name}`);
354
+ parameterNames.push(`parameters.${parameter.parameter.name}`);
355
355
  if (parameter.isPartOfPath()) {
356
- if (parameter.property.type !== 'class') {
357
- const converted = parameter.property.type === 'any' ? (v) => v : getPropertyXtoClassFunction(parameter.property, jsonSerializer);
356
+ if (parameter.parameter.type.kind !== 20 /* class */) {
357
+ const converted = getSerializeFunction(parameter.parameter.parameter, serializer.deserializeRegistry, undefined, parameter.getName());
358
358
  const converterVar = compiler.reserveVariable('argumentConverter', converted);
359
- setParameters.push(`parameters.${parameter.property.name} = ${converterVar}(_match[${1 + (parameter.regexPosition || 0)}]);`);
360
- const validator = parameter.property.type === 'any' ? (v) => undefined : jitValidateProperty(parameter.property);
359
+ setParameters.push(`parameters.${parameter.parameter.name} = ${converterVar}(_match[${1 + (parameter.regexPosition || 0)}], {loosely: true});`);
360
+ const validator = getValidatorFunction(undefined, parameter.parameter.parameter);
361
361
  const validatorVar = compiler.reserveVariable('argumentValidator', validator);
362
- parameterValidator.push(`${validatorVar}(parameters.${parameter.property.name}, ${JSON.stringify(parameter.getName())}, validationErrors);`);
362
+ parameterValidator.push(`${validatorVar}(parameters.${parameter.parameter.name}, {errors: validationErrors}, ${JSON.stringify(parameter.getName())});`);
363
363
  }
364
364
  else {
365
- setParameters.push(`parameters.${parameter.property.name} = _match[${1 + (parameter.regexPosition || 0)}];`);
365
+ setParameters.push(`parameters.${parameter.parameter.name} = _match[${1 + (parameter.regexPosition || 0)}];`);
366
366
  }
367
367
  }
368
- const injectorOptions = parameter.property.data['deepkit/inject'];
369
- const injectorToken = injectorOptions && injectorOptions.token ? injectorOptions.token : (parameter.property.type === 'class' ? parameter.property.getResolvedClassType() : undefined);
368
+ const injectorToken = parameter.parameter.type.kind === 20 /* class */ ? parameter.parameter.type.classType : undefined;
370
369
  const injectorTokenVar = compiler.reserveVariable('classType', injectorToken);
371
370
  const parameterResolverFoundVar = compiler.reserveVariable('parameterResolverFound', false);
372
371
  setParameters.push(`${parameterResolverFoundVar} = false;`);
@@ -388,27 +387,21 @@ let Router = class Router {
388
387
  ${instance} = ${injector}.get(${resolverProvideTokenVar}${moduleVar});
389
388
  if (!${parameterResolverFoundVar}) {
390
389
  ${parameterResolverFoundVar} = true;
391
- parameters.${parameter.property.name} = await ${instance}.resolve({
390
+ parameters.${parameter.parameter.name} = await ${instance}.resolve({
392
391
  token: ${injectorTokenVar},
393
392
  routeConfig: ${routeConfigVar},
394
393
  request: request,
395
- name: ${JSON.stringify(parameter.property.name)},
396
- value: parameters.${parameter.property.name},
394
+ name: ${JSON.stringify(parameter.parameter.name)},
395
+ value: parameters.${parameter.parameter.name},
397
396
  query: _query,
398
397
  parameters: parameters
399
398
  });
400
399
  }`);
401
400
  }
402
- else {
403
- if (!parameter.isPartOfPath() && parameter.property.type !== 'class' && (!injectorOptions || !injectorOptions.token)) {
404
- throw new Error(`Route parameter '${parameter.property.name}' of ${getRouterControllerActionName(routeConfig.action)} is not a ClassType nor is a @inject(T) set. It can not be requested from the DI container like that.` +
405
- `If its a query parameter use '@http.query() ${parameter.property.name}' or if its a body '@http.body() ${parameter.property.name}'.`);
406
- }
407
- }
408
401
  if (!parameter.isPartOfPath()) {
409
- let injectorGet = `parameters.${parameter.property.name} = ${injector}.get(${injectorTokenVar});`;
410
- if (injectorOptions && injectorOptions.optional) {
411
- injectorGet = `try {parameters.${parameter.property.name} = ${injector}.get(${injectorTokenVar}); } catch (e) {}`;
402
+ let injectorGet = `parameters.${parameter.parameter.name} = ${injector}.get(${injectorTokenVar});`;
403
+ if (parameter.parameter.isOptional()) {
404
+ injectorGet = `try {parameters.${parameter.parameter.name} = ${injector}.get(${injectorTokenVar}); } catch (e) {}`;
412
405
  }
413
406
  setParameters.push(`if (!${parameterResolverFoundVar}) ${injectorGet}`);
414
407
  }
@@ -416,11 +409,9 @@ let Router = class Router {
416
409
  }
417
410
  let parseBodyLoading = '';
418
411
  if (enableParseBody) {
419
- const parseBodyVar = compiler.reserveVariable('parseBody', parseBody);
420
- const formVar = compiler.reserveVariable('form', this.form);
412
+ const parseBodyVar = compiler.reserveVariable('parseBody', this.parseBody.bind(this));
421
413
  parseBodyLoading = `
422
- const bodyParsed = (await ${parseBodyVar}(${formVar}, request, uploadedFiles));
423
- const bodyFields = {...bodyParsed.fields, ...bodyParsed.files};`;
414
+ const bodyFields = (await ${parseBodyVar}(request, uploadedFiles));`;
424
415
  requiresAsyncParameters = true;
425
416
  }
426
417
  let matcher = `_path.startsWith(${JSON.stringify(prefix)}) && (_match = _path.match(${regexVar}))`;
@@ -459,15 +450,15 @@ let Router = class Router {
459
450
  ${setParameters.join('\n')}
460
451
  ${parameterValidator.join('\n')}
461
452
  ${bodyValidationErrorHandling}
462
- if (validationErrors.length) throw ValidationFailed.from(validationErrors);
453
+ if (validationErrors.length) throw new ValidationError(validationErrors);
463
454
  return [${parameterNames.join(',')}];
464
455
  }`;
465
456
  }
466
457
  let methodCheck = '';
467
458
  if (routeConfig.httpMethods.length) {
468
- methodCheck = '(' + routeConfig.httpMethods.map(v => {
469
- return `_method === '${v.toLowerCase()}'`;
470
- }).join(' || ') + ') && ';
459
+ methodCheck = '(' + routeConfig.httpMethods.map(Object.assign(v => {
460
+ return `_method === '${v.toUpperCase()}'`;
461
+ }, { __type: ['v', '', 'P"2!"/"'] })).join(' || ') + ') && ';
471
462
  }
472
463
  return `
473
464
  //=> ${routeConfig.httpMethods.join(',')} ${path}
@@ -479,15 +470,15 @@ let Router = class Router {
479
470
  getRouteUrlResolveCode(compiler, routeConfig) {
480
471
  const parsedRoute = parseRouteControllerAction(routeConfig);
481
472
  let url = routeConfig.getFullPath();
482
- url = url.replace(/:(\w+)/g, (a, name) => {
473
+ url = url.replace(/:(\w+)/g, Object.assign((a, name) => {
483
474
  return `\${parameters.${name}}`;
484
- });
475
+ }, { __type: ['a', 'name', '', 'P"2!"2""/#'] }));
485
476
  const modify = [];
486
477
  for (const parameter of parsedRoute.getParameters()) {
487
478
  if (parameter.query || parameter.queries) {
488
- const queryPath = parameter.typePath === undefined ? parameter.property.name : parameter.typePath;
489
- if (parameter.property.type === 'class') {
490
- for (const property of parameter.property.getResolvedClassSchema().getProperties()) {
479
+ const queryPath = parameter.typePath === undefined && parameter.query ? parameter.parameter.name : parameter.typePath || '';
480
+ if (parameter.parameter.type.kind === 20 /* class */ || parameter.parameter.type.kind === 30 /* objectLiteral */) {
481
+ for (const property of ReflectionClass.from(parameter.parameter.type).getProperties()) {
491
482
  const accessor = `parameters.${parameter.getName()}?.${property.name}`;
492
483
  const thisPath = queryPath ? queryPath + '.' + property.name : property.name;
493
484
  modify.push(`${accessor} !== undefined && query.push(${JSON.stringify(dotToUrlPath(thisPath))} + '=' + encodeURIComponent(${accessor}))`);
@@ -515,7 +506,7 @@ let Router = class Router {
515
506
  const data = httpClass._fetch(controller);
516
507
  if (!data)
517
508
  throw new Error(`Http controller class ${getClassName(controller)} has no @http.controller decorator.`);
518
- const schema = getClassSchema(controller);
509
+ const schema = ReflectionClass.from(controller);
519
510
  for (const action of data.getActions()) {
520
511
  const routeConfig = new RouteConfig(action.name, action.httpMethods, action.path, {
521
512
  controller,
@@ -523,19 +514,18 @@ let Router = class Router {
523
514
  methodName: action.methodName
524
515
  });
525
516
  routeConfig.module = module;
526
- routeConfig.parameterRegularExpressions = action.parameterRegularExpressions;
527
517
  routeConfig.responses = action.responses;
528
518
  routeConfig.description = action.description;
529
519
  routeConfig.category = action.category;
530
520
  routeConfig.groups = action.groups;
531
521
  routeConfig.data = new Map(action.data);
532
522
  routeConfig.baseUrl = data.baseUrl;
533
- routeConfig.middlewares = data.middlewares.map(v => {
523
+ routeConfig.middlewares = data.middlewares.map(Object.assign(v => {
534
524
  return { config: v(), module };
535
- });
536
- routeConfig.middlewares.push(...action.middlewares.map(v => {
525
+ }, { __type: ['v', '', 'P"2!"/"'] }));
526
+ routeConfig.middlewares.push(...action.middlewares.map(Object.assign(v => {
537
527
  return { config: v(), module };
538
- }));
528
+ }, { __type: ['v', '', 'P"2!"/"'] })));
539
529
  for (const item of action.resolverForToken)
540
530
  routeConfig.resolverForToken.set(...item);
541
531
  routeConfig.resolverForToken = new Map(data.resolverForToken);
@@ -544,18 +534,17 @@ let Router = class Router {
544
534
  routeConfig.resolverForParameterName = new Map(data.resolverForParameterName);
545
535
  for (const item of action.resolverForParameterName)
546
536
  routeConfig.resolverForParameterName.set(...item);
547
- routeConfig.parameters = { ...action.parameters };
548
537
  routeConfig.serializationOptions = action.serializationOptions;
549
538
  routeConfig.serializer = action.serializer;
550
539
  routeConfig.serializer = action.serializer;
551
540
  if (schema.hasMethod(action.methodName))
552
- routeConfig.returnSchema = schema.getMethod(action.methodName);
541
+ routeConfig.returnType = schema.getMethod(action.methodName).getReturnType();
553
542
  this.addRoute(routeConfig);
554
543
  }
555
544
  }
556
545
  build() {
557
546
  const compiler = new CompilerContext;
558
- compiler.context.set('ValidationFailed', ValidationFailed);
547
+ compiler.context.set('ValidationError', ValidationError);
559
548
  compiler.context.set('qs', require('qs'));
560
549
  const code = [];
561
550
  for (const route of this.routes) {
@@ -563,8 +552,8 @@ let Router = class Router {
563
552
  }
564
553
  return compiler.build(`
565
554
  let _match;
566
- const _method = request.getMethod().toLowerCase();
567
- const _url = request.getUrl();
555
+ const _method = request.method || 'GET';
556
+ const _url = request.url || '/';
568
557
  const _qPosition = _url.indexOf('?');
569
558
  let uploadedFiles = {};
570
559
  const _path = _qPosition === -1 ? _url : _url.substr(0, _qPosition);
@@ -598,22 +587,9 @@ let Router = class Router {
598
587
  return this.fn(request);
599
588
  }
600
589
  resolve(method, url) {
601
- return this.resolveRequest({
602
- getUrl() {
603
- return url;
604
- },
605
- getMethod() {
606
- return method;
607
- },
608
- });
590
+ method = method.toUpperCase();
591
+ return this.resolveRequest({ url, method });
609
592
  }
610
- };
611
- Router = __decorate([
612
- injectable,
613
- __metadata("design:paramtypes", [HttpControllers,
614
- Logger,
615
- TagRegistry,
616
- MiddlewareRegistry])
617
- ], Router);
618
- export { Router };
593
+ }
594
+ Router.__type = [() => HttpRequest, 'request', () => __ΩResolvedController, '', 'fn', 'name', 'parameters', 'resolveFn', () => RouteConfig, 'routes', () => [], () => HttpRequest, 'req', () => UploadedFile, 'files', 'parseBody', () => HttpControllers, 'controllers', () => __ΩLoggerInterface, 'logger', () => TagRegistry, 'tagRegistry', () => MiddlewareRegistry, 'middlewareRegistry', () => new MiddlewareRegistry, 'constructor', () => RouteConfig, 'getRoutes', () => __ΩClassType, () => InjectorModule, 'module', () => __ΩClassType, 'controller', () => TagRegistry, () => new TagRegistry(), () => MiddlewareRegistry, () => new MiddlewareRegistry(), () => InjectorModule, () => new InjectorModule(), () => Router, 'forControllers', () => CompilerContext, 'compiler', () => RouteConfig, 'routeConfig', 'getRouteCode', () => CompilerContext, () => RouteConfig, 'getRouteUrlResolveCode', () => RouteConfig, 'addRoute', () => __ΩClassType, () => InjectorModule, 'addRouteForController', () => HttpRequest, () => __ΩResolvedController, 'build', 'buildUrlResolver', 'routeName', () => ({}), 'resolveUrl', () => HttpRequest, () => __ΩResolvedController, 'resolveRequest', 'method', 'url', () => __ΩResolvedController, 'resolve', 'PP7!2"Pn#-J/$3%8<P&2&P&"LM2\'&/$3(8<P7)F3*<>+PP7,2-P&P7.LM2/"00;PP7122n324;P7526P7728;>9"0:PP7;F0<PPn=PP"7>4?n@4AMJF22P7B26>CP7D28>EP"7F2?>GP7H0IPP7J2KP7L2M&0N<PP7O2KP7P2M&0Q<PP7R2M"0SPnT2AP"7U2?"0VPPP7W2"PnX-J/$0Y<P"0Z<P&2[P&"LM2\'>\\&0]PP7^2"Pn_-J0`P&2a&2bPnc-J0d5'];
619
595
  //# sourceMappingURL=router.js.map