@bool-ts/core 1.4.1 → 1.5.0
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/.prettierrc +11 -11
- package/LICENSE +21 -21
- package/__test/afterDispatcher.ts +9 -0
- package/__test/beforeDispatcher.ts +9 -0
- package/__test/controller.ts +66 -66
- package/__test/firstGuard.ts +10 -0
- package/__test/firstMiddleware.ts +9 -0
- package/__test/index.ts +8 -8
- package/__test/interfaces.ts +7 -7
- package/__test/module.ts +25 -16
- package/__test/repository.ts +16 -16
- package/__test/secondGuard.ts +10 -0
- package/__test/secondMiddleware.ts +9 -0
- package/__test/service.ts +20 -20
- package/bun.lockb +0 -0
- package/dist/decorators/arguments.d.ts +12 -6
- package/dist/decorators/arguments.js +39 -26
- package/dist/decorators/controller.d.ts +9 -1
- package/dist/decorators/controller.js +6 -4
- package/dist/decorators/dispatcher.d.ts +7 -0
- package/dist/decorators/dispatcher.js +9 -0
- package/dist/decorators/guard.d.ts +7 -0
- package/dist/decorators/guard.js +9 -0
- package/dist/decorators/http.d.ts +4 -3
- package/dist/decorators/http.js +6 -5
- package/dist/decorators/index.d.ts +13 -3
- package/dist/decorators/index.js +5 -2
- package/dist/decorators/injectable.d.ts +1 -1
- package/dist/decorators/injectable.js +1 -4
- package/dist/decorators/middleware.d.ts +7 -0
- package/dist/decorators/middleware.js +9 -0
- package/dist/decorators/module.d.ts +28 -7
- package/dist/decorators/module.js +48 -1
- package/dist/entities/route.d.ts +5 -5
- package/dist/entities/routerGroup.d.ts +1 -1
- package/dist/hooks/factory.d.ts +3 -3
- package/dist/hooks/factory.js +282 -60
- package/dist/hooks/injector.js +6 -5
- package/dist/interfaces/index.d.ts +5 -2
- package/dist/interfaces/index.js +1 -1
- package/package.json +1 -1
- package/src/decorators/arguments.ts +214 -186
- package/src/decorators/controller.ts +22 -14
- package/src/decorators/dispatcher.ts +19 -0
- package/src/decorators/guard.ts +19 -0
- package/src/decorators/http.ts +81 -81
- package/src/decorators/index.ts +28 -7
- package/src/decorators/inject.ts +13 -13
- package/src/decorators/injectable.ts +8 -11
- package/src/decorators/middleware.ts +19 -0
- package/src/decorators/module.ts +100 -21
- package/src/decorators/zodSchema.ts +20 -20
- package/src/entities/index.ts +3 -3
- package/src/entities/route.ts +328 -328
- package/src/entities/router.ts +35 -35
- package/src/entities/routerGroup.ts +34 -34
- package/src/hooks/factory.ts +653 -319
- package/src/hooks/index.ts +2 -2
- package/src/hooks/injector.ts +43 -43
- package/src/http/clientError.ts +45 -45
- package/src/http/index.ts +63 -63
- package/src/http/serverError.ts +38 -38
- package/src/index.ts +6 -6
- package/src/interfaces/controller.d.ts +1 -0
- package/src/interfaces/dispatcher.d.ts +3 -0
- package/src/interfaces/guard.d.ts +3 -0
- package/src/interfaces/index.ts +5 -3
- package/src/interfaces/middleware.d.ts +3 -0
- package/src/interfaces/module.d.ts +1 -0
- package/test.http +31 -30
- package/tsconfig.json +107 -107
package/dist/hooks/factory.js
CHANGED
|
@@ -3,11 +3,10 @@ import "reflect-metadata";
|
|
|
3
3
|
import Qs from "qs";
|
|
4
4
|
import * as Zod from "zod";
|
|
5
5
|
import { Router, RouterGroup } from "../entities";
|
|
6
|
-
import { controllerKey,
|
|
6
|
+
import { controllerHttpKey, controllerKey, argumentsKey, moduleKey, EArgumentTypes } from "../decorators";
|
|
7
7
|
import { HttpClientError, HttpServerError, jsonErrorInfer } from "../http";
|
|
8
8
|
import { Injector } from "./injector";
|
|
9
|
-
|
|
10
|
-
export const controllerCreator = (controllerConstructor, group) => {
|
|
9
|
+
export const controllerCreator = (controllerConstructor, group, prefix) => {
|
|
11
10
|
if (!Reflect.getOwnMetadataKeys(controllerConstructor).includes(controllerKey)) {
|
|
12
11
|
throw Error(`${controllerConstructor.name} is not a controller.`);
|
|
13
12
|
}
|
|
@@ -15,18 +14,19 @@ export const controllerCreator = (controllerConstructor, group) => {
|
|
|
15
14
|
if (!controller) {
|
|
16
15
|
throw Error("Can not initialize controller.");
|
|
17
16
|
}
|
|
18
|
-
const controllerMetadata = Reflect.getOwnMetadata(controllerKey, controllerConstructor) ||
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const
|
|
17
|
+
const controllerMetadata = Reflect.getOwnMetadata(controllerKey, controllerConstructor) || {
|
|
18
|
+
prefix: "/"
|
|
19
|
+
};
|
|
20
|
+
const routesMetadata = (Reflect.getOwnMetadata(controllerHttpKey, controllerConstructor) || []);
|
|
21
|
+
const router = new Router(controllerMetadata.prefix);
|
|
22
22
|
routesMetadata.forEach((routeMetadata) => {
|
|
23
23
|
if (typeof routeMetadata.descriptor.value !== "function") {
|
|
24
24
|
return;
|
|
25
25
|
}
|
|
26
|
-
const route = router.route(`/${routeMetadata.path}`);
|
|
26
|
+
const route = router.route(`/${prefix || ""}/${routeMetadata.path}`);
|
|
27
27
|
const handler = routeMetadata.descriptor.value.bind(controller);
|
|
28
28
|
const routeArgument = {
|
|
29
|
-
|
|
29
|
+
class: controllerConstructor,
|
|
30
30
|
funcName: routeMetadata.methodName,
|
|
31
31
|
func: handler
|
|
32
32
|
};
|
|
@@ -47,7 +47,7 @@ export const controllerCreator = (controllerConstructor, group) => {
|
|
|
47
47
|
});
|
|
48
48
|
return group.add(router);
|
|
49
49
|
};
|
|
50
|
-
export const
|
|
50
|
+
export const argumentsResolution = async (data, zodSchema, argumentIndex, funcName) => {
|
|
51
51
|
try {
|
|
52
52
|
const validation = await zodSchema.safeParseAsync(data);
|
|
53
53
|
if (!validation.success) {
|
|
@@ -83,31 +83,90 @@ export const BoolFactory = (target, options) => {
|
|
|
83
83
|
throw Error(`${target.name} is not a module.`);
|
|
84
84
|
}
|
|
85
85
|
const moduleMetadata = Reflect.getOwnMetadata(moduleKey, target);
|
|
86
|
-
|
|
86
|
+
if (!moduleMetadata) {
|
|
87
|
+
return Bun.serve({
|
|
88
|
+
port: options.port,
|
|
89
|
+
fetch: () => new Response()
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
const { middlewares, guards, beforeDispatchers, controllers, afterDispatchers, options: moduleOptions } = moduleMetadata;
|
|
93
|
+
// Middleware(s)
|
|
94
|
+
const middlewareGroup = !middlewares
|
|
95
|
+
? []
|
|
96
|
+
: middlewares.map((middleware) => {
|
|
97
|
+
const middlewareInstance = Injector.get(middleware);
|
|
98
|
+
return Object.freeze({
|
|
99
|
+
class: middleware,
|
|
100
|
+
funcName: "enforce",
|
|
101
|
+
func: middlewareInstance.enforce.bind(middlewareInstance)
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
// Guard(s)
|
|
105
|
+
const guardGroup = !guards
|
|
106
|
+
? []
|
|
107
|
+
: guards.map((guard) => {
|
|
108
|
+
const guardInstance = Injector.get(guard);
|
|
109
|
+
return Object.freeze({
|
|
110
|
+
class: guard,
|
|
111
|
+
funcName: "enforce",
|
|
112
|
+
func: guardInstance.enforce.bind(guardInstance)
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
// Before dispatcher(s)
|
|
116
|
+
const beforeDispatcherGroup = !beforeDispatchers
|
|
117
|
+
? []
|
|
118
|
+
: beforeDispatchers.map((beforeDispatcher) => {
|
|
119
|
+
const beforeDispatcherInstance = Injector.get(beforeDispatcher);
|
|
120
|
+
return Object.freeze({
|
|
121
|
+
class: beforeDispatcher,
|
|
122
|
+
funcName: "execute",
|
|
123
|
+
func: beforeDispatcherInstance.execute.bind(beforeDispatcherInstance)
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
// Controller(s)
|
|
127
|
+
const routerGroup = new RouterGroup();
|
|
128
|
+
controllers &&
|
|
129
|
+
controllers.map((controllerConstructor) => controllerCreator(controllerConstructor, routerGroup, options.prefix));
|
|
130
|
+
const allowOrigins = !moduleOptions?.allowOrigins
|
|
87
131
|
? ["*"]
|
|
88
|
-
: typeof
|
|
89
|
-
?
|
|
90
|
-
: [
|
|
91
|
-
const allowMethods = !
|
|
132
|
+
: typeof moduleOptions.allowOrigins !== "string"
|
|
133
|
+
? moduleOptions.allowOrigins
|
|
134
|
+
: [moduleOptions.allowOrigins];
|
|
135
|
+
const allowMethods = !moduleOptions?.allowMethods
|
|
92
136
|
? ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"]
|
|
93
|
-
:
|
|
137
|
+
: moduleOptions.allowMethods;
|
|
94
138
|
const { allowLogsMethods } = Object.freeze({
|
|
95
|
-
allowLogsMethods:
|
|
139
|
+
allowLogsMethods: options?.log?.methods
|
|
96
140
|
});
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
141
|
+
// After dispatcher(s)
|
|
142
|
+
const afterDispatcherGroup = !afterDispatchers
|
|
143
|
+
? []
|
|
144
|
+
: afterDispatchers.map((afterDispatcher) => {
|
|
145
|
+
const afterDispatcherInstance = Injector.get(afterDispatcher);
|
|
146
|
+
return Object.freeze({
|
|
147
|
+
class: afterDispatcher,
|
|
148
|
+
funcName: "execute",
|
|
149
|
+
func: afterDispatcherInstance.execute.bind(afterDispatcherInstance)
|
|
150
|
+
});
|
|
151
|
+
});
|
|
100
152
|
Bun.serve({
|
|
101
153
|
port: options.port,
|
|
102
|
-
async
|
|
154
|
+
fetch: async (request) => {
|
|
103
155
|
const start = performance.now();
|
|
104
156
|
const url = new URL(request.url);
|
|
105
157
|
try {
|
|
106
158
|
const reqHeaders = request.headers;
|
|
107
159
|
const origin = reqHeaders.get("origin");
|
|
160
|
+
const resHeaders = new Headers({
|
|
161
|
+
"Access-Control-Allow-Origin": origin || "*",
|
|
162
|
+
"Access-Control-Allow-Headers": "*",
|
|
163
|
+
"Access-Control-Allow-Credentials": "true",
|
|
164
|
+
"Access-Control-Allow-Methods": allowMethods.join(", "),
|
|
165
|
+
"Content-Type": "application/json"
|
|
166
|
+
});
|
|
108
167
|
if (!allowOrigins.includes("*")) {
|
|
109
168
|
if (!origin) {
|
|
110
|
-
|
|
169
|
+
return new Response(JSON.stringify({
|
|
111
170
|
httpCode: 403,
|
|
112
171
|
message: "Origin not found.",
|
|
113
172
|
data: {
|
|
@@ -116,18 +175,26 @@ export const BoolFactory = (target, options) => {
|
|
|
116
175
|
message: "Origin not found."
|
|
117
176
|
}
|
|
118
177
|
}
|
|
178
|
+
}), {
|
|
179
|
+
status: 403,
|
|
180
|
+
statusText: "Origin not found.",
|
|
181
|
+
headers: resHeaders
|
|
119
182
|
});
|
|
120
183
|
}
|
|
121
184
|
if (!allowOrigins.includes(origin)) {
|
|
122
|
-
|
|
185
|
+
return new Response(JSON.stringify({
|
|
123
186
|
httpCode: 403,
|
|
124
|
-
message: "
|
|
187
|
+
message: "Origin not found.",
|
|
125
188
|
data: {
|
|
126
189
|
origin: {
|
|
127
190
|
code: "origin:invalid:0x00002",
|
|
128
191
|
message: "Invalid origin."
|
|
129
192
|
}
|
|
130
193
|
}
|
|
194
|
+
}), {
|
|
195
|
+
status: 403,
|
|
196
|
+
statusText: "Invalid origin.",
|
|
197
|
+
headers: resHeaders
|
|
131
198
|
});
|
|
132
199
|
}
|
|
133
200
|
}
|
|
@@ -138,6 +205,71 @@ export const BoolFactory = (target, options) => {
|
|
|
138
205
|
data: undefined
|
|
139
206
|
});
|
|
140
207
|
}
|
|
208
|
+
// Execute middleware(s)
|
|
209
|
+
for (let i = 0; i < middlewareGroup.length; i++) {
|
|
210
|
+
const middlewareArguments = [];
|
|
211
|
+
const middlewareCollection = middlewareGroup[i];
|
|
212
|
+
const middlewareMetadata = Reflect.getOwnMetadata(argumentsKey, middlewareCollection.class, middlewareCollection.funcName) || {};
|
|
213
|
+
if (middlewareMetadata) {
|
|
214
|
+
for (const [_key, argsMetadata] of Object.entries(middlewareMetadata)) {
|
|
215
|
+
switch (argsMetadata.type) {
|
|
216
|
+
case EArgumentTypes.requestHeaders:
|
|
217
|
+
middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
218
|
+
? reqHeaders
|
|
219
|
+
: await argumentsResolution(reqHeaders, argsMetadata.zodSchema, argsMetadata.index, middlewareCollection.funcName);
|
|
220
|
+
break;
|
|
221
|
+
case EArgumentTypes.body:
|
|
222
|
+
middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
223
|
+
? await request[argsMetadata.parser || "json"]()
|
|
224
|
+
: await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, middlewareCollection.funcName);
|
|
225
|
+
break;
|
|
226
|
+
case EArgumentTypes.request:
|
|
227
|
+
middlewareArguments[argsMetadata.index] = request;
|
|
228
|
+
break;
|
|
229
|
+
case EArgumentTypes.responseHeaders:
|
|
230
|
+
middlewareArguments[argsMetadata.index] = resHeaders;
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
await middlewareCollection.func(...middlewareArguments);
|
|
236
|
+
}
|
|
237
|
+
// Execute guard(s)
|
|
238
|
+
for (let i = 0; i < guardGroup.length; i++) {
|
|
239
|
+
const guardArguments = [];
|
|
240
|
+
const guardCollection = guardGroup[i];
|
|
241
|
+
const guardMetadata = Reflect.getOwnMetadata(argumentsKey, guardCollection.class, guardCollection.funcName) || {};
|
|
242
|
+
if (guardMetadata) {
|
|
243
|
+
for (const [_key, argsMetadata] of Object.entries(guardMetadata)) {
|
|
244
|
+
switch (argsMetadata.type) {
|
|
245
|
+
case EArgumentTypes.requestHeaders:
|
|
246
|
+
guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
247
|
+
? reqHeaders
|
|
248
|
+
: await argumentsResolution(reqHeaders, argsMetadata.zodSchema, argsMetadata.index, guardCollection.funcName);
|
|
249
|
+
break;
|
|
250
|
+
case EArgumentTypes.body:
|
|
251
|
+
guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
252
|
+
? await request[argsMetadata.parser || "json"]()
|
|
253
|
+
: await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, guardCollection.funcName);
|
|
254
|
+
break;
|
|
255
|
+
case EArgumentTypes.request:
|
|
256
|
+
guardArguments[argsMetadata.index] = request;
|
|
257
|
+
break;
|
|
258
|
+
case EArgumentTypes.responseHeaders:
|
|
259
|
+
guardArguments[argsMetadata.index] = resHeaders;
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
const guardResult = await guardCollection.func(...guardArguments);
|
|
265
|
+
if (typeof guardResult !== "boolean" || !guardResult) {
|
|
266
|
+
throw new HttpClientError({
|
|
267
|
+
httpCode: 401,
|
|
268
|
+
message: "Unauthorization.",
|
|
269
|
+
data: undefined
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
}
|
|
141
273
|
const result = routerGroup.find(url.pathname, request.method);
|
|
142
274
|
if (!result) {
|
|
143
275
|
throw new HttpClientError({
|
|
@@ -149,81 +281,171 @@ export const BoolFactory = (target, options) => {
|
|
|
149
281
|
const params = result.params;
|
|
150
282
|
const query = Qs.parse(url.search, options.queryParser);
|
|
151
283
|
let responseBody = undefined;
|
|
284
|
+
// Execute before dispatcher(s)
|
|
285
|
+
for (let i = 0; i < beforeDispatcherGroup.length; i++) {
|
|
286
|
+
const beforeDispatcherArguments = [];
|
|
287
|
+
const beforeDispatcherCollection = beforeDispatcherGroup[i];
|
|
288
|
+
const beforeDispatcherMetadata = Reflect.getOwnMetadata(argumentsKey, beforeDispatcherCollection.class, beforeDispatcherCollection.funcName) || {};
|
|
289
|
+
if (beforeDispatcherMetadata) {
|
|
290
|
+
for (const [_key, argsMetadata] of Object.entries(beforeDispatcherMetadata)) {
|
|
291
|
+
switch (argsMetadata.type) {
|
|
292
|
+
case EArgumentTypes.requestHeaders:
|
|
293
|
+
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
294
|
+
? reqHeaders
|
|
295
|
+
: await argumentsResolution(reqHeaders, argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
|
|
296
|
+
break;
|
|
297
|
+
case EArgumentTypes.body:
|
|
298
|
+
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
299
|
+
? await request[argsMetadata.parser || "json"]()
|
|
300
|
+
: await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
|
|
301
|
+
break;
|
|
302
|
+
case EArgumentTypes.params:
|
|
303
|
+
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
304
|
+
? params
|
|
305
|
+
: await argumentsResolution(params, argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
|
|
306
|
+
break;
|
|
307
|
+
case EArgumentTypes.query:
|
|
308
|
+
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
309
|
+
? query
|
|
310
|
+
: await argumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
|
|
311
|
+
break;
|
|
312
|
+
case EArgumentTypes.param:
|
|
313
|
+
beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
314
|
+
? !(argsMetadata.key in params)
|
|
315
|
+
? undefined
|
|
316
|
+
: params[argsMetadata.key]
|
|
317
|
+
: await argumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, beforeDispatcherCollection.funcName);
|
|
318
|
+
break;
|
|
319
|
+
case EArgumentTypes.request:
|
|
320
|
+
beforeDispatcherArguments[argsMetadata.index] = request;
|
|
321
|
+
break;
|
|
322
|
+
case EArgumentTypes.responseHeaders:
|
|
323
|
+
beforeDispatcherArguments[argsMetadata.index] = resHeaders;
|
|
324
|
+
break;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
await beforeDispatcherCollection.func(...beforeDispatcherArguments);
|
|
329
|
+
}
|
|
330
|
+
// Execute controller action
|
|
152
331
|
for (let i = 0; i < result.handlers.length; i++) {
|
|
153
|
-
const handler = result.handlers[i];
|
|
154
|
-
const handlerMetadata = (Reflect.getOwnMetadata(controllerActionArgumentsKey, handler.constructor, handler.funcName) || {});
|
|
155
332
|
const controllerActionArguments = [];
|
|
333
|
+
const handler = result.handlers[i];
|
|
334
|
+
const handlerMetadata = Reflect.getOwnMetadata(argumentsKey, handler.class, handler.funcName) || {};
|
|
156
335
|
if (handlerMetadata) {
|
|
157
336
|
for (const [_key, argsMetadata] of Object.entries(handlerMetadata)) {
|
|
158
337
|
switch (argsMetadata.type) {
|
|
159
|
-
case EArgumentTypes.
|
|
338
|
+
case EArgumentTypes.requestHeaders:
|
|
160
339
|
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
161
340
|
? reqHeaders
|
|
162
|
-
: await
|
|
341
|
+
: await argumentsResolution(reqHeaders, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
|
|
163
342
|
break;
|
|
164
343
|
case EArgumentTypes.body:
|
|
165
344
|
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
166
345
|
? await request[argsMetadata.parser || "json"]()
|
|
167
|
-
: await
|
|
346
|
+
: await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
|
|
168
347
|
break;
|
|
169
348
|
case EArgumentTypes.params:
|
|
170
349
|
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
171
350
|
? params
|
|
172
|
-
: await
|
|
351
|
+
: await argumentsResolution(params, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
|
|
173
352
|
break;
|
|
174
353
|
case EArgumentTypes.query:
|
|
175
354
|
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
176
355
|
? query
|
|
177
|
-
: await
|
|
356
|
+
: await argumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
|
|
178
357
|
break;
|
|
179
358
|
case EArgumentTypes.param:
|
|
180
359
|
controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
181
360
|
? !(argsMetadata.key in params)
|
|
182
361
|
? undefined
|
|
183
362
|
: params[argsMetadata.key]
|
|
184
|
-
: await
|
|
363
|
+
: await argumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
|
|
185
364
|
break;
|
|
186
365
|
case EArgumentTypes.request:
|
|
187
366
|
controllerActionArguments[argsMetadata.index] = request;
|
|
188
367
|
break;
|
|
368
|
+
case EArgumentTypes.responseHeaders:
|
|
369
|
+
controllerActionArguments[argsMetadata.index] = resHeaders;
|
|
370
|
+
break;
|
|
189
371
|
}
|
|
190
372
|
}
|
|
191
373
|
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
374
|
+
responseBody = await handler.func(...controllerActionArguments);
|
|
375
|
+
}
|
|
376
|
+
// Execute after dispatcher(s)
|
|
377
|
+
for (let i = 0; i < afterDispatcherGroup.length; i++) {
|
|
378
|
+
const afterDispatcherArguments = [];
|
|
379
|
+
const afterDispatcherCollection = afterDispatcherGroup[i];
|
|
380
|
+
const afterDispatcherMetadata = Reflect.getOwnMetadata(argumentsKey, afterDispatcherCollection.class, afterDispatcherCollection.funcName) || {};
|
|
381
|
+
if (afterDispatcherMetadata) {
|
|
382
|
+
for (const [_key, argsMetadata] of Object.entries(afterDispatcherMetadata)) {
|
|
383
|
+
switch (argsMetadata.type) {
|
|
384
|
+
case EArgumentTypes.requestHeaders:
|
|
385
|
+
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
386
|
+
? reqHeaders
|
|
387
|
+
: await argumentsResolution(reqHeaders, argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
|
|
388
|
+
break;
|
|
389
|
+
case EArgumentTypes.body:
|
|
390
|
+
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
391
|
+
? await request[argsMetadata.parser || "json"]()
|
|
392
|
+
: await argumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
|
|
393
|
+
break;
|
|
394
|
+
case EArgumentTypes.params:
|
|
395
|
+
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
396
|
+
? params
|
|
397
|
+
: await argumentsResolution(params, argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
|
|
398
|
+
break;
|
|
399
|
+
case EArgumentTypes.query:
|
|
400
|
+
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
401
|
+
? query
|
|
402
|
+
: await argumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
|
|
403
|
+
break;
|
|
404
|
+
case EArgumentTypes.param:
|
|
405
|
+
afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
|
|
406
|
+
? !(argsMetadata.key in params)
|
|
407
|
+
? undefined
|
|
408
|
+
: params[argsMetadata.key]
|
|
409
|
+
: await argumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, afterDispatcherCollection.funcName);
|
|
410
|
+
break;
|
|
411
|
+
case EArgumentTypes.request:
|
|
412
|
+
afterDispatcherArguments[argsMetadata.index] = request;
|
|
413
|
+
break;
|
|
414
|
+
case EArgumentTypes.responseHeaders:
|
|
415
|
+
afterDispatcherArguments[argsMetadata.index] = resHeaders;
|
|
416
|
+
break;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
195
419
|
}
|
|
196
|
-
|
|
420
|
+
await afterDispatcherCollection.func(...afterDispatcherArguments);
|
|
197
421
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
statusText: "Success",
|
|
212
|
-
headers: resHeaders
|
|
213
|
-
});
|
|
214
|
-
return response;
|
|
422
|
+
return responseBody instanceof Response
|
|
423
|
+
? responseBody
|
|
424
|
+
: new Response(!responseBody
|
|
425
|
+
? undefined
|
|
426
|
+
: JSON.stringify({
|
|
427
|
+
httpCode: 200,
|
|
428
|
+
message: "SUCCESS",
|
|
429
|
+
data: responseBody
|
|
430
|
+
}), {
|
|
431
|
+
status: !responseBody ? 204 : 200,
|
|
432
|
+
statusText: "SUCCESS",
|
|
433
|
+
headers: resHeaders
|
|
434
|
+
});
|
|
215
435
|
}
|
|
216
436
|
catch (error) {
|
|
217
437
|
return jsonErrorInfer(error);
|
|
218
438
|
}
|
|
219
439
|
finally {
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
440
|
+
if (allowLogsMethods) {
|
|
441
|
+
const end = performance.now();
|
|
442
|
+
const convertedPID = `${process.pid}`.yellow;
|
|
443
|
+
const convertedMethod = `${request.method.yellow}`.bgBlue;
|
|
444
|
+
const convertedReqIp = `${request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || "<Unknown>"}`.yellow;
|
|
445
|
+
const convertedTime = `${Math.round((end - start + Number.EPSILON) * 10 ** 2) / 10 ** 2}ms`.yellow;
|
|
446
|
+
allowLogsMethods.includes(request.method.toUpperCase()) &&
|
|
447
|
+
console.info(`PID: ${convertedPID} - Method: ${convertedMethod} - IP: ${convertedReqIp} - ${url.pathname.blue} - Time: ${convertedTime}`);
|
|
448
|
+
}
|
|
227
449
|
}
|
|
228
450
|
}
|
|
229
451
|
});
|
package/dist/hooks/injector.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import "reflect-metadata";
|
|
2
|
-
import { injectableKey, injectKey } from "../decorators";
|
|
3
|
-
export const Injector = new class {
|
|
2
|
+
import { controllerKey, dispatcherKey, guardKey, injectableKey, injectKey, middlewareKey } from "../decorators";
|
|
3
|
+
export const Injector = new (class {
|
|
4
4
|
_mapper = new Map();
|
|
5
5
|
/**
|
|
6
6
|
*
|
|
@@ -11,15 +11,16 @@ export const Injector = new class {
|
|
|
11
11
|
return this._mapper.get(classDefinition);
|
|
12
12
|
}
|
|
13
13
|
const ownMetadataKeys = Reflect.getMetadataKeys(classDefinition);
|
|
14
|
-
if (!ownMetadataKeys.includes(
|
|
14
|
+
if (![injectableKey, controllerKey, middlewareKey, guardKey, dispatcherKey].some((value) => ownMetadataKeys.includes(value))) {
|
|
15
|
+
console.error(classDefinition);
|
|
15
16
|
throw Error("Missing dependency declaration, please check @Injectable() used on dependency(ies).");
|
|
16
17
|
}
|
|
17
18
|
// Initialize dependencies injection
|
|
18
19
|
const dependencies = Reflect.getOwnMetadata(injectKey, classDefinition) || [];
|
|
19
|
-
const injections = dependencies.map(dependency => Injector.get(dependency));
|
|
20
|
+
const injections = dependencies.map((dependency) => Injector.get(dependency));
|
|
20
21
|
const instance = new classDefinition(...injections);
|
|
21
22
|
this._mapper.set(classDefinition, instance);
|
|
22
23
|
return instance;
|
|
23
24
|
}
|
|
24
|
-
};
|
|
25
|
+
})();
|
|
25
26
|
export default Injector;
|
|
@@ -1,2 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
1
|
+
export type { IGuard } from "./guard";
|
|
2
|
+
export type { IMiddleware } from "./middleware";
|
|
3
|
+
export type { IController } from "./controller";
|
|
4
|
+
export type { IDispatcher } from "./dispatcher";
|
|
5
|
+
export type { IModule } from "./module";
|
package/dist/interfaces/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export {};
|