@deepkit/http 1.0.1-alpha.59 → 1.0.1-alpha.63

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 (144) 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.js +5 -1
  26. package/dist/cjs/index.js.map +1 -1
  27. package/dist/cjs/src/controllers.d.ts +4 -4
  28. package/dist/cjs/src/controllers.js +3 -0
  29. package/dist/cjs/src/controllers.js.map +1 -1
  30. package/dist/cjs/src/decorator.d.ts +29 -94
  31. package/dist/cjs/src/decorator.js +53 -118
  32. package/dist/cjs/src/decorator.js.map +1 -1
  33. package/dist/cjs/src/filter.d.ts +1 -0
  34. package/dist/cjs/src/filter.js +11 -17
  35. package/dist/cjs/src/filter.js.map +1 -1
  36. package/dist/cjs/src/http.d.ts +5 -3
  37. package/dist/cjs/src/http.js +91 -55
  38. package/dist/cjs/src/http.js.map +1 -1
  39. package/dist/cjs/src/kernel.d.ts +3 -3
  40. package/dist/cjs/src/kernel.js +5 -25
  41. package/dist/cjs/src/kernel.js.map +1 -1
  42. package/dist/cjs/src/logger.d.ts +2 -2
  43. package/dist/cjs/src/logger.js +4 -8
  44. package/dist/cjs/src/logger.js.map +1 -1
  45. package/dist/cjs/src/middleware.d.ts +5 -1
  46. package/dist/cjs/src/middleware.js +15 -3
  47. package/dist/cjs/src/middleware.js.map +1 -1
  48. package/dist/cjs/src/model.d.ts +62 -2
  49. package/dist/cjs/src/model.js +101 -26
  50. package/dist/cjs/src/model.js.map +1 -1
  51. package/dist/cjs/src/module.config.d.ts +3 -4
  52. package/dist/cjs/src/module.config.js +8 -6
  53. package/dist/cjs/src/module.config.js.map +1 -1
  54. package/dist/cjs/src/module.d.ts +2 -3
  55. package/dist/cjs/src/module.js +4 -2
  56. package/dist/cjs/src/module.js.map +1 -1
  57. package/dist/cjs/src/router.d.ts +24 -53
  58. package/dist/cjs/src/router.js +140 -159
  59. package/dist/cjs/src/router.js.map +1 -1
  60. package/dist/cjs/src/static-serving.d.ts +1 -0
  61. package/dist/cjs/src/static-serving.js +46 -39
  62. package/dist/cjs/src/static-serving.js.map +1 -1
  63. package/dist/cjs/src/utils.js +1 -0
  64. package/dist/cjs/tests/filter.spec.js +61 -47
  65. package/dist/cjs/tests/filter.spec.js.map +1 -1
  66. package/dist/cjs/tests/middleware.spec.d.ts +1 -1
  67. package/dist/cjs/tests/middleware.spec.js +157 -145
  68. package/dist/cjs/tests/middleware.spec.js.map +1 -1
  69. package/dist/cjs/tests/model.spec.js +4 -4
  70. package/dist/cjs/tests/model.spec.js.map +1 -1
  71. package/dist/cjs/tests/module.spec.js +4 -3
  72. package/dist/cjs/tests/module.spec.js.map +1 -1
  73. package/dist/cjs/tests/router.spec.d.ts +1 -1
  74. package/dist/cjs/tests/router.spec.js +298 -333
  75. package/dist/cjs/tests/router.spec.js.map +1 -1
  76. package/dist/cjs/tests/utils.js +5 -2
  77. package/dist/cjs/tests/utils.js.map +1 -1
  78. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  79. package/dist/esm/src/controllers.d.ts +4 -4
  80. package/dist/esm/src/controllers.js +3 -0
  81. package/dist/esm/src/controllers.js.map +1 -1
  82. package/dist/esm/src/decorator.d.ts +29 -94
  83. package/dist/esm/src/decorator.js +49 -114
  84. package/dist/esm/src/decorator.js.map +1 -1
  85. package/dist/esm/src/filter.d.ts +1 -0
  86. package/dist/esm/src/filter.js +11 -18
  87. package/dist/esm/src/filter.js.map +1 -1
  88. package/dist/esm/src/http.d.ts +5 -3
  89. package/dist/esm/src/http.js +89 -55
  90. package/dist/esm/src/http.js.map +1 -1
  91. package/dist/esm/src/kernel.d.ts +3 -3
  92. package/dist/esm/src/kernel.js +6 -27
  93. package/dist/esm/src/kernel.js.map +1 -1
  94. package/dist/esm/src/logger.d.ts +2 -2
  95. package/dist/esm/src/logger.js +4 -9
  96. package/dist/esm/src/logger.js.map +1 -1
  97. package/dist/esm/src/middleware.d.ts +5 -1
  98. package/dist/esm/src/middleware.js +12 -0
  99. package/dist/esm/src/middleware.js.map +1 -1
  100. package/dist/esm/src/model.d.ts +62 -2
  101. package/dist/esm/src/model.js +92 -24
  102. package/dist/esm/src/model.js.map +1 -1
  103. package/dist/esm/src/module.config.d.ts +3 -4
  104. package/dist/esm/src/module.config.js +6 -5
  105. package/dist/esm/src/module.config.js.map +1 -1
  106. package/dist/esm/src/module.d.ts +2 -3
  107. package/dist/esm/src/module.js +5 -3
  108. package/dist/esm/src/module.js.map +1 -1
  109. package/dist/esm/src/router.d.ts +24 -53
  110. package/dist/esm/src/router.js +136 -155
  111. package/dist/esm/src/router.js.map +1 -1
  112. package/dist/esm/src/static-serving.d.ts +1 -0
  113. package/dist/esm/src/static-serving.js +39 -32
  114. package/dist/esm/src/static-serving.js.map +1 -1
  115. package/dist/esm/src/utils.js +1 -0
  116. package/dist/esm/tests/filter.spec.js +14 -0
  117. package/dist/esm/tests/filter.spec.js.map +1 -1
  118. package/dist/esm/tests/middleware.spec.d.ts +1 -1
  119. package/dist/esm/tests/middleware.spec.js +60 -48
  120. package/dist/esm/tests/middleware.spec.js.map +1 -1
  121. package/dist/esm/tests/module.spec.js +1 -0
  122. package/dist/esm/tests/module.spec.js.map +1 -1
  123. package/dist/esm/tests/router.spec.d.ts +1 -1
  124. package/dist/esm/tests/router.spec.js +167 -202
  125. package/dist/esm/tests/router.spec.js.map +1 -1
  126. package/dist/esm/tests/utils.js +4 -1
  127. package/dist/esm/tests/utils.js.map +1 -1
  128. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  129. package/package.json +14 -15
  130. package/src/controllers.ts +3 -3
  131. package/src/decorator.ts +42 -131
  132. package/src/filter.ts +0 -2
  133. package/src/http.ts +35 -36
  134. package/src/kernel.ts +4 -5
  135. package/src/logger.ts +2 -4
  136. package/src/middleware.ts +2 -1
  137. package/src/model.ts +80 -8
  138. package/src/module.config.ts +3 -6
  139. package/src/module.ts +2 -2
  140. package/src/router.ts +121 -161
  141. package/src/static-serving.ts +14 -12
  142. package/tests/middleware.spec.ts +0 -1
  143. package/tests/router.spec.ts +131 -133
  144. 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,46 +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 as __Ω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 };
44
+ var __ΩRouteControllerAction = [() => InjectorModule, 'module', () => __ΩClassType, 'controller', 'methodName', 'PP"7!4"8n#4$&4%M'];
45
+ export { __ΩRouteControllerAction as __ΩRouteControllerAction };
56
46
  function getRouterControllerActionName(action) {
57
47
  return `${getClassName(action.controller)}.${action.methodName}`;
58
48
  }
49
+ getRouterControllerActionName.__type = [() => __ΩRouteControllerAction, 'action', 'getRouterControllerActionName', 'Pn!2"&/#'];
59
50
  export class RouteConfig {
60
51
  constructor(name, httpMethods, path, action, internal = false) {
61
52
  this.name = name;
@@ -64,7 +55,6 @@ export class RouteConfig {
64
55
  this.action = action;
65
56
  this.internal = internal;
66
57
  this.baseUrl = '';
67
- this.parameterRegularExpressions = {};
68
58
  this.responses = [];
69
59
  this.description = '';
70
60
  this.groups = [];
@@ -76,7 +66,6 @@ export class RouteConfig {
76
66
  * An arbitrary data container the user can use to store app specific settings/values.
77
67
  */
78
68
  this.data = new Map();
79
- this.parameters = {};
80
69
  }
81
70
  getSchemaForResponse(statusCode) {
82
71
  if (!this.responses.length)
@@ -94,39 +83,15 @@ export class RouteConfig {
94
83
  return path;
95
84
  }
96
85
  }
97
- /**
98
- * When this class is injected into a route, then validation errors are not automatically thrown (using onHttpControllerValidationError event),
99
- * but injected to the route itself. The user is then responsible to handle the errors.
100
- *
101
- * Note: The body parameter is still passed, however it might contain now invalid data. The BodyValidation tells what data is invalid.
102
- */
103
- export class BodyValidation {
104
- constructor(errors = []) {
105
- this.errors = errors;
106
- }
107
- hasErrors(prefix) {
108
- return this.getErrors(prefix).length > 0;
109
- }
110
- getErrors(prefix) {
111
- if (prefix)
112
- return this.errors.filter(v => v.path.startsWith(prefix));
113
- return this.errors;
114
- }
115
- getErrorsForPath(path) {
116
- return this.errors.filter(v => v.path === path);
117
- }
118
- getErrorMessageForPath(path) {
119
- return this.getErrorsForPath(path).map(v => v.message).join(', ');
120
- }
121
- }
86
+ RouteConfig.__type = ['baseUrl', function () { return ''; }, 'statusCode', 'description', 'type', 'responses', function () { return []; }, function () { return ''; }, 'groups', function () { return []; }, 'category', function () { return ''; }, 'returnType', () => __ΩSerializationOptions, 'serializationOptions', () => Serializer, 'serializer', () => InjectorModule, 'module', () => __ΩClassType, 'resolverForToken', function () { return new Map(); }, () => HttpMiddlewareConfig, 'config', () => InjectorModule, 'middlewares', function () { return []; }, () => __ΩClassType, 'resolverForParameterName', function () { return 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'];
122
87
  class ParsedRoute {
123
88
  constructor(routeConfig) {
124
89
  this.routeConfig = routeConfig;
125
90
  this.pathParameterNames = {};
126
91
  this.parameters = [];
127
92
  }
128
- addParameter(property, config) {
129
- const parameter = new ParsedRouteParameter(property, config);
93
+ addParameter(property) {
94
+ const parameter = new ParsedRouteParameter(property);
130
95
  this.parameters.push(parameter);
131
96
  return parameter;
132
97
  }
@@ -141,69 +106,97 @@ class ParsedRoute {
141
106
  throw new Error(`No route parameter with name ${name} defined.`);
142
107
  }
143
108
  }
109
+ ParsedRoute.__type = ['regex', 'pathParameterNames', function () { return {}; }, () => ParsedRouteParameter, 'parameters', function () { return []; }, () => 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'];
144
110
  class ParsedRouteParameter {
145
- constructor(property, config) {
146
- this.property = property;
147
- this.config = config;
111
+ constructor(parameter) {
112
+ this.parameter = parameter;
148
113
  }
149
114
  get body() {
150
- 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;
151
129
  }
152
130
  get query() {
153
- return this.config ? this.config.type === 'query' : false;
131
+ return metaAnnotation.getForName(this.parameter.type, 'httpQuery') !== undefined;
154
132
  }
155
133
  get queries() {
156
- return this.config ? this.config.type === 'queries' : false;
134
+ return metaAnnotation.getForName(this.parameter.type, 'httpQueries') !== undefined;
157
135
  }
158
136
  get typePath() {
159
- 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;
160
144
  }
161
145
  getName() {
162
- return this.property.name;
146
+ return this.parameter.name;
163
147
  }
164
148
  isPartOfPath() {
165
149
  return this.regexPosition !== undefined;
166
150
  }
167
151
  }
152
+ ParsedRouteParameter.__type = ['regexPosition', () => ReflectionParameter, 'parameter', 'constructor', 'getType', 'getName', 'isPartOfPath', '\'3!8PP7"2#:"0$!!P"0%!!!P"0&P)0\'5'];
168
153
  function parseRoutePathToRegex(routeConfig) {
169
154
  const parameterNames = {};
170
155
  let path = routeConfig.getFullPath();
156
+ const method = ReflectionClass.from(routeConfig.action.controller).getMethod(routeConfig.action.methodName);
171
157
  let argumentIndex = 0;
172
- path = path.replace(/:(\w+)/g, (a, name) => {
158
+ path = path.replace(/:(\w+)/g, Object.assign((a, name) => {
173
159
  parameterNames[name] = argumentIndex;
174
160
  argumentIndex++;
175
- return routeConfig.parameterRegularExpressions[name] ? '(' + routeConfig.parameterRegularExpressions[name] + ')' : String.raw `([^/]+)`;
176
- });
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""/#'] }));
177
169
  return { regex: path, parameterNames };
178
170
  }
171
+ parseRoutePathToRegex.__type = [() => RouteConfig, 'routeConfig', 'regex', 'parameterNames', 'parseRoutePathToRegex', 'PP7!2"P&4#P&\'LM4$M/%'];
179
172
  export function parseRouteControllerAction(routeConfig) {
180
- const schema = getClassSchema(routeConfig.action.controller);
173
+ const schema = ReflectionClass.from(routeConfig.action.controller);
181
174
  const parsedRoute = new ParsedRoute(routeConfig);
182
- const methodArgumentProperties = schema.getMethodProperties(routeConfig.action.methodName);
175
+ const methodArgumentProperties = schema.getMethodParameters(routeConfig.action.methodName);
183
176
  const parsedPath = parseRoutePathToRegex(routeConfig);
184
177
  parsedRoute.regex = parsedPath.regex;
185
178
  parsedRoute.pathParameterNames = parsedPath.parameterNames;
186
179
  for (const property of methodArgumentProperties) {
187
- const decoratorData = routeConfig.parameters[property.name];
188
- const parsedParameter = parsedRoute.addParameter(property, decoratorData);
189
- if (decoratorData && decoratorData.optional)
190
- property.isOptional = true;
191
- if (property.type === 'class' && property.classType === BodyValidation) {
192
- parsedRoute.customValidationErrorHandling = parsedParameter;
193
- }
180
+ const parsedParameter = parsedRoute.addParameter(property);
194
181
  parsedParameter.regexPosition = parsedPath.parameterNames[property.name];
195
182
  }
196
183
  return parsedRoute;
197
184
  }
185
+ parseRouteControllerAction.__type = [() => RouteConfig, 'routeConfig', () => ParsedRoute, 'parseRouteControllerAction', 'PP7!2"P7#/$'];
198
186
  export function dotToUrlPath(dotPath) {
199
187
  if (-1 === dotPath.indexOf('.'))
200
188
  return dotPath;
201
189
  return dotPath.replace(/\./g, '][').replace('][', '[') + ']';
202
190
  }
191
+ dotToUrlPath.__type = ['dotPath', 'dotToUrlPath', 'P&2!&/"'];
192
+ var __ΩRouteParameterResolver = [() => __ΩRouteParameterResolverContext, 'context', 'resolve', 'PPn!2"P""`J1#M'];
193
+ export { __ΩRouteParameterResolver as __Ω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 as __ΩRouteParameterResolverContext };
203
196
  function filterMiddlewaresForRoute(middlewareRawConfigs, routeConfig, fullPath) {
204
197
  const middlewares = middlewareRawConfigs.slice(0);
205
198
  middlewares.push(...routeConfig.middlewares);
206
- const middlewareConfigs = middlewares.filter((v) => {
199
+ const middlewareConfigs = middlewares.filter(Object.assign((v) => {
207
200
  var _a;
208
201
  if (!(v.config instanceof HttpMiddlewareConfig))
209
202
  return false;
@@ -266,13 +259,14 @@ function filterMiddlewaresForRoute(middlewareRawConfigs, routeConfig, fullPath)
266
259
  }
267
260
  }
268
261
  return true;
269
- });
270
- middlewareConfigs.sort((a, b) => {
262
+ }, { __type: ['v', '', 'P"2!"/"'] }));
263
+ middlewareConfigs.sort(Object.assign((a, b) => {
271
264
  return a.config.order - b.config.order;
272
- });
265
+ }, { __type: ['a', 'b', '', 'P"2!"2""/#'] }));
273
266
  return middlewareConfigs;
274
267
  }
275
- 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 {
276
270
  constructor(controllers, logger, tagRegistry, middlewareRegistry = new MiddlewareRegistry) {
277
271
  this.logger = logger;
278
272
  this.middlewareRegistry = middlewareRegistry;
@@ -287,11 +281,11 @@ let Router = class Router {
287
281
  hash: 'sha1',
288
282
  enabledPlugins: ['octetstream', 'querystring', 'json'],
289
283
  });
290
- return asyncOperation((resolve, reject) => {
284
+ return asyncOperation(Object.assign((resolve, reject) => {
291
285
  if (req.body) {
292
286
  return resolve(req.body);
293
287
  }
294
- form.parse(req, (err, fields, files) => {
288
+ form.parse(req, Object.assign((err, fields, files) => {
295
289
  if (err) {
296
290
  reject(err);
297
291
  }
@@ -299,16 +293,16 @@ let Router = class Router {
299
293
  const body = req.body = { ...fields, ...files };
300
294
  resolve(body);
301
295
  }
302
- });
303
- });
296
+ }, { __type: ['err', 'fields', 'files', '', 'P"2!"2""2#"/$'] }));
297
+ }, { __type: ['resolve', 'reject', '', 'P"2!"2""/#'] }));
304
298
  }
305
299
  getRoutes() {
306
300
  return this.routes;
307
301
  }
308
- static forControllers(controllers, tagRegistry = new TagRegistry(), middlewareRegistry = new MiddlewareRegistry(), module = new AppModule({})) {
309
- 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 => {
310
304
  return isClass(v) ? { controller: v, module } : v;
311
- })), new Logger([], []), tagRegistry, middlewareRegistry);
305
+ }, { __type: ['v', '', 'P"2!"/"'] }))), new Logger([], []), tagRegistry, middlewareRegistry);
312
306
  }
313
307
  getRouteCode(compiler, routeConfig) {
314
308
  const routeConfigVar = compiler.reserveVariable('routeConfigVar', routeConfig);
@@ -319,7 +313,7 @@ let Router = class Router {
319
313
  const setParameters = [];
320
314
  const parameterNames = [];
321
315
  const parameterValidator = [];
322
- let bodyValidationErrorHandling = `if (bodyErrors.length) throw ValidationFailed.from(bodyErrors);`;
316
+ let bodyValidationErrorHandling = `if (bodyErrors.length) throw ValidationError.from(bodyErrors);`;
323
317
  let enableParseBody = false;
324
318
  const hasParameters = parsedRoute.getParameters().length > 0;
325
319
  let requiresAsyncParameters = false;
@@ -327,49 +321,51 @@ let Router = class Router {
327
321
  const fullPath = routeConfig.getFullPath();
328
322
  const middlewareConfigs = filterMiddlewaresForRoute(this.middlewareRegistry.configs, routeConfig, fullPath);
329
323
  for (const parameter of parsedRoute.getParameters()) {
330
- if (parsedRoute.customValidationErrorHandling === parameter) {
331
- compiler.context.set('BodyValidation', BodyValidation);
332
- bodyValidationErrorHandling = '';
333
- setParameters.push(`parameters.${parameter.property.name} = new BodyValidation(bodyErrors);`);
334
- parameterNames.push(`parameters.${parameter.property.name}`);
335
- }
336
- else if (parameter.body) {
337
- const validatorVar = compiler.reserveVariable('argumentValidator', jitValidateProperty(parameter.property));
338
- 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));
339
328
  enableParseBody = true;
340
- setParameters.push(`parameters.${parameter.property.name} = ${converterVar}(bodyFields);`);
341
- parameterValidator.push(`${validatorVar}(parameters.${parameter.property.name}, ${JSON.stringify(parameter.typePath || '')}, bodyErrors);`);
342
- 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
+ }
343
340
  }
344
341
  else if (parameter.query || parameter.queries) {
345
- const converted = parameter.property.type === 'any' ? (v) => v : getPropertyXtoClassFunction(parameter.property, jsonSerializer);
346
- 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);
347
344
  const converterVar = compiler.reserveVariable('argumentConverter', converted);
348
345
  const validatorVar = compiler.reserveVariable('argumentValidator', validator);
349
- const queryPath = parameter.typePath === undefined ? parameter.property.name : parameter.typePath;
346
+ const queryPath = parameter.typePath === undefined && parameter.query ? parameter.parameter.name : parameter.typePath;
350
347
  const accessor = queryPath ? `['` + (queryPath.replace(/\./g, `']['`)) + `']` : '';
351
348
  const queryAccessor = queryPath ? `_query${accessor}` : '_query';
352
- setParameters.push(`parameters.${parameter.property.name} = ${converterVar}(${queryAccessor});`);
353
- parameterNames.push(`parameters.${parameter.property.name}`);
354
- 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())});`);
355
352
  }
356
353
  else {
357
- parameterNames.push(`parameters.${parameter.property.name}`);
354
+ parameterNames.push(`parameters.${parameter.parameter.name}`);
358
355
  if (parameter.isPartOfPath()) {
359
- if (parameter.property.type !== 'class') {
360
- 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());
361
358
  const converterVar = compiler.reserveVariable('argumentConverter', converted);
362
- setParameters.push(`parameters.${parameter.property.name} = ${converterVar}(_match[${1 + (parameter.regexPosition || 0)}]);`);
363
- 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);
364
361
  const validatorVar = compiler.reserveVariable('argumentValidator', validator);
365
- 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())});`);
366
363
  }
367
364
  else {
368
- setParameters.push(`parameters.${parameter.property.name} = _match[${1 + (parameter.regexPosition || 0)}];`);
365
+ setParameters.push(`parameters.${parameter.parameter.name} = _match[${1 + (parameter.regexPosition || 0)}];`);
369
366
  }
370
367
  }
371
- const injectorOptions = parameter.property.data['deepkit/inject'];
372
- 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;
373
369
  const injectorTokenVar = compiler.reserveVariable('classType', injectorToken);
374
370
  const parameterResolverFoundVar = compiler.reserveVariable('parameterResolverFound', false);
375
371
  setParameters.push(`${parameterResolverFoundVar} = false;`);
@@ -391,27 +387,21 @@ let Router = class Router {
391
387
  ${instance} = ${injector}.get(${resolverProvideTokenVar}${moduleVar});
392
388
  if (!${parameterResolverFoundVar}) {
393
389
  ${parameterResolverFoundVar} = true;
394
- parameters.${parameter.property.name} = await ${instance}.resolve({
390
+ parameters.${parameter.parameter.name} = await ${instance}.resolve({
395
391
  token: ${injectorTokenVar},
396
392
  routeConfig: ${routeConfigVar},
397
393
  request: request,
398
- name: ${JSON.stringify(parameter.property.name)},
399
- value: parameters.${parameter.property.name},
394
+ name: ${JSON.stringify(parameter.parameter.name)},
395
+ value: parameters.${parameter.parameter.name},
400
396
  query: _query,
401
397
  parameters: parameters
402
398
  });
403
399
  }`);
404
400
  }
405
- else {
406
- if (!parameter.isPartOfPath() && parameter.property.type !== 'class' && (!injectorOptions || !injectorOptions.token)) {
407
- 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.` +
408
- `If its a query parameter use '@http.query() ${parameter.property.name}' or if its a body '@http.body() ${parameter.property.name}'.`);
409
- }
410
- }
411
401
  if (!parameter.isPartOfPath()) {
412
- let injectorGet = `parameters.${parameter.property.name} = ${injector}.get(${injectorTokenVar});`;
413
- if (injectorOptions && injectorOptions.optional) {
414
- 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) {}`;
415
405
  }
416
406
  setParameters.push(`if (!${parameterResolverFoundVar}) ${injectorGet}`);
417
407
  }
@@ -460,15 +450,15 @@ let Router = class Router {
460
450
  ${setParameters.join('\n')}
461
451
  ${parameterValidator.join('\n')}
462
452
  ${bodyValidationErrorHandling}
463
- if (validationErrors.length) throw ValidationFailed.from(validationErrors);
453
+ if (validationErrors.length) throw new ValidationError(validationErrors);
464
454
  return [${parameterNames.join(',')}];
465
455
  }`;
466
456
  }
467
457
  let methodCheck = '';
468
458
  if (routeConfig.httpMethods.length) {
469
- methodCheck = '(' + routeConfig.httpMethods.map(v => {
459
+ methodCheck = '(' + routeConfig.httpMethods.map(Object.assign(v => {
470
460
  return `_method === '${v.toUpperCase()}'`;
471
- }).join(' || ') + ') && ';
461
+ }, { __type: ['v', '', 'P"2!"/"'] })).join(' || ') + ') && ';
472
462
  }
473
463
  return `
474
464
  //=> ${routeConfig.httpMethods.join(',')} ${path}
@@ -480,15 +470,15 @@ let Router = class Router {
480
470
  getRouteUrlResolveCode(compiler, routeConfig) {
481
471
  const parsedRoute = parseRouteControllerAction(routeConfig);
482
472
  let url = routeConfig.getFullPath();
483
- url = url.replace(/:(\w+)/g, (a, name) => {
473
+ url = url.replace(/:(\w+)/g, Object.assign((a, name) => {
484
474
  return `\${parameters.${name}}`;
485
- });
475
+ }, { __type: ['a', 'name', '', 'P"2!"2""/#'] }));
486
476
  const modify = [];
487
477
  for (const parameter of parsedRoute.getParameters()) {
488
478
  if (parameter.query || parameter.queries) {
489
- const queryPath = parameter.typePath === undefined ? parameter.property.name : parameter.typePath;
490
- if (parameter.property.type === 'class') {
491
- 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()) {
492
482
  const accessor = `parameters.${parameter.getName()}?.${property.name}`;
493
483
  const thisPath = queryPath ? queryPath + '.' + property.name : property.name;
494
484
  modify.push(`${accessor} !== undefined && query.push(${JSON.stringify(dotToUrlPath(thisPath))} + '=' + encodeURIComponent(${accessor}))`);
@@ -516,7 +506,7 @@ let Router = class Router {
516
506
  const data = httpClass._fetch(controller);
517
507
  if (!data)
518
508
  throw new Error(`Http controller class ${getClassName(controller)} has no @http.controller decorator.`);
519
- const schema = getClassSchema(controller);
509
+ const schema = ReflectionClass.from(controller);
520
510
  for (const action of data.getActions()) {
521
511
  const routeConfig = new RouteConfig(action.name, action.httpMethods, action.path, {
522
512
  controller,
@@ -524,19 +514,18 @@ let Router = class Router {
524
514
  methodName: action.methodName
525
515
  });
526
516
  routeConfig.module = module;
527
- routeConfig.parameterRegularExpressions = action.parameterRegularExpressions;
528
517
  routeConfig.responses = action.responses;
529
518
  routeConfig.description = action.description;
530
519
  routeConfig.category = action.category;
531
520
  routeConfig.groups = action.groups;
532
521
  routeConfig.data = new Map(action.data);
533
522
  routeConfig.baseUrl = data.baseUrl;
534
- routeConfig.middlewares = data.middlewares.map(v => {
523
+ routeConfig.middlewares = data.middlewares.map(Object.assign(v => {
535
524
  return { config: v(), module };
536
- });
537
- routeConfig.middlewares.push(...action.middlewares.map(v => {
525
+ }, { __type: ['v', '', 'P"2!"/"'] }));
526
+ routeConfig.middlewares.push(...action.middlewares.map(Object.assign(v => {
538
527
  return { config: v(), module };
539
- }));
528
+ }, { __type: ['v', '', 'P"2!"/"'] })));
540
529
  for (const item of action.resolverForToken)
541
530
  routeConfig.resolverForToken.set(...item);
542
531
  routeConfig.resolverForToken = new Map(data.resolverForToken);
@@ -545,18 +534,17 @@ let Router = class Router {
545
534
  routeConfig.resolverForParameterName = new Map(data.resolverForParameterName);
546
535
  for (const item of action.resolverForParameterName)
547
536
  routeConfig.resolverForParameterName.set(...item);
548
- routeConfig.parameters = { ...action.parameters };
549
537
  routeConfig.serializationOptions = action.serializationOptions;
550
538
  routeConfig.serializer = action.serializer;
551
539
  routeConfig.serializer = action.serializer;
552
540
  if (schema.hasMethod(action.methodName))
553
- routeConfig.returnSchema = schema.getMethod(action.methodName);
541
+ routeConfig.returnType = schema.getMethod(action.methodName).getReturnType();
554
542
  this.addRoute(routeConfig);
555
543
  }
556
544
  }
557
545
  build() {
558
546
  const compiler = new CompilerContext;
559
- compiler.context.set('ValidationFailed', ValidationFailed);
547
+ compiler.context.set('ValidationError', ValidationError);
560
548
  compiler.context.set('qs', require('qs'));
561
549
  const code = [];
562
550
  for (const route of this.routes) {
@@ -602,13 +590,6 @@ let Router = class Router {
602
590
  method = method.toUpperCase();
603
591
  return this.resolveRequest({ url, method });
604
592
  }
605
- };
606
- Router = __decorate([
607
- injectable,
608
- __metadata("design:paramtypes", [HttpControllers,
609
- Logger,
610
- TagRegistry,
611
- MiddlewareRegistry])
612
- ], Router);
613
- export { Router };
593
+ }
594
+ Router.__type = [() => HttpRequest, 'request', () => __ΩResolvedController, '', 'fn', 'name', 'parameters', 'resolveFn', () => RouteConfig, 'routes', function () { return []; }, () => 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'];
614
595
  //# sourceMappingURL=router.js.map