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