@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
@@ -5,14 +5,18 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  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;
6
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
8
  var __importDefault = (this && this.__importDefault) || function (mod) {
12
9
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
10
  };
14
11
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.Router = exports.dotToUrlPath = exports.parseRouteControllerAction = exports.BodyValidation = exports.RouteConfig = exports.UploadedFile = void 0;
12
+ exports.Router = exports.__ΩRouteParameterResolverContext = exports.__ΩRouteParameterResolver = exports.dotToUrlPath = exports.parseRouteControllerAction = exports.RouteConfig = exports.__ΩRouteControllerAction = exports.UploadedFile = exports.__ΩRouteParameterResolverForInjector = void 0;
13
+ var { __ΩSerializationOptions } = require('@deepkit/type');
14
+ var { __ΩClassType } = require('@deepkit/core');
15
+ var { __ΩMiddlewareRegistryEntry } = require('@deepkit/app');
16
+ var { __ΩLoggerInterface } = require('@deepkit/logger');
17
+ var { __ΩHttpMiddlewareFn } = require('./middleware');
18
+ var { __ΩHttpRequestQuery } = require('./model');
19
+ var { __ΩHttpRequestResolvedParameters } = require('./model');
16
20
  /*
17
21
  * Deepkit Framework
18
22
  * Copyright (C) 2021 Deepkit UG, Marc J. Schmidt
@@ -22,46 +26,33 @@ exports.Router = exports.dotToUrlPath = exports.parseRouteControllerAction = exp
22
26
  *
23
27
  * You should have received a copy of the MIT License along with this program.
24
28
  */
25
- require("reflect-metadata");
26
29
  const core_1 = require("@deepkit/core");
27
30
  const type_1 = require("@deepkit/type");
28
31
  // @ts-ignore
29
32
  const formidable_1 = __importDefault(require("formidable"));
30
33
  const decorator_1 = require("./decorator");
34
+ const model_1 = require("./model");
31
35
  const injector_1 = require("@deepkit/injector");
32
36
  const logger_1 = require("@deepkit/logger");
33
37
  const controllers_1 = require("./controllers");
34
38
  const app_1 = require("@deepkit/app");
35
39
  const middleware_1 = require("./middleware");
40
+ var __ΩRouteParameterResolverForInjector = [() => injector_1.InjectorContext, 'injector', '', 'PP7!2"P"F"F`J/#'];
41
+ exports.__ΩRouteParameterResolverForInjector = __ΩRouteParameterResolverForInjector;
42
+ var __ΩResolvedController = [() => __ΩRouteParameterResolverForInjector, 'parameters', () => RouteConfig, 'routeConfig', () => UploadedFile, 'uploadedFiles', () => injector_1.InjectorContext, 'injector', () => __ΩHttpMiddlewareFn, 'fn', 'timeout', '', 'middlewares', 'Pn!4"P7#4$P&P7%LM4&PP7\'2(Pn)4*\'4+MF/,4-8M'];
36
43
  let UploadedFile = class UploadedFile {
37
44
  };
38
- __decorate([
39
- type_1.t.required,
40
- __metadata("design:type", Number)
41
- ], UploadedFile.prototype, "size", void 0);
42
- __decorate([
43
- type_1.t.required,
44
- __metadata("design:type", String)
45
- ], UploadedFile.prototype, "path", void 0);
46
- __decorate([
47
- type_1.t.string.required.nullable,
48
- __metadata("design:type", Object)
49
- ], UploadedFile.prototype, "name", void 0);
50
- __decorate([
51
- type_1.t.string.required.nullable,
52
- __metadata("design:type", Object)
53
- ], UploadedFile.prototype, "type", void 0);
54
- __decorate([
55
- type_1.t.date.required.nullable,
56
- __metadata("design:type", Object)
57
- ], UploadedFile.prototype, "lastModifiedDate", void 0);
45
+ UploadedFile.__type = ['size', 'path', 'name', 'type', 'lastModifiedDate', '\'3!&3"P&,J3#P&,J3$PT,J3%5'];
58
46
  UploadedFile = __decorate([
59
47
  type_1.entity.name('@deepkit/UploadedFile')
60
48
  ], UploadedFile);
61
49
  exports.UploadedFile = UploadedFile;
50
+ var __ΩRouteControllerAction = [() => injector_1.InjectorModule, 'module', () => __ΩClassType, 'controller', 'methodName', 'PP"7!4"8n#4$&4%M'];
51
+ exports.__ΩRouteControllerAction = __ΩRouteControllerAction;
62
52
  function getRouterControllerActionName(action) {
63
- return `${core_1.getClassName(action.controller)}.${action.methodName}`;
53
+ return `${(0, core_1.getClassName)(action.controller)}.${action.methodName}`;
64
54
  }
55
+ getRouterControllerActionName.__type = [() => __ΩRouteControllerAction, 'action', 'getRouterControllerActionName', 'Pn!2"&/#'];
65
56
  class RouteConfig {
66
57
  constructor(name, httpMethods, path, action, internal = false) {
67
58
  this.name = name;
@@ -70,7 +61,6 @@ class RouteConfig {
70
61
  this.action = action;
71
62
  this.internal = internal;
72
63
  this.baseUrl = '';
73
- this.parameterRegularExpressions = {};
74
64
  this.responses = [];
75
65
  this.description = '';
76
66
  this.groups = [];
@@ -82,7 +72,6 @@ class RouteConfig {
82
72
  * An arbitrary data container the user can use to store app specific settings/values.
83
73
  */
84
74
  this.data = new Map();
85
- this.parameters = {};
86
75
  }
87
76
  getSchemaForResponse(statusCode) {
88
77
  if (!this.responses.length)
@@ -94,47 +83,22 @@ class RouteConfig {
94
83
  return;
95
84
  }
96
85
  getFullPath() {
97
- let path = this.baseUrl ? core_1.urlJoin(this.baseUrl, this.path) : this.path;
86
+ let path = this.baseUrl ? (0, core_1.urlJoin)(this.baseUrl, this.path) : this.path;
98
87
  if (!path.startsWith('/'))
99
88
  path = '/' + path;
100
89
  return path;
101
90
  }
102
91
  }
103
92
  exports.RouteConfig = RouteConfig;
104
- /**
105
- * When this class is injected into a route, then validation errors are not automatically thrown (using onHttpControllerValidationError event),
106
- * but injected to the route itself. The user is then responsible to handle the errors.
107
- *
108
- * Note: The body parameter is still passed, however it might contain now invalid data. The BodyValidation tells what data is invalid.
109
- */
110
- class BodyValidation {
111
- constructor(errors = []) {
112
- this.errors = errors;
113
- }
114
- hasErrors(prefix) {
115
- return this.getErrors(prefix).length > 0;
116
- }
117
- getErrors(prefix) {
118
- if (prefix)
119
- return this.errors.filter(v => v.path.startsWith(prefix));
120
- return this.errors;
121
- }
122
- getErrorsForPath(path) {
123
- return this.errors.filter(v => v.path === path);
124
- }
125
- getErrorMessageForPath(path) {
126
- return this.getErrorsForPath(path).map(v => v.message).join(', ');
127
- }
128
- }
129
- exports.BodyValidation = BodyValidation;
93
+ RouteConfig.__type = ['baseUrl', function () { return ''; }, 'statusCode', 'description', 'type', 'responses', function () { return []; }, function () { return ''; }, 'groups', function () { return []; }, 'category', function () { return ''; }, 'returnType', () => __ΩSerializationOptions, 'serializationOptions', () => type_1.Serializer, 'serializer', () => injector_1.InjectorModule, 'module', () => __ΩClassType, 'resolverForToken', function () { return new Map(); }, () => middleware_1.HttpMiddlewareConfig, 'config', () => injector_1.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'];
130
94
  class ParsedRoute {
131
95
  constructor(routeConfig) {
132
96
  this.routeConfig = routeConfig;
133
97
  this.pathParameterNames = {};
134
98
  this.parameters = [];
135
99
  }
136
- addParameter(property, config) {
137
- const parameter = new ParsedRouteParameter(property, config);
100
+ addParameter(property) {
101
+ const parameter = new ParsedRouteParameter(property);
138
102
  this.parameters.push(parameter);
139
103
  return parameter;
140
104
  }
@@ -149,71 +113,99 @@ class ParsedRoute {
149
113
  throw new Error(`No route parameter with name ${name} defined.`);
150
114
  }
151
115
  }
116
+ ParsedRoute.__type = ['regex', 'pathParameterNames', function () { return {}; }, () => ParsedRouteParameter, 'parameters', function () { return []; }, () => RouteConfig, 'routeConfig', 'constructor', () => type_1.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'];
152
117
  class ParsedRouteParameter {
153
- constructor(property, config) {
154
- this.property = property;
155
- this.config = config;
118
+ constructor(parameter) {
119
+ this.parameter = parameter;
156
120
  }
157
121
  get body() {
158
- return this.config ? this.config.type === 'body' : false;
122
+ return type_1.metaAnnotation.getForName(this.parameter.type, 'httpBody') !== undefined;
123
+ }
124
+ get bodyValidation() {
125
+ return type_1.metaAnnotation.getForName(this.parameter.type, 'httpBodyValidation') !== undefined;
126
+ }
127
+ getType() {
128
+ if (this.bodyValidation) {
129
+ (0, type_1.assertType)(this.parameter.type, 20 /* class */);
130
+ const valueType = (0, type_1.findMember)('value', this.parameter.type);
131
+ if (!valueType || valueType.kind !== 15 /* property */)
132
+ throw new Error(`No property value found at ${(0, type_1.stringifyType)(this.parameter.type)}`);
133
+ return valueType.type;
134
+ }
135
+ return this.parameter.type;
159
136
  }
160
137
  get query() {
161
- return this.config ? this.config.type === 'query' : false;
138
+ return type_1.metaAnnotation.getForName(this.parameter.type, 'httpQuery') !== undefined;
162
139
  }
163
140
  get queries() {
164
- return this.config ? this.config.type === 'queries' : false;
141
+ return type_1.metaAnnotation.getForName(this.parameter.type, 'httpQueries') !== undefined;
165
142
  }
166
143
  get typePath() {
167
- return this.config ? this.config.typePath : undefined;
144
+ const typeOptions = type_1.metaAnnotation.getForName(this.parameter.type, 'httpQueries') || type_1.metaAnnotation.getForName(this.parameter.type, 'httpQuery');
145
+ if (!typeOptions)
146
+ return;
147
+ const options = (0, type_1.typeToObject)(typeOptions[0]);
148
+ if ((0, core_1.isObject)(options))
149
+ return options.name;
150
+ return;
168
151
  }
169
152
  getName() {
170
- return this.property.name;
153
+ return this.parameter.name;
171
154
  }
172
155
  isPartOfPath() {
173
156
  return this.regexPosition !== undefined;
174
157
  }
175
158
  }
159
+ ParsedRouteParameter.__type = ['regexPosition', () => type_1.ReflectionParameter, 'parameter', 'constructor', 'getType', 'getName', 'isPartOfPath', '\'3!8PP7"2#:"0$!!P"0%!!!P"0&P)0\'5'];
176
160
  function parseRoutePathToRegex(routeConfig) {
177
161
  const parameterNames = {};
178
162
  let path = routeConfig.getFullPath();
163
+ const method = type_1.ReflectionClass.from(routeConfig.action.controller).getMethod(routeConfig.action.methodName);
179
164
  let argumentIndex = 0;
180
- path = path.replace(/:(\w+)/g, (a, name) => {
165
+ path = path.replace(/:(\w+)/g, Object.assign((a, name) => {
181
166
  parameterNames[name] = argumentIndex;
182
167
  argumentIndex++;
183
- return routeConfig.parameterRegularExpressions[name] ? '(' + routeConfig.parameterRegularExpressions[name] + ')' : String.raw `([^/]+)`;
184
- });
168
+ const parameter = method.getParameterOrUndefined(name);
169
+ if (parameter) {
170
+ const regExp = (0, model_1.getRegExp)(parameter.type);
171
+ if (regExp)
172
+ return '(' + regExp + ')';
173
+ }
174
+ return String.raw `([^/]+)`;
175
+ }, { __type: ['a', 'name', '', 'P"2!"2""/#'] }));
185
176
  return { regex: path, parameterNames };
186
177
  }
178
+ parseRoutePathToRegex.__type = [() => RouteConfig, 'routeConfig', 'regex', 'parameterNames', 'parseRoutePathToRegex', 'PP7!2"P&4#P&\'LM4$M/%'];
187
179
  function parseRouteControllerAction(routeConfig) {
188
- const schema = type_1.getClassSchema(routeConfig.action.controller);
180
+ const schema = type_1.ReflectionClass.from(routeConfig.action.controller);
189
181
  const parsedRoute = new ParsedRoute(routeConfig);
190
- const methodArgumentProperties = schema.getMethodProperties(routeConfig.action.methodName);
182
+ const methodArgumentProperties = schema.getMethodParameters(routeConfig.action.methodName);
191
183
  const parsedPath = parseRoutePathToRegex(routeConfig);
192
184
  parsedRoute.regex = parsedPath.regex;
193
185
  parsedRoute.pathParameterNames = parsedPath.parameterNames;
194
186
  for (const property of methodArgumentProperties) {
195
- const decoratorData = routeConfig.parameters[property.name];
196
- const parsedParameter = parsedRoute.addParameter(property, decoratorData);
197
- if (decoratorData && decoratorData.optional)
198
- property.isOptional = true;
199
- if (property.type === 'class' && property.classType === BodyValidation) {
200
- parsedRoute.customValidationErrorHandling = parsedParameter;
201
- }
187
+ const parsedParameter = parsedRoute.addParameter(property);
202
188
  parsedParameter.regexPosition = parsedPath.parameterNames[property.name];
203
189
  }
204
190
  return parsedRoute;
205
191
  }
206
192
  exports.parseRouteControllerAction = parseRouteControllerAction;
193
+ parseRouteControllerAction.__type = [() => RouteConfig, 'routeConfig', () => ParsedRoute, 'parseRouteControllerAction', 'PP7!2"P7#/$'];
207
194
  function dotToUrlPath(dotPath) {
208
195
  if (-1 === dotPath.indexOf('.'))
209
196
  return dotPath;
210
197
  return dotPath.replace(/\./g, '][').replace('][', '[') + ']';
211
198
  }
212
199
  exports.dotToUrlPath = dotToUrlPath;
200
+ dotToUrlPath.__type = ['dotPath', 'dotToUrlPath', 'P&2!&/"'];
201
+ var __ΩRouteParameterResolver = [() => __ΩRouteParameterResolverContext, 'context', 'resolve', 'PPn!2"P""`J1#M'];
202
+ exports.__ΩRouteParameterResolver = __ΩRouteParameterResolver;
203
+ var __ΩRouteParameterResolverContext = [() => __ΩClassType, 'token', () => RouteConfig, 'route', () => model_1.HttpRequest, 'request', 'name', 'value', () => __ΩHttpRequestQuery, 'query', () => __ΩHttpRequestResolvedParameters, 'parameters', 'PPn!&+"J4"P7#4$P7%4&"4\'"4(n)4*n+4,M'];
204
+ exports.__ΩRouteParameterResolverContext = __ΩRouteParameterResolverContext;
213
205
  function filterMiddlewaresForRoute(middlewareRawConfigs, routeConfig, fullPath) {
214
206
  const middlewares = middlewareRawConfigs.slice(0);
215
207
  middlewares.push(...routeConfig.middlewares);
216
- const middlewareConfigs = middlewares.filter((v) => {
208
+ const middlewareConfigs = middlewares.filter(Object.assign((v) => {
217
209
  var _a;
218
210
  if (!(v.config instanceof middleware_1.HttpMiddlewareConfig))
219
211
  return false;
@@ -276,13 +268,14 @@ function filterMiddlewaresForRoute(middlewareRawConfigs, routeConfig, fullPath)
276
268
  }
277
269
  }
278
270
  return true;
279
- });
280
- middlewareConfigs.sort((a, b) => {
271
+ }, { __type: ['v', '', 'P"2!"/"'] }));
272
+ middlewareConfigs.sort(Object.assign((a, b) => {
281
273
  return a.config.order - b.config.order;
282
- });
274
+ }, { __type: ['a', 'b', '', 'P"2!"2""/#'] }));
283
275
  return middlewareConfigs;
284
276
  }
285
- let Router = class Router {
277
+ filterMiddlewaresForRoute.__type = [() => __ΩMiddlewareRegistryEntry, 'middlewareRawConfigs', () => RouteConfig, 'routeConfig', 'fullPath', () => middleware_1.HttpMiddlewareConfig, 'config', () => injector_1.InjectorModule, 'module', 'filterMiddlewaresForRoute', 'Pn!F2"P7#2$&2%PP7&4\'P"7(4)MF/*'];
278
+ class Router {
286
279
  constructor(controllers, logger, tagRegistry, middlewareRegistry = new app_1.MiddlewareRegistry) {
287
280
  this.logger = logger;
288
281
  this.middlewareRegistry = middlewareRegistry;
@@ -292,16 +285,16 @@ let Router = class Router {
292
285
  }
293
286
  }
294
287
  parseBody(req, files) {
295
- const form = formidable_1.default({
288
+ const form = (0, formidable_1.default)({
296
289
  multiples: true,
297
290
  hash: 'sha1',
298
291
  enabledPlugins: ['octetstream', 'querystring', 'json'],
299
292
  });
300
- return core_1.asyncOperation((resolve, reject) => {
293
+ return (0, core_1.asyncOperation)(Object.assign((resolve, reject) => {
301
294
  if (req.body) {
302
295
  return resolve(req.body);
303
296
  }
304
- form.parse(req, (err, fields, files) => {
297
+ form.parse(req, Object.assign((err, fields, files) => {
305
298
  if (err) {
306
299
  reject(err);
307
300
  }
@@ -309,16 +302,16 @@ let Router = class Router {
309
302
  const body = req.body = { ...fields, ...files };
310
303
  resolve(body);
311
304
  }
312
- });
313
- });
305
+ }, { __type: ['err', 'fields', 'files', '', 'P"2!"2""2#"/$'] }));
306
+ }, { __type: ['resolve', 'reject', '', 'P"2!"2""/#'] }));
314
307
  }
315
308
  getRoutes() {
316
309
  return this.routes;
317
310
  }
318
- static forControllers(controllers, tagRegistry = new injector_1.TagRegistry(), middlewareRegistry = new app_1.MiddlewareRegistry(), module = new app_1.AppModule({})) {
319
- return new this(new controllers_1.HttpControllers(controllers.map(v => {
320
- return core_1.isClass(v) ? { controller: v, module } : v;
321
- })), new logger_1.Logger([], []), tagRegistry, middlewareRegistry);
311
+ static forControllers(controllers, tagRegistry = new injector_1.TagRegistry(), middlewareRegistry = new app_1.MiddlewareRegistry(), module = new injector_1.InjectorModule()) {
312
+ return new this(new controllers_1.HttpControllers(controllers.map(Object.assign(v => {
313
+ return (0, core_1.isClass)(v) ? { controller: v, module } : v;
314
+ }, { __type: ['v', '', 'P"2!"/"'] }))), new logger_1.Logger([], []), tagRegistry, middlewareRegistry);
322
315
  }
323
316
  getRouteCode(compiler, routeConfig) {
324
317
  const routeConfigVar = compiler.reserveVariable('routeConfigVar', routeConfig);
@@ -329,7 +322,7 @@ let Router = class Router {
329
322
  const setParameters = [];
330
323
  const parameterNames = [];
331
324
  const parameterValidator = [];
332
- let bodyValidationErrorHandling = `if (bodyErrors.length) throw ValidationFailed.from(bodyErrors);`;
325
+ let bodyValidationErrorHandling = `if (bodyErrors.length) throw ValidationError.from(bodyErrors);`;
333
326
  let enableParseBody = false;
334
327
  const hasParameters = parsedRoute.getParameters().length > 0;
335
328
  let requiresAsyncParameters = false;
@@ -337,49 +330,51 @@ let Router = class Router {
337
330
  const fullPath = routeConfig.getFullPath();
338
331
  const middlewareConfigs = filterMiddlewaresForRoute(this.middlewareRegistry.configs, routeConfig, fullPath);
339
332
  for (const parameter of parsedRoute.getParameters()) {
340
- if (parsedRoute.customValidationErrorHandling === parameter) {
341
- compiler.context.set('BodyValidation', BodyValidation);
342
- bodyValidationErrorHandling = '';
343
- setParameters.push(`parameters.${parameter.property.name} = new BodyValidation(bodyErrors);`);
344
- parameterNames.push(`parameters.${parameter.property.name}`);
345
- }
346
- else if (parameter.body) {
347
- const validatorVar = compiler.reserveVariable('argumentValidator', type_1.jitValidateProperty(parameter.property));
348
- const converterVar = compiler.reserveVariable('argumentConverter', type_1.getPropertyXtoClassFunction(parameter.property, type_1.jsonSerializer));
333
+ if (parameter.body || parameter.bodyValidation) {
334
+ const type = parameter.getType();
335
+ const validatorVar = compiler.reserveVariable('argumentValidator', (0, type_1.getValidatorFunction)(undefined, type));
336
+ const converterVar = compiler.reserveVariable('argumentConverter', (0, type_1.getSerializeFunction)(type, type_1.serializer.deserializeRegistry));
349
337
  enableParseBody = true;
350
- setParameters.push(`parameters.${parameter.property.name} = ${converterVar}(bodyFields);`);
351
- parameterValidator.push(`${validatorVar}(parameters.${parameter.property.name}, ${JSON.stringify(parameter.typePath || '')}, bodyErrors);`);
352
- parameterNames.push(`parameters.${parameter.property.name}`);
338
+ setParameters.push(`parameters.${parameter.parameter.name} = ${converterVar}(bodyFields, {loosely: true});`);
339
+ parameterValidator.push(`${validatorVar}(parameters.${parameter.parameter.name}, {errors: bodyErrors});`);
340
+ if (parameter.bodyValidation) {
341
+ compiler.context.set('BodyValidation', model_1.ValidatedBody);
342
+ compiler.context.set('BodyValidationError', model_1.BodyValidationError);
343
+ parameterNames.push(`new BodyValidation(new BodyValidationError(bodyErrors), bodyErrors.length === 0 ? parameters.${parameter.parameter.name} : undefined)`);
344
+ bodyValidationErrorHandling = '';
345
+ }
346
+ else {
347
+ parameterNames.push(`parameters.${parameter.parameter.name}`);
348
+ }
353
349
  }
354
350
  else if (parameter.query || parameter.queries) {
355
- const converted = parameter.property.type === 'any' ? (v) => v : type_1.getPropertyXtoClassFunction(parameter.property, type_1.jsonSerializer);
356
- const validator = parameter.property.type === 'any' ? (v) => undefined : type_1.jitValidateProperty(parameter.property);
351
+ const converted = (0, type_1.getSerializeFunction)(parameter.parameter.parameter, type_1.serializer.deserializeRegistry, undefined, parameter.getName());
352
+ const validator = (0, type_1.getValidatorFunction)(undefined, parameter.parameter.parameter);
357
353
  const converterVar = compiler.reserveVariable('argumentConverter', converted);
358
354
  const validatorVar = compiler.reserveVariable('argumentValidator', validator);
359
- const queryPath = parameter.typePath === undefined ? parameter.property.name : parameter.typePath;
355
+ const queryPath = parameter.typePath === undefined && parameter.query ? parameter.parameter.name : parameter.typePath;
360
356
  const accessor = queryPath ? `['` + (queryPath.replace(/\./g, `']['`)) + `']` : '';
361
357
  const queryAccessor = queryPath ? `_query${accessor}` : '_query';
362
- setParameters.push(`parameters.${parameter.property.name} = ${converterVar}(${queryAccessor});`);
363
- parameterNames.push(`parameters.${parameter.property.name}`);
364
- parameterValidator.push(`${validatorVar}(parameters.${parameter.property.name}, ${JSON.stringify(parameter.typePath)}, validationErrors);`);
358
+ setParameters.push(`parameters.${parameter.parameter.name} = ${converterVar}(${queryAccessor}, {loosely: true});`);
359
+ parameterNames.push(`parameters.${parameter.parameter.name}`);
360
+ parameterValidator.push(`${validatorVar}(parameters.${parameter.parameter.name}, {errors: validationErrors}, ${JSON.stringify(parameter.typePath || parameter.getName())});`);
365
361
  }
366
362
  else {
367
- parameterNames.push(`parameters.${parameter.property.name}`);
363
+ parameterNames.push(`parameters.${parameter.parameter.name}`);
368
364
  if (parameter.isPartOfPath()) {
369
- if (parameter.property.type !== 'class') {
370
- const converted = parameter.property.type === 'any' ? (v) => v : type_1.getPropertyXtoClassFunction(parameter.property, type_1.jsonSerializer);
365
+ if (parameter.parameter.type.kind !== 20 /* class */) {
366
+ const converted = (0, type_1.getSerializeFunction)(parameter.parameter.parameter, type_1.serializer.deserializeRegistry, undefined, parameter.getName());
371
367
  const converterVar = compiler.reserveVariable('argumentConverter', converted);
372
- setParameters.push(`parameters.${parameter.property.name} = ${converterVar}(_match[${1 + (parameter.regexPosition || 0)}]);`);
373
- const validator = parameter.property.type === 'any' ? (v) => undefined : type_1.jitValidateProperty(parameter.property);
368
+ setParameters.push(`parameters.${parameter.parameter.name} = ${converterVar}(_match[${1 + (parameter.regexPosition || 0)}], {loosely: true});`);
369
+ const validator = (0, type_1.getValidatorFunction)(undefined, parameter.parameter.parameter);
374
370
  const validatorVar = compiler.reserveVariable('argumentValidator', validator);
375
- parameterValidator.push(`${validatorVar}(parameters.${parameter.property.name}, ${JSON.stringify(parameter.getName())}, validationErrors);`);
371
+ parameterValidator.push(`${validatorVar}(parameters.${parameter.parameter.name}, {errors: validationErrors}, ${JSON.stringify(parameter.getName())});`);
376
372
  }
377
373
  else {
378
- setParameters.push(`parameters.${parameter.property.name} = _match[${1 + (parameter.regexPosition || 0)}];`);
374
+ setParameters.push(`parameters.${parameter.parameter.name} = _match[${1 + (parameter.regexPosition || 0)}];`);
379
375
  }
380
376
  }
381
- const injectorOptions = parameter.property.data['deepkit/inject'];
382
- const injectorToken = injectorOptions && injectorOptions.token ? injectorOptions.token : (parameter.property.type === 'class' ? parameter.property.getResolvedClassType() : undefined);
377
+ const injectorToken = parameter.parameter.type.kind === 20 /* class */ ? parameter.parameter.type.classType : undefined;
383
378
  const injectorTokenVar = compiler.reserveVariable('classType', injectorToken);
384
379
  const parameterResolverFoundVar = compiler.reserveVariable('parameterResolverFound', false);
385
380
  setParameters.push(`${parameterResolverFoundVar} = false;`);
@@ -397,31 +392,25 @@ let Router = class Router {
397
392
  requiresAsyncParameters = true;
398
393
  const instance = compiler.reserveVariable('resolverInstance');
399
394
  setParameters.push(`
400
- //resolver ${core_1.getClassName(resolver)} for ${parameter.getName()}
395
+ //resolver ${(0, core_1.getClassName)(resolver)} for ${parameter.getName()}
401
396
  ${instance} = ${injector}.get(${resolverProvideTokenVar}${moduleVar});
402
397
  if (!${parameterResolverFoundVar}) {
403
398
  ${parameterResolverFoundVar} = true;
404
- parameters.${parameter.property.name} = await ${instance}.resolve({
399
+ parameters.${parameter.parameter.name} = await ${instance}.resolve({
405
400
  token: ${injectorTokenVar},
406
401
  routeConfig: ${routeConfigVar},
407
402
  request: request,
408
- name: ${JSON.stringify(parameter.property.name)},
409
- value: parameters.${parameter.property.name},
403
+ name: ${JSON.stringify(parameter.parameter.name)},
404
+ value: parameters.${parameter.parameter.name},
410
405
  query: _query,
411
406
  parameters: parameters
412
407
  });
413
408
  }`);
414
409
  }
415
- else {
416
- if (!parameter.isPartOfPath() && parameter.property.type !== 'class' && (!injectorOptions || !injectorOptions.token)) {
417
- 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.` +
418
- `If its a query parameter use '@http.query() ${parameter.property.name}' or if its a body '@http.body() ${parameter.property.name}'.`);
419
- }
420
- }
421
410
  if (!parameter.isPartOfPath()) {
422
- let injectorGet = `parameters.${parameter.property.name} = ${injector}.get(${injectorTokenVar});`;
423
- if (injectorOptions && injectorOptions.optional) {
424
- injectorGet = `try {parameters.${parameter.property.name} = ${injector}.get(${injectorTokenVar}); } catch (e) {}`;
411
+ let injectorGet = `parameters.${parameter.parameter.name} = ${injector}.get(${injectorTokenVar});`;
412
+ if (parameter.parameter.isOptional()) {
413
+ injectorGet = `try {parameters.${parameter.parameter.name} = ${injector}.get(${injectorTokenVar}); } catch (e) {}`;
425
414
  }
426
415
  setParameters.push(`if (!${parameterResolverFoundVar}) ${injectorGet}`);
427
416
  }
@@ -444,7 +433,7 @@ let Router = class Router {
444
433
  for (const middlewareConfig of middlewareConfigs) {
445
434
  const moduleVar = middlewareConfig.module ? ', ' + compiler.reserveVariable('module', middlewareConfig.module) : '';
446
435
  for (const middleware of middlewareConfig.config.middlewares) {
447
- if (core_1.isClass(middleware)) {
436
+ if ((0, core_1.isClass)(middleware)) {
448
437
  const classVar = compiler.reserveVariable('middlewareClassType', middleware);
449
438
  middlewareItems.push(`{fn: function() {return _injector.get(${classVar}${moduleVar}).execute(...arguments) }, timeout: ${middlewareConfig.config.timeout}}`);
450
439
  }
@@ -470,15 +459,15 @@ let Router = class Router {
470
459
  ${setParameters.join('\n')}
471
460
  ${parameterValidator.join('\n')}
472
461
  ${bodyValidationErrorHandling}
473
- if (validationErrors.length) throw ValidationFailed.from(validationErrors);
462
+ if (validationErrors.length) throw new ValidationError(validationErrors);
474
463
  return [${parameterNames.join(',')}];
475
464
  }`;
476
465
  }
477
466
  let methodCheck = '';
478
467
  if (routeConfig.httpMethods.length) {
479
- methodCheck = '(' + routeConfig.httpMethods.map(v => {
468
+ methodCheck = '(' + routeConfig.httpMethods.map(Object.assign(v => {
480
469
  return `_method === '${v.toUpperCase()}'`;
481
- }).join(' || ') + ') && ';
470
+ }, { __type: ['v', '', 'P"2!"/"'] })).join(' || ') + ') && ';
482
471
  }
483
472
  return `
484
473
  //=> ${routeConfig.httpMethods.join(',')} ${path}
@@ -490,15 +479,15 @@ let Router = class Router {
490
479
  getRouteUrlResolveCode(compiler, routeConfig) {
491
480
  const parsedRoute = parseRouteControllerAction(routeConfig);
492
481
  let url = routeConfig.getFullPath();
493
- url = url.replace(/:(\w+)/g, (a, name) => {
482
+ url = url.replace(/:(\w+)/g, Object.assign((a, name) => {
494
483
  return `\${parameters.${name}}`;
495
- });
484
+ }, { __type: ['a', 'name', '', 'P"2!"2""/#'] }));
496
485
  const modify = [];
497
486
  for (const parameter of parsedRoute.getParameters()) {
498
487
  if (parameter.query || parameter.queries) {
499
- const queryPath = parameter.typePath === undefined ? parameter.property.name : parameter.typePath;
500
- if (parameter.property.type === 'class') {
501
- for (const property of parameter.property.getResolvedClassSchema().getProperties()) {
488
+ const queryPath = parameter.typePath === undefined && parameter.query ? parameter.parameter.name : parameter.typePath || '';
489
+ if (parameter.parameter.type.kind === 20 /* class */ || parameter.parameter.type.kind === 30 /* objectLiteral */) {
490
+ for (const property of type_1.ReflectionClass.from(parameter.parameter.type).getProperties()) {
502
491
  const accessor = `parameters.${parameter.getName()}?.${property.name}`;
503
492
  const thisPath = queryPath ? queryPath + '.' + property.name : property.name;
504
493
  modify.push(`${accessor} !== undefined && query.push(${JSON.stringify(dotToUrlPath(thisPath))} + '=' + encodeURIComponent(${accessor}))`);
@@ -525,8 +514,8 @@ let Router = class Router {
525
514
  addRouteForController(controller, module) {
526
515
  const data = decorator_1.httpClass._fetch(controller);
527
516
  if (!data)
528
- throw new Error(`Http controller class ${core_1.getClassName(controller)} has no @http.controller decorator.`);
529
- const schema = type_1.getClassSchema(controller);
517
+ throw new Error(`Http controller class ${(0, core_1.getClassName)(controller)} has no @http.controller decorator.`);
518
+ const schema = type_1.ReflectionClass.from(controller);
530
519
  for (const action of data.getActions()) {
531
520
  const routeConfig = new RouteConfig(action.name, action.httpMethods, action.path, {
532
521
  controller,
@@ -534,19 +523,18 @@ let Router = class Router {
534
523
  methodName: action.methodName
535
524
  });
536
525
  routeConfig.module = module;
537
- routeConfig.parameterRegularExpressions = action.parameterRegularExpressions;
538
526
  routeConfig.responses = action.responses;
539
527
  routeConfig.description = action.description;
540
528
  routeConfig.category = action.category;
541
529
  routeConfig.groups = action.groups;
542
530
  routeConfig.data = new Map(action.data);
543
531
  routeConfig.baseUrl = data.baseUrl;
544
- routeConfig.middlewares = data.middlewares.map(v => {
532
+ routeConfig.middlewares = data.middlewares.map(Object.assign(v => {
545
533
  return { config: v(), module };
546
- });
547
- routeConfig.middlewares.push(...action.middlewares.map(v => {
534
+ }, { __type: ['v', '', 'P"2!"/"'] }));
535
+ routeConfig.middlewares.push(...action.middlewares.map(Object.assign(v => {
548
536
  return { config: v(), module };
549
- }));
537
+ }, { __type: ['v', '', 'P"2!"/"'] })));
550
538
  for (const item of action.resolverForToken)
551
539
  routeConfig.resolverForToken.set(...item);
552
540
  routeConfig.resolverForToken = new Map(data.resolverForToken);
@@ -555,18 +543,17 @@ let Router = class Router {
555
543
  routeConfig.resolverForParameterName = new Map(data.resolverForParameterName);
556
544
  for (const item of action.resolverForParameterName)
557
545
  routeConfig.resolverForParameterName.set(...item);
558
- routeConfig.parameters = { ...action.parameters };
559
546
  routeConfig.serializationOptions = action.serializationOptions;
560
547
  routeConfig.serializer = action.serializer;
561
548
  routeConfig.serializer = action.serializer;
562
549
  if (schema.hasMethod(action.methodName))
563
- routeConfig.returnSchema = schema.getMethod(action.methodName);
550
+ routeConfig.returnType = schema.getMethod(action.methodName).getReturnType();
564
551
  this.addRoute(routeConfig);
565
552
  }
566
553
  }
567
554
  build() {
568
555
  const compiler = new core_1.CompilerContext;
569
- compiler.context.set('ValidationFailed', type_1.ValidationFailed);
556
+ compiler.context.set('ValidationError', type_1.ValidationError);
570
557
  compiler.context.set('qs', require('qs'));
571
558
  const code = [];
572
559
  for (const route of this.routes) {
@@ -612,13 +599,7 @@ let Router = class Router {
612
599
  method = method.toUpperCase();
613
600
  return this.resolveRequest({ url, method });
614
601
  }
615
- };
616
- Router = __decorate([
617
- injector_1.injectable,
618
- __metadata("design:paramtypes", [controllers_1.HttpControllers,
619
- logger_1.Logger,
620
- injector_1.TagRegistry,
621
- app_1.MiddlewareRegistry])
622
- ], Router);
602
+ }
623
603
  exports.Router = Router;
604
+ Router.__type = [() => model_1.HttpRequest, 'request', () => __ΩResolvedController, '', 'fn', 'name', 'parameters', 'resolveFn', () => RouteConfig, 'routes', function () { return []; }, () => model_1.HttpRequest, 'req', () => UploadedFile, 'files', 'parseBody', () => controllers_1.HttpControllers, 'controllers', () => __ΩLoggerInterface, 'logger', () => injector_1.TagRegistry, 'tagRegistry', () => app_1.MiddlewareRegistry, 'middlewareRegistry', () => new app_1.MiddlewareRegistry, 'constructor', () => RouteConfig, 'getRoutes', () => __ΩClassType, () => injector_1.InjectorModule, 'module', () => __ΩClassType, 'controller', () => injector_1.TagRegistry, () => new injector_1.TagRegistry(), () => app_1.MiddlewareRegistry, () => new app_1.MiddlewareRegistry(), () => injector_1.InjectorModule, () => new injector_1.InjectorModule(), () => Router, 'forControllers', () => core_1.CompilerContext, 'compiler', () => RouteConfig, 'routeConfig', 'getRouteCode', () => core_1.CompilerContext, () => RouteConfig, 'getRouteUrlResolveCode', () => RouteConfig, 'addRoute', () => __ΩClassType, () => injector_1.InjectorModule, 'addRouteForController', () => model_1.HttpRequest, () => __ΩResolvedController, 'build', 'buildUrlResolver', 'routeName', () => ({}), 'resolveUrl', () => model_1.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'];
624
605
  //# sourceMappingURL=router.js.map