@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.
Files changed (71) hide show
  1. package/.prettierrc +11 -11
  2. package/LICENSE +21 -21
  3. package/__test/afterDispatcher.ts +9 -0
  4. package/__test/beforeDispatcher.ts +9 -0
  5. package/__test/controller.ts +66 -66
  6. package/__test/firstGuard.ts +10 -0
  7. package/__test/firstMiddleware.ts +9 -0
  8. package/__test/index.ts +8 -8
  9. package/__test/interfaces.ts +7 -7
  10. package/__test/module.ts +25 -16
  11. package/__test/repository.ts +16 -16
  12. package/__test/secondGuard.ts +10 -0
  13. package/__test/secondMiddleware.ts +9 -0
  14. package/__test/service.ts +20 -20
  15. package/bun.lockb +0 -0
  16. package/dist/decorators/arguments.d.ts +12 -6
  17. package/dist/decorators/arguments.js +39 -26
  18. package/dist/decorators/controller.d.ts +9 -1
  19. package/dist/decorators/controller.js +6 -4
  20. package/dist/decorators/dispatcher.d.ts +7 -0
  21. package/dist/decorators/dispatcher.js +9 -0
  22. package/dist/decorators/guard.d.ts +7 -0
  23. package/dist/decorators/guard.js +9 -0
  24. package/dist/decorators/http.d.ts +4 -3
  25. package/dist/decorators/http.js +6 -5
  26. package/dist/decorators/index.d.ts +13 -3
  27. package/dist/decorators/index.js +5 -2
  28. package/dist/decorators/injectable.d.ts +1 -1
  29. package/dist/decorators/injectable.js +1 -4
  30. package/dist/decorators/middleware.d.ts +7 -0
  31. package/dist/decorators/middleware.js +9 -0
  32. package/dist/decorators/module.d.ts +28 -7
  33. package/dist/decorators/module.js +48 -1
  34. package/dist/entities/route.d.ts +5 -5
  35. package/dist/entities/routerGroup.d.ts +1 -1
  36. package/dist/hooks/factory.d.ts +3 -3
  37. package/dist/hooks/factory.js +282 -60
  38. package/dist/hooks/injector.js +6 -5
  39. package/dist/interfaces/index.d.ts +5 -2
  40. package/dist/interfaces/index.js +1 -1
  41. package/package.json +1 -1
  42. package/src/decorators/arguments.ts +214 -186
  43. package/src/decorators/controller.ts +22 -14
  44. package/src/decorators/dispatcher.ts +19 -0
  45. package/src/decorators/guard.ts +19 -0
  46. package/src/decorators/http.ts +81 -81
  47. package/src/decorators/index.ts +28 -7
  48. package/src/decorators/inject.ts +13 -13
  49. package/src/decorators/injectable.ts +8 -11
  50. package/src/decorators/middleware.ts +19 -0
  51. package/src/decorators/module.ts +100 -21
  52. package/src/decorators/zodSchema.ts +20 -20
  53. package/src/entities/index.ts +3 -3
  54. package/src/entities/route.ts +328 -328
  55. package/src/entities/router.ts +35 -35
  56. package/src/entities/routerGroup.ts +34 -34
  57. package/src/hooks/factory.ts +653 -319
  58. package/src/hooks/index.ts +2 -2
  59. package/src/hooks/injector.ts +43 -43
  60. package/src/http/clientError.ts +45 -45
  61. package/src/http/index.ts +63 -63
  62. package/src/http/serverError.ts +38 -38
  63. package/src/index.ts +6 -6
  64. package/src/interfaces/controller.d.ts +1 -0
  65. package/src/interfaces/dispatcher.d.ts +3 -0
  66. package/src/interfaces/guard.d.ts +3 -0
  67. package/src/interfaces/index.ts +5 -3
  68. package/src/interfaces/middleware.d.ts +3 -0
  69. package/src/interfaces/module.d.ts +1 -0
  70. package/test.http +31 -30
  71. package/tsconfig.json +107 -107
@@ -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, controllerRoutesKey, moduleKey } from "../decorators";
6
+ import { controllerHttpKey, controllerKey, argumentsKey, moduleKey, EArgumentTypes } from "../decorators";
7
7
  import { HttpClientError, HttpServerError, jsonErrorInfer } from "../http";
8
8
  import { Injector } from "./injector";
9
- import { controllerActionArgumentsKey, EArgumentTypes } from "../decorators/arguments";
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
- const routesMetadata = (Reflect.getOwnMetadata(controllerRoutesKey, controllerConstructor) ||
20
- []);
21
- const router = new Router(controllerMetadata);
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
- constructor: controllerConstructor,
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 controllerActionArgumentsResolution = async (data, zodSchema, argumentIndex, funcName) => {
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
- const allowOrigins = !moduleMetadata?.allowOrigins
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 moduleMetadata.allowOrigins !== "string"
89
- ? moduleMetadata.allowOrigins
90
- : [moduleMetadata.allowOrigins];
91
- const allowMethods = !moduleMetadata?.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
- : moduleMetadata.allowMethods;
137
+ : moduleOptions.allowMethods;
94
138
  const { allowLogsMethods } = Object.freeze({
95
- allowLogsMethods: !options?.log?.methods ? ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"] : options.log.methods
139
+ allowLogsMethods: options?.log?.methods
96
140
  });
97
- const routerGroup = new RouterGroup();
98
- moduleMetadata?.controllers &&
99
- moduleMetadata.controllers.map((controllerConstructor) => controllerCreator(controllerConstructor, routerGroup));
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 fetch(request) {
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
- throw new HttpClientError({
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
- throw new HttpClientError({
185
+ return new Response(JSON.stringify({
123
186
  httpCode: 403,
124
- message: "Invalid origin.",
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.headers:
338
+ case EArgumentTypes.requestHeaders:
160
339
  controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
161
340
  ? reqHeaders
162
- : await controllerActionArgumentsResolution(reqHeaders, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
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 controllerActionArgumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
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 controllerActionArgumentsResolution(params, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
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 controllerActionArgumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
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 controllerActionArgumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
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
- const responseData = await handler.func(...controllerActionArguments);
193
- if (responseData instanceof Response) {
194
- return responseData;
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
- responseBody = responseData;
420
+ await afterDispatcherCollection.func(...afterDispatcherArguments);
197
421
  }
198
- const resHeaders = new Headers({
199
- "Access-Control-Allow-Origin": origin || "*",
200
- "Access-Control-Allow-Headers": "*",
201
- "Access-Control-Allow-Credentials": "true",
202
- "Access-Control-Allow-Methods": allowMethods.join(", "),
203
- "Content-Type": "application/json"
204
- });
205
- const response = new Response(JSON.stringify({
206
- httpCode: 200,
207
- message: "Success",
208
- data: responseBody
209
- }), {
210
- status: 200,
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
- const end = performance.now();
221
- const convertedPID = `${process.pid}`.yellow;
222
- const convertedMethod = `${request.method.yellow}`.bgBlue;
223
- const convertedReqIp = `${request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || "<Unknown>"}`.yellow;
224
- const convertedTime = `${Math.round((end - start + Number.EPSILON) * 10 ** 2) / 10 ** 2}ms`.yellow;
225
- allowLogsMethods.includes(request.method.toUpperCase()) &&
226
- console.info(`PID: ${convertedPID} - Method: ${convertedMethod} - IP: ${convertedReqIp} - ${url.pathname.blue} - Time: ${convertedTime}`);
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
  });
@@ -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(injectableKey)) {
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
- declare const _default: {};
2
- export default _default;
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";
@@ -1 +1 @@
1
- export default {};
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bool-ts/core",
3
- "version": "1.4.1",
3
+ "version": "1.5.0",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {