@bool-ts/core 1.6.9 → 1.6.11
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/dist/decorators/arguments.d.ts +5 -1
- package/dist/decorators/arguments.js +12 -1
- package/dist/entities/index.d.ts +1 -0
- package/dist/entities/route.d.ts +16 -16
- package/dist/entities/route.js +36 -36
- package/dist/entities/routerGroup.d.ts +2 -6
- package/dist/hooks/factory.js +69 -57
- package/dist/index.d.ts +4 -3
- package/dist/index.js +3 -3
- package/dist/keys/index.d.ts +1 -0
- package/dist/keys/index.js +1 -0
- package/package.json +1 -1
- package/src/decorators/arguments.ts +26 -1
- package/src/entities/index.ts +2 -0
- package/src/entities/route.ts +45 -43
- package/src/hooks/factory.ts +107 -94
- package/src/index.ts +5 -3
- package/src/keys/index.ts +1 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as Zod from "zod";
|
|
2
|
-
import { bodyArgsKey, contextArgsKey, paramArgsKey, paramsArgsKey, queryArgsKey, requestArgsKey, requestHeaderArgsKey, requestHeadersArgsKey, responseHeadersArgsKey } from "../keys";
|
|
2
|
+
import { bodyArgsKey, contextArgsKey, paramArgsKey, paramsArgsKey, queryArgsKey, requestArgsKey, requestHeaderArgsKey, requestHeadersArgsKey, responseHeadersArgsKey, routeModelArgsKey } from "../keys";
|
|
3
3
|
export type TArgumentsMetadata = {
|
|
4
4
|
index: number;
|
|
5
5
|
type: typeof requestHeadersArgsKey;
|
|
@@ -38,6 +38,9 @@ export type TArgumentsMetadata = {
|
|
|
38
38
|
index: number;
|
|
39
39
|
type: typeof contextArgsKey;
|
|
40
40
|
key?: symbol;
|
|
41
|
+
} | {
|
|
42
|
+
index: number;
|
|
43
|
+
type: typeof routeModelArgsKey;
|
|
41
44
|
};
|
|
42
45
|
export declare const RequestHeaders: (schema?: Zod.Schema) => (target: Object, methodName: string | symbol | undefined, parameterIndex: number) => void;
|
|
43
46
|
export declare const RequestHeader: (key: string, schema?: Zod.Schema) => (target: Object, methodName: string | symbol | undefined, parameterIndex: number) => void;
|
|
@@ -48,3 +51,4 @@ export declare const Query: (schema?: Zod.Schema) => (target: Object, methodName
|
|
|
48
51
|
export declare const Request: (schema?: Zod.Schema) => (target: Object, methodName: string | symbol | undefined, parameterIndex: number) => void;
|
|
49
52
|
export declare const ResponseHeaders: () => (target: Object, methodName: string | symbol | undefined, parameterIndex: number) => void;
|
|
50
53
|
export declare const Context: (key?: symbol) => (target: Object, methodName: string | symbol | undefined, parameterIndex: number) => void;
|
|
54
|
+
export declare const RouteModel: () => (target: Object, methodName: string | symbol | undefined, parameterIndex: number) => void;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as Zod from "zod";
|
|
2
|
-
import { argumentsKey, bodyArgsKey, contextArgsKey, paramArgsKey, paramsArgsKey, queryArgsKey, requestArgsKey, requestHeaderArgsKey, requestHeadersArgsKey, responseHeadersArgsKey } from "../keys";
|
|
2
|
+
import { argumentsKey, bodyArgsKey, contextArgsKey, paramArgsKey, paramsArgsKey, queryArgsKey, requestArgsKey, requestHeaderArgsKey, requestHeadersArgsKey, responseHeadersArgsKey, routeModelArgsKey } from "../keys";
|
|
3
3
|
export const RequestHeaders = (schema) => (target, methodName, parameterIndex) => {
|
|
4
4
|
if (!methodName) {
|
|
5
5
|
return;
|
|
@@ -110,3 +110,14 @@ export const Context = (key) => (target, methodName, parameterIndex) => {
|
|
|
110
110
|
};
|
|
111
111
|
Reflect.defineMetadata(argumentsKey, responseHeadersMetadata, target.constructor, methodName);
|
|
112
112
|
};
|
|
113
|
+
export const RouteModel = () => (target, methodName, parameterIndex) => {
|
|
114
|
+
if (!methodName) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const responseHeadersMetadata = Reflect.getOwnMetadata(argumentsKey, target.constructor, methodName) || {};
|
|
118
|
+
responseHeadersMetadata[`argumentIndexes.${parameterIndex}`] = {
|
|
119
|
+
index: parameterIndex,
|
|
120
|
+
type: routeModelArgsKey
|
|
121
|
+
};
|
|
122
|
+
Reflect.defineMetadata(argumentsKey, responseHeadersMetadata, target.constructor, methodName);
|
|
123
|
+
};
|
package/dist/entities/index.d.ts
CHANGED
package/dist/entities/route.d.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import type { THttpMethods } from "../http";
|
|
2
|
-
type
|
|
2
|
+
export type TRouteModel<T = unknown> = Readonly<Required<{
|
|
3
3
|
class: new (...args: Array<any>) => T;
|
|
4
4
|
funcName: string | symbol;
|
|
5
5
|
func: (...args: Array<any>) => unknown;
|
|
6
|
-
}
|
|
6
|
+
}>>;
|
|
7
7
|
export declare class Route {
|
|
8
8
|
static rootPattern: string;
|
|
9
9
|
readonly alias: string;
|
|
10
10
|
private _map;
|
|
11
11
|
constructor(alias: string);
|
|
12
12
|
test(pathname: string, method: keyof THttpMethods): Readonly<{
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
parameters: Record<string, string>;
|
|
14
|
+
model: TRouteModel;
|
|
15
15
|
}> | false | undefined;
|
|
16
16
|
/**
|
|
17
17
|
*
|
|
@@ -22,65 +22,65 @@ export declare class Route {
|
|
|
22
22
|
* @param handlers
|
|
23
23
|
* @returns
|
|
24
24
|
*/
|
|
25
|
-
get(
|
|
25
|
+
get(handler: TRouteModel): this;
|
|
26
26
|
/**
|
|
27
27
|
*
|
|
28
28
|
* @param handlers
|
|
29
29
|
* @returns
|
|
30
30
|
*/
|
|
31
|
-
post(
|
|
31
|
+
post(handler: TRouteModel): this;
|
|
32
32
|
/**
|
|
33
33
|
*
|
|
34
34
|
* @param handlers
|
|
35
35
|
* @returns
|
|
36
36
|
*/
|
|
37
|
-
put(
|
|
37
|
+
put(handler: TRouteModel): this;
|
|
38
38
|
/**
|
|
39
39
|
*
|
|
40
40
|
* @param handlers
|
|
41
41
|
* @returns
|
|
42
42
|
*/
|
|
43
|
-
delete(
|
|
43
|
+
delete(handler: TRouteModel): this;
|
|
44
44
|
/**
|
|
45
45
|
*
|
|
46
46
|
* @param handlers
|
|
47
47
|
* @returns
|
|
48
48
|
*/
|
|
49
|
-
connect(
|
|
49
|
+
connect(handler: TRouteModel): this | Map<keyof THttpMethods, Readonly<Required<{
|
|
50
50
|
class: new (...args: Array<any>) => unknown;
|
|
51
51
|
funcName: string | symbol;
|
|
52
52
|
func: (...args: Array<any>) => unknown;
|
|
53
|
-
}
|
|
53
|
+
}>>>;
|
|
54
54
|
/**
|
|
55
55
|
*
|
|
56
56
|
* @param handlers
|
|
57
57
|
* @returns
|
|
58
58
|
*/
|
|
59
|
-
options(
|
|
59
|
+
options(handler: TRouteModel): this | Map<keyof THttpMethods, Readonly<Required<{
|
|
60
60
|
class: new (...args: Array<any>) => unknown;
|
|
61
61
|
funcName: string | symbol;
|
|
62
62
|
func: (...args: Array<any>) => unknown;
|
|
63
|
-
}
|
|
63
|
+
}>>>;
|
|
64
64
|
/**
|
|
65
65
|
*
|
|
66
66
|
* @param handlers
|
|
67
67
|
* @returns
|
|
68
68
|
*/
|
|
69
|
-
trace(
|
|
69
|
+
trace(handler: TRouteModel): this | Map<keyof THttpMethods, Readonly<Required<{
|
|
70
70
|
class: new (...args: Array<any>) => unknown;
|
|
71
71
|
funcName: string | symbol;
|
|
72
72
|
func: (...args: Array<any>) => unknown;
|
|
73
|
-
}
|
|
73
|
+
}>>>;
|
|
74
74
|
/**
|
|
75
75
|
*
|
|
76
76
|
* @param handlers
|
|
77
77
|
* @returns
|
|
78
78
|
*/
|
|
79
|
-
patch(
|
|
79
|
+
patch(handler: TRouteModel): this | Map<keyof THttpMethods, Readonly<Required<{
|
|
80
80
|
class: new (...args: Array<any>) => unknown;
|
|
81
81
|
funcName: string | symbol;
|
|
82
82
|
func: (...args: Array<any>) => unknown;
|
|
83
|
-
}
|
|
83
|
+
}>>>;
|
|
84
84
|
/**
|
|
85
85
|
*
|
|
86
86
|
* @param handlers
|
package/dist/entities/route.js
CHANGED
|
@@ -8,10 +8,10 @@ export class Route {
|
|
|
8
8
|
}
|
|
9
9
|
test(pathname, method) {
|
|
10
10
|
try {
|
|
11
|
-
const
|
|
11
|
+
const model = this._map.get(method);
|
|
12
12
|
const aliasSplitted = this.alias.split("/");
|
|
13
13
|
const currentPathNameSplitted = this._thinAlias(pathname).split("/");
|
|
14
|
-
if (!
|
|
14
|
+
if (!model) {
|
|
15
15
|
return undefined;
|
|
16
16
|
}
|
|
17
17
|
// Compare splitted length
|
|
@@ -44,8 +44,8 @@ export class Route {
|
|
|
44
44
|
continue;
|
|
45
45
|
}
|
|
46
46
|
return Object.freeze({
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
parameters: parameters,
|
|
48
|
+
model: model
|
|
49
49
|
});
|
|
50
50
|
}
|
|
51
51
|
catch (err) {
|
|
@@ -109,10 +109,10 @@ export class Route {
|
|
|
109
109
|
* @param handlers
|
|
110
110
|
* @returns
|
|
111
111
|
*/
|
|
112
|
-
get(
|
|
113
|
-
const
|
|
114
|
-
if (!
|
|
115
|
-
this._map.set("GET",
|
|
112
|
+
get(handler) {
|
|
113
|
+
const currenTRouteModel = this._map.get("GET");
|
|
114
|
+
if (!currenTRouteModel) {
|
|
115
|
+
this._map.set("GET", handler);
|
|
116
116
|
}
|
|
117
117
|
return this;
|
|
118
118
|
}
|
|
@@ -121,10 +121,10 @@ export class Route {
|
|
|
121
121
|
* @param handlers
|
|
122
122
|
* @returns
|
|
123
123
|
*/
|
|
124
|
-
post(
|
|
125
|
-
const
|
|
126
|
-
if (!
|
|
127
|
-
this._map.set("POST",
|
|
124
|
+
post(handler) {
|
|
125
|
+
const currenTRouteModel = this._map.get("POST");
|
|
126
|
+
if (!currenTRouteModel) {
|
|
127
|
+
this._map.set("POST", handler);
|
|
128
128
|
}
|
|
129
129
|
return this;
|
|
130
130
|
}
|
|
@@ -133,10 +133,10 @@ export class Route {
|
|
|
133
133
|
* @param handlers
|
|
134
134
|
* @returns
|
|
135
135
|
*/
|
|
136
|
-
put(
|
|
137
|
-
const
|
|
138
|
-
if (!
|
|
139
|
-
this._map.set("PUT",
|
|
136
|
+
put(handler) {
|
|
137
|
+
const currenTRouteModel = this._map.get("PUT");
|
|
138
|
+
if (!currenTRouteModel) {
|
|
139
|
+
this._map.set("PUT", handler);
|
|
140
140
|
}
|
|
141
141
|
return this;
|
|
142
142
|
}
|
|
@@ -145,10 +145,10 @@ export class Route {
|
|
|
145
145
|
* @param handlers
|
|
146
146
|
* @returns
|
|
147
147
|
*/
|
|
148
|
-
delete(
|
|
149
|
-
const
|
|
150
|
-
if (!
|
|
151
|
-
this._map.set("DELETE",
|
|
148
|
+
delete(handler) {
|
|
149
|
+
const currenTRouteModel = this._map.get("DELETE");
|
|
150
|
+
if (!currenTRouteModel) {
|
|
151
|
+
this._map.set("DELETE", handler);
|
|
152
152
|
}
|
|
153
153
|
return this;
|
|
154
154
|
}
|
|
@@ -157,10 +157,10 @@ export class Route {
|
|
|
157
157
|
* @param handlers
|
|
158
158
|
* @returns
|
|
159
159
|
*/
|
|
160
|
-
connect(
|
|
161
|
-
const
|
|
162
|
-
if (!
|
|
163
|
-
return this._map.set("CONNECT",
|
|
160
|
+
connect(handler) {
|
|
161
|
+
const currenTRouteModel = this._map.get("CONNECT");
|
|
162
|
+
if (!currenTRouteModel) {
|
|
163
|
+
return this._map.set("CONNECT", handler);
|
|
164
164
|
}
|
|
165
165
|
return this;
|
|
166
166
|
}
|
|
@@ -169,10 +169,10 @@ export class Route {
|
|
|
169
169
|
* @param handlers
|
|
170
170
|
* @returns
|
|
171
171
|
*/
|
|
172
|
-
options(
|
|
173
|
-
const
|
|
174
|
-
if (!
|
|
175
|
-
return this._map.set("OPTIONS",
|
|
172
|
+
options(handler) {
|
|
173
|
+
const currenTRouteModel = this._map.get("OPTIONS");
|
|
174
|
+
if (!currenTRouteModel) {
|
|
175
|
+
return this._map.set("OPTIONS", handler);
|
|
176
176
|
}
|
|
177
177
|
return this;
|
|
178
178
|
}
|
|
@@ -181,10 +181,10 @@ export class Route {
|
|
|
181
181
|
* @param handlers
|
|
182
182
|
* @returns
|
|
183
183
|
*/
|
|
184
|
-
trace(
|
|
185
|
-
const
|
|
186
|
-
if (!
|
|
187
|
-
return this._map.set("TRACE",
|
|
184
|
+
trace(handler) {
|
|
185
|
+
const currenTRouteModel = this._map.get("TRACE");
|
|
186
|
+
if (!currenTRouteModel) {
|
|
187
|
+
return this._map.set("TRACE", handler);
|
|
188
188
|
}
|
|
189
189
|
return this;
|
|
190
190
|
}
|
|
@@ -193,10 +193,10 @@ export class Route {
|
|
|
193
193
|
* @param handlers
|
|
194
194
|
* @returns
|
|
195
195
|
*/
|
|
196
|
-
patch(
|
|
197
|
-
const
|
|
198
|
-
if (!
|
|
199
|
-
return this._map.set("PATCH",
|
|
196
|
+
patch(handler) {
|
|
197
|
+
const currenTRouteModel = this._map.get("PATCH");
|
|
198
|
+
if (!currenTRouteModel) {
|
|
199
|
+
return this._map.set("PATCH", handler);
|
|
200
200
|
}
|
|
201
201
|
return this;
|
|
202
202
|
}
|
|
@@ -4,11 +4,7 @@ export declare class RouterGroup {
|
|
|
4
4
|
private _routers;
|
|
5
5
|
add(...routers: Array<Router>): this;
|
|
6
6
|
find(pathame: string, method: keyof THttpMethods): Readonly<{
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class: new (...args: Array<any>) => unknown;
|
|
10
|
-
funcName: string | symbol;
|
|
11
|
-
func: (...args: Array<any>) => unknown;
|
|
12
|
-
}>>;
|
|
7
|
+
parameters: Record<string, string>;
|
|
8
|
+
model: import("./route").TRouteModel;
|
|
13
9
|
}> | undefined;
|
|
14
10
|
}
|
package/dist/hooks/factory.js
CHANGED
|
@@ -4,7 +4,7 @@ import Qs from "qs";
|
|
|
4
4
|
import * as Zod from "zod";
|
|
5
5
|
import { Router, RouterGroup } from "../entities";
|
|
6
6
|
import { HttpClientError, HttpServerError, jsonErrorInfer } from "../http";
|
|
7
|
-
import { argumentsKey, bodyArgsKey, configKey, contextArgsKey, controllerHttpKey, controllerKey, moduleKey, paramArgsKey, paramsArgsKey, queryArgsKey, requestArgsKey, requestHeaderArgsKey, requestHeadersArgsKey, responseHeadersArgsKey } from "../keys";
|
|
7
|
+
import { argumentsKey, bodyArgsKey, configKey, contextArgsKey, controllerHttpKey, controllerKey, moduleKey, paramArgsKey, paramsArgsKey, queryArgsKey, requestArgsKey, requestHeaderArgsKey, requestHeadersArgsKey, responseHeadersArgsKey, routeModelArgsKey } from "../keys";
|
|
8
8
|
import { Injector } from "./injector";
|
|
9
9
|
export const controllerCreator = (controllerConstructor, group, prefix) => {
|
|
10
10
|
if (!Reflect.getOwnMetadataKeys(controllerConstructor).includes(controllerKey)) {
|
|
@@ -26,11 +26,11 @@ export const controllerCreator = (controllerConstructor, group, prefix) => {
|
|
|
26
26
|
}
|
|
27
27
|
const route = router.route(routeMetadata.path);
|
|
28
28
|
const handler = routeMetadata.descriptor.value.bind(controller);
|
|
29
|
-
const routeArgument = {
|
|
29
|
+
const routeArgument = Object.freeze({
|
|
30
30
|
class: controllerConstructor,
|
|
31
31
|
funcName: routeMetadata.methodName,
|
|
32
32
|
func: handler
|
|
33
|
-
};
|
|
33
|
+
});
|
|
34
34
|
switch (routeMetadata.httpMethod) {
|
|
35
35
|
case "GET":
|
|
36
36
|
return route.get(routeArgument);
|
|
@@ -235,8 +235,10 @@ export const BoolFactory = async (target, options) => {
|
|
|
235
235
|
break;
|
|
236
236
|
case requestHeaderArgsKey:
|
|
237
237
|
middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
238
|
-
? headers.get(argsMetadata.key)
|
|
239
|
-
: await argumentsResolution(headers.get(argsMetadata.key), argsMetadata.zodSchema, argsMetadata.index, middlewareCollection.funcName);
|
|
238
|
+
? headers.get(argsMetadata.key) || undefined
|
|
239
|
+
: await argumentsResolution(headers.get(argsMetadata.key) || undefined, argsMetadata.zodSchema, argsMetadata.index, middlewareCollection.funcName);
|
|
240
|
+
break;
|
|
241
|
+
case routeModelArgsKey:
|
|
240
242
|
break;
|
|
241
243
|
default:
|
|
242
244
|
middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
@@ -287,8 +289,10 @@ export const BoolFactory = async (target, options) => {
|
|
|
287
289
|
break;
|
|
288
290
|
case requestHeaderArgsKey:
|
|
289
291
|
guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
290
|
-
? headers.get(argsMetadata.key)
|
|
291
|
-
: await argumentsResolution(headers.get(argsMetadata.key), argsMetadata.zodSchema, argsMetadata.index, guardCollection.funcName);
|
|
292
|
+
? headers.get(argsMetadata.key) || undefined
|
|
293
|
+
: await argumentsResolution(headers.get(argsMetadata.key) || undefined, argsMetadata.zodSchema, argsMetadata.index, guardCollection.funcName);
|
|
294
|
+
break;
|
|
295
|
+
case routeModelArgsKey:
|
|
292
296
|
break;
|
|
293
297
|
default:
|
|
294
298
|
guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
@@ -315,7 +319,8 @@ export const BoolFactory = async (target, options) => {
|
|
|
315
319
|
data: undefined
|
|
316
320
|
});
|
|
317
321
|
}
|
|
318
|
-
context[paramsArgsKey] = result.
|
|
322
|
+
context[paramsArgsKey] = result.parameters;
|
|
323
|
+
context[routeModelArgsKey] = result;
|
|
319
324
|
let responseBody = undefined;
|
|
320
325
|
// Execute before dispatcher(s)
|
|
321
326
|
for (let i = 0; i < beforeDispatcherGroup.length; i++) {
|
|
@@ -351,13 +356,16 @@ export const BoolFactory = async (target, options) => {
|
|
|
351
356
|
case requestHeaderArgsKey:
|
|
352
357
|
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
353
358
|
? headers.get(argsMetadata.key) || undefined
|
|
354
|
-
: await argumentsResolution(headers.get(argsMetadata.key), argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
|
|
359
|
+
: await argumentsResolution(headers.get(argsMetadata.key) || undefined, argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
|
|
355
360
|
break;
|
|
356
361
|
case paramArgsKey:
|
|
357
362
|
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
358
363
|
? context[paramArgsKey][argsMetadata.key] || undefined
|
|
359
364
|
: await argumentsResolution(context[paramArgsKey][argsMetadata.key], argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
|
|
360
365
|
break;
|
|
366
|
+
case routeModelArgsKey:
|
|
367
|
+
beforeDispatcherArguments[argsMetadata.index] = context[routeModelArgsKey];
|
|
368
|
+
break;
|
|
361
369
|
default:
|
|
362
370
|
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
363
371
|
? context[argsMetadata.type]
|
|
@@ -369,56 +377,57 @@ export const BoolFactory = async (target, options) => {
|
|
|
369
377
|
await beforeDispatcherCollection.func(...beforeDispatcherArguments);
|
|
370
378
|
}
|
|
371
379
|
// Execute controller action
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
380
|
+
const controllerActionArguments = [];
|
|
381
|
+
const controllerActionCollection = result.model;
|
|
382
|
+
const controllerActionMetadata = Reflect.getOwnMetadata(argumentsKey, controllerActionCollection.class, controllerActionCollection.funcName) || {};
|
|
383
|
+
if (controllerActionMetadata) {
|
|
384
|
+
for (const [_key, argsMetadata] of Object.entries(controllerActionMetadata)) {
|
|
385
|
+
switch (argsMetadata.type) {
|
|
386
|
+
case requestArgsKey:
|
|
387
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
388
|
+
? request
|
|
389
|
+
: await argumentsResolution(request, argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
|
|
390
|
+
break;
|
|
391
|
+
case bodyArgsKey:
|
|
392
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
393
|
+
? await request[argsMetadata.parser || "json"]()
|
|
394
|
+
: await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
|
|
395
|
+
break;
|
|
396
|
+
case contextArgsKey:
|
|
397
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.key
|
|
398
|
+
? contextHook
|
|
399
|
+
: contextHook.get(argsMetadata.key);
|
|
400
|
+
break;
|
|
401
|
+
case requestHeadersArgsKey:
|
|
402
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
403
|
+
? headers
|
|
404
|
+
: await argumentsResolution(headers.toJSON(), argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
|
|
405
|
+
break;
|
|
406
|
+
case responseHeadersArgsKey:
|
|
407
|
+
controllerActionArguments[argsMetadata.index] = context[argsMetadata.type];
|
|
408
|
+
break;
|
|
409
|
+
case requestHeaderArgsKey:
|
|
410
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
411
|
+
? headers.get(argsMetadata.key) || undefined
|
|
412
|
+
: await argumentsResolution(headers.get(argsMetadata.key) || undefined, argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
|
|
413
|
+
break;
|
|
414
|
+
case paramArgsKey:
|
|
415
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
416
|
+
? context[paramArgsKey][argsMetadata.key] || undefined
|
|
417
|
+
: await argumentsResolution(context[paramArgsKey][argsMetadata.key], argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
|
|
418
|
+
break;
|
|
419
|
+
case routeModelArgsKey:
|
|
420
|
+
controllerActionArguments[argsMetadata.index] = context[routeModelArgsKey];
|
|
421
|
+
break;
|
|
422
|
+
default:
|
|
423
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
424
|
+
? context[argsMetadata.type]
|
|
425
|
+
: await argumentsResolution(context[argsMetadata.type], argsMetadata.zodSchema, argsMetadata.index, controllerActionCollection.funcName);
|
|
426
|
+
break;
|
|
418
427
|
}
|
|
419
428
|
}
|
|
420
|
-
responseBody = await controllerActionCollection.func(...controllerActionArguments);
|
|
421
429
|
}
|
|
430
|
+
responseBody = await controllerActionCollection.func(...controllerActionArguments);
|
|
422
431
|
// Execute after dispatcher(s)
|
|
423
432
|
for (let i = 0; i < afterDispatcherGroup.length; i++) {
|
|
424
433
|
const afterDispatcherArguments = [];
|
|
@@ -453,13 +462,16 @@ export const BoolFactory = async (target, options) => {
|
|
|
453
462
|
case requestHeaderArgsKey:
|
|
454
463
|
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
455
464
|
? headers.get(argsMetadata.key) || undefined
|
|
456
|
-
: await argumentsResolution(headers.get(argsMetadata.key), argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
|
|
465
|
+
: await argumentsResolution(headers.get(argsMetadata.key) || undefined, argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
|
|
457
466
|
break;
|
|
458
467
|
case paramArgsKey:
|
|
459
468
|
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
460
469
|
? context[paramArgsKey][argsMetadata.key] || undefined
|
|
461
470
|
: await argumentsResolution(context[paramArgsKey][argsMetadata.key], argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
|
|
462
471
|
break;
|
|
472
|
+
case routeModelArgsKey:
|
|
473
|
+
afterDispatcherArguments[argsMetadata.index] = context[routeModelArgsKey];
|
|
474
|
+
break;
|
|
463
475
|
default:
|
|
464
476
|
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
465
477
|
? context[argsMetadata.type]
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import "reflect-metadata";
|
|
2
|
-
export
|
|
3
|
-
export * from "./interfaces";
|
|
4
|
-
export * from "./hooks";
|
|
2
|
+
export type { TRouteModel } from "./entities";
|
|
5
3
|
export * from "./decorators";
|
|
4
|
+
export * from "./hooks";
|
|
6
5
|
export * from "./http";
|
|
6
|
+
export * from "./interfaces";
|
|
7
|
+
export * as Keys from "./keys";
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import "reflect-metadata";
|
|
2
|
-
export * as Keys from "./keys";
|
|
3
|
-
export * from "./interfaces";
|
|
4
|
-
export * from "./hooks";
|
|
5
2
|
export * from "./decorators";
|
|
3
|
+
export * from "./hooks";
|
|
6
4
|
export * from "./http";
|
|
5
|
+
export * from "./interfaces";
|
|
6
|
+
export * as Keys from "./keys";
|
package/dist/keys/index.d.ts
CHANGED
|
@@ -18,3 +18,4 @@ export declare const queryArgsKey: unique symbol;
|
|
|
18
18
|
export declare const requestArgsKey: unique symbol;
|
|
19
19
|
export declare const responseHeadersArgsKey: unique symbol;
|
|
20
20
|
export declare const contextArgsKey: unique symbol;
|
|
21
|
+
export declare const routeModelArgsKey: unique symbol;
|
package/dist/keys/index.js
CHANGED
|
@@ -18,3 +18,4 @@ export const queryArgsKey = Symbol("__bool:arguments:query__");
|
|
|
18
18
|
export const requestArgsKey = Symbol("__bool:arguments:request__");
|
|
19
19
|
export const responseHeadersArgsKey = Symbol("__bool:arguments:responseHeaders__");
|
|
20
20
|
export const contextArgsKey = Symbol("__bool:arguments:context__");
|
|
21
|
+
export const routeModelArgsKey = Symbol("__bool:arguments:routeModel__");
|
package/package.json
CHANGED
|
@@ -9,7 +9,8 @@ import {
|
|
|
9
9
|
requestArgsKey,
|
|
10
10
|
requestHeaderArgsKey,
|
|
11
11
|
requestHeadersArgsKey,
|
|
12
|
-
responseHeadersArgsKey
|
|
12
|
+
responseHeadersArgsKey,
|
|
13
|
+
routeModelArgsKey
|
|
13
14
|
} from "../keys";
|
|
14
15
|
|
|
15
16
|
export type TArgumentsMetadata =
|
|
@@ -59,6 +60,10 @@ export type TArgumentsMetadata =
|
|
|
59
60
|
index: number;
|
|
60
61
|
type: typeof contextArgsKey;
|
|
61
62
|
key?: symbol;
|
|
63
|
+
}
|
|
64
|
+
| {
|
|
65
|
+
index: number;
|
|
66
|
+
type: typeof routeModelArgsKey;
|
|
62
67
|
};
|
|
63
68
|
|
|
64
69
|
export const RequestHeaders =
|
|
@@ -259,3 +264,23 @@ export const Context = (key?: symbol) => (target: Object, methodName: string | s
|
|
|
259
264
|
|
|
260
265
|
Reflect.defineMetadata(argumentsKey, responseHeadersMetadata, target.constructor, methodName);
|
|
261
266
|
};
|
|
267
|
+
|
|
268
|
+
export const RouteModel = () => (target: Object, methodName: string | symbol | undefined, parameterIndex: number) => {
|
|
269
|
+
if (!methodName) {
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const responseHeadersMetadata = Reflect.getOwnMetadata(argumentsKey, target.constructor, methodName) || {};
|
|
274
|
+
|
|
275
|
+
responseHeadersMetadata[`argumentIndexes.${parameterIndex}`] = {
|
|
276
|
+
index: parameterIndex,
|
|
277
|
+
type: routeModelArgsKey
|
|
278
|
+
} satisfies Extract<
|
|
279
|
+
TArgumentsMetadata,
|
|
280
|
+
{
|
|
281
|
+
type: typeof routeModelArgsKey;
|
|
282
|
+
}
|
|
283
|
+
>;
|
|
284
|
+
|
|
285
|
+
Reflect.defineMetadata(argumentsKey, responseHeadersMetadata, target.constructor, methodName);
|
|
286
|
+
};
|
package/src/entities/index.ts
CHANGED
package/src/entities/route.ts
CHANGED
|
@@ -2,18 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
import type { THttpMethods } from "../http";
|
|
4
4
|
|
|
5
|
-
type
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
export type TRouteModel<T = unknown> = Readonly<
|
|
6
|
+
Required<{
|
|
7
|
+
class: new (...args: Array<any>) => T;
|
|
8
|
+
funcName: string | symbol;
|
|
9
|
+
func: (...args: Array<any>) => unknown;
|
|
10
|
+
}>
|
|
11
|
+
>;
|
|
10
12
|
|
|
11
13
|
export class Route {
|
|
12
14
|
public static rootPattern = ":([a-z0-9A-Z_.-]{1,})";
|
|
13
15
|
|
|
14
16
|
public readonly alias: string;
|
|
15
17
|
|
|
16
|
-
private _map = new Map<keyof THttpMethods,
|
|
18
|
+
private _map = new Map<keyof THttpMethods, TRouteModel>();
|
|
17
19
|
|
|
18
20
|
constructor(alias: string) {
|
|
19
21
|
this.alias = this._thinAlias(alias);
|
|
@@ -22,13 +24,13 @@ export class Route {
|
|
|
22
24
|
public test(
|
|
23
25
|
pathname: string,
|
|
24
26
|
method: keyof THttpMethods
|
|
25
|
-
): Readonly<{
|
|
27
|
+
): Readonly<{ parameters: Record<string, string>; model: TRouteModel }> | false | undefined {
|
|
26
28
|
try {
|
|
27
|
-
const
|
|
29
|
+
const model = this._map.get(method);
|
|
28
30
|
const aliasSplitted = this.alias.split("/");
|
|
29
31
|
const currentPathNameSplitted = this._thinAlias(pathname).split("/");
|
|
30
32
|
|
|
31
|
-
if (!
|
|
33
|
+
if (!model) {
|
|
32
34
|
return undefined;
|
|
33
35
|
}
|
|
34
36
|
|
|
@@ -68,8 +70,8 @@ export class Route {
|
|
|
68
70
|
}
|
|
69
71
|
|
|
70
72
|
return Object.freeze({
|
|
71
|
-
|
|
72
|
-
|
|
73
|
+
parameters: parameters,
|
|
74
|
+
model: model
|
|
73
75
|
});
|
|
74
76
|
} catch (err) {
|
|
75
77
|
console.error(err);
|
|
@@ -141,11 +143,11 @@ export class Route {
|
|
|
141
143
|
* @param handlers
|
|
142
144
|
* @returns
|
|
143
145
|
*/
|
|
144
|
-
public get(
|
|
145
|
-
const
|
|
146
|
+
public get(handler: TRouteModel) {
|
|
147
|
+
const currenTRouteModel = this._map.get("GET");
|
|
146
148
|
|
|
147
|
-
if (!
|
|
148
|
-
this._map.set("GET",
|
|
149
|
+
if (!currenTRouteModel) {
|
|
150
|
+
this._map.set("GET", handler);
|
|
149
151
|
}
|
|
150
152
|
|
|
151
153
|
return this;
|
|
@@ -156,11 +158,11 @@ export class Route {
|
|
|
156
158
|
* @param handlers
|
|
157
159
|
* @returns
|
|
158
160
|
*/
|
|
159
|
-
public post(
|
|
160
|
-
const
|
|
161
|
+
public post(handler: TRouteModel) {
|
|
162
|
+
const currenTRouteModel = this._map.get("POST");
|
|
161
163
|
|
|
162
|
-
if (!
|
|
163
|
-
this._map.set("POST",
|
|
164
|
+
if (!currenTRouteModel) {
|
|
165
|
+
this._map.set("POST", handler);
|
|
164
166
|
}
|
|
165
167
|
|
|
166
168
|
return this;
|
|
@@ -171,11 +173,11 @@ export class Route {
|
|
|
171
173
|
* @param handlers
|
|
172
174
|
* @returns
|
|
173
175
|
*/
|
|
174
|
-
public put(
|
|
175
|
-
const
|
|
176
|
+
public put(handler: TRouteModel) {
|
|
177
|
+
const currenTRouteModel = this._map.get("PUT");
|
|
176
178
|
|
|
177
|
-
if (!
|
|
178
|
-
this._map.set("PUT",
|
|
179
|
+
if (!currenTRouteModel) {
|
|
180
|
+
this._map.set("PUT", handler);
|
|
179
181
|
}
|
|
180
182
|
|
|
181
183
|
return this;
|
|
@@ -186,11 +188,11 @@ export class Route {
|
|
|
186
188
|
* @param handlers
|
|
187
189
|
* @returns
|
|
188
190
|
*/
|
|
189
|
-
public delete(
|
|
190
|
-
const
|
|
191
|
+
public delete(handler: TRouteModel) {
|
|
192
|
+
const currenTRouteModel = this._map.get("DELETE");
|
|
191
193
|
|
|
192
|
-
if (!
|
|
193
|
-
this._map.set("DELETE",
|
|
194
|
+
if (!currenTRouteModel) {
|
|
195
|
+
this._map.set("DELETE", handler);
|
|
194
196
|
}
|
|
195
197
|
|
|
196
198
|
return this;
|
|
@@ -201,11 +203,11 @@ export class Route {
|
|
|
201
203
|
* @param handlers
|
|
202
204
|
* @returns
|
|
203
205
|
*/
|
|
204
|
-
public connect(
|
|
205
|
-
const
|
|
206
|
+
public connect(handler: TRouteModel) {
|
|
207
|
+
const currenTRouteModel = this._map.get("CONNECT");
|
|
206
208
|
|
|
207
|
-
if (!
|
|
208
|
-
return this._map.set("CONNECT",
|
|
209
|
+
if (!currenTRouteModel) {
|
|
210
|
+
return this._map.set("CONNECT", handler);
|
|
209
211
|
}
|
|
210
212
|
|
|
211
213
|
return this;
|
|
@@ -216,11 +218,11 @@ export class Route {
|
|
|
216
218
|
* @param handlers
|
|
217
219
|
* @returns
|
|
218
220
|
*/
|
|
219
|
-
public options(
|
|
220
|
-
const
|
|
221
|
+
public options(handler: TRouteModel) {
|
|
222
|
+
const currenTRouteModel = this._map.get("OPTIONS");
|
|
221
223
|
|
|
222
|
-
if (!
|
|
223
|
-
return this._map.set("OPTIONS",
|
|
224
|
+
if (!currenTRouteModel) {
|
|
225
|
+
return this._map.set("OPTIONS", handler);
|
|
224
226
|
}
|
|
225
227
|
|
|
226
228
|
return this;
|
|
@@ -231,11 +233,11 @@ export class Route {
|
|
|
231
233
|
* @param handlers
|
|
232
234
|
* @returns
|
|
233
235
|
*/
|
|
234
|
-
public trace(
|
|
235
|
-
const
|
|
236
|
+
public trace(handler: TRouteModel) {
|
|
237
|
+
const currenTRouteModel = this._map.get("TRACE");
|
|
236
238
|
|
|
237
|
-
if (!
|
|
238
|
-
return this._map.set("TRACE",
|
|
239
|
+
if (!currenTRouteModel) {
|
|
240
|
+
return this._map.set("TRACE", handler);
|
|
239
241
|
}
|
|
240
242
|
|
|
241
243
|
return this;
|
|
@@ -246,11 +248,11 @@ export class Route {
|
|
|
246
248
|
* @param handlers
|
|
247
249
|
* @returns
|
|
248
250
|
*/
|
|
249
|
-
public patch(
|
|
250
|
-
const
|
|
251
|
+
public patch(handler: TRouteModel) {
|
|
252
|
+
const currenTRouteModel = this._map.get("PATCH");
|
|
251
253
|
|
|
252
|
-
if (!
|
|
253
|
-
return this._map.set("PATCH",
|
|
254
|
+
if (!currenTRouteModel) {
|
|
255
|
+
return this._map.set("PATCH", handler);
|
|
254
256
|
}
|
|
255
257
|
|
|
256
258
|
return this;
|
package/src/hooks/factory.ts
CHANGED
|
@@ -24,7 +24,8 @@ import {
|
|
|
24
24
|
requestArgsKey,
|
|
25
25
|
requestHeaderArgsKey,
|
|
26
26
|
requestHeadersArgsKey,
|
|
27
|
-
responseHeadersArgsKey
|
|
27
|
+
responseHeadersArgsKey,
|
|
28
|
+
routeModelArgsKey
|
|
28
29
|
} from "../keys";
|
|
29
30
|
import { Injector } from "./injector";
|
|
30
31
|
|
|
@@ -70,11 +71,11 @@ export const controllerCreator = (
|
|
|
70
71
|
|
|
71
72
|
const route = router.route(routeMetadata.path);
|
|
72
73
|
const handler = routeMetadata.descriptor.value.bind(controller);
|
|
73
|
-
const routeArgument = {
|
|
74
|
+
const routeArgument = Object.freeze({
|
|
74
75
|
class: controllerConstructor,
|
|
75
76
|
funcName: routeMetadata.methodName,
|
|
76
77
|
func: handler
|
|
77
|
-
};
|
|
78
|
+
});
|
|
78
79
|
|
|
79
80
|
switch (routeMetadata.httpMethod) {
|
|
80
81
|
case "GET":
|
|
@@ -343,14 +344,16 @@ export const BoolFactory = async (target: new (...args: any[]) => unknown, optio
|
|
|
343
344
|
break;
|
|
344
345
|
case requestHeaderArgsKey:
|
|
345
346
|
middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
346
|
-
? headers.get(argsMetadata.key)
|
|
347
|
+
? headers.get(argsMetadata.key) || undefined
|
|
347
348
|
: await argumentsResolution(
|
|
348
|
-
headers.get(argsMetadata.key),
|
|
349
|
+
headers.get(argsMetadata.key) || undefined,
|
|
349
350
|
argsMetadata.zodSchema,
|
|
350
351
|
argsMetadata.index,
|
|
351
352
|
middlewareCollection.funcName
|
|
352
353
|
);
|
|
353
354
|
break;
|
|
355
|
+
case routeModelArgsKey:
|
|
356
|
+
break;
|
|
354
357
|
default:
|
|
355
358
|
middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
356
359
|
? !(argsMetadata.type in context)
|
|
@@ -426,14 +429,16 @@ export const BoolFactory = async (target: new (...args: any[]) => unknown, optio
|
|
|
426
429
|
break;
|
|
427
430
|
case requestHeaderArgsKey:
|
|
428
431
|
guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
429
|
-
? headers.get(argsMetadata.key)
|
|
432
|
+
? headers.get(argsMetadata.key) || undefined
|
|
430
433
|
: await argumentsResolution(
|
|
431
|
-
headers.get(argsMetadata.key),
|
|
434
|
+
headers.get(argsMetadata.key) || undefined,
|
|
432
435
|
argsMetadata.zodSchema,
|
|
433
436
|
argsMetadata.index,
|
|
434
437
|
guardCollection.funcName
|
|
435
438
|
);
|
|
436
439
|
break;
|
|
440
|
+
case routeModelArgsKey:
|
|
441
|
+
break;
|
|
437
442
|
default:
|
|
438
443
|
guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
439
444
|
? context[argsMetadata.type]
|
|
@@ -469,7 +474,8 @@ export const BoolFactory = async (target: new (...args: any[]) => unknown, optio
|
|
|
469
474
|
});
|
|
470
475
|
}
|
|
471
476
|
|
|
472
|
-
context[paramsArgsKey] = result.
|
|
477
|
+
context[paramsArgsKey] = result.parameters;
|
|
478
|
+
context[routeModelArgsKey] = result;
|
|
473
479
|
|
|
474
480
|
let responseBody = undefined;
|
|
475
481
|
|
|
@@ -529,7 +535,7 @@ export const BoolFactory = async (target: new (...args: any[]) => unknown, optio
|
|
|
529
535
|
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
530
536
|
? headers.get(argsMetadata.key) || undefined
|
|
531
537
|
: await argumentsResolution(
|
|
532
|
-
headers.get(argsMetadata.key),
|
|
538
|
+
headers.get(argsMetadata.key) || undefined,
|
|
533
539
|
argsMetadata.zodSchema,
|
|
534
540
|
argsMetadata.index,
|
|
535
541
|
beforeDispatcherCollection.funcName
|
|
@@ -545,6 +551,9 @@ export const BoolFactory = async (target: new (...args: any[]) => unknown, optio
|
|
|
545
551
|
beforeDispatcherCollection.funcName
|
|
546
552
|
);
|
|
547
553
|
break;
|
|
554
|
+
case routeModelArgsKey:
|
|
555
|
+
beforeDispatcherArguments[argsMetadata.index] = context[routeModelArgsKey];
|
|
556
|
+
break;
|
|
548
557
|
default:
|
|
549
558
|
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
550
559
|
? context[argsMetadata.type]
|
|
@@ -563,94 +572,95 @@ export const BoolFactory = async (target: new (...args: any[]) => unknown, optio
|
|
|
563
572
|
}
|
|
564
573
|
|
|
565
574
|
// Execute controller action
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
575
|
+
const controllerActionArguments: any[] = [];
|
|
576
|
+
const controllerActionCollection = result.model;
|
|
577
|
+
const controllerActionMetadata: Record<string, TArgumentsMetadata> =
|
|
578
|
+
Reflect.getOwnMetadata(
|
|
579
|
+
argumentsKey,
|
|
580
|
+
controllerActionCollection.class,
|
|
581
|
+
controllerActionCollection.funcName
|
|
582
|
+
) || {};
|
|
583
|
+
|
|
584
|
+
if (controllerActionMetadata) {
|
|
585
|
+
for (const [_key, argsMetadata] of Object.entries(controllerActionMetadata)) {
|
|
586
|
+
switch (argsMetadata.type) {
|
|
587
|
+
case requestArgsKey:
|
|
588
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
589
|
+
? request
|
|
590
|
+
: await argumentsResolution(
|
|
591
|
+
request,
|
|
592
|
+
argsMetadata.zodSchema,
|
|
593
|
+
argsMetadata.index,
|
|
594
|
+
controllerActionCollection.funcName
|
|
595
|
+
);
|
|
596
|
+
break;
|
|
597
|
+
case bodyArgsKey:
|
|
598
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
599
|
+
? await request[argsMetadata.parser || "json"]()
|
|
600
|
+
: await argumentsResolution(
|
|
601
|
+
await request[argsMetadata.parser || "json"](),
|
|
602
|
+
argsMetadata.zodSchema,
|
|
603
|
+
argsMetadata.index,
|
|
604
|
+
controllerActionCollection.funcName
|
|
605
|
+
);
|
|
606
|
+
break;
|
|
607
|
+
case contextArgsKey:
|
|
608
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.key
|
|
609
|
+
? contextHook
|
|
610
|
+
: contextHook.get(argsMetadata.key);
|
|
611
|
+
break;
|
|
612
|
+
case requestHeadersArgsKey:
|
|
613
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
614
|
+
? headers
|
|
615
|
+
: await argumentsResolution(
|
|
616
|
+
headers.toJSON(),
|
|
617
|
+
argsMetadata.zodSchema,
|
|
618
|
+
argsMetadata.index,
|
|
619
|
+
controllerActionCollection.funcName
|
|
620
|
+
);
|
|
621
|
+
break;
|
|
622
|
+
case responseHeadersArgsKey:
|
|
623
|
+
controllerActionArguments[argsMetadata.index] = context[argsMetadata.type];
|
|
624
|
+
break;
|
|
625
|
+
case requestHeaderArgsKey:
|
|
626
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
627
|
+
? headers.get(argsMetadata.key) || undefined
|
|
628
|
+
: await argumentsResolution(
|
|
629
|
+
headers.get(argsMetadata.key) || undefined,
|
|
630
|
+
argsMetadata.zodSchema,
|
|
631
|
+
argsMetadata.index,
|
|
632
|
+
controllerActionCollection.funcName
|
|
633
|
+
);
|
|
634
|
+
break;
|
|
635
|
+
case paramArgsKey:
|
|
636
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
637
|
+
? context[paramArgsKey][argsMetadata.key] || undefined
|
|
638
|
+
: await argumentsResolution(
|
|
639
|
+
context[paramArgsKey][argsMetadata.key],
|
|
640
|
+
argsMetadata.zodSchema,
|
|
641
|
+
argsMetadata.index,
|
|
642
|
+
controllerActionCollection.funcName
|
|
643
|
+
);
|
|
644
|
+
break;
|
|
645
|
+
case routeModelArgsKey:
|
|
646
|
+
controllerActionArguments[argsMetadata.index] = context[routeModelArgsKey];
|
|
647
|
+
break;
|
|
648
|
+
default:
|
|
649
|
+
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
650
|
+
? context[argsMetadata.type]
|
|
651
|
+
: await argumentsResolution(
|
|
652
|
+
context[argsMetadata.type],
|
|
653
|
+
argsMetadata.zodSchema,
|
|
654
|
+
argsMetadata.index,
|
|
655
|
+
controllerActionCollection.funcName
|
|
656
|
+
);
|
|
657
|
+
break;
|
|
648
658
|
}
|
|
649
659
|
}
|
|
650
|
-
|
|
651
|
-
responseBody = await controllerActionCollection.func(...controllerActionArguments);
|
|
652
660
|
}
|
|
653
661
|
|
|
662
|
+
responseBody = await controllerActionCollection.func(...controllerActionArguments);
|
|
663
|
+
|
|
654
664
|
// Execute after dispatcher(s)
|
|
655
665
|
for (let i = 0; i < afterDispatcherGroup.length; i++) {
|
|
656
666
|
const afterDispatcherArguments = [];
|
|
@@ -707,7 +717,7 @@ export const BoolFactory = async (target: new (...args: any[]) => unknown, optio
|
|
|
707
717
|
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
708
718
|
? headers.get(argsMetadata.key) || undefined
|
|
709
719
|
: await argumentsResolution(
|
|
710
|
-
headers.get(argsMetadata.key),
|
|
720
|
+
headers.get(argsMetadata.key) || undefined,
|
|
711
721
|
argsMetadata.zodSchema,
|
|
712
722
|
argsMetadata.index,
|
|
713
723
|
afterDispatcherCollection.funcName
|
|
@@ -723,6 +733,9 @@ export const BoolFactory = async (target: new (...args: any[]) => unknown, optio
|
|
|
723
733
|
afterDispatcherCollection.funcName
|
|
724
734
|
);
|
|
725
735
|
break;
|
|
736
|
+
case routeModelArgsKey:
|
|
737
|
+
afterDispatcherArguments[argsMetadata.index] = context[routeModelArgsKey];
|
|
738
|
+
break;
|
|
726
739
|
default:
|
|
727
740
|
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
728
741
|
? context[argsMetadata.type]
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import "reflect-metadata";
|
|
2
2
|
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
export * from "./hooks";
|
|
3
|
+
export type { TRouteModel } from "./entities";
|
|
4
|
+
|
|
6
5
|
export * from "./decorators";
|
|
6
|
+
export * from "./hooks";
|
|
7
7
|
export * from "./http";
|
|
8
|
+
export * from "./interfaces";
|
|
9
|
+
export * as Keys from "./keys";
|
package/src/keys/index.ts
CHANGED
|
@@ -19,3 +19,4 @@ export const queryArgsKey = Symbol("__bool:arguments:query__");
|
|
|
19
19
|
export const requestArgsKey = Symbol("__bool:arguments:request__");
|
|
20
20
|
export const responseHeadersArgsKey = Symbol("__bool:arguments:responseHeaders__");
|
|
21
21
|
export const contextArgsKey = Symbol("__bool:arguments:context__");
|
|
22
|
+
export const routeModelArgsKey = Symbol("__bool:arguments:routeModel__");
|