@deepkit/http 1.0.1-alpha.16 → 1.0.1-alpha.160
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +236 -0
- package/dist/cjs/index.d.ts +14 -10
- package/dist/cjs/index.js +19 -11
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/src/controllers.d.ts +10 -3
- package/dist/cjs/src/controllers.js +7 -3
- package/dist/cjs/src/controllers.js.map +1 -1
- package/dist/cjs/src/decorator.d.ts +144 -70
- package/dist/cjs/src/decorator.js +277 -102
- package/dist/cjs/src/decorator.js.map +1 -1
- package/dist/cjs/src/filter.d.ts +49 -0
- package/dist/cjs/src/filter.js +215 -0
- package/dist/cjs/src/filter.js.map +1 -0
- package/dist/cjs/src/http-app.d.ts +8 -0
- package/dist/cjs/src/http-app.js +16 -0
- package/dist/cjs/src/http-app.js.map +1 -0
- package/dist/cjs/src/http.d.ts +131 -32
- package/dist/cjs/src/http.js +523 -122
- package/dist/cjs/src/http.js.map +1 -1
- package/dist/cjs/src/kernel.d.ts +50 -9
- package/dist/cjs/src/kernel.js +109 -98
- package/dist/cjs/src/kernel.js.map +1 -1
- package/dist/cjs/src/logger.d.ts +3 -3
- package/dist/cjs/src/logger.js +9 -12
- package/dist/cjs/src/logger.js.map +1 -1
- package/dist/cjs/src/middleware.d.ts +61 -0
- package/dist/cjs/src/middleware.js +95 -0
- package/dist/cjs/src/middleware.js.map +1 -0
- package/dist/cjs/src/model.d.ts +270 -4
- package/dist/cjs/src/model.js +401 -3
- package/dist/cjs/src/model.js.map +1 -1
- package/dist/cjs/src/module.config.d.ts +149 -4
- package/dist/cjs/src/module.config.js +11 -6
- package/dist/cjs/src/module.config.js.map +1 -1
- package/dist/cjs/src/module.d.ts +14 -32
- package/dist/cjs/src/module.js +122 -7
- package/dist/cjs/src/module.js.map +1 -1
- package/dist/cjs/src/request-parser.d.ts +37 -0
- package/dist/cjs/src/request-parser.js +382 -0
- package/dist/cjs/src/request-parser.js.map +1 -0
- package/dist/cjs/src/router.d.ts +174 -75
- package/dist/cjs/src/router.js +469 -288
- package/dist/cjs/src/router.js.map +1 -1
- package/dist/cjs/src/static-serving.d.ts +32 -4
- package/dist/cjs/src/static-serving.js +115 -71
- package/dist/cjs/src/static-serving.js.map +1 -1
- package/dist/cjs/src/utils.js +2 -2
- package/dist/cjs/src/utils.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -2916
- package/dist/esm/index.d.ts +14 -10
- package/dist/esm/index.js +14 -10
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/src/controllers.d.ts +10 -3
- package/dist/esm/src/controllers.js +7 -3
- package/dist/esm/src/controllers.js.map +1 -1
- package/dist/esm/src/decorator.d.ts +144 -70
- package/dist/esm/src/decorator.js +272 -99
- package/dist/esm/src/decorator.js.map +1 -1
- package/dist/esm/src/filter.d.ts +49 -0
- package/dist/esm/src/filter.js +209 -0
- package/dist/esm/src/filter.js.map +1 -0
- package/dist/esm/src/http-app.d.ts +8 -0
- package/dist/esm/src/http-app.js +12 -0
- package/dist/esm/src/http-app.js.map +1 -0
- package/dist/esm/src/http.d.ts +131 -32
- package/dist/esm/src/http.js +504 -121
- package/dist/esm/src/http.js.map +1 -1
- package/dist/esm/src/kernel.d.ts +50 -9
- package/dist/esm/src/kernel.js +110 -100
- package/dist/esm/src/kernel.js.map +1 -1
- package/dist/esm/src/logger.d.ts +3 -3
- package/dist/esm/src/logger.js +7 -11
- package/dist/esm/src/logger.js.map +1 -1
- package/dist/esm/src/middleware.d.ts +61 -0
- package/dist/esm/src/middleware.js +90 -0
- package/dist/esm/src/middleware.js.map +1 -0
- package/dist/esm/src/model.d.ts +270 -4
- package/dist/esm/src/model.js +357 -1
- package/dist/esm/src/model.js.map +1 -1
- package/dist/esm/src/module.config.d.ts +149 -4
- package/dist/esm/src/module.config.js +9 -5
- package/dist/esm/src/module.config.js.map +1 -1
- package/dist/esm/src/module.d.ts +14 -32
- package/dist/esm/src/module.js +121 -7
- package/dist/esm/src/module.js.map +1 -1
- package/dist/esm/src/request-parser.d.ts +37 -0
- package/dist/esm/src/request-parser.js +372 -0
- package/dist/esm/src/request-parser.js.map +1 -0
- package/dist/esm/src/router.d.ts +174 -75
- package/dist/esm/src/router.js +463 -285
- package/dist/esm/src/router.js.map +1 -1
- package/dist/esm/src/static-serving.d.ts +32 -4
- package/dist/esm/src/static-serving.js +107 -65
- package/dist/esm/src/static-serving.js.map +1 -1
- package/dist/esm/src/utils.js +1 -0
- package/dist/esm/src/utils.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -2916
- package/index.ts +14 -10
- package/package.json +30 -19
- package/src/controllers.ts +4 -3
- package/src/decorator.ts +242 -104
- package/src/filter.ts +224 -0
- package/src/http-app.ts +11 -0
- package/src/http.ts +501 -100
- package/src/kernel.ts +128 -80
- package/src/logger.ts +4 -6
- package/src/middleware.ts +116 -0
- package/src/model.ts +516 -5
- package/src/module.config.ts +168 -5
- package/src/module.ts +120 -7
- package/src/request-parser.ts +430 -0
- package/src/router.ts +546 -317
- package/src/static-serving.ts +120 -50
- package/src/utils.ts +0 -2
- package/tsconfig.esm.json +7 -7
- package/tsconfig.json +18 -11
- package/tsconfig.spec.json +8 -0
- package/dist/cjs/tests/router.spec.d.ts +0 -1
- package/dist/cjs/tests/router.spec.js +0 -481
- package/dist/cjs/tests/router.spec.js.map +0 -1
- package/dist/esm/tests/router.spec.d.ts +0 -1
- package/dist/esm/tests/router.spec.js +0 -479
- package/dist/esm/tests/router.spec.js.map +0 -1
- package/tests/router.spec.ts +0 -347
package/dist/cjs/src/module.d.ts
CHANGED
|
@@ -1,32 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
controller: typeof import("./http").HttpControllerEvent;
|
|
16
|
-
controllerError: typeof import("./http").HttpControllerErrorEvent;
|
|
17
|
-
parametersFailed: typeof import("./http").HttpControllerErrorEvent;
|
|
18
|
-
response: typeof import("./http").HttpResponseEvent;
|
|
19
|
-
}> & import("@deepkit/workflow").WorkflowDefinitionEvents<{
|
|
20
|
-
start: typeof import("@deepkit/workflow").WorkflowEvent;
|
|
21
|
-
request: typeof import("./http").HttpWorkflowEvent;
|
|
22
|
-
route: typeof import("./http").HttpRouteEvent;
|
|
23
|
-
routeNotFound: typeof import("./http").HttpWorkflowEvent;
|
|
24
|
-
auth: typeof import("./http").HttpAuthEvent;
|
|
25
|
-
resolveParameters: typeof import("./http").HttpResolveParametersEvent;
|
|
26
|
-
accessDenied: typeof import("./http").HttpAccessDeniedEvent;
|
|
27
|
-
controller: typeof import("./http").HttpControllerEvent;
|
|
28
|
-
controllerError: typeof import("./http").HttpControllerErrorEvent;
|
|
29
|
-
parametersFailed: typeof import("./http").HttpControllerErrorEvent;
|
|
30
|
-
response: typeof import("./http").HttpResponseEvent;
|
|
31
|
-
}>)[];
|
|
32
|
-
}, "">;
|
|
1
|
+
import { HttpConfig } from './module.config.js';
|
|
2
|
+
import { AddedListener, AppModule, ControllerConfig } from '@deepkit/app';
|
|
3
|
+
import { HttpControllers } from './controllers.js';
|
|
4
|
+
import '@deepkit/type';
|
|
5
|
+
import { EventToken } from '@deepkit/event';
|
|
6
|
+
declare const HttpModule_base: import("@deepkit/app").AppModuleClass<HttpConfig>;
|
|
7
|
+
export declare class HttpModule extends HttpModule_base {
|
|
8
|
+
protected httpControllers: HttpControllers;
|
|
9
|
+
process(): void;
|
|
10
|
+
protected patchEventsForHttpRequestAccess: EventToken<any>[];
|
|
11
|
+
processListener(module: AppModule<any>, listener: AddedListener): void;
|
|
12
|
+
processController(module: AppModule<any>, config: ControllerConfig): void;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
package/dist/cjs/src/module.js
CHANGED
|
@@ -1,14 +1,129 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.HttpModule = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
function __assignType(fn, args) {
|
|
5
|
+
fn.__type = args;
|
|
6
|
+
return fn;
|
|
7
|
+
}
|
|
8
|
+
const http_js_1 = require("./http.js");
|
|
9
|
+
const module_config_js_1 = require("./module.config.js");
|
|
6
10
|
const app_1 = require("@deepkit/app");
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
11
|
+
const router_js_1 = require("./router.js");
|
|
12
|
+
const kernel_js_1 = require("./kernel.js");
|
|
13
|
+
const filter_js_1 = require("./filter.js");
|
|
14
|
+
const controllers_js_1 = require("./controllers.js");
|
|
15
|
+
const logger_1 = require("@deepkit/logger");
|
|
16
|
+
const model_js_1 = require("./model.js");
|
|
17
|
+
require("@deepkit/type");
|
|
18
|
+
const decorator_js_1 = require("./decorator.js");
|
|
19
|
+
const event_1 = require("@deepkit/event");
|
|
20
|
+
const type_1 = require("@deepkit/type");
|
|
21
|
+
const request_parser_js_1 = require("./request-parser.js");
|
|
22
|
+
const injector_1 = require("@deepkit/injector");
|
|
23
|
+
function parameterRequiresRequest(parameter) {
|
|
24
|
+
return Boolean(type_1.typeAnnotation.getType(parameter.type, 'httpQueries')
|
|
25
|
+
|| type_1.typeAnnotation.getType(parameter.type, 'httpQuery')
|
|
26
|
+
|| type_1.typeAnnotation.getType(parameter.type, 'httpBody')
|
|
27
|
+
|| type_1.typeAnnotation.getType(parameter.type, 'httpRequestParser')
|
|
28
|
+
|| type_1.typeAnnotation.getType(parameter.type, 'httpPath')
|
|
29
|
+
|| type_1.typeAnnotation.getType(parameter.type, 'httpHeader'));
|
|
30
|
+
}
|
|
31
|
+
parameterRequiresRequest.__type = [() => type_1.ReflectionParameter, 'parameter', 'parameterRequiresRequest', 'PP7!2")/#'];
|
|
32
|
+
class HttpModule extends (0, app_1.createModuleClass)({
|
|
33
|
+
config: module_config_js_1.HttpConfig,
|
|
34
|
+
providers: [
|
|
35
|
+
router_js_1.HttpRouter,
|
|
36
|
+
kernel_js_1.HttpKernel,
|
|
37
|
+
http_js_1.HttpResultFormatter,
|
|
38
|
+
router_js_1.HttpRouterRegistry,
|
|
39
|
+
filter_js_1.HttpRouterFilterResolver,
|
|
40
|
+
{ provide: model_js_1.HttpResponse, scope: 'http' },
|
|
41
|
+
{ provide: model_js_1.HttpRequest, scope: 'http' },
|
|
42
|
+
{ provide: router_js_1.RouteConfig, useValue: undefined, scope: 'http' },
|
|
43
|
+
{ provide: logger_1.Logger, useValue: new logger_1.Logger([new logger_1.ConsoleTransport()]) },
|
|
44
|
+
],
|
|
45
|
+
listeners: [
|
|
46
|
+
http_js_1.HttpListener,
|
|
47
|
+
],
|
|
10
48
|
workflows: [
|
|
11
|
-
|
|
49
|
+
http_js_1.httpWorkflow
|
|
12
50
|
],
|
|
13
|
-
|
|
51
|
+
exports: [
|
|
52
|
+
router_js_1.HttpRouter,
|
|
53
|
+
router_js_1.HttpRouterRegistry,
|
|
54
|
+
kernel_js_1.HttpKernel,
|
|
55
|
+
http_js_1.HttpResultFormatter,
|
|
56
|
+
filter_js_1.HttpRouterFilterResolver,
|
|
57
|
+
model_js_1.HttpResponse,
|
|
58
|
+
model_js_1.HttpRequest,
|
|
59
|
+
controllers_js_1.HttpControllers,
|
|
60
|
+
router_js_1.RouteConfig,
|
|
61
|
+
logger_1.Logger,
|
|
62
|
+
]
|
|
63
|
+
}) {
|
|
64
|
+
constructor() {
|
|
65
|
+
super(...arguments);
|
|
66
|
+
this.httpControllers = new controllers_js_1.HttpControllers;
|
|
67
|
+
this.patchEventsForHttpRequestAccess = [http_js_1.httpWorkflow.onRequest, http_js_1.httpWorkflow.onAuth, http_js_1.httpWorkflow.onController];
|
|
68
|
+
}
|
|
69
|
+
process() {
|
|
70
|
+
this.addProvider({ provide: controllers_js_1.HttpControllers, useValue: this.httpControllers });
|
|
71
|
+
}
|
|
72
|
+
processListener(module, listener) {
|
|
73
|
+
if (!this.patchEventsForHttpRequestAccess.includes(listener.eventToken))
|
|
74
|
+
return;
|
|
75
|
+
let requiresHttpRequest = false;
|
|
76
|
+
let needsAsync = false;
|
|
77
|
+
const params = listener.reflection.getParameters().slice(1);
|
|
78
|
+
for (const parameter of params) {
|
|
79
|
+
if (type_1.typeAnnotation.getType(parameter.type, 'httpBody'))
|
|
80
|
+
needsAsync = true;
|
|
81
|
+
if (parameterRequiresRequest(parameter))
|
|
82
|
+
requiresHttpRequest = true;
|
|
83
|
+
}
|
|
84
|
+
if (needsAsync) {
|
|
85
|
+
//not yet supported since we have to patch the listener to be async and redirect the call (as the DI container is sync).
|
|
86
|
+
throw new Error(`Listener ${(0, app_1.stringifyListener)(listener)} requires async HttpBody. This is not yet supported. You have to parse the request manually by injecting HttpRequest.`);
|
|
87
|
+
}
|
|
88
|
+
const parserCache = (Map.Ω = [[() => router_js_1.RouteConfig, 'P7!'], [() => Function, 'Pu!']], new Map());
|
|
89
|
+
for (let index = 0; index < params.length; index++) {
|
|
90
|
+
const parameter = params[index];
|
|
91
|
+
if (!parameterRequiresRequest(parameter))
|
|
92
|
+
continue;
|
|
93
|
+
//change the reflection type so that we create a unique injection token for that type.
|
|
94
|
+
const unique = Symbol('event.parameter:' + parameter.name);
|
|
95
|
+
const uniqueType = { kind: type_1.ReflectionKind.literal, literal: unique };
|
|
96
|
+
type_1.typeAnnotation.registerType(parameter.type, { name: 'inject', options: uniqueType });
|
|
97
|
+
let i = index;
|
|
98
|
+
this.addProvider({
|
|
99
|
+
provide: uniqueType, useFactory: __assignType((httpConfig, request, injector, config) => {
|
|
100
|
+
let build = config && parserCache.get(config);
|
|
101
|
+
if (!build) {
|
|
102
|
+
const params = listener.reflection.getParameters().slice(1);
|
|
103
|
+
build = (0, request_parser_js_1.buildRequestParser)(httpConfig.parser, params, config);
|
|
104
|
+
if (config)
|
|
105
|
+
parserCache.set(config, build);
|
|
106
|
+
}
|
|
107
|
+
const parser = build(request);
|
|
108
|
+
const result = parser(injector);
|
|
109
|
+
return result.arguments[i];
|
|
110
|
+
}, [() => module_config_js_1.HttpConfig, 'httpConfig', () => model_js_1.HttpRequest, 'request', () => injector_1.InjectorContext, 'injector', () => router_js_1.RouteConfig, 'config', '', 'PP7!2"P7#2$P7%2&P7\'2(8"/)']), scope: 'http'
|
|
111
|
+
});
|
|
112
|
+
this.addExport(uniqueType);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
processController(module, config) {
|
|
116
|
+
const controller = config.controller;
|
|
117
|
+
if (!controller)
|
|
118
|
+
return;
|
|
119
|
+
const httpConfig = decorator_js_1.httpClass._fetch(controller);
|
|
120
|
+
if (!httpConfig)
|
|
121
|
+
return;
|
|
122
|
+
if (!module.isProvided(controller))
|
|
123
|
+
module.addProvider({ provide: controller, scope: 'http' });
|
|
124
|
+
this.httpControllers.add(controller, module);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
exports.HttpModule = HttpModule;
|
|
128
|
+
HttpModule.__type = [() => (0, app_1.createModuleClass)({ config: module_config_js_1.HttpConfig, providers: [router_js_1.HttpRouter, kernel_js_1.HttpKernel, http_js_1.HttpResultFormatter, router_js_1.HttpRouterRegistry, filter_js_1.HttpRouterFilterResolver, { provide: model_js_1.HttpResponse, scope: "http" }, { provide: model_js_1.HttpRequest, scope: "http" }, { provide: router_js_1.RouteConfig, useValue: undefined, scope: "http" }, { provide: logger_1.Logger, useValue: new logger_1.Logger([new logger_1.ConsoleTransport()]) }], listeners: [http_js_1.HttpListener], workflows: [http_js_1.httpWorkflow], exports: [router_js_1.HttpRouter, router_js_1.HttpRouterRegistry, kernel_js_1.HttpKernel, http_js_1.HttpResultFormatter, filter_js_1.HttpRouterFilterResolver, model_js_1.HttpResponse, model_js_1.HttpRequest, controllers_js_1.HttpControllers, router_js_1.RouteConfig, logger_1.Logger] }), 'httpControllers', function () { return new controllers_js_1.HttpControllers; }, 'process', () => event_1.EventToken, 'patchEventsForHttpRequestAccess', function () { return [http_js_1.httpWorkflow.onRequest, http_js_1.httpWorkflow.onAuth, http_js_1.httpWorkflow.onController]; }, () => app_1.AppModule, 'module', 'AddedListener', 'listener', 'processListener', () => app_1.AppModule, 'ControllerConfig', 'config', 'processController', 'HttpModule', 'P7!!3"<>#P"0$P"7%F3&<>\'PP"7(2)"w*2+"0,PP"7-2)"w.2/"005w1'];
|
|
14
129
|
//# sourceMappingURL=module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../../src/module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../../src/module.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
import { HttpParserOptions } from './module.config.js';
|
|
7
|
+
export declare class ParameterForRequestParser {
|
|
8
|
+
parameter: ReflectionParameter;
|
|
9
|
+
regexPosition?: number;
|
|
10
|
+
constructor(parameter: ReflectionParameter);
|
|
11
|
+
get body(): boolean;
|
|
12
|
+
get requestParser(): boolean;
|
|
13
|
+
get bodyValidation(): boolean;
|
|
14
|
+
getType(): Type;
|
|
15
|
+
get header(): boolean;
|
|
16
|
+
get query(): boolean;
|
|
17
|
+
get queries(): boolean;
|
|
18
|
+
get typePath(): string | undefined;
|
|
19
|
+
getName(): string;
|
|
20
|
+
isPartOfPath(): boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function parseRoutePathToRegex(path: string, params: ReflectionParameter[]): {
|
|
23
|
+
regex: string;
|
|
24
|
+
parameterNames: {
|
|
25
|
+
[name: string]: number;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
export declare function buildRequestParser(parseOptions: HttpParserOptions, parameters: ReflectionParameter[], routeConfig?: RouteConfig): (request: HttpRequest) => any[];
|
|
29
|
+
export declare function getRequestParserCodeForParameters(compiler: CompilerContext, parseOptions: HttpParserOptions, parameters: ParameterForRequestParser[], config: {
|
|
30
|
+
module?: InjectorModule<any>;
|
|
31
|
+
resolverForParameterName?: Map<string, ClassType>;
|
|
32
|
+
resolverForToken?: Map<any, ClassType>;
|
|
33
|
+
pathParameterNames?: {
|
|
34
|
+
[name: string]: number;
|
|
35
|
+
};
|
|
36
|
+
routeConfig?: RouteConfig;
|
|
37
|
+
}): string;
|
|
@@ -0,0 +1,382 @@
|
|
|
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.ParameterForRequestParser = void 0;
|
|
7
|
+
exports.parseRoutePathToRegex = parseRoutePathToRegex;
|
|
8
|
+
exports.buildRequestParser = buildRequestParser;
|
|
9
|
+
exports.getRequestParserCodeForParameters = getRequestParserCodeForParameters;
|
|
10
|
+
/*@ts-ignore*/
|
|
11
|
+
const { __ΩHttpParserOptions } = require('./module.config.js');
|
|
12
|
+
/*@ts-ignore*/
|
|
13
|
+
const { __ΩClassType } = require('@deepkit/core');
|
|
14
|
+
function __assignType(fn, args) {
|
|
15
|
+
fn.__type = args;
|
|
16
|
+
return fn;
|
|
17
|
+
}
|
|
18
|
+
const core_1 = require("@deepkit/core");
|
|
19
|
+
const injector_1 = require("@deepkit/injector");
|
|
20
|
+
const type_1 = require("@deepkit/type");
|
|
21
|
+
const model_js_1 = require("./model.js");
|
|
22
|
+
const router_js_1 = require("./router.js");
|
|
23
|
+
const qs_1 = __importDefault(require("qs"));
|
|
24
|
+
const formidable_1 = __importDefault(require("formidable"));
|
|
25
|
+
function parseBody(options, req, foundFiles) {
|
|
26
|
+
const form = (0, formidable_1.default)(Object.assign(options, {
|
|
27
|
+
multiples: true,
|
|
28
|
+
}));
|
|
29
|
+
return (0, core_1.asyncOperation)(__assignType(async (resolve, reject) => {
|
|
30
|
+
function parseData(fields, files) {
|
|
31
|
+
const fileEntries = Object.entries(files);
|
|
32
|
+
// formidable turns JSON arrays into numerically keyed objects, so we convert them back
|
|
33
|
+
if ('0' in fields && fileEntries.length === 0 && Object.keys(fields).every(__assignType((key, idx) => parseInt(key) === idx, ['key', 'idx', '', 'P"2!"2""/#']))) {
|
|
34
|
+
return resolve(Object.values(fields));
|
|
35
|
+
}
|
|
36
|
+
for (const [name, files] of fileEntries) {
|
|
37
|
+
if (!files)
|
|
38
|
+
continue;
|
|
39
|
+
const file = files[0];
|
|
40
|
+
if (!file)
|
|
41
|
+
continue;
|
|
42
|
+
if (!file.filepath || 'string' !== typeof file.filepath)
|
|
43
|
+
continue;
|
|
44
|
+
if (!file.size || 'number' !== typeof file.size)
|
|
45
|
+
continue;
|
|
46
|
+
foundFiles[name] = {
|
|
47
|
+
validator: router_js_1.UploadedFileSymbol,
|
|
48
|
+
size: file.size,
|
|
49
|
+
path: file.filepath,
|
|
50
|
+
name: file.originalFilename || null,
|
|
51
|
+
type: file.mimetype || null,
|
|
52
|
+
lastModifiedDate: null,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const body = { ...fields, ...foundFiles };
|
|
56
|
+
resolve(body);
|
|
57
|
+
}
|
|
58
|
+
parseData.__type = ['fields', 'files', 'parseData', 'P!2!!2""/#'];
|
|
59
|
+
if (req.body) {
|
|
60
|
+
const [fields, files] = await form.parse((0, model_js_1.createRequestWithCachedBody)(req, req.body));
|
|
61
|
+
parseData(fields, files);
|
|
62
|
+
}
|
|
63
|
+
const chunks = [];
|
|
64
|
+
function read(chunk) {
|
|
65
|
+
chunks.push(chunk);
|
|
66
|
+
}
|
|
67
|
+
read.__type = ['chunk', 'read', 'P!2!"/"'];
|
|
68
|
+
req.on('data', read);
|
|
69
|
+
req.once('end', () => {
|
|
70
|
+
req.body = Buffer.concat(chunks);
|
|
71
|
+
req.off('data', read);
|
|
72
|
+
});
|
|
73
|
+
req.once('error', () => req.off('data', read));
|
|
74
|
+
const [fields, files] = await form.parse(req);
|
|
75
|
+
parseData(fields, files);
|
|
76
|
+
}, ['resolve', 'reject', '', 'P"2!"2""/#']));
|
|
77
|
+
}
|
|
78
|
+
parseBody.__type = [() => __ΩHttpParserOptions, 'options', () => model_js_1.HttpRequest, 'req', () => router_js_1.UploadedFile, 'foundFiles', 'parseBody', 'Pn!2"P7#2$P&P7%LM2&"/\''];
|
|
79
|
+
class ParameterForRequestParser {
|
|
80
|
+
constructor(parameter) {
|
|
81
|
+
this.parameter = parameter;
|
|
82
|
+
}
|
|
83
|
+
get body() {
|
|
84
|
+
return type_1.typeAnnotation.getType(this.parameter.type, 'httpBody') !== undefined;
|
|
85
|
+
}
|
|
86
|
+
get requestParser() {
|
|
87
|
+
return type_1.typeAnnotation.getType(this.parameter.type, 'httpRequestParser') !== undefined;
|
|
88
|
+
}
|
|
89
|
+
get bodyValidation() {
|
|
90
|
+
return type_1.typeAnnotation.getType(this.parameter.type, 'httpBodyValidation') !== undefined;
|
|
91
|
+
}
|
|
92
|
+
getType() {
|
|
93
|
+
const parser = type_1.typeAnnotation.getType(this.parameter.type, 'httpRequestParser');
|
|
94
|
+
if (parser) {
|
|
95
|
+
return parser;
|
|
96
|
+
}
|
|
97
|
+
if (this.bodyValidation) {
|
|
98
|
+
(0, type_1.assertType)(this.parameter.type, type_1.ReflectionKind.class);
|
|
99
|
+
const valueType = (0, type_1.findMember)('value', this.parameter.type.types);
|
|
100
|
+
if (!valueType || valueType.kind !== type_1.ReflectionKind.property)
|
|
101
|
+
throw new Error(`No property value found at ${(0, type_1.stringifyType)(this.parameter.type)}`);
|
|
102
|
+
return valueType.type;
|
|
103
|
+
}
|
|
104
|
+
return this.parameter.type;
|
|
105
|
+
}
|
|
106
|
+
get header() {
|
|
107
|
+
return type_1.typeAnnotation.getType(this.parameter.type, 'httpHeader') !== undefined;
|
|
108
|
+
}
|
|
109
|
+
get query() {
|
|
110
|
+
return type_1.typeAnnotation.getType(this.parameter.type, 'httpQuery') !== undefined;
|
|
111
|
+
}
|
|
112
|
+
get queries() {
|
|
113
|
+
return type_1.typeAnnotation.getType(this.parameter.type, 'httpQueries') !== undefined;
|
|
114
|
+
}
|
|
115
|
+
get typePath() {
|
|
116
|
+
const typeOptions = type_1.typeAnnotation.getType(this.parameter.type, 'httpQueries') || type_1.typeAnnotation.getType(this.parameter.type, 'httpQuery')
|
|
117
|
+
|| type_1.typeAnnotation.getType(this.parameter.type, 'httpPath') || type_1.typeAnnotation.getType(this.parameter.type, 'httpHeader');
|
|
118
|
+
if (!typeOptions)
|
|
119
|
+
return;
|
|
120
|
+
const options = (0, type_1.typeToObject)(typeOptions);
|
|
121
|
+
if ((0, core_1.isObject)(options))
|
|
122
|
+
return options.name;
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
getName() {
|
|
126
|
+
return this.parameter.name;
|
|
127
|
+
}
|
|
128
|
+
isPartOfPath() {
|
|
129
|
+
return type_1.typeAnnotation.getType(this.parameter.type, 'httpPath') !== undefined || this.regexPosition !== undefined;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
exports.ParameterForRequestParser = ParameterForRequestParser;
|
|
133
|
+
ParameterForRequestParser.__type = ['regexPosition', () => type_1.ReflectionParameter, 'parameter', 'constructor', 'Type', 'getType', 'getName', 'isPartOfPath', 'ParameterForRequestParser', '\'3!8PP7"2#:"0$!!!P"w%0&!!!!P"0\'P)0(5w)'];
|
|
134
|
+
function parseRoutePathToRegex(path, params) {
|
|
135
|
+
const parameterNames = {};
|
|
136
|
+
let argumentIndex = 0;
|
|
137
|
+
path = path.replace(/:(\w+)/g, __assignType((a, name) => {
|
|
138
|
+
parameterNames[name] = argumentIndex;
|
|
139
|
+
argumentIndex++;
|
|
140
|
+
const parameter = params.find(__assignType(v => v.name === name, ['v', '', 'P"2!"/"']));
|
|
141
|
+
if (parameter) {
|
|
142
|
+
const regExp = (0, model_js_1.getRegExp)(parameter.type);
|
|
143
|
+
if (regExp instanceof RegExp) {
|
|
144
|
+
return '(' + regExp.source + ')';
|
|
145
|
+
}
|
|
146
|
+
else if (regExp) {
|
|
147
|
+
return '(' + regExp + ')';
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return String.raw `([^/]+)`;
|
|
151
|
+
}, ['a', 'name', '', 'P"2!"2""/#']));
|
|
152
|
+
return { regex: path, parameterNames };
|
|
153
|
+
}
|
|
154
|
+
parseRoutePathToRegex.__type = ['path', () => type_1.ReflectionParameter, 'params', 'regex', 'parameterNames', 'parseRoutePathToRegex', 'P&2!P7"F2#P&4$P&\'LM4%M/&'];
|
|
155
|
+
function isTypeUnknown(type) {
|
|
156
|
+
if (type.id)
|
|
157
|
+
return false; //if is has an id we treat it as nominal type
|
|
158
|
+
return type.kind === type_1.ReflectionKind.unknown || type.kind === type_1.ReflectionKind.any
|
|
159
|
+
|| type.kind === type_1.ReflectionKind.never;
|
|
160
|
+
}
|
|
161
|
+
isTypeUnknown.__type = ['Type', 'type', 'isTypeUnknown', 'P"w!2")/#'];
|
|
162
|
+
function buildRequestParser(parseOptions, parameters, routeConfig) {
|
|
163
|
+
const compiler = new core_1.CompilerContext();
|
|
164
|
+
const params = parameters.map(__assignType(v => new ParameterForRequestParser(v), ['v', '', 'P"2!"/"']));
|
|
165
|
+
//todo: parse path
|
|
166
|
+
let pathRegex = '';
|
|
167
|
+
let pathParameterNames = {};
|
|
168
|
+
if (routeConfig) {
|
|
169
|
+
const parsedPath = parseRoutePathToRegex(routeConfig.getFullPath(), parameters);
|
|
170
|
+
pathRegex = parsedPath.regex;
|
|
171
|
+
pathParameterNames = parsedPath.parameterNames;
|
|
172
|
+
for (const param of params) {
|
|
173
|
+
param.regexPosition = parsedPath.parameterNames[param.parameter.name];
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const code = getRequestParserCodeForParameters(compiler, parseOptions, params, {
|
|
177
|
+
pathParameterNames,
|
|
178
|
+
routeConfig
|
|
179
|
+
});
|
|
180
|
+
compiler.context.set('ValidationError', type_1.ValidationError);
|
|
181
|
+
compiler.context.set('qs', qs_1.default);
|
|
182
|
+
let needsQueryString = !!params.find(__assignType(v => v.query || v.queries || v.requestParser, ['v', '', 'P"2!"/"']));
|
|
183
|
+
const query = needsQueryString ? '_qPosition === -1 ? {} : qs.parse(_url.substr(_qPosition + 1))' : '{}';
|
|
184
|
+
const regexVar = compiler.reserveVariable('regex', new RegExp('^' + pathRegex + '$'));
|
|
185
|
+
return compiler.build(`
|
|
186
|
+
const _method = request.method || 'GET';
|
|
187
|
+
const _url = request.url || '/';
|
|
188
|
+
const _headers = request.headers || {};
|
|
189
|
+
const _qPosition = _url.indexOf('?');
|
|
190
|
+
let uploadedFiles = {};
|
|
191
|
+
const _path = _qPosition === -1 ? _url : _url.substr(0, _qPosition);
|
|
192
|
+
const _match = _path.match(${regexVar}) || [];
|
|
193
|
+
const _query = ${query};
|
|
194
|
+
return ${code}
|
|
195
|
+
`, 'request');
|
|
196
|
+
}
|
|
197
|
+
buildRequestParser.__type = [() => __ΩHttpParserOptions, 'parseOptions', () => type_1.ReflectionParameter, 'parameters', () => router_js_1.RouteConfig, 'routeConfig', () => model_js_1.HttpRequest, 'request', '', 'buildRequestParser', 'Pn!2"P7#F2$P7%2&8PP7\'2("F/)/*'];
|
|
198
|
+
function getRequestParserCodeForParameters(compiler, parseOptions, parameters, config) {
|
|
199
|
+
compiler.set({ DependenciesUnmetError: injector_1.DependenciesUnmetError });
|
|
200
|
+
let enableParseBody = false;
|
|
201
|
+
let requiresAsyncParameters = false;
|
|
202
|
+
const setParameters = [];
|
|
203
|
+
const parameterNames = [];
|
|
204
|
+
const parameterValidator = [];
|
|
205
|
+
let setParametersFromPath = '';
|
|
206
|
+
let bodyValidationErrorHandling = `if (bodyErrors.length) throw ValidationError.from(bodyErrors);`;
|
|
207
|
+
for (const parameter of parameters) {
|
|
208
|
+
if (parameter.requestParser || parameter.body || parameter.bodyValidation) {
|
|
209
|
+
const type = parameter.getType();
|
|
210
|
+
const validatorVar = compiler.reserveVariable('argumentValidator', (0, type_1.getValidatorFunction)(undefined, type));
|
|
211
|
+
const converterVar = compiler.reserveVariable('argumentConverter', (0, type_1.getSerializeFunction)(type, type_1.serializer.deserializeRegistry));
|
|
212
|
+
if (parameter.bodyValidation) {
|
|
213
|
+
compiler.context.set('BodyValidation', model_js_1.ValidatedBody);
|
|
214
|
+
compiler.context.set('BodyValidationError', model_js_1.BodyValidationError);
|
|
215
|
+
parameterNames.push(`new BodyValidation(new BodyValidationError(bodyErrors), bodyErrors.length === 0 ? parameters.${parameter.parameter.name} : undefined)`);
|
|
216
|
+
bodyValidationErrorHandling = '';
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
parameterNames.push(`parameters.${parameter.parameter.name}`);
|
|
220
|
+
}
|
|
221
|
+
if (parameter.requestParser) {
|
|
222
|
+
const parseOptionsVar = compiler.reserveVariable('parseOptions', parseOptions);
|
|
223
|
+
const parseBodyVar = compiler.reserveVariable('parseBody', parseBody);
|
|
224
|
+
let assignPathNames = [];
|
|
225
|
+
for (const [name, index] of Object.entries(config.pathParameterNames || {})) {
|
|
226
|
+
assignPathNames.push(`res.${name} = _match[${1 + index}];`);
|
|
227
|
+
}
|
|
228
|
+
setParameters.push(`parameters.${parameter.parameter.name} = async (options = {}) => {
|
|
229
|
+
let res = {};
|
|
230
|
+
if (options.withPath !== false) {
|
|
231
|
+
${assignPathNames.join('\n')}
|
|
232
|
+
}
|
|
233
|
+
if (options.withHeader !== false) {
|
|
234
|
+
Object.assign(res, _headers);
|
|
235
|
+
}
|
|
236
|
+
if (options.withBody !== false) {
|
|
237
|
+
bodyFields = bodyFields || (await ${parseBodyVar}(${parseOptionsVar}, request, uploadedFiles));
|
|
238
|
+
Object.assign(res, bodyFields);
|
|
239
|
+
}
|
|
240
|
+
if (options.withQuery !== false) {
|
|
241
|
+
Object.assign(res, _query);
|
|
242
|
+
}
|
|
243
|
+
res = ${converterVar}(res, {loosely: true});
|
|
244
|
+
${validatorVar}(res, {errors: bodyErrors});
|
|
245
|
+
if (bodyErrors.length) throw ValidationError.from(bodyErrors);
|
|
246
|
+
return res;
|
|
247
|
+
}`);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
enableParseBody = true;
|
|
251
|
+
setParameters.push(`parameters.${parameter.parameter.name} = ${converterVar}(bodyFields, {loosely: true});`);
|
|
252
|
+
parameterValidator.push(`${validatorVar}(parameters.${parameter.parameter.name}, {errors: bodyErrors});`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
else if (parameter.query || parameter.queries || parameter.header) {
|
|
256
|
+
const converted = (0, type_1.getSerializeFunction)(parameter.parameter.parameter, type_1.serializer.deserializeRegistry, undefined, parameter.getName());
|
|
257
|
+
const validator = (0, type_1.getValidatorFunction)(undefined, parameter.parameter.parameter);
|
|
258
|
+
const converterVar = compiler.reserveVariable('argumentConverter', converted);
|
|
259
|
+
const validatorVar = compiler.reserveVariable('argumentValidator', validator);
|
|
260
|
+
const queryPath = parameter.typePath === undefined && !parameter.queries ? parameter.parameter.name : parameter.typePath;
|
|
261
|
+
const accessor = queryPath ? `['` + (queryPath.replace(/\./g, `']['`)) + `']` : '';
|
|
262
|
+
const queryAccessor = parameter.header ? `_headers${accessor}` : queryPath ? `_query${accessor}` : '_query';
|
|
263
|
+
if ((0, type_1.isOptional)(parameter.parameter.parameter) || (0, type_1.hasDefaultValue)(parameter.parameter.parameter)) {
|
|
264
|
+
setParameters.push(`parameters.${parameter.parameter.name} = ${queryAccessor} === undefined ? undefined : ${converterVar}(${queryAccessor}, {loosely: true});`);
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
setParameters.push(`parameters.${parameter.parameter.name} = ${converterVar}(${queryAccessor}, {loosely: true});`);
|
|
268
|
+
}
|
|
269
|
+
parameterNames.push(`parameters.${parameter.parameter.name}`);
|
|
270
|
+
parameterValidator.push(`${validatorVar}(parameters.${parameter.parameter.name}, {errors: validationErrors}, ${JSON.stringify(parameter.typePath || parameter.getName())});`);
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
parameterNames.push(`parameters.${parameter.parameter.name}`);
|
|
274
|
+
if (parameter.isPartOfPath()) {
|
|
275
|
+
if (parameter.parameter.type.kind !== type_1.ReflectionKind.class) {
|
|
276
|
+
const converted = (0, type_1.getSerializeFunction)(parameter.parameter.parameter, type_1.serializer.deserializeRegistry, undefined, parameter.getName());
|
|
277
|
+
const converterVar = compiler.reserveVariable('argumentConverter', converted);
|
|
278
|
+
setParameters.push(`parameters.${parameter.parameter.name} = ${converterVar}(_match[${1 + (parameter.regexPosition || 0)}], {loosely: true});`);
|
|
279
|
+
const validator = (0, type_1.getValidatorFunction)(undefined, parameter.parameter.parameter);
|
|
280
|
+
const validatorVar = compiler.reserveVariable('argumentValidator', validator);
|
|
281
|
+
parameterValidator.push(`${validatorVar}(parameters.${parameter.parameter.name}, {errors: validationErrors}, ${JSON.stringify(parameter.getName())});`);
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
setParameters.push(`parameters.${parameter.parameter.name} = _match[${1 + (parameter.regexPosition || 0)}];`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
const injectorTokenVar = compiler.reserveVariable('type', parameter.parameter.type);
|
|
288
|
+
const parameterResolverFoundVar = compiler.reserveVariable('parameterResolverFound', false);
|
|
289
|
+
setParameters.push(`${parameterResolverFoundVar} = false;`);
|
|
290
|
+
const resolverType = config.resolverForParameterName?.get(parameter.getName())
|
|
291
|
+
|| config.resolverForToken?.get(parameter.parameter.type.kind === type_1.ReflectionKind.class ? parameter.parameter.type.classType : undefined);
|
|
292
|
+
//make sure all parameter values from the path are available, important for parameter resolver
|
|
293
|
+
if (resolverType && !setParametersFromPath && config.pathParameterNames) {
|
|
294
|
+
for (const i in config.pathParameterNames) {
|
|
295
|
+
setParametersFromPath += `parameters.${i} = _match[${1 + config.pathParameterNames[i]}];`;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
if (!resolverType && !parameter.isPartOfPath() && isTypeUnknown(parameter.parameter.type)) {
|
|
299
|
+
const label = config.routeConfig ? (0, router_js_1.getRouteActionLabel)(config.routeConfig?.action) + ' ' : '';
|
|
300
|
+
throw new Error(`Parameter ${label}${JSON.stringify(parameter.parameter.name)} has no runtime type. Runtime types disabled or circular dependencies?`);
|
|
301
|
+
}
|
|
302
|
+
let injector = '_injector';
|
|
303
|
+
const moduleRawVar = config.module ? compiler.reserveConst(config.module, 'module') : 'undefined';
|
|
304
|
+
const moduleVar = config.module ? `, ${moduleRawVar}` : '';
|
|
305
|
+
if (resolverType) {
|
|
306
|
+
requiresAsyncParameters = true;
|
|
307
|
+
let instanceFetcher = '';
|
|
308
|
+
if (config.module && config.module.injector) {
|
|
309
|
+
const resolverResolverVar = compiler.reserveVariable('resolverProvideToken', config.module.injector.createResolver((0, type_1.resolveReceiveType)(resolverType)));
|
|
310
|
+
instanceFetcher = `${resolverResolverVar}(${injector}.scope)`;
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
const resolverProvideTokenVar = compiler.reserveVariable('resolverProvideToken', resolverType);
|
|
314
|
+
instanceFetcher = `${injector}.get(${resolverProvideTokenVar}${moduleVar})`;
|
|
315
|
+
}
|
|
316
|
+
const instance = compiler.reserveVariable('resolverInstance');
|
|
317
|
+
const routeConfigVar = compiler.reserveVariable('routeConfigVar', config.routeConfig);
|
|
318
|
+
const classTypeToken = parameter.parameter.type.kind === type_1.ReflectionKind.class ? parameter.parameter.type.classType : undefined;
|
|
319
|
+
const classTypeTokenVar = compiler.reserveVariable('classType', classTypeToken);
|
|
320
|
+
setParameters.push(`
|
|
321
|
+
//resolver ${(0, core_1.getClassName)(resolverType)} for ${parameter.getName()}
|
|
322
|
+
${instance} = ${instanceFetcher};
|
|
323
|
+
if (!${parameterResolverFoundVar}) {
|
|
324
|
+
${parameterResolverFoundVar} = true;
|
|
325
|
+
parameters.${parameter.parameter.name} = await ${instance}.resolve({
|
|
326
|
+
token: ${classTypeTokenVar},
|
|
327
|
+
route: ${routeConfigVar},
|
|
328
|
+
request: request,
|
|
329
|
+
name: ${JSON.stringify(parameter.parameter.name)},
|
|
330
|
+
value: parameters.${parameter.parameter.name},
|
|
331
|
+
query: _query,
|
|
332
|
+
parameters: parameters,
|
|
333
|
+
type: ${compiler.reserveVariable('parameterType', parameter.parameter)}
|
|
334
|
+
});
|
|
335
|
+
}`);
|
|
336
|
+
}
|
|
337
|
+
if (!parameter.isPartOfPath()) {
|
|
338
|
+
const resolverVar = compiler.reserveVariable('resolver');
|
|
339
|
+
let injectorGet = `
|
|
340
|
+
if (!${resolverVar}) ${resolverVar} = ${injector}.resolve(${moduleRawVar}, ${injectorTokenVar});
|
|
341
|
+
parameters.${parameter.parameter.name} = ${resolverVar}(${injector}.scope);
|
|
342
|
+
`;
|
|
343
|
+
if (!parameter.parameter.isOptional()) {
|
|
344
|
+
injectorGet += `
|
|
345
|
+
if (!parameters.${parameter.parameter.name}) {
|
|
346
|
+
throw new DependenciesUnmetError(
|
|
347
|
+
\`Parameter \${${JSON.stringify(parameter.parameter.name)}} is required but provider returned undefined.\`,
|
|
348
|
+
);
|
|
349
|
+
}`;
|
|
350
|
+
}
|
|
351
|
+
setParameters.push(`if (!${parameterResolverFoundVar}) { ${injectorGet} }`);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
let parseBodyLoading = '';
|
|
356
|
+
if (enableParseBody) {
|
|
357
|
+
const parseOptionsVar = compiler.reserveVariable('parseOptions', parseOptions);
|
|
358
|
+
const parseBodyVar = compiler.reserveVariable('parseBody', parseBody);
|
|
359
|
+
parseBodyLoading = `
|
|
360
|
+
bodyFields = bodyFields || (await ${parseBodyVar}(${parseOptionsVar}, request, uploadedFiles));`;
|
|
361
|
+
requiresAsyncParameters = true;
|
|
362
|
+
}
|
|
363
|
+
let parametersLoader = '() => {}';
|
|
364
|
+
if (setParameters.length) {
|
|
365
|
+
parametersLoader = `${requiresAsyncParameters ? 'async' : ''} function parse(_injector){
|
|
366
|
+
const validationErrors = [];
|
|
367
|
+
const bodyErrors = [];
|
|
368
|
+
const parameters = {};
|
|
369
|
+
let bodyFields;
|
|
370
|
+
${setParametersFromPath}
|
|
371
|
+
${parseBodyLoading}
|
|
372
|
+
${setParameters.join('\n')}
|
|
373
|
+
${parameterValidator.join('\n')}
|
|
374
|
+
${bodyValidationErrorHandling}
|
|
375
|
+
if (validationErrors.length) throw new ValidationError(validationErrors);
|
|
376
|
+
return {arguments: [${parameterNames.join(',')}], parameters: parameters};
|
|
377
|
+
}`;
|
|
378
|
+
}
|
|
379
|
+
return parametersLoader;
|
|
380
|
+
}
|
|
381
|
+
getRequestParserCodeForParameters.__type = [() => core_1.CompilerContext, 'compiler', () => __ΩHttpParserOptions, 'parseOptions', () => ParameterForRequestParser, 'parameters', () => injector_1.InjectorModule, 'module', () => __ΩClassType, 'resolverForParameterName', () => __ΩClassType, 'resolverForToken', 'pathParameterNames', () => router_js_1.RouteConfig, 'routeConfig', 'config', 'getRequestParserCodeForParameters', 'PP7!2"n#2$P7%F2&PP"7\'4(8&n)E4*8"n+E4,8P&\'LM4-8P7.4/8M20"/1'];
|
|
382
|
+
//# sourceMappingURL=request-parser.js.map
|