@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.
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 +283 -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 +656 -332
  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,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
- const routesMetadata = (Reflect.getOwnMetadata(controllerRoutesKey, controllerConstructor) ||
20
- []);
21
- const router = new Router(controllerMetadata);
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(`/${routeMetadata.path}`);
27
+ const route = router.route(routeMetadata.path);
27
28
  const handler = routeMetadata.descriptor.value.bind(controller);
28
29
  const routeArgument = {
29
- constructor: controllerConstructor,
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 controllerActionArgumentsResolution = async (data, zodSchema, argumentIndex, funcName) => {
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
- const allowOrigins = !moduleMetadata?.allowOrigins
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 moduleMetadata.allowOrigins !== "string"
89
- ? moduleMetadata.allowOrigins
90
- : [moduleMetadata.allowOrigins];
91
- const allowMethods = !moduleMetadata?.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
- : moduleMetadata.allowMethods;
138
+ : moduleOptions.allowMethods;
94
139
  const { allowLogsMethods } = Object.freeze({
95
- allowLogsMethods: !options?.log?.methods ? ["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"] : options.log.methods
140
+ allowLogsMethods: options?.log?.methods
96
141
  });
97
- const routerGroup = new RouterGroup();
98
- moduleMetadata?.controllers &&
99
- moduleMetadata.controllers.map((controllerConstructor) => controllerCreator(controllerConstructor, routerGroup));
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 fetch(request) {
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
- throw new HttpClientError({
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
- throw new HttpClientError({
186
+ return new Response(JSON.stringify({
123
187
  httpCode: 403,
124
- message: "Invalid origin.",
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.headers:
339
+ case EArgumentTypes.requestHeaders:
160
340
  controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
161
341
  ? reqHeaders
162
- : await controllerActionArgumentsResolution(reqHeaders, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
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 controllerActionArgumentsResolution(await request[argsMetadata.parser || "json"](), argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
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 controllerActionArgumentsResolution(params, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
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 controllerActionArgumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
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 controllerActionArgumentsResolution(query, argsMetadata.zodSchema, argsMetadata.index, handler.funcName);
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
- const responseData = await handler.func(...controllerActionArguments);
193
- if (responseData instanceof Response) {
194
- return responseData;
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
- responseBody = responseData;
421
+ await afterDispatcherCollection.func(...afterDispatcherArguments);
197
422
  }
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;
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
- 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}`);
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
  });
@@ -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.2",
3
+ "version": "1.5.1",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {