@deepkit/http 1.0.1-alpha.92 → 1.0.1-alpha.93

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 (59) hide show
  1. package/dist/cjs/src/http.d.ts +7 -6
  2. package/dist/cjs/src/http.js +22 -12
  3. package/dist/cjs/src/http.js.map +1 -1
  4. package/dist/cjs/src/kernel.js +18 -1
  5. package/dist/cjs/src/kernel.js.map +1 -1
  6. package/dist/cjs/src/logger.js +1 -1
  7. package/dist/cjs/src/logger.js.map +1 -1
  8. package/dist/cjs/src/model.d.ts +17 -0
  9. package/dist/cjs/src/model.js +10 -2
  10. package/dist/cjs/src/model.js.map +1 -1
  11. package/dist/cjs/src/module.d.ts +4 -1
  12. package/dist/cjs/src/module.js +57 -1
  13. package/dist/cjs/src/module.js.map +1 -1
  14. package/dist/cjs/src/request-parser.d.ts +35 -0
  15. package/dist/cjs/src/request-parser.js +302 -0
  16. package/dist/cjs/src/request-parser.js.map +1 -0
  17. package/dist/cjs/src/resolver.d.ts +27 -0
  18. package/dist/cjs/src/resolver.js +246 -0
  19. package/dist/cjs/src/resolver.js.map +1 -0
  20. package/dist/cjs/src/router.d.ts +7 -20
  21. package/dist/cjs/src/router.js +23 -247
  22. package/dist/cjs/src/router.js.map +1 -1
  23. package/dist/cjs/src/static-serving.js +1 -1
  24. package/dist/cjs/src/static-serving.js.map +1 -1
  25. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  26. package/dist/esm/src/http.d.ts +7 -6
  27. package/dist/esm/src/http.js +22 -12
  28. package/dist/esm/src/http.js.map +1 -1
  29. package/dist/esm/src/kernel.js +19 -2
  30. package/dist/esm/src/kernel.js.map +1 -1
  31. package/dist/esm/src/logger.js +1 -1
  32. package/dist/esm/src/logger.js.map +1 -1
  33. package/dist/esm/src/model.d.ts +17 -0
  34. package/dist/esm/src/model.js +9 -1
  35. package/dist/esm/src/model.js.map +1 -1
  36. package/dist/esm/src/module.d.ts +4 -1
  37. package/dist/esm/src/module.js +59 -3
  38. package/dist/esm/src/module.js.map +1 -1
  39. package/dist/esm/src/request-parser.d.ts +35 -0
  40. package/dist/esm/src/request-parser.js +292 -0
  41. package/dist/esm/src/request-parser.js.map +1 -0
  42. package/dist/esm/src/resolver.d.ts +27 -0
  43. package/dist/esm/src/resolver.js +238 -0
  44. package/dist/esm/src/resolver.js.map +1 -0
  45. package/dist/esm/src/router.d.ts +7 -20
  46. package/dist/esm/src/router.js +26 -250
  47. package/dist/esm/src/router.js.map +1 -1
  48. package/dist/esm/src/static-serving.js +1 -1
  49. package/dist/esm/src/static-serving.js.map +1 -1
  50. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  51. package/package.json +11 -11
  52. package/src/http.ts +15 -8
  53. package/src/kernel.ts +22 -3
  54. package/src/logger.ts +1 -1
  55. package/src/model.ts +6 -1
  56. package/src/module.ts +59 -2
  57. package/src/request-parser.ts +340 -0
  58. package/src/router.ts +26 -290
  59. package/src/static-serving.ts +1 -1
@@ -0,0 +1,35 @@
1
+ import { ClassType, CompilerContext } from '@deepkit/core';
2
+ import { InjectorModule } from '@deepkit/injector';
3
+ import { ReflectionParameter, Type } from '@deepkit/type';
4
+ import { HttpRequest } from './model.js';
5
+ import { RouteConfig } from './router.js';
6
+ export declare class ParameterForRequestParser {
7
+ parameter: ReflectionParameter;
8
+ regexPosition?: number;
9
+ constructor(parameter: ReflectionParameter);
10
+ get body(): boolean;
11
+ get bodyValidation(): boolean;
12
+ getType(): Type;
13
+ get header(): boolean;
14
+ get query(): boolean;
15
+ get queries(): boolean;
16
+ get typePath(): string | undefined;
17
+ getName(): string;
18
+ isPartOfPath(): boolean;
19
+ }
20
+ export declare function parseRoutePathToRegex(path: string, params: ReflectionParameter[]): {
21
+ regex: string;
22
+ parameterNames: {
23
+ [name: string]: number;
24
+ };
25
+ };
26
+ export declare function buildRequestParser(parameters: ReflectionParameter[], path?: string): (request: HttpRequest) => any[];
27
+ export declare function getRequestParserCodeForParameters(compiler: CompilerContext, parameters: ParameterForRequestParser[], config: {
28
+ module?: InjectorModule<any>;
29
+ resolverForParameterName?: Map<string, ClassType>;
30
+ resolverForToken?: Map<any, ClassType>;
31
+ pathParameterNames?: {
32
+ [name: string]: number;
33
+ };
34
+ routeConfig?: RouteConfig;
35
+ }): string;
@@ -0,0 +1,302 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getRequestParserCodeForParameters = exports.buildRequestParser = exports.parseRoutePathToRegex = exports.ParameterForRequestParser = void 0;
7
+ /*@ts-ignore*/
8
+ const { __ΩClassType } = require('@deepkit/core');
9
+ function __assignType(fn, args) {
10
+ fn.__type = args;
11
+ return fn;
12
+ }
13
+ const core_1 = require("@deepkit/core");
14
+ const injector_1 = require("@deepkit/injector");
15
+ const type_1 = require("@deepkit/type");
16
+ const model_js_1 = require("./model.js");
17
+ const router_js_1 = require("./router.js");
18
+ //@ts-ignore
19
+ const qs_1 = __importDefault(require("qs"));
20
+ // @ts-ignore
21
+ const formidable_1 = __importDefault(require("formidable"));
22
+ function parseBody(req, foundFiles) {
23
+ const form = (0, formidable_1.default)({
24
+ multiples: true,
25
+ hash: 'sha1',
26
+ });
27
+ return (0, core_1.asyncOperation)(__assignType((resolve, reject) => {
28
+ function parseData(err, fields, files) {
29
+ if (err) {
30
+ reject(err);
31
+ }
32
+ else {
33
+ for (const [name, file] of Object.entries(files)) {
34
+ if (file.size === 0)
35
+ continue;
36
+ foundFiles[name] = {
37
+ size: file.size,
38
+ path: file.filepath,
39
+ name: file.originalFilename,
40
+ type: file.mimetype,
41
+ lastModifiedDate: file.lastModifiedDate,
42
+ };
43
+ }
44
+ const body = { ...fields, ...foundFiles };
45
+ resolve(body);
46
+ }
47
+ }
48
+ parseData.__type = ['err', 'fields', 'files', 'parseData', 'P"2!"2""2#"/$'];
49
+ if (req.body) {
50
+ form.parse((0, model_js_1.createRequestWithCachedBody)(req, req.body), parseData);
51
+ return;
52
+ }
53
+ const chunks = [];
54
+ function read(chunk) {
55
+ chunks.push(chunk);
56
+ }
57
+ read.__type = ['chunk', 'read', 'P!2!"/"'];
58
+ req.on('data', read);
59
+ req.once('end', () => {
60
+ req.body = Buffer.concat(chunks);
61
+ req.off('data', read);
62
+ });
63
+ req.once('error', () => req.off('data', read));
64
+ form.parse(req, parseData);
65
+ }, ['resolve', 'reject', '', 'P"2!"2""/#']));
66
+ }
67
+ parseBody.__type = [() => model_js_1.HttpRequest, 'req', () => router_js_1.UploadedFile, 'foundFiles', 'parseBody', 'PP7!2"P&P7#LM2$"/%'];
68
+ class ParameterForRequestParser {
69
+ constructor(parameter) {
70
+ this.parameter = parameter;
71
+ }
72
+ get body() {
73
+ return type_1.metaAnnotation.getForName(this.parameter.type, 'httpBody') !== undefined;
74
+ }
75
+ get bodyValidation() {
76
+ return type_1.metaAnnotation.getForName(this.parameter.type, 'httpBodyValidation') !== undefined;
77
+ }
78
+ getType() {
79
+ if (this.bodyValidation) {
80
+ (0, type_1.assertType)(this.parameter.type, type_1.ReflectionKind.class);
81
+ const valueType = (0, type_1.findMember)('value', this.parameter.type.types);
82
+ if (!valueType || valueType.kind !== type_1.ReflectionKind.property)
83
+ throw new Error(`No property value found at ${(0, type_1.stringifyType)(this.parameter.type)}`);
84
+ return valueType.type;
85
+ }
86
+ return this.parameter.type;
87
+ }
88
+ get header() {
89
+ return type_1.metaAnnotation.getForName(this.parameter.type, 'httpHeader') !== undefined;
90
+ }
91
+ get query() {
92
+ return type_1.metaAnnotation.getForName(this.parameter.type, 'httpQuery') !== undefined;
93
+ }
94
+ get queries() {
95
+ return type_1.metaAnnotation.getForName(this.parameter.type, 'httpQueries') !== undefined;
96
+ }
97
+ get typePath() {
98
+ const typeOptions = type_1.metaAnnotation.getForName(this.parameter.type, 'httpQueries') || type_1.metaAnnotation.getForName(this.parameter.type, 'httpQuery')
99
+ || type_1.metaAnnotation.getForName(this.parameter.type, 'httpPath') || type_1.metaAnnotation.getForName(this.parameter.type, 'httpHeader');
100
+ if (!typeOptions)
101
+ return;
102
+ const options = (0, type_1.typeToObject)(typeOptions[0]);
103
+ if ((0, core_1.isObject)(options))
104
+ return options.name;
105
+ return;
106
+ }
107
+ getName() {
108
+ return this.parameter.name;
109
+ }
110
+ isPartOfPath() {
111
+ return type_1.metaAnnotation.getForName(this.parameter.type, 'httpPath') !== undefined || this.regexPosition !== undefined;
112
+ }
113
+ }
114
+ exports.ParameterForRequestParser = ParameterForRequestParser;
115
+ ParameterForRequestParser.__type = ['regexPosition', () => type_1.ReflectionParameter, 'parameter', 'constructor', 'getType', 'getName', 'isPartOfPath', '\'3!8PP7"2#:"0$!!P"0%!!!!P"0&P)0\'5'];
116
+ function parseRoutePathToRegex(path, params) {
117
+ const parameterNames = {};
118
+ let argumentIndex = 0;
119
+ path = path.replace(/:(\w+)/g, __assignType((a, name) => {
120
+ parameterNames[name] = argumentIndex;
121
+ argumentIndex++;
122
+ const parameter = params.find(__assignType(v => v.name === name, ['v', '', 'P"2!"/"']));
123
+ if (parameter) {
124
+ const regExp = (0, model_js_1.getRegExp)(parameter.type);
125
+ if (regExp instanceof RegExp) {
126
+ return '(' + regExp.source + ')';
127
+ }
128
+ else if (regExp) {
129
+ return '(' + regExp + ')';
130
+ }
131
+ }
132
+ return String.raw `([^/]+)`;
133
+ }, ['a', 'name', '', 'P"2!"2""/#']));
134
+ return { regex: path, parameterNames };
135
+ }
136
+ exports.parseRoutePathToRegex = parseRoutePathToRegex;
137
+ parseRoutePathToRegex.__type = ['path', () => type_1.ReflectionParameter, 'params', 'regex', 'parameterNames', 'parseRoutePathToRegex', 'P&2!P7"F2#P&4$P&\'LM4%M/&'];
138
+ function buildRequestParser(parameters, path) {
139
+ const compiler = new core_1.CompilerContext();
140
+ const params = parameters.map(__assignType(v => new ParameterForRequestParser(v), ['v', '', 'P"2!"/"']));
141
+ //todo: parse path
142
+ let pathRegex = '';
143
+ if (path) {
144
+ const parsedPath = parseRoutePathToRegex(path, parameters);
145
+ pathRegex = parsedPath.regex;
146
+ for (const param of params) {
147
+ param.regexPosition = parsedPath.parameterNames[param.parameter.name];
148
+ }
149
+ }
150
+ const code = getRequestParserCodeForParameters(compiler, params, {});
151
+ compiler.context.set('ValidationError', type_1.ValidationError);
152
+ compiler.context.set('qs', qs_1.default);
153
+ let needsQueryString = !!params.find(__assignType(v => v.query || v.queries, ['v', '', 'P"2!"/"']));
154
+ const query = needsQueryString ? '_qPosition === -1 ? {} : qs.parse(_url.substr(_qPosition + 1))' : '{}';
155
+ const regexVar = compiler.reserveVariable('regex', new RegExp('^' + pathRegex + '$'));
156
+ return compiler.build(`
157
+ const _method = request.method || 'GET';
158
+ const _url = request.url || '/';
159
+ const _headers = request.headers || {};
160
+ const _qPosition = _url.indexOf('?');
161
+ let uploadedFiles = {};
162
+ const _path = _qPosition === -1 ? _url : _url.substr(0, _qPosition);
163
+ const _match = _path.match(${regexVar}) || [];
164
+ const _query = ${query};
165
+ return ${code}
166
+ `, 'request');
167
+ }
168
+ exports.buildRequestParser = buildRequestParser;
169
+ buildRequestParser.__type = [() => type_1.ReflectionParameter, 'parameters', 'path', () => model_js_1.HttpRequest, 'request', '', 'buildRequestParser', 'PP7!F2"&2#8PP7$2%"F/&/\''];
170
+ function getRequestParserCodeForParameters(compiler, parameters, config) {
171
+ var _a, _b;
172
+ let enableParseBody = false;
173
+ let requiresAsyncParameters = false;
174
+ const setParameters = [];
175
+ const parameterNames = [];
176
+ const parameterValidator = [];
177
+ let setParametersFromPath = '';
178
+ let bodyValidationErrorHandling = `if (bodyErrors.length) throw ValidationError.from(bodyErrors);`;
179
+ for (const parameter of parameters) {
180
+ if (parameter.body || parameter.bodyValidation) {
181
+ const type = parameter.getType();
182
+ const validatorVar = compiler.reserveVariable('argumentValidator', (0, type_1.getValidatorFunction)(undefined, type));
183
+ const converterVar = compiler.reserveVariable('argumentConverter', (0, type_1.getSerializeFunction)(type, type_1.serializer.deserializeRegistry));
184
+ enableParseBody = true;
185
+ setParameters.push(`parameters.${parameter.parameter.name} = ${converterVar}(bodyFields, {loosely: true});`);
186
+ parameterValidator.push(`${validatorVar}(parameters.${parameter.parameter.name}, {errors: bodyErrors});`);
187
+ if (parameter.bodyValidation) {
188
+ compiler.context.set('BodyValidation', model_js_1.ValidatedBody);
189
+ compiler.context.set('BodyValidationError', model_js_1.BodyValidationError);
190
+ parameterNames.push(`new BodyValidation(new BodyValidationError(bodyErrors), bodyErrors.length === 0 ? parameters.${parameter.parameter.name} : undefined)`);
191
+ bodyValidationErrorHandling = '';
192
+ }
193
+ else {
194
+ parameterNames.push(`parameters.${parameter.parameter.name}`);
195
+ }
196
+ }
197
+ else if (parameter.query || parameter.queries || parameter.header) {
198
+ const converted = (0, type_1.getSerializeFunction)(parameter.parameter.parameter, type_1.serializer.deserializeRegistry, undefined, parameter.getName());
199
+ const validator = (0, type_1.getValidatorFunction)(undefined, parameter.parameter.parameter);
200
+ const converterVar = compiler.reserveVariable('argumentConverter', converted);
201
+ const validatorVar = compiler.reserveVariable('argumentValidator', validator);
202
+ const queryPath = parameter.typePath === undefined && !parameter.queries ? parameter.parameter.name : parameter.typePath;
203
+ const accessor = queryPath ? `['` + (queryPath.replace(/\./g, `']['`)) + `']` : '';
204
+ const queryAccessor = parameter.header ? `_headers${accessor}` : queryPath ? `_query${accessor}` : '_query';
205
+ setParameters.push(`parameters.${parameter.parameter.name} = ${converterVar}(${queryAccessor}, {loosely: true});`);
206
+ parameterNames.push(`parameters.${parameter.parameter.name}`);
207
+ parameterValidator.push(`${validatorVar}(parameters.${parameter.parameter.name}, {errors: validationErrors}, ${JSON.stringify(parameter.typePath || parameter.getName())});`);
208
+ }
209
+ else {
210
+ parameterNames.push(`parameters.${parameter.parameter.name}`);
211
+ if (parameter.isPartOfPath()) {
212
+ if (parameter.parameter.type.kind !== type_1.ReflectionKind.class) {
213
+ const converted = (0, type_1.getSerializeFunction)(parameter.parameter.parameter, type_1.serializer.deserializeRegistry, undefined, parameter.getName());
214
+ const converterVar = compiler.reserveVariable('argumentConverter', converted);
215
+ setParameters.push(`parameters.${parameter.parameter.name} = ${converterVar}(_match[${1 + (parameter.regexPosition || 0)}], {loosely: true});`);
216
+ const validator = (0, type_1.getValidatorFunction)(undefined, parameter.parameter.parameter);
217
+ const validatorVar = compiler.reserveVariable('argumentValidator', validator);
218
+ parameterValidator.push(`${validatorVar}(parameters.${parameter.parameter.name}, {errors: validationErrors}, ${JSON.stringify(parameter.getName())});`);
219
+ }
220
+ else {
221
+ setParameters.push(`parameters.${parameter.parameter.name} = _match[${1 + (parameter.regexPosition || 0)}];`);
222
+ }
223
+ }
224
+ const injectorToken = parameter.parameter.type.kind === type_1.ReflectionKind.class ? parameter.parameter.type.classType : undefined;
225
+ const injectorTokenVar = compiler.reserveVariable('classType', injectorToken);
226
+ const parameterResolverFoundVar = compiler.reserveVariable('parameterResolverFound', false);
227
+ setParameters.push(`${parameterResolverFoundVar} = false;`);
228
+ const resolverType = ((_a = config.resolverForParameterName) === null || _a === void 0 ? void 0 : _a.get(parameter.getName())) || ((_b = config.resolverForToken) === null || _b === void 0 ? void 0 : _b.get(injectorToken));
229
+ //make sure all parameter values from the path are available, important for parameter resolver
230
+ if (resolverType && !setParametersFromPath && config.pathParameterNames) {
231
+ for (const i in config.pathParameterNames) {
232
+ setParametersFromPath += `parameters.${i} = _match[${1 + config.pathParameterNames[i]}];`;
233
+ }
234
+ }
235
+ let injector = '_injector';
236
+ const moduleVar = config.module ? ', ' + compiler.reserveConst(config.module, 'module') : '';
237
+ if (resolverType) {
238
+ requiresAsyncParameters = true;
239
+ let instanceFetcher = '';
240
+ if (config.module && config.module.injector) {
241
+ const resolverResolverVar = compiler.reserveVariable('resolverProvideToken', config.module.injector.createResolver((0, type_1.resolveReceiveType)(resolverType)));
242
+ instanceFetcher = `${resolverResolverVar}(${injector}.scope)`;
243
+ }
244
+ else {
245
+ const resolverProvideTokenVar = compiler.reserveVariable('resolverProvideToken', resolverType);
246
+ instanceFetcher = `${injector}.get(${resolverProvideTokenVar}${moduleVar})`;
247
+ }
248
+ const instance = compiler.reserveVariable('resolverInstance');
249
+ const routeConfigVar = compiler.reserveVariable('routeConfigVar', config.routeConfig);
250
+ setParameters.push(`
251
+ //resolver ${(0, core_1.getClassName)(resolverType)} for ${parameter.getName()}
252
+ ${instance} = ${instanceFetcher};
253
+ if (!${parameterResolverFoundVar}) {
254
+ ${parameterResolverFoundVar} = true;
255
+ parameters.${parameter.parameter.name} = await ${instance}.resolve({
256
+ token: ${injectorTokenVar},
257
+ route: ${routeConfigVar},
258
+ request: request,
259
+ name: ${JSON.stringify(parameter.parameter.name)},
260
+ value: parameters.${parameter.parameter.name},
261
+ query: _query,
262
+ parameters: parameters,
263
+ type: ${compiler.reserveVariable('parameterType', parameter.parameter)}
264
+ });
265
+ }`);
266
+ }
267
+ if (!parameter.isPartOfPath()) {
268
+ let injectorGet = `parameters.${parameter.parameter.name} = ${injector}.get(${injectorTokenVar});`;
269
+ if (parameter.parameter.isOptional()) {
270
+ injectorGet = `try {parameters.${parameter.parameter.name} = ${injector}.get(${injectorTokenVar}); } catch (e) {}`;
271
+ }
272
+ setParameters.push(`if (!${parameterResolverFoundVar}) ${injectorGet}`);
273
+ }
274
+ }
275
+ }
276
+ let parseBodyLoading = '';
277
+ if (enableParseBody) {
278
+ const parseBodyVar = compiler.reserveVariable('parseBody', parseBody);
279
+ parseBodyLoading = `
280
+ const bodyFields = (await ${parseBodyVar}(request, uploadedFiles));`;
281
+ requiresAsyncParameters = true;
282
+ }
283
+ let parametersLoader = '() => {}';
284
+ if (setParameters.length) {
285
+ parametersLoader = `${requiresAsyncParameters ? 'async' : ''} function parse(_injector){
286
+ const validationErrors = [];
287
+ const bodyErrors = [];
288
+ const parameters = {};
289
+ ${setParametersFromPath}
290
+ ${parseBodyLoading}
291
+ ${setParameters.join('\n')}
292
+ ${parameterValidator.join('\n')}
293
+ ${bodyValidationErrorHandling}
294
+ if (validationErrors.length) throw new ValidationError(validationErrors);
295
+ return {arguments: [${parameterNames.join(',')}], parameters: parameters};
296
+ }`;
297
+ }
298
+ return parametersLoader;
299
+ }
300
+ exports.getRequestParserCodeForParameters = getRequestParserCodeForParameters;
301
+ getRequestParserCodeForParameters.__type = [() => core_1.CompilerContext, 'compiler', () => ParameterForRequestParser, 'parameters', () => injector_1.InjectorModule, 'module', () => __ΩClassType, 'resolverForParameterName', () => __ΩClassType, 'resolverForToken', 'pathParameterNames', () => router_js_1.RouteConfig, 'routeConfig', 'config', 'getRequestParserCodeForParameters', 'PP7!2"P7#F2$PP"7%4&8&n\'E4(8"n)E4*8P&\'LM4+8P7,4-8M2."//'];
302
+ //# sourceMappingURL=request-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-parser.js","sourceRoot":"","sources":["../../../src/request-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { ClassType, CompilerContext } from '@deepkit/core';
2
+ import { InjectorModule } from '@deepkit/injector';
3
+ import { ReflectionParameter, Type } from '@deepkit/type';
4
+ import { RouteConfig } from './router.js';
5
+ export declare class ParameterForRequestParser {
6
+ parameter: ReflectionParameter;
7
+ regexPosition?: number;
8
+ constructor(parameter: ReflectionParameter);
9
+ get body(): boolean;
10
+ get bodyValidation(): boolean;
11
+ getType(): Type;
12
+ get header(): boolean;
13
+ get query(): boolean;
14
+ get queries(): boolean;
15
+ get typePath(): string | undefined;
16
+ getName(): string;
17
+ isPartOfPath(): boolean;
18
+ }
19
+ export declare function getRuquestParserCodeForParameters(compiler: CompilerContext, parameters: ParameterForRequestParser[], config: {
20
+ module?: InjectorModule<any>;
21
+ resolverForParameterName?: Map<string, ClassType>;
22
+ resolverForToken?: Map<any, ClassType>;
23
+ pathParameterNames?: {
24
+ [name: string]: number;
25
+ };
26
+ routeConfig?: RouteConfig;
27
+ }): string;
@@ -0,0 +1,246 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getRuquestParserCodeForParameters = exports.ParameterForRequestParser = void 0;
7
+ /*@ts-ignore*/
8
+ const { __ΩClassType } = require('@deepkit/core');
9
+ function __assignType(fn, args) {
10
+ fn.__type = args;
11
+ return fn;
12
+ }
13
+ const core_1 = require("@deepkit/core");
14
+ const injector_1 = require("@deepkit/injector");
15
+ const type_1 = require("@deepkit/type");
16
+ const model_js_1 = require("./model.js");
17
+ const router_js_1 = require("./router.js");
18
+ // @ts-ignore
19
+ const formidable_1 = __importDefault(require("formidable"));
20
+ function parseBody(req, foundFiles) {
21
+ const form = (0, formidable_1.default)({
22
+ multiples: true,
23
+ hash: 'sha1',
24
+ });
25
+ return (0, core_1.asyncOperation)(__assignType((resolve, reject) => {
26
+ function parseData(err, fields, files) {
27
+ if (err) {
28
+ reject(err);
29
+ }
30
+ else {
31
+ for (const [name, file] of Object.entries(files)) {
32
+ if (file.size === 0)
33
+ continue;
34
+ foundFiles[name] = {
35
+ size: file.size,
36
+ path: file.filepath,
37
+ name: file.originalFilename,
38
+ type: file.mimetype,
39
+ lastModifiedDate: file.lastModifiedDate,
40
+ };
41
+ }
42
+ const body = { ...fields, ...foundFiles };
43
+ resolve(body);
44
+ }
45
+ }
46
+ parseData.__type = ['err', 'fields', 'files', 'parseData', 'P"2!"2""2#"/$'];
47
+ if (req.body) {
48
+ form.parse((0, model_js_1.createRequestWithCachedBody)(req, req.body), parseData);
49
+ return;
50
+ }
51
+ const chunks = [];
52
+ function read(chunk) {
53
+ chunks.push(chunk);
54
+ }
55
+ read.__type = ['chunk', 'read', 'P!2!"/"'];
56
+ req.on('data', read);
57
+ req.once('end', () => {
58
+ req.body = Buffer.concat(chunks);
59
+ req.off('data', read);
60
+ });
61
+ req.once('error', () => req.off('data', read));
62
+ form.parse(req, parseData);
63
+ }, ['resolve', 'reject', '', 'P"2!"2""/#']));
64
+ }
65
+ parseBody.__type = [() => model_js_1.HttpRequest, 'req', () => router_js_1.UploadedFile, 'foundFiles', 'parseBody', 'PP7!2"P&P7#LM2$"/%'];
66
+ class ParameterForRequestParser {
67
+ constructor(parameter) {
68
+ this.parameter = parameter;
69
+ }
70
+ get body() {
71
+ return type_1.metaAnnotation.getForName(this.parameter.type, 'httpBody') !== undefined;
72
+ }
73
+ get bodyValidation() {
74
+ return type_1.metaAnnotation.getForName(this.parameter.type, 'httpBodyValidation') !== undefined;
75
+ }
76
+ getType() {
77
+ if (this.bodyValidation) {
78
+ (0, type_1.assertType)(this.parameter.type, type_1.ReflectionKind.class);
79
+ const valueType = (0, type_1.findMember)('value', this.parameter.type.types);
80
+ if (!valueType || valueType.kind !== type_1.ReflectionKind.property)
81
+ throw new Error(`No property value found at ${(0, type_1.stringifyType)(this.parameter.type)}`);
82
+ return valueType.type;
83
+ }
84
+ return this.parameter.type;
85
+ }
86
+ get header() {
87
+ return type_1.metaAnnotation.getForName(this.parameter.type, 'httpHeader') !== undefined;
88
+ }
89
+ get query() {
90
+ return type_1.metaAnnotation.getForName(this.parameter.type, 'httpQuery') !== undefined;
91
+ }
92
+ get queries() {
93
+ return type_1.metaAnnotation.getForName(this.parameter.type, 'httpQueries') !== undefined;
94
+ }
95
+ get typePath() {
96
+ const typeOptions = type_1.metaAnnotation.getForName(this.parameter.type, 'httpQueries') || type_1.metaAnnotation.getForName(this.parameter.type, 'httpQuery')
97
+ || type_1.metaAnnotation.getForName(this.parameter.type, 'httpPath') || type_1.metaAnnotation.getForName(this.parameter.type, 'httpHeader');
98
+ if (!typeOptions)
99
+ return;
100
+ const options = (0, type_1.typeToObject)(typeOptions[0]);
101
+ if ((0, core_1.isObject)(options))
102
+ return options.name;
103
+ return;
104
+ }
105
+ getName() {
106
+ return this.parameter.name;
107
+ }
108
+ isPartOfPath() {
109
+ return type_1.metaAnnotation.getForName(this.parameter.type, 'httpPath') !== undefined || this.regexPosition !== undefined;
110
+ }
111
+ }
112
+ exports.ParameterForRequestParser = ParameterForRequestParser;
113
+ ParameterForRequestParser.__type = ['regexPosition', () => type_1.ReflectionParameter, 'parameter', 'constructor', 'getType', 'getName', 'isPartOfPath', '\'3!8PP7"2#:"0$!!P"0%!!!!P"0&P)0\'5'];
114
+ function getRuquestParserCodeForParameters(compiler, parameters, config) {
115
+ var _a, _b;
116
+ let enableParseBody = false;
117
+ let requiresAsyncParameters = false;
118
+ const setParameters = [];
119
+ const parameterNames = [];
120
+ const parameterValidator = [];
121
+ let setParametersFromPath = '';
122
+ let bodyValidationErrorHandling = `if (bodyErrors.length) throw ValidationError.from(bodyErrors);`;
123
+ for (const parameter of parameters) {
124
+ if (parameter.body || parameter.bodyValidation) {
125
+ const type = parameter.getType();
126
+ const validatorVar = compiler.reserveVariable('argumentValidator', (0, type_1.getValidatorFunction)(undefined, type));
127
+ const converterVar = compiler.reserveVariable('argumentConverter', (0, type_1.getSerializeFunction)(type, type_1.serializer.deserializeRegistry));
128
+ enableParseBody = true;
129
+ setParameters.push(`parameters.${parameter.parameter.name} = ${converterVar}(bodyFields, {loosely: true});`);
130
+ parameterValidator.push(`${validatorVar}(parameters.${parameter.parameter.name}, {errors: bodyErrors});`);
131
+ if (parameter.bodyValidation) {
132
+ compiler.context.set('BodyValidation', model_js_1.ValidatedBody);
133
+ compiler.context.set('BodyValidationError', model_js_1.BodyValidationError);
134
+ parameterNames.push(`new BodyValidation(new BodyValidationError(bodyErrors), bodyErrors.length === 0 ? parameters.${parameter.parameter.name} : undefined)`);
135
+ bodyValidationErrorHandling = '';
136
+ }
137
+ else {
138
+ parameterNames.push(`parameters.${parameter.parameter.name}`);
139
+ }
140
+ }
141
+ else if (parameter.query || parameter.queries || parameter.header) {
142
+ const converted = (0, type_1.getSerializeFunction)(parameter.parameter.parameter, type_1.serializer.deserializeRegistry, undefined, parameter.getName());
143
+ const validator = (0, type_1.getValidatorFunction)(undefined, parameter.parameter.parameter);
144
+ const converterVar = compiler.reserveVariable('argumentConverter', converted);
145
+ const validatorVar = compiler.reserveVariable('argumentValidator', validator);
146
+ const queryPath = parameter.typePath === undefined && !parameter.queries ? parameter.parameter.name : parameter.typePath;
147
+ const accessor = queryPath ? `['` + (queryPath.replace(/\./g, `']['`)) + `']` : '';
148
+ const queryAccessor = parameter.header ? `_headers${accessor}` : queryPath ? `_query${accessor}` : '_query';
149
+ setParameters.push(`parameters.${parameter.parameter.name} = ${converterVar}(${queryAccessor}, {loosely: true});`);
150
+ parameterNames.push(`parameters.${parameter.parameter.name}`);
151
+ parameterValidator.push(`${validatorVar}(parameters.${parameter.parameter.name}, {errors: validationErrors}, ${JSON.stringify(parameter.typePath || parameter.getName())});`);
152
+ }
153
+ else {
154
+ parameterNames.push(`parameters.${parameter.parameter.name}`);
155
+ if (parameter.isPartOfPath()) {
156
+ if (parameter.parameter.type.kind !== type_1.ReflectionKind.class) {
157
+ const converted = (0, type_1.getSerializeFunction)(parameter.parameter.parameter, type_1.serializer.deserializeRegistry, undefined, parameter.getName());
158
+ const converterVar = compiler.reserveVariable('argumentConverter', converted);
159
+ setParameters.push(`parameters.${parameter.parameter.name} = ${converterVar}(_match[${1 + (parameter.regexPosition || 0)}], {loosely: true});`);
160
+ const validator = (0, type_1.getValidatorFunction)(undefined, parameter.parameter.parameter);
161
+ const validatorVar = compiler.reserveVariable('argumentValidator', validator);
162
+ parameterValidator.push(`${validatorVar}(parameters.${parameter.parameter.name}, {errors: validationErrors}, ${JSON.stringify(parameter.getName())});`);
163
+ }
164
+ else {
165
+ setParameters.push(`parameters.${parameter.parameter.name} = _match[${1 + (parameter.regexPosition || 0)}];`);
166
+ }
167
+ }
168
+ const injectorToken = parameter.parameter.type.kind === type_1.ReflectionKind.class ? parameter.parameter.type.classType : undefined;
169
+ const injectorTokenVar = compiler.reserveVariable('classType', injectorToken);
170
+ const parameterResolverFoundVar = compiler.reserveVariable('parameterResolverFound', false);
171
+ setParameters.push(`${parameterResolverFoundVar} = false;`);
172
+ const resolverType = ((_a = config.resolverForParameterName) === null || _a === void 0 ? void 0 : _a.get(parameter.getName())) || ((_b = config.resolverForToken) === null || _b === void 0 ? void 0 : _b.get(injectorToken));
173
+ //make sure all parameter values from the path are available, important for parameter resolver
174
+ if (resolverType && !setParametersFromPath && config.pathParameterNames) {
175
+ for (const i in config.pathParameterNames) {
176
+ setParametersFromPath += `parameters.${i} = _match[${1 + config.pathParameterNames[i]}];`;
177
+ }
178
+ }
179
+ let injector = '_injector';
180
+ const moduleVar = config.module ? ', ' + compiler.reserveConst(config.module, 'module') : '';
181
+ if (resolverType) {
182
+ requiresAsyncParameters = true;
183
+ let instanceFetcher = '';
184
+ if (config.module && config.module.injector) {
185
+ const resolverResolverVar = compiler.reserveVariable('resolverProvideToken', config.module.injector.createResolver((0, type_1.resolveReceiveType)(resolverType)));
186
+ instanceFetcher = `${resolverResolverVar}(${injector}.scope)`;
187
+ }
188
+ else {
189
+ const resolverProvideTokenVar = compiler.reserveVariable('resolverProvideToken', resolverType);
190
+ instanceFetcher = `${injector}.get(${resolverProvideTokenVar}${moduleVar})`;
191
+ }
192
+ const instance = compiler.reserveVariable('resolverInstance');
193
+ const routeConfigVar = compiler.reserveVariable('routeConfigVar', config.routeConfig);
194
+ setParameters.push(`
195
+ //resolver ${(0, core_1.getClassName)(resolverType)} for ${parameter.getName()}
196
+ ${instance} = ${instanceFetcher};
197
+ if (!${parameterResolverFoundVar}) {
198
+ ${parameterResolverFoundVar} = true;
199
+ parameters.${parameter.parameter.name} = await ${instance}.resolve({
200
+ token: ${injectorTokenVar},
201
+ route: ${routeConfigVar},
202
+ request: request,
203
+ name: ${JSON.stringify(parameter.parameter.name)},
204
+ value: parameters.${parameter.parameter.name},
205
+ query: _query,
206
+ parameters: parameters,
207
+ type: ${compiler.reserveVariable('parameterType', parameter.parameter)}
208
+ });
209
+ }`);
210
+ }
211
+ if (!parameter.isPartOfPath()) {
212
+ let injectorGet = `parameters.${parameter.parameter.name} = ${injector}.get(${injectorTokenVar});`;
213
+ if (parameter.parameter.isOptional()) {
214
+ injectorGet = `try {parameters.${parameter.parameter.name} = ${injector}.get(${injectorTokenVar}); } catch (e) {}`;
215
+ }
216
+ setParameters.push(`if (!${parameterResolverFoundVar}) ${injectorGet}`);
217
+ }
218
+ }
219
+ }
220
+ let parseBodyLoading = '';
221
+ if (enableParseBody) {
222
+ const parseBodyVar = compiler.reserveVariable('parseBody', parseBody);
223
+ parseBodyLoading = `
224
+ const bodyFields = (await ${parseBodyVar}(request, uploadedFiles));`;
225
+ requiresAsyncParameters = true;
226
+ }
227
+ let parametersLoader = '() => []';
228
+ if (setParameters.length) {
229
+ parametersLoader = `${requiresAsyncParameters ? 'async' : ''} function(_injector){
230
+ const validationErrors = [];
231
+ const bodyErrors = [];
232
+ const parameters = {};
233
+ ${setParametersFromPath}
234
+ ${parseBodyLoading}
235
+ ${setParameters.join('\n')}
236
+ ${parameterValidator.join('\n')}
237
+ ${bodyValidationErrorHandling}
238
+ if (validationErrors.length) throw new ValidationError(validationErrors);
239
+ return {arguments: [${parameterNames.join(',')}], parameters: parameters};
240
+ }`;
241
+ }
242
+ return parametersLoader;
243
+ }
244
+ exports.getRuquestParserCodeForParameters = getRuquestParserCodeForParameters;
245
+ getRuquestParserCodeForParameters.__type = [() => core_1.CompilerContext, 'compiler', () => ParameterForRequestParser, 'parameters', () => injector_1.InjectorModule, 'module', () => __ΩClassType, 'resolverForParameterName', () => __ΩClassType, 'resolverForToken', 'pathParameterNames', () => router_js_1.RouteConfig, 'routeConfig', 'config', 'getRuquestParserCodeForParameters', 'PP7!2"P7#F2$PP"7%4&8&n\'E4(8"n)E4*8P&\'LM4+8P7,4-8M2."//'];
246
+ //# sourceMappingURL=resolver.js.map