@bool-ts/core 1.5.9 → 1.6.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.
@@ -1,22 +1,23 @@
1
+ import type { TModuleMetadata, TArgumentsMetadata, THttpMetadata, TControllerMetadata } from "../decorators";
2
+ import type { IGuard, IMiddleware } from "../interfaces";
3
+ import type { IDispatcher } from "../interfaces/dispatcher";
4
+
1
5
  import "colors";
2
6
  import "reflect-metadata";
3
7
 
4
8
  import Qs from "qs";
5
9
  import * as Zod from "zod";
6
10
 
7
- import type { TModuleMetadata, TArgumentsMetadata, THttpMetadata, TControllerMetadata } from "../decorators";
8
-
9
11
  import { Router, RouterGroup } from "../entities";
10
12
  import { controllerHttpKey, controllerKey, argumentsKey, moduleKey, EArgumentTypes } from "../decorators";
11
13
  import { HttpClientError, HttpServerError, jsonErrorInfer, type THttpMethods } from "../http";
12
14
  import { Injector } from "./injector";
13
- import type { IGuard, IMiddleware } from "../interfaces";
14
- import type { IDispatcher } from "../interfaces/dispatcher";
15
15
 
16
16
  export type TBoolFactoryOptions = Required<{
17
17
  port: number;
18
18
  }> &
19
19
  Partial<{
20
+ config: Record<string | symbol, any> | (() => Record<string | symbol, any>);
20
21
  prefix: string;
21
22
  debug: boolean;
22
23
  log: Partial<{
@@ -118,499 +119,538 @@ export const argumentsResolution = async (
118
119
  }
119
120
  };
120
121
 
121
- export const BoolFactory = (target: new (...args: any[]) => unknown, options: TBoolFactoryOptions) => {
122
- if (!Reflect.getOwnMetadataKeys(target).includes(moduleKey)) {
123
- throw Error(`${target.name} is not a module.`);
124
- }
125
-
126
- const moduleMetadata = Reflect.getOwnMetadata(moduleKey, target) as TModuleMetadata;
127
-
128
- if (!moduleMetadata) {
129
- return Bun.serve({
130
- port: options.port,
131
- fetch: () => new Response()
132
- });
133
- }
122
+ export const BoolFactory = async (target: new (...args: any[]) => unknown, options: TBoolFactoryOptions) => {
123
+ try {
124
+ if (!Reflect.getOwnMetadataKeys(target).includes(moduleKey)) {
125
+ throw Error(`${target.name} is not a module.`);
126
+ }
134
127
 
135
- const { middlewares, guards, beforeDispatchers, controllers, afterDispatchers, prefix: modulePrefix } = moduleMetadata;
128
+ const moduleMetadata = Reflect.getOwnMetadata(moduleKey, target) as TModuleMetadata;
136
129
 
137
- // Middleware(s)
138
- const middlewareGroup = !middlewares
139
- ? []
140
- : middlewares.map((middleware) => {
141
- const middlewareInstance = Injector.get<IMiddleware>(middleware);
130
+ if (!moduleMetadata) {
131
+ return Bun.serve({
132
+ port: options.port,
133
+ fetch: () => new Response()
134
+ });
135
+ }
142
136
 
143
- return Object.freeze({
144
- class: middleware,
145
- funcName: "enforce",
146
- func: middlewareInstance.enforce.bind(middlewareInstance)
137
+ const {
138
+ middlewares,
139
+ guards,
140
+ beforeDispatchers,
141
+ controllers,
142
+ afterDispatchers,
143
+ prefix: modulePrefix,
144
+ config: moduleConfig
145
+ } = moduleMetadata;
146
+
147
+ // Middleware(s)
148
+ const middlewareGroup = !middlewares
149
+ ? []
150
+ : middlewares.map((middleware) => {
151
+ const middlewareInstance = Injector.get<IMiddleware>(middleware);
152
+
153
+ return Object.freeze({
154
+ class: middleware,
155
+ funcName: "enforce",
156
+ func: middlewareInstance.enforce.bind(middlewareInstance)
157
+ });
147
158
  });
148
- });
149
-
150
- // Guard(s)
151
- const guardGroup = !guards
152
- ? []
153
- : guards.map((guard) => {
154
- const guardInstance = Injector.get<IGuard>(guard);
155
-
156
- return Object.freeze({
157
- class: guard,
158
- funcName: "enforce",
159
- func: guardInstance.enforce.bind(guardInstance)
160
- });
161
- });
162
-
163
- // Before dispatcher(s)
164
- const beforeDispatcherGroup = !beforeDispatchers
165
- ? []
166
- : beforeDispatchers.map((beforeDispatcher) => {
167
- const beforeDispatcherInstance = Injector.get<IDispatcher>(beforeDispatcher);
168
-
169
- return Object.freeze({
170
- class: beforeDispatcher,
171
- funcName: "execute",
172
- func: beforeDispatcherInstance.execute.bind(beforeDispatcherInstance)
173
- });
174
- });
175
159
 
176
- // Controller(s)
177
- const routerGroup = new RouterGroup();
160
+ // Guard(s)
161
+ const guardGroup = !guards
162
+ ? []
163
+ : guards.map((guard) => {
164
+ const guardInstance = Injector.get<IGuard>(guard);
165
+
166
+ return Object.freeze({
167
+ class: guard,
168
+ funcName: "enforce",
169
+ func: guardInstance.enforce.bind(guardInstance)
170
+ });
171
+ });
178
172
 
179
- controllers &&
180
- controllers.map((controllerConstructor) =>
181
- controllerCreator(controllerConstructor, routerGroup, `${options.prefix || ""}/${modulePrefix || ""}`)
182
- );
173
+ // Before dispatcher(s)
174
+ const beforeDispatcherGroup = !beforeDispatchers
175
+ ? []
176
+ : beforeDispatchers.map((beforeDispatcher) => {
177
+ const beforeDispatcherInstance = Injector.get<IDispatcher>(beforeDispatcher);
178
+
179
+ return Object.freeze({
180
+ class: beforeDispatcher,
181
+ funcName: "execute",
182
+ func: beforeDispatcherInstance.execute.bind(beforeDispatcherInstance)
183
+ });
184
+ });
183
185
 
184
- const { allowLogsMethods } = Object.freeze({
185
- allowLogsMethods: options?.log?.methods
186
- });
186
+ // Controller(s)
187
+ const routerGroup = new RouterGroup();
188
+
189
+ controllers &&
190
+ controllers.map((controllerConstructor) =>
191
+ controllerCreator(controllerConstructor, routerGroup, `${options.prefix || ""}/${modulePrefix || ""}`)
192
+ );
193
+
194
+ // After dispatcher(s)
195
+ const afterDispatcherGroup = !afterDispatchers
196
+ ? []
197
+ : afterDispatchers.map((afterDispatcher) => {
198
+ const afterDispatcherInstance = Injector.get<IDispatcher>(afterDispatcher);
199
+
200
+ return Object.freeze({
201
+ class: afterDispatcher,
202
+ funcName: "execute",
203
+ func: afterDispatcherInstance.execute.bind(afterDispatcherInstance)
204
+ });
205
+ });
187
206
 
188
- // After dispatcher(s)
189
- const afterDispatcherGroup = !afterDispatchers
190
- ? []
191
- : afterDispatchers.map((afterDispatcher) => {
192
- const afterDispatcherInstance = Injector.get<IDispatcher>(afterDispatcher);
207
+ const { allowLogsMethods, config } = Object.freeze({
208
+ allowLogsMethods: options?.log?.methods,
209
+ config: {
210
+ ...(typeof options.config !== "function" ? options.config : await options.config()),
211
+ ...(typeof moduleConfig !== "function" ? moduleConfig : await moduleConfig())
212
+ }
213
+ });
193
214
 
194
- return Object.freeze({
195
- class: afterDispatcher,
196
- funcName: "execute",
197
- func: afterDispatcherInstance.execute.bind(afterDispatcherInstance)
198
- });
199
- });
200
-
201
- Bun.serve({
202
- port: options.port,
203
- fetch: async (request) => {
204
- const start = performance.now();
205
- const url = new URL(request.url);
206
- const reqHeaders = request.headers;
207
- const resHeaders = new Headers();
208
- const query = Qs.parse(url.searchParams.toString(), options.queryParser);
209
-
210
- try {
211
- // Execute middleware(s)
212
- for (let i = 0; i < middlewareGroup.length; i++) {
213
- const middlewareArguments = [];
214
- const middlewareCollection = middlewareGroup[i];
215
- const middlewareMetadata: Record<string, TArgumentsMetadata> =
216
- Reflect.getOwnMetadata(argumentsKey, middlewareCollection.class, middlewareCollection.funcName) || {};
217
-
218
- if (middlewareMetadata) {
219
- for (const [_key, argsMetadata] of Object.entries(middlewareMetadata)) {
220
- switch (argsMetadata.type) {
221
- case EArgumentTypes.requestHeaders:
222
- middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
223
- ? reqHeaders
224
- : await argumentsResolution(
225
- reqHeaders,
226
- argsMetadata.zodSchema,
227
- argsMetadata.index,
228
- middlewareCollection.funcName
229
- );
230
- break;
231
- case EArgumentTypes.body:
232
- middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
233
- ? await request[argsMetadata.parser || "json"]()
234
- : await argumentsResolution(
235
- await request[argsMetadata.parser || "json"](),
236
- argsMetadata.zodSchema,
237
- argsMetadata.index,
238
- middlewareCollection.funcName
239
- );
240
- break;
241
- case EArgumentTypes.query:
242
- middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
243
- ? query
244
- : await argumentsResolution(
245
- query,
246
- argsMetadata.zodSchema,
247
- argsMetadata.index,
248
- middlewareCollection.funcName
249
- );
250
- break;
251
- case EArgumentTypes.request:
252
- middlewareArguments[argsMetadata.index] = request;
253
- break;
254
- case EArgumentTypes.responseHeaders:
255
- middlewareArguments[argsMetadata.index] = resHeaders;
256
- break;
215
+ Bun.serve({
216
+ port: options.port,
217
+ fetch: async (request) => {
218
+ const start = performance.now();
219
+ const url = new URL(request.url);
220
+ const reqHeaders = request.headers;
221
+ const resHeaders = new Headers();
222
+ const query = Qs.parse(url.searchParams.toString(), options.queryParser);
223
+
224
+ try {
225
+ // Execute middleware(s)
226
+ for (let i = 0; i < middlewareGroup.length; i++) {
227
+ const middlewareArguments = [];
228
+ const middlewareCollection = middlewareGroup[i];
229
+ const middlewareMetadata: Record<string, TArgumentsMetadata> =
230
+ Reflect.getOwnMetadata(argumentsKey, middlewareCollection.class, middlewareCollection.funcName) ||
231
+ {};
232
+
233
+ if (middlewareMetadata) {
234
+ for (const [_key, argsMetadata] of Object.entries(middlewareMetadata)) {
235
+ switch (argsMetadata.type) {
236
+ case EArgumentTypes.requestHeaders:
237
+ middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
238
+ ? reqHeaders
239
+ : await argumentsResolution(
240
+ reqHeaders,
241
+ argsMetadata.zodSchema,
242
+ argsMetadata.index,
243
+ middlewareCollection.funcName
244
+ );
245
+ break;
246
+ case EArgumentTypes.body:
247
+ middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
248
+ ? await request[argsMetadata.parser || "json"]()
249
+ : await argumentsResolution(
250
+ await request[argsMetadata.parser || "json"](),
251
+ argsMetadata.zodSchema,
252
+ argsMetadata.index,
253
+ middlewareCollection.funcName
254
+ );
255
+ break;
256
+ case EArgumentTypes.query:
257
+ middlewareArguments[argsMetadata.index] = !argsMetadata.zodSchema
258
+ ? query
259
+ : await argumentsResolution(
260
+ query,
261
+ argsMetadata.zodSchema,
262
+ argsMetadata.index,
263
+ middlewareCollection.funcName
264
+ );
265
+ break;
266
+ case EArgumentTypes.request:
267
+ middlewareArguments[argsMetadata.index] = request;
268
+ break;
269
+ case EArgumentTypes.responseHeaders:
270
+ middlewareArguments[argsMetadata.index] = resHeaders;
271
+ break;
272
+ case EArgumentTypes.config:
273
+ middlewareArguments[argsMetadata.index] = config;
274
+ break;
275
+ }
257
276
  }
258
277
  }
259
- }
260
278
 
261
- const middlewareResult = await middlewareCollection.func(...middlewareArguments);
279
+ const middlewareResult = await middlewareCollection.func(...middlewareArguments);
262
280
 
263
- if (!(middlewareResult instanceof Response)) {
264
- continue;
265
- }
281
+ if (!(middlewareResult instanceof Response)) {
282
+ continue;
283
+ }
266
284
 
267
- return middlewareResult;
268
- }
285
+ return middlewareResult;
286
+ }
269
287
 
270
- // Execute guard(s)
271
- for (let i = 0; i < guardGroup.length; i++) {
272
- const guardArguments = [];
273
- const guardCollection = guardGroup[i];
274
- const guardMetadata: Record<string, TArgumentsMetadata> =
275
- Reflect.getOwnMetadata(argumentsKey, guardCollection.class, guardCollection.funcName) || {};
276
-
277
- if (guardMetadata) {
278
- for (const [_key, argsMetadata] of Object.entries(guardMetadata)) {
279
- switch (argsMetadata.type) {
280
- case EArgumentTypes.requestHeaders:
281
- guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
282
- ? reqHeaders
283
- : await argumentsResolution(
284
- reqHeaders,
285
- argsMetadata.zodSchema,
286
- argsMetadata.index,
287
- guardCollection.funcName
288
- );
289
- break;
290
- case EArgumentTypes.body:
291
- guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
292
- ? await request[argsMetadata.parser || "json"]()
293
- : await argumentsResolution(
294
- await request[argsMetadata.parser || "json"](),
295
- argsMetadata.zodSchema,
296
- argsMetadata.index,
297
- guardCollection.funcName
298
- );
299
- break;
300
- case EArgumentTypes.query:
301
- guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
302
- ? query
303
- : await argumentsResolution(
304
- query,
305
- argsMetadata.zodSchema,
306
- argsMetadata.index,
307
- guardCollection.funcName
308
- );
309
- break;
310
- case EArgumentTypes.request:
311
- guardArguments[argsMetadata.index] = request;
312
- break;
313
- case EArgumentTypes.responseHeaders:
314
- guardArguments[argsMetadata.index] = resHeaders;
315
- break;
288
+ // Execute guard(s)
289
+ for (let i = 0; i < guardGroup.length; i++) {
290
+ const guardArguments = [];
291
+ const guardCollection = guardGroup[i];
292
+ const guardMetadata: Record<string, TArgumentsMetadata> =
293
+ Reflect.getOwnMetadata(argumentsKey, guardCollection.class, guardCollection.funcName) || {};
294
+
295
+ if (guardMetadata) {
296
+ for (const [_key, argsMetadata] of Object.entries(guardMetadata)) {
297
+ switch (argsMetadata.type) {
298
+ case EArgumentTypes.requestHeaders:
299
+ guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
300
+ ? reqHeaders
301
+ : await argumentsResolution(
302
+ reqHeaders,
303
+ argsMetadata.zodSchema,
304
+ argsMetadata.index,
305
+ guardCollection.funcName
306
+ );
307
+ break;
308
+ case EArgumentTypes.body:
309
+ guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
310
+ ? await request[argsMetadata.parser || "json"]()
311
+ : await argumentsResolution(
312
+ await request[argsMetadata.parser || "json"](),
313
+ argsMetadata.zodSchema,
314
+ argsMetadata.index,
315
+ guardCollection.funcName
316
+ );
317
+ break;
318
+ case EArgumentTypes.query:
319
+ guardArguments[argsMetadata.index] = !argsMetadata.zodSchema
320
+ ? query
321
+ : await argumentsResolution(
322
+ query,
323
+ argsMetadata.zodSchema,
324
+ argsMetadata.index,
325
+ guardCollection.funcName
326
+ );
327
+ break;
328
+ case EArgumentTypes.request:
329
+ guardArguments[argsMetadata.index] = request;
330
+ break;
331
+ case EArgumentTypes.responseHeaders:
332
+ guardArguments[argsMetadata.index] = resHeaders;
333
+ break;
334
+ case EArgumentTypes.config:
335
+ guardArguments[argsMetadata.index] = config;
336
+ break;
337
+ }
316
338
  }
317
339
  }
340
+
341
+ const guardResult = await guardCollection.func(...guardArguments);
342
+
343
+ if (typeof guardResult !== "boolean" || !guardResult) {
344
+ throw new HttpClientError({
345
+ httpCode: 401,
346
+ message: "Unauthorization.",
347
+ data: undefined
348
+ });
349
+ }
318
350
  }
319
351
 
320
- const guardResult = await guardCollection.func(...guardArguments);
352
+ const result = routerGroup.find(url.pathname, request.method as keyof THttpMethods);
321
353
 
322
- if (typeof guardResult !== "boolean" || !guardResult) {
354
+ if (!result) {
323
355
  throw new HttpClientError({
324
- httpCode: 401,
325
- message: "Unauthorization.",
356
+ httpCode: 404,
357
+ message: "Route not found.",
326
358
  data: undefined
327
359
  });
328
360
  }
329
- }
330
361
 
331
- const result = routerGroup.find(url.pathname, request.method as keyof THttpMethods);
332
-
333
- if (!result) {
334
- throw new HttpClientError({
335
- httpCode: 404,
336
- message: "Route not found.",
337
- data: undefined
338
- });
339
- }
340
-
341
- const params = result.params;
342
-
343
- let responseBody = undefined;
344
-
345
- // Execute before dispatcher(s)
346
- for (let i = 0; i < beforeDispatcherGroup.length; i++) {
347
- const beforeDispatcherArguments = [];
348
- const beforeDispatcherCollection = beforeDispatcherGroup[i];
349
- const beforeDispatcherMetadata: Record<string, TArgumentsMetadata> =
350
- Reflect.getOwnMetadata(
351
- argumentsKey,
352
- beforeDispatcherCollection.class,
353
- beforeDispatcherCollection.funcName
354
- ) || {};
355
-
356
- if (beforeDispatcherMetadata) {
357
- for (const [_key, argsMetadata] of Object.entries(beforeDispatcherMetadata)) {
358
- switch (argsMetadata.type) {
359
- case EArgumentTypes.requestHeaders:
360
- beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
361
- ? reqHeaders
362
- : await argumentsResolution(
363
- reqHeaders,
364
- argsMetadata.zodSchema,
365
- argsMetadata.index,
366
- beforeDispatcherCollection.funcName
367
- );
368
- break;
369
- case EArgumentTypes.body:
370
- beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
371
- ? await request[argsMetadata.parser || "json"]()
372
- : await argumentsResolution(
373
- await request[argsMetadata.parser || "json"](),
374
- argsMetadata.zodSchema,
375
- argsMetadata.index,
376
- beforeDispatcherCollection.funcName
377
- );
378
- break;
379
- case EArgumentTypes.params:
380
- beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
381
- ? params
382
- : await argumentsResolution(
383
- params,
384
- argsMetadata.zodSchema,
385
- argsMetadata.index,
386
- beforeDispatcherCollection.funcName
387
- );
388
- break;
389
- case EArgumentTypes.query:
390
- beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
391
- ? query
392
- : await argumentsResolution(
393
- query,
394
- argsMetadata.zodSchema,
395
- argsMetadata.index,
396
- beforeDispatcherCollection.funcName
397
- );
398
- break;
399
- case EArgumentTypes.param:
400
- beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
401
- ? !(argsMetadata.key in params)
402
- ? undefined
403
- : params[argsMetadata.key]
404
- : await argumentsResolution(
405
- query,
406
- argsMetadata.zodSchema,
407
- argsMetadata.index,
408
- beforeDispatcherCollection.funcName
409
- );
410
- break;
411
- case EArgumentTypes.request:
412
- beforeDispatcherArguments[argsMetadata.index] = request;
413
- break;
414
- case EArgumentTypes.responseHeaders:
415
- beforeDispatcherArguments[argsMetadata.index] = resHeaders;
416
- break;
362
+ const params = result.params;
363
+
364
+ let responseBody = undefined;
365
+
366
+ // Execute before dispatcher(s)
367
+ for (let i = 0; i < beforeDispatcherGroup.length; i++) {
368
+ const beforeDispatcherArguments = [];
369
+ const beforeDispatcherCollection = beforeDispatcherGroup[i];
370
+ const beforeDispatcherMetadata: Record<string, TArgumentsMetadata> =
371
+ Reflect.getOwnMetadata(
372
+ argumentsKey,
373
+ beforeDispatcherCollection.class,
374
+ beforeDispatcherCollection.funcName
375
+ ) || {};
376
+
377
+ if (beforeDispatcherMetadata) {
378
+ for (const [_key, argsMetadata] of Object.entries(beforeDispatcherMetadata)) {
379
+ switch (argsMetadata.type) {
380
+ case EArgumentTypes.requestHeaders:
381
+ beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
382
+ ? reqHeaders
383
+ : await argumentsResolution(
384
+ reqHeaders,
385
+ argsMetadata.zodSchema,
386
+ argsMetadata.index,
387
+ beforeDispatcherCollection.funcName
388
+ );
389
+ break;
390
+ case EArgumentTypes.body:
391
+ beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
392
+ ? await request[argsMetadata.parser || "json"]()
393
+ : await argumentsResolution(
394
+ await request[argsMetadata.parser || "json"](),
395
+ argsMetadata.zodSchema,
396
+ argsMetadata.index,
397
+ beforeDispatcherCollection.funcName
398
+ );
399
+ break;
400
+ case EArgumentTypes.params:
401
+ beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
402
+ ? params
403
+ : await argumentsResolution(
404
+ params,
405
+ argsMetadata.zodSchema,
406
+ argsMetadata.index,
407
+ beforeDispatcherCollection.funcName
408
+ );
409
+ break;
410
+ case EArgumentTypes.query:
411
+ beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
412
+ ? query
413
+ : await argumentsResolution(
414
+ query,
415
+ argsMetadata.zodSchema,
416
+ argsMetadata.index,
417
+ beforeDispatcherCollection.funcName
418
+ );
419
+ break;
420
+ case EArgumentTypes.param:
421
+ beforeDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
422
+ ? !(argsMetadata.key in params)
423
+ ? undefined
424
+ : params[argsMetadata.key]
425
+ : await argumentsResolution(
426
+ query,
427
+ argsMetadata.zodSchema,
428
+ argsMetadata.index,
429
+ beforeDispatcherCollection.funcName
430
+ );
431
+ break;
432
+ case EArgumentTypes.request:
433
+ beforeDispatcherArguments[argsMetadata.index] = request;
434
+ break;
435
+ case EArgumentTypes.responseHeaders:
436
+ beforeDispatcherArguments[argsMetadata.index] = resHeaders;
437
+ break;
438
+ case EArgumentTypes.config:
439
+ beforeDispatcherArguments[argsMetadata.index] = config;
440
+ break;
441
+ }
417
442
  }
418
443
  }
419
- }
420
444
 
421
- await beforeDispatcherCollection.func(...beforeDispatcherArguments);
422
- }
445
+ await beforeDispatcherCollection.func(...beforeDispatcherArguments);
446
+ }
423
447
 
424
- // Execute controller action
425
- for (let i = 0; i < result.handlers.length; i++) {
426
- const controllerActionArguments = [];
427
- const handler = result.handlers[i];
428
- const handlerMetadata: Record<string, TArgumentsMetadata> =
429
- Reflect.getOwnMetadata(argumentsKey, handler.class, handler.funcName) || {};
430
-
431
- if (handlerMetadata) {
432
- for (const [_key, argsMetadata] of Object.entries(handlerMetadata)) {
433
- switch (argsMetadata.type) {
434
- case EArgumentTypes.requestHeaders:
435
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
436
- ? reqHeaders
437
- : await argumentsResolution(
438
- reqHeaders,
439
- argsMetadata.zodSchema,
440
- argsMetadata.index,
441
- handler.funcName
442
- );
443
- break;
444
- case EArgumentTypes.body:
445
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
446
- ? await request[argsMetadata.parser || "json"]()
447
- : await argumentsResolution(
448
- await request[argsMetadata.parser || "json"](),
449
- argsMetadata.zodSchema,
450
- argsMetadata.index,
451
- handler.funcName
452
- );
453
- break;
454
- case EArgumentTypes.params:
455
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
456
- ? params
457
- : await argumentsResolution(
458
- params,
459
- argsMetadata.zodSchema,
460
- argsMetadata.index,
461
- handler.funcName
462
- );
463
- break;
464
- case EArgumentTypes.query:
465
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
466
- ? query
467
- : await argumentsResolution(
468
- query,
469
- argsMetadata.zodSchema,
470
- argsMetadata.index,
471
- handler.funcName
472
- );
473
- break;
474
- case EArgumentTypes.param:
475
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
476
- ? !(argsMetadata.key in params)
477
- ? undefined
478
- : params[argsMetadata.key]
479
- : await argumentsResolution(
480
- query,
481
- argsMetadata.zodSchema,
482
- argsMetadata.index,
483
- handler.funcName
484
- );
485
- break;
486
- case EArgumentTypes.request:
487
- controllerActionArguments[argsMetadata.index] = request;
488
- break;
489
- case EArgumentTypes.responseHeaders:
490
- controllerActionArguments[argsMetadata.index] = resHeaders;
491
- break;
448
+ // Execute controller action
449
+ for (let i = 0; i < result.handlers.length; i++) {
450
+ const controllerActionArguments = [];
451
+ const handler = result.handlers[i];
452
+ const handlerMetadata: Record<string, TArgumentsMetadata> =
453
+ Reflect.getOwnMetadata(argumentsKey, handler.class, handler.funcName) || {};
454
+
455
+ if (handlerMetadata) {
456
+ for (const [_key, argsMetadata] of Object.entries(handlerMetadata)) {
457
+ switch (argsMetadata.type) {
458
+ case EArgumentTypes.requestHeaders:
459
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
460
+ ? reqHeaders
461
+ : await argumentsResolution(
462
+ reqHeaders,
463
+ argsMetadata.zodSchema,
464
+ argsMetadata.index,
465
+ handler.funcName
466
+ );
467
+ break;
468
+ case EArgumentTypes.body:
469
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
470
+ ? await request[argsMetadata.parser || "json"]()
471
+ : await argumentsResolution(
472
+ await request[argsMetadata.parser || "json"](),
473
+ argsMetadata.zodSchema,
474
+ argsMetadata.index,
475
+ handler.funcName
476
+ );
477
+ break;
478
+ case EArgumentTypes.params:
479
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
480
+ ? params
481
+ : await argumentsResolution(
482
+ params,
483
+ argsMetadata.zodSchema,
484
+ argsMetadata.index,
485
+ handler.funcName
486
+ );
487
+ break;
488
+ case EArgumentTypes.query:
489
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
490
+ ? query
491
+ : await argumentsResolution(
492
+ query,
493
+ argsMetadata.zodSchema,
494
+ argsMetadata.index,
495
+ handler.funcName
496
+ );
497
+ break;
498
+ case EArgumentTypes.param:
499
+ controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
500
+ ? !(argsMetadata.key in params)
501
+ ? undefined
502
+ : params[argsMetadata.key]
503
+ : await argumentsResolution(
504
+ query,
505
+ argsMetadata.zodSchema,
506
+ argsMetadata.index,
507
+ handler.funcName
508
+ );
509
+ break;
510
+ case EArgumentTypes.request:
511
+ controllerActionArguments[argsMetadata.index] = request;
512
+ break;
513
+ case EArgumentTypes.responseHeaders:
514
+ controllerActionArguments[argsMetadata.index] = resHeaders;
515
+ break;
516
+ case EArgumentTypes.config:
517
+ controllerActionArguments[argsMetadata.index] = config;
518
+ break;
519
+ }
492
520
  }
493
521
  }
494
- }
495
522
 
496
- responseBody = await handler.func(...controllerActionArguments);
497
- }
523
+ responseBody = await handler.func(...controllerActionArguments);
524
+ }
498
525
 
499
- // Execute after dispatcher(s)
500
- for (let i = 0; i < afterDispatcherGroup.length; i++) {
501
- const afterDispatcherArguments = [];
502
- const afterDispatcherCollection = afterDispatcherGroup[i];
503
- const afterDispatcherMetadata: Record<string, TArgumentsMetadata> =
504
- Reflect.getOwnMetadata(
505
- argumentsKey,
506
- afterDispatcherCollection.class,
507
- afterDispatcherCollection.funcName
508
- ) || {};
509
-
510
- if (afterDispatcherMetadata) {
511
- for (const [_key, argsMetadata] of Object.entries(afterDispatcherMetadata)) {
512
- switch (argsMetadata.type) {
513
- case EArgumentTypes.requestHeaders:
514
- afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
515
- ? reqHeaders
516
- : await argumentsResolution(
517
- reqHeaders,
518
- argsMetadata.zodSchema,
519
- argsMetadata.index,
520
- afterDispatcherCollection.funcName
521
- );
522
- break;
523
- case EArgumentTypes.body:
524
- afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
525
- ? await request[argsMetadata.parser || "json"]()
526
- : await argumentsResolution(
527
- await request[argsMetadata.parser || "json"](),
528
- argsMetadata.zodSchema,
529
- argsMetadata.index,
530
- afterDispatcherCollection.funcName
531
- );
532
- break;
533
- case EArgumentTypes.params:
534
- afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
535
- ? params
536
- : await argumentsResolution(
537
- params,
538
- argsMetadata.zodSchema,
539
- argsMetadata.index,
540
- afterDispatcherCollection.funcName
541
- );
542
- break;
543
- case EArgumentTypes.query:
544
- afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
545
- ? query
546
- : await argumentsResolution(
547
- query,
548
- argsMetadata.zodSchema,
549
- argsMetadata.index,
550
- afterDispatcherCollection.funcName
551
- );
552
- break;
553
- case EArgumentTypes.param:
554
- afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
555
- ? !(argsMetadata.key in params)
556
- ? undefined
557
- : params[argsMetadata.key]
558
- : await argumentsResolution(
559
- query,
560
- argsMetadata.zodSchema,
561
- argsMetadata.index,
562
- afterDispatcherCollection.funcName
563
- );
564
- break;
565
- case EArgumentTypes.request:
566
- afterDispatcherArguments[argsMetadata.index] = request;
567
- break;
568
- case EArgumentTypes.responseHeaders:
569
- afterDispatcherArguments[argsMetadata.index] = resHeaders;
570
- break;
526
+ // Execute after dispatcher(s)
527
+ for (let i = 0; i < afterDispatcherGroup.length; i++) {
528
+ const afterDispatcherArguments = [];
529
+ const afterDispatcherCollection = afterDispatcherGroup[i];
530
+ const afterDispatcherMetadata: Record<string, TArgumentsMetadata> =
531
+ Reflect.getOwnMetadata(
532
+ argumentsKey,
533
+ afterDispatcherCollection.class,
534
+ afterDispatcherCollection.funcName
535
+ ) || {};
536
+
537
+ if (afterDispatcherMetadata) {
538
+ for (const [_key, argsMetadata] of Object.entries(afterDispatcherMetadata)) {
539
+ switch (argsMetadata.type) {
540
+ case EArgumentTypes.requestHeaders:
541
+ afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
542
+ ? reqHeaders
543
+ : await argumentsResolution(
544
+ reqHeaders,
545
+ argsMetadata.zodSchema,
546
+ argsMetadata.index,
547
+ afterDispatcherCollection.funcName
548
+ );
549
+ break;
550
+ case EArgumentTypes.body:
551
+ afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
552
+ ? await request[argsMetadata.parser || "json"]()
553
+ : await argumentsResolution(
554
+ await request[argsMetadata.parser || "json"](),
555
+ argsMetadata.zodSchema,
556
+ argsMetadata.index,
557
+ afterDispatcherCollection.funcName
558
+ );
559
+ break;
560
+ case EArgumentTypes.params:
561
+ afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
562
+ ? params
563
+ : await argumentsResolution(
564
+ params,
565
+ argsMetadata.zodSchema,
566
+ argsMetadata.index,
567
+ afterDispatcherCollection.funcName
568
+ );
569
+ break;
570
+ case EArgumentTypes.query:
571
+ afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
572
+ ? query
573
+ : await argumentsResolution(
574
+ query,
575
+ argsMetadata.zodSchema,
576
+ argsMetadata.index,
577
+ afterDispatcherCollection.funcName
578
+ );
579
+ break;
580
+ case EArgumentTypes.param:
581
+ afterDispatcherArguments[argsMetadata.index] = !argsMetadata.zodSchema
582
+ ? !(argsMetadata.key in params)
583
+ ? undefined
584
+ : params[argsMetadata.key]
585
+ : await argumentsResolution(
586
+ query,
587
+ argsMetadata.zodSchema,
588
+ argsMetadata.index,
589
+ afterDispatcherCollection.funcName
590
+ );
591
+ break;
592
+ case EArgumentTypes.request:
593
+ afterDispatcherArguments[argsMetadata.index] = request;
594
+ break;
595
+ case EArgumentTypes.responseHeaders:
596
+ afterDispatcherArguments[argsMetadata.index] = resHeaders;
597
+ break;
598
+ case EArgumentTypes.config:
599
+ afterDispatcherArguments[argsMetadata.index] = config;
600
+ break;
601
+ }
571
602
  }
572
603
  }
573
- }
574
604
 
575
- await afterDispatcherCollection.func(...afterDispatcherArguments);
576
- }
605
+ await afterDispatcherCollection.func(...afterDispatcherArguments);
606
+ }
577
607
 
578
- return responseBody instanceof Response
579
- ? responseBody
580
- : new Response(
581
- !responseBody
582
- ? undefined
583
- : JSON.stringify({
584
- httpCode: 200,
585
- message: "SUCCESS",
586
- data: responseBody
587
- }),
588
- {
589
- status: !responseBody ? 204 : 200,
590
- statusText: "SUCCESS",
591
- headers: resHeaders
592
- }
593
- );
594
- } catch (error) {
595
- return jsonErrorInfer(error, resHeaders);
596
- } finally {
597
- if (allowLogsMethods) {
598
- const end = performance.now();
599
- const convertedPID = `${process.pid}`.yellow;
600
- const convertedMethod = `${request.method.yellow}`.bgBlue;
601
- const convertedReqIp = `${
602
- request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || "<Unknown>"
603
- }`.yellow;
604
- const convertedTime = `${Math.round((end - start + Number.EPSILON) * 10 ** 2) / 10 ** 2}ms`.yellow;
605
-
606
- allowLogsMethods.includes(request.method.toUpperCase() as (typeof allowLogsMethods)[number]) &&
607
- console.info(
608
- `PID: ${convertedPID} - Method: ${convertedMethod} - IP: ${convertedReqIp} - ${url.pathname.blue} - Time: ${convertedTime}`
609
- );
608
+ // Set default header(s)
609
+ resHeaders.set("X-Powered-By", "Bool Typescript");
610
+
611
+ return responseBody instanceof Response
612
+ ? responseBody
613
+ : new Response(
614
+ !responseBody
615
+ ? undefined
616
+ : JSON.stringify({
617
+ httpCode: 200,
618
+ message: "SUCCESS",
619
+ data: responseBody
620
+ }),
621
+ {
622
+ status: !responseBody ? 204 : 200,
623
+ statusText: "SUCCESS",
624
+ headers: resHeaders
625
+ }
626
+ );
627
+ } catch (error) {
628
+ // Set default header(s)
629
+ resHeaders.set("X-Powered-By", "Bool Typescript");
630
+
631
+ return jsonErrorInfer(error, resHeaders);
632
+ } finally {
633
+ if (allowLogsMethods) {
634
+ const end = performance.now();
635
+ const convertedPID = `${process.pid}`.yellow;
636
+ const convertedMethod = `${request.method.yellow}`.bgBlue;
637
+ const convertedReqIp = `${
638
+ request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || "<Unknown>"
639
+ }`.yellow;
640
+ const convertedTime = `${Math.round((end - start + Number.EPSILON) * 10 ** 2) / 10 ** 2}ms`.yellow;
641
+
642
+ allowLogsMethods.includes(request.method.toUpperCase() as (typeof allowLogsMethods)[number]) &&
643
+ console.info(
644
+ `PID: ${convertedPID} - Method: ${convertedMethod} - IP: ${convertedReqIp} - ${url.pathname.blue} - Time: ${convertedTime}`
645
+ );
646
+ }
610
647
  }
611
648
  }
612
- }
613
- });
649
+ });
650
+ } catch (error) {
651
+ console.error(error);
652
+ throw error;
653
+ }
614
654
  };
615
655
 
616
656
  export default BoolFactory;