@bool-ts/core 1.9.0 → 1.9.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.
@@ -1,11 +1,11 @@
1
+ import type { BunFile, Server } from "bun";
1
2
  import type {
2
- TArgumentsMetadata,
3
3
  TControllerMetadata,
4
- THttpMetadata,
5
4
  TModuleMetadata,
6
5
  TWebSocketEventHandlerMetadata,
7
6
  TWebSocketMetadata
8
7
  } from "../decorators";
8
+ import type { TArgumentsMetadataCollection } from "../decorators/arguments";
9
9
  import type { TWebSocketUpgradeData } from "../decorators/webSocket";
10
10
  import type { IContext, IGuard, IMiddleware } from "../interfaces";
11
11
  import type { IDispatcher } from "../interfaces/dispatcher";
@@ -16,7 +16,6 @@ import Qs from "qs";
16
16
  import * as Zod from "zod";
17
17
 
18
18
  import { ETimeUnit, add as TimeAdd } from "@bool-ts/date-time";
19
- import type { BunFile, Server } from "bun";
20
19
  import {
21
20
  HttpRouter,
22
21
  HttpRouterGroup,
@@ -29,7 +28,6 @@ import {
29
28
  argumentsKey,
30
29
  configKey,
31
30
  contextArgsKey,
32
- controllerHttpKey,
33
31
  controllerKey,
34
32
  moduleKey,
35
33
  paramArgsKey,
@@ -60,6 +58,7 @@ export type TGroupElementModel<
60
58
  class: TClass;
61
59
  func: TFunc;
62
60
  funcName: TFuncName;
61
+ argumentsMetadata: TArgumentsMetadataCollection;
63
62
  }>;
64
63
 
65
64
  export type TBoolFactoryOptions = Required<{
@@ -124,11 +123,10 @@ const controllerCreator = ({
124
123
  prefix: "/",
125
124
  httpMetadata: []
126
125
  };
127
- const routesMetadata = (Reflect.getOwnMetadata(controllerHttpKey, controllerConstructor) ||
128
- []) as THttpMetadata;
126
+
129
127
  const router = new HttpRouter(`/${prefix || ""}/${controllerMetadata.prefix}`);
130
128
 
131
- routesMetadata.forEach((routeMetadata) => {
129
+ controllerMetadata.httpMetadata.forEach((routeMetadata) => {
132
130
  if (typeof routeMetadata.descriptor.value !== "function") {
133
131
  return;
134
132
  }
@@ -138,7 +136,8 @@ const controllerCreator = ({
138
136
  const routeArgument = Object.freeze({
139
137
  class: controllerConstructor,
140
138
  funcName: routeMetadata.methodName,
141
- func: handler
139
+ func: handler,
140
+ argumentsMetadata: routeMetadata.argumentsMetadata
142
141
  });
143
142
 
144
143
  switch (routeMetadata.httpMethod) {
@@ -210,7 +209,8 @@ const webSocketCreator = ({
210
209
  const routeArgument = Object.freeze({
211
210
  class: webSocketConstructor,
212
211
  funcName: httpMetadata.methodName,
213
- func: handler
212
+ func: handler,
213
+ argumentsMetadata: httpMetadata.argumentsMetadata
214
214
  });
215
215
 
216
216
  switch (httpMetadata.httpMethod) {
@@ -391,21 +391,29 @@ const moduleResolution = async (
391
391
  const instance = injector.get<IMiddleware>(middleware);
392
392
 
393
393
  if (instance.start && typeof instance.start === "function") {
394
+ const argumentsMetadata: TArgumentsMetadataCollection =
395
+ Reflect.getOwnMetadata(argumentsKey, middleware, "start") || {};
396
+
394
397
  startMiddlewareGroup.push(
395
398
  Object.freeze({
396
399
  class: middleware as IMiddleware,
397
400
  funcName: "start",
398
- func: instance.start.bind(instance)
401
+ func: instance.start.bind(instance),
402
+ argumentsMetadata: argumentsMetadata
399
403
  })
400
404
  );
401
405
  }
402
406
 
403
407
  if (instance.end && typeof instance.end === "function") {
408
+ const argumentsMetadata: TArgumentsMetadataCollection =
409
+ Reflect.getOwnMetadata(argumentsKey, middleware, "start") || {};
410
+
404
411
  endMiddlewareGroup.push(
405
412
  Object.freeze({
406
413
  class: middleware as IMiddleware,
407
414
  funcName: "end",
408
- func: instance.end.bind(instance)
415
+ func: instance.end.bind(instance),
416
+ argumentsMetadata: argumentsMetadata
409
417
  })
410
418
  );
411
419
  }
@@ -413,17 +421,21 @@ const moduleResolution = async (
413
421
  //#endregion
414
422
 
415
423
  //#region [Guard(s)]
416
- const guardGroup = !guards
417
- ? []
418
- : guards.map((guard) => {
419
- const guardInstance = injector.get<IGuard>(guard);
420
-
421
- return Object.freeze({
422
- class: guard,
423
- funcName: "enforce",
424
- func: guardInstance.enforce.bind(guardInstance)
424
+ const guardGroup: Array<TGroupElementModel<"enforce", IGuard, NonNullable<IGuard["enforce"]>>> =
425
+ !guards
426
+ ? []
427
+ : guards.map((guard) => {
428
+ const guardInstance = injector.get<IGuard>(guard);
429
+ const argumentsMetadata: TArgumentsMetadataCollection =
430
+ Reflect.getOwnMetadata(argumentsKey, guard, "enforce") || {};
431
+
432
+ return Object.freeze({
433
+ class: guard as unknown as IGuard,
434
+ funcName: "enforce",
435
+ func: guardInstance.enforce.bind(guardInstance),
436
+ argumentsMetadata: argumentsMetadata
437
+ });
425
438
  });
426
- });
427
439
  //#endregion
428
440
 
429
441
  //#region [Before dispatcher(s)]
@@ -439,21 +451,29 @@ const moduleResolution = async (
439
451
  const instance = injector.get<IDispatcher>(dispatcher);
440
452
 
441
453
  if (instance.open && typeof instance.open === "function") {
454
+ const argumentsMetadata: TArgumentsMetadataCollection =
455
+ Reflect.getOwnMetadata(argumentsKey, dispatcher, "open") || {};
456
+
442
457
  openDispatcherGroup.push(
443
458
  Object.freeze({
444
459
  class: dispatcher as IDispatcher,
445
460
  funcName: "open",
446
- func: instance.open.bind(instance)
461
+ func: instance.open.bind(instance),
462
+ argumentsMetadata: argumentsMetadata
447
463
  })
448
464
  );
449
465
  }
450
466
 
451
467
  if (instance.close && typeof instance.close === "function") {
468
+ const argumentsMetadata: TArgumentsMetadataCollection =
469
+ Reflect.getOwnMetadata(argumentsKey, dispatcher, "close") || {};
470
+
452
471
  closeDispatcherGroup.push(
453
472
  Object.freeze({
454
473
  class: dispatcher as IDispatcher,
455
474
  funcName: "close",
456
- func: instance.close.bind(instance)
475
+ func: instance.close.bind(instance),
476
+ argumentsMetadata: argumentsMetadata
457
477
  })
458
478
  );
459
479
  }
@@ -613,93 +633,93 @@ const httpFetcher = async (
613
633
  // Execute start middleware(s)
614
634
  for (let i = 0; i < startMiddlewareGroup.length; i++) {
615
635
  const args = [];
616
- const collection = startMiddlewareGroup[i];
617
- const metadata: Record<string, TArgumentsMetadata> =
618
- Reflect.getOwnMetadata(argumentsKey, collection.class, collection.funcName) || {};
619
-
620
- if (metadata) {
621
- for (const [_key, argsMetadata] of Object.entries(metadata)) {
622
- switch (argsMetadata.type) {
623
- case requestArgsKey:
624
- args[argsMetadata.index] = !argsMetadata.zodSchema
625
- ? request
626
- : await argumentsResolution(
627
- request,
628
- argsMetadata.zodSchema,
629
- argsMetadata.index,
630
- collection.funcName
631
- );
632
- break;
633
- case requestBodyArgsKey:
634
- args[argsMetadata.index] = !argsMetadata.zodSchema
635
- ? await request[argsMetadata.parser || "json"]()
636
- : await argumentsResolution(
637
- await request[argsMetadata.parser || "json"](),
638
- argsMetadata.zodSchema,
639
- argsMetadata.index,
640
- collection.funcName
641
- );
642
- break;
643
- case contextArgsKey:
644
- args[argsMetadata.index] = !argsMetadata.key
645
- ? contextHook
646
- : contextHook.get(argsMetadata.key);
647
- break;
648
- case requestHeadersArgsKey:
649
- args[argsMetadata.index] = !argsMetadata.zodSchema
650
- ? request.headers
651
- : await argumentsResolution(
652
- request.headers.toJSON(),
653
- argsMetadata.zodSchema,
654
- argsMetadata.index,
655
- collection.funcName
656
- );
657
- break;
658
- case responseHeadersArgsKey:
659
- args[argsMetadata.index] = context[argsMetadata.type];
660
- break;
661
- case requestHeaderArgsKey:
662
- args[argsMetadata.index] = !argsMetadata.zodSchema
663
- ? request.headers.get(argsMetadata.key) || undefined
664
- : await argumentsResolution(
665
- request.headers.get(argsMetadata.key) || undefined,
666
- argsMetadata.zodSchema,
667
- argsMetadata.index,
668
- collection.funcName
669
- );
670
- break;
671
- case paramArgsKey:
672
- args[argsMetadata.index] = !argsMetadata.zodSchema
673
- ? context[paramsArgsKey][argsMetadata.key] || undefined
674
- : await argumentsResolution(
675
- context[paramsArgsKey][argsMetadata.key],
676
- argsMetadata.zodSchema,
677
- argsMetadata.index,
678
- collection.funcName
679
- );
680
- break;
681
- case routeModelArgsKey:
682
- args[argsMetadata.index] = context[routeModelArgsKey];
683
- break;
684
- default:
685
- args[argsMetadata.index] = !argsMetadata.zodSchema
686
- ? !(argsMetadata.type in context)
687
- ? undefined
688
- : context[argsMetadata.type]
689
- : await argumentsResolution(
690
- !(argsMetadata.type in context)
691
- ? undefined
692
- : context[argsMetadata.type],
693
- argsMetadata.zodSchema,
694
- argsMetadata.index,
695
- collection.funcName
696
- );
697
- break;
698
- }
636
+ const {
637
+ func: handler,
638
+ funcName: functionName,
639
+ argumentsMetadata
640
+ } = startMiddlewareGroup[i];
641
+
642
+ for (const [_key, argMetadata] of Object.entries(argumentsMetadata)) {
643
+ switch (argMetadata.type) {
644
+ case requestArgsKey:
645
+ args[argMetadata.index] = !argMetadata.zodSchema
646
+ ? request
647
+ : await argumentsResolution(
648
+ request,
649
+ argMetadata.zodSchema,
650
+ argMetadata.index,
651
+ functionName
652
+ );
653
+ break;
654
+ case requestBodyArgsKey:
655
+ args[argMetadata.index] = !argMetadata.zodSchema
656
+ ? await request[argMetadata.parser || "json"]()
657
+ : await argumentsResolution(
658
+ await request[argMetadata.parser || "json"](),
659
+ argMetadata.zodSchema,
660
+ argMetadata.index,
661
+ functionName
662
+ );
663
+ break;
664
+ case contextArgsKey:
665
+ args[argMetadata.index] = !argMetadata.key
666
+ ? contextHook
667
+ : contextHook.get(argMetadata.key);
668
+ break;
669
+ case requestHeadersArgsKey:
670
+ args[argMetadata.index] = !argMetadata.zodSchema
671
+ ? request.headers
672
+ : await argumentsResolution(
673
+ request.headers.toJSON(),
674
+ argMetadata.zodSchema,
675
+ argMetadata.index,
676
+ functionName
677
+ );
678
+ break;
679
+ case responseHeadersArgsKey:
680
+ args[argMetadata.index] = context[argMetadata.type];
681
+ break;
682
+ case requestHeaderArgsKey:
683
+ args[argMetadata.index] = !argMetadata.zodSchema
684
+ ? request.headers.get(argMetadata.key) || undefined
685
+ : await argumentsResolution(
686
+ request.headers.get(argMetadata.key) || undefined,
687
+ argMetadata.zodSchema,
688
+ argMetadata.index,
689
+ functionName
690
+ );
691
+ break;
692
+ case paramArgsKey:
693
+ args[argMetadata.index] = !argMetadata.zodSchema
694
+ ? context[paramsArgsKey][argMetadata.key] || undefined
695
+ : await argumentsResolution(
696
+ context[paramsArgsKey][argMetadata.key],
697
+ argMetadata.zodSchema,
698
+ argMetadata.index,
699
+ functionName
700
+ );
701
+ break;
702
+ case routeModelArgsKey:
703
+ args[argMetadata.index] = context[routeModelArgsKey];
704
+ break;
705
+ default:
706
+ args[argMetadata.index] = !argMetadata.zodSchema
707
+ ? !(argMetadata.type in context)
708
+ ? undefined
709
+ : context[argMetadata.type]
710
+ : await argumentsResolution(
711
+ !(argMetadata.type in context)
712
+ ? undefined
713
+ : context[argMetadata.type],
714
+ argMetadata.zodSchema,
715
+ argMetadata.index,
716
+ functionName
717
+ );
718
+ break;
699
719
  }
700
720
  }
701
721
 
702
- context[responseBodyArgsKey] = await collection.func(...args);
722
+ context[responseBodyArgsKey] = await handler(...args);
703
723
 
704
724
  if (context[responseBodyArgsKey] instanceof Response) {
705
725
  return responseConverter(context[responseBodyArgsKey]);
@@ -709,89 +729,85 @@ const httpFetcher = async (
709
729
  // Execute guard(s)
710
730
  for (let i = 0; i < guardGroup.length; i++) {
711
731
  const args = [];
712
- const collection = guardGroup[i];
713
- const metadata: Record<string, TArgumentsMetadata> =
714
- Reflect.getOwnMetadata(argumentsKey, collection.class, collection.funcName) || {};
715
-
716
- if (metadata) {
717
- for (const [_key, argsMetadata] of Object.entries(metadata)) {
718
- switch (argsMetadata.type) {
719
- case requestArgsKey:
720
- args[argsMetadata.index] = !argsMetadata.zodSchema
721
- ? request
722
- : await argumentsResolution(
723
- request,
724
- argsMetadata.zodSchema,
725
- argsMetadata.index,
726
- collection.funcName
727
- );
728
- break;
729
- case requestBodyArgsKey:
730
- args[argsMetadata.index] = !argsMetadata.zodSchema
731
- ? await request[argsMetadata.parser || "json"]()
732
- : await argumentsResolution(
733
- await request[argsMetadata.parser || "json"](),
734
- argsMetadata.zodSchema,
735
- argsMetadata.index,
736
- collection.funcName
737
- );
738
- break;
739
- case contextArgsKey:
740
- args[argsMetadata.index] = !argsMetadata.key
741
- ? contextHook
742
- : contextHook.get(argsMetadata.key);
743
- break;
744
- case requestHeadersArgsKey:
745
- args[argsMetadata.index] = !argsMetadata.zodSchema
746
- ? request.headers
747
- : await argumentsResolution(
748
- request.headers.toJSON(),
749
- argsMetadata.zodSchema,
750
- argsMetadata.index,
751
- collection.funcName
752
- );
753
- break;
754
- case responseHeadersArgsKey:
755
- args[argsMetadata.index] = context[argsMetadata.type];
756
- break;
757
- case requestHeaderArgsKey:
758
- args[argsMetadata.index] = !argsMetadata.zodSchema
759
- ? request.headers.get(argsMetadata.key) || undefined
760
- : await argumentsResolution(
761
- request.headers.get(argsMetadata.key) || undefined,
762
- argsMetadata.zodSchema,
763
- argsMetadata.index,
764
- collection.funcName
765
- );
766
- break;
767
- case paramArgsKey:
768
- args[argsMetadata.index] = !argsMetadata.zodSchema
769
- ? context[paramsArgsKey][argsMetadata.key] || undefined
770
- : await argumentsResolution(
771
- context[paramsArgsKey][argsMetadata.key],
772
- argsMetadata.zodSchema,
773
- argsMetadata.index,
774
- collection.funcName
775
- );
776
- break;
777
- case routeModelArgsKey:
778
- args[argsMetadata.index] = context[routeModelArgsKey];
779
- break;
780
- default:
781
- args[argsMetadata.index] = !argsMetadata.zodSchema
782
- ? context[argsMetadata.type]
783
- : await argumentsResolution(
784
- context[argsMetadata.type],
785
- argsMetadata.zodSchema,
786
- argsMetadata.index,
787
- collection.funcName
788
- );
789
- break;
790
- }
732
+ const { func: handler, funcName: functionName, argumentsMetadata } = guardGroup[i];
733
+
734
+ for (const [_key, argMetadata] of Object.entries(argumentsMetadata)) {
735
+ switch (argMetadata.type) {
736
+ case requestArgsKey:
737
+ args[argMetadata.index] = !argMetadata.zodSchema
738
+ ? request
739
+ : await argumentsResolution(
740
+ request,
741
+ argMetadata.zodSchema,
742
+ argMetadata.index,
743
+ functionName
744
+ );
745
+ break;
746
+ case requestBodyArgsKey:
747
+ args[argMetadata.index] = !argMetadata.zodSchema
748
+ ? await request[argMetadata.parser || "json"]()
749
+ : await argumentsResolution(
750
+ await request[argMetadata.parser || "json"](),
751
+ argMetadata.zodSchema,
752
+ argMetadata.index,
753
+ functionName
754
+ );
755
+ break;
756
+ case contextArgsKey:
757
+ args[argMetadata.index] = !argMetadata.key
758
+ ? contextHook
759
+ : contextHook.get(argMetadata.key);
760
+ break;
761
+ case requestHeadersArgsKey:
762
+ args[argMetadata.index] = !argMetadata.zodSchema
763
+ ? request.headers
764
+ : await argumentsResolution(
765
+ request.headers.toJSON(),
766
+ argMetadata.zodSchema,
767
+ argMetadata.index,
768
+ functionName
769
+ );
770
+ break;
771
+ case responseHeadersArgsKey:
772
+ args[argMetadata.index] = context[argMetadata.type];
773
+ break;
774
+ case requestHeaderArgsKey:
775
+ args[argMetadata.index] = !argMetadata.zodSchema
776
+ ? request.headers.get(argMetadata.key) || undefined
777
+ : await argumentsResolution(
778
+ request.headers.get(argMetadata.key) || undefined,
779
+ argMetadata.zodSchema,
780
+ argMetadata.index,
781
+ functionName
782
+ );
783
+ break;
784
+ case paramArgsKey:
785
+ args[argMetadata.index] = !argMetadata.zodSchema
786
+ ? context[paramsArgsKey][argMetadata.key] || undefined
787
+ : await argumentsResolution(
788
+ context[paramsArgsKey][argMetadata.key],
789
+ argMetadata.zodSchema,
790
+ argMetadata.index,
791
+ functionName
792
+ );
793
+ break;
794
+ case routeModelArgsKey:
795
+ args[argMetadata.index] = context[routeModelArgsKey];
796
+ break;
797
+ default:
798
+ args[argMetadata.index] = !argMetadata.zodSchema
799
+ ? context[argMetadata.type]
800
+ : await argumentsResolution(
801
+ context[argMetadata.type],
802
+ argMetadata.zodSchema,
803
+ argMetadata.index,
804
+ functionName
805
+ );
806
+ break;
791
807
  }
792
808
  }
793
809
 
794
- const guardResult = await collection.func(...args);
810
+ const guardResult = await handler(...args);
795
811
 
796
812
  if (typeof guardResult !== "boolean" || !guardResult) {
797
813
  throw new HttpClientError({
@@ -805,269 +821,259 @@ const httpFetcher = async (
805
821
  // Execute open dispatcher(s)
806
822
  for (let i = 0; i < openDispatcherGroup.length; i++) {
807
823
  const args = [];
808
- const collection = openDispatcherGroup[i];
809
- const metadata: Record<string, TArgumentsMetadata> =
810
- Reflect.getOwnMetadata(argumentsKey, collection.class, collection.funcName) || {};
811
-
812
- if (metadata) {
813
- for (const [_key, argsMetadata] of Object.entries(metadata)) {
814
- switch (argsMetadata.type) {
815
- case requestArgsKey:
816
- args[argsMetadata.index] = !argsMetadata.zodSchema
817
- ? request
818
- : await argumentsResolution(
819
- request,
820
- argsMetadata.zodSchema,
821
- argsMetadata.index,
822
- collection.funcName
823
- );
824
- break;
825
- case requestBodyArgsKey:
826
- args[argsMetadata.index] = !argsMetadata.zodSchema
827
- ? await request[argsMetadata.parser || "json"]()
828
- : await argumentsResolution(
829
- await request[argsMetadata.parser || "json"](),
830
- argsMetadata.zodSchema,
831
- argsMetadata.index,
832
- collection.funcName
833
- );
834
- break;
835
- case contextArgsKey:
836
- args[argsMetadata.index] = !argsMetadata.key
837
- ? contextHook
838
- : contextHook.get(argsMetadata.key);
839
- break;
840
- case requestHeadersArgsKey:
841
- args[argsMetadata.index] = !argsMetadata.zodSchema
842
- ? request.headers
843
- : await argumentsResolution(
844
- request.headers.toJSON(),
845
- argsMetadata.zodSchema,
846
- argsMetadata.index,
847
- collection.funcName
848
- );
849
- break;
850
- case responseHeadersArgsKey:
851
- args[argsMetadata.index] = context[argsMetadata.type];
852
- break;
853
- case requestHeaderArgsKey:
854
- args[argsMetadata.index] = !argsMetadata.zodSchema
855
- ? request.headers.get(argsMetadata.key) || undefined
856
- : await argumentsResolution(
857
- request.headers.get(argsMetadata.key) || undefined,
858
- argsMetadata.zodSchema,
859
- argsMetadata.index,
860
- collection.funcName
861
- );
862
- break;
863
- case paramArgsKey:
864
- args[argsMetadata.index] = !argsMetadata.zodSchema
865
- ? context[paramsArgsKey][argsMetadata.key] || undefined
866
- : await argumentsResolution(
867
- context[paramsArgsKey][argsMetadata.key],
868
- argsMetadata.zodSchema,
869
- argsMetadata.index,
870
- collection.funcName
871
- );
872
- break;
873
- case routeModelArgsKey:
874
- args[argsMetadata.index] = context[routeModelArgsKey];
875
- break;
876
- default:
877
- args[argsMetadata.index] = !argsMetadata.zodSchema
878
- ? context[argsMetadata.type]
879
- : await argumentsResolution(
880
- context[argsMetadata.type],
881
- argsMetadata.zodSchema,
882
- argsMetadata.index,
883
- collection.funcName
884
- );
885
- break;
886
- }
887
- }
888
- }
824
+ const { func: handler, funcName: functionName, argumentsMetadata } = openDispatcherGroup[i];
889
825
 
890
- context[responseBodyArgsKey] = await collection.func(...args);
891
- }
892
-
893
- // Execute controller action
894
- const controllerActionArguments: any[] = [];
895
- const controllerActionCollection = model;
896
- const controllerActionMetadata: Record<string, TArgumentsMetadata> =
897
- Reflect.getOwnMetadata(
898
- argumentsKey,
899
- controllerActionCollection.class,
900
- controllerActionCollection.funcName
901
- ) || {};
902
-
903
- if (controllerActionMetadata) {
904
- for (const [_key, argsMetadata] of Object.entries(controllerActionMetadata)) {
905
- switch (argsMetadata.type) {
826
+ for (const [_key, argMetadata] of Object.entries(argumentsMetadata)) {
827
+ switch (argMetadata.type) {
906
828
  case requestArgsKey:
907
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
829
+ args[argMetadata.index] = !argMetadata.zodSchema
908
830
  ? request
909
831
  : await argumentsResolution(
910
832
  request,
911
- argsMetadata.zodSchema,
912
- argsMetadata.index,
913
- controllerActionCollection.funcName
833
+ argMetadata.zodSchema,
834
+ argMetadata.index,
835
+ functionName
914
836
  );
915
837
  break;
916
838
  case requestBodyArgsKey:
917
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
918
- ? await request[argsMetadata.parser || "json"]()
839
+ args[argMetadata.index] = !argMetadata.zodSchema
840
+ ? await request[argMetadata.parser || "json"]()
919
841
  : await argumentsResolution(
920
- await request[argsMetadata.parser || "json"](),
921
- argsMetadata.zodSchema,
922
- argsMetadata.index,
923
- controllerActionCollection.funcName
842
+ await request[argMetadata.parser || "json"](),
843
+ argMetadata.zodSchema,
844
+ argMetadata.index,
845
+ functionName
924
846
  );
925
847
  break;
926
848
  case contextArgsKey:
927
- controllerActionArguments[argsMetadata.index] = !argsMetadata.key
849
+ args[argMetadata.index] = !argMetadata.key
928
850
  ? contextHook
929
- : contextHook.get(argsMetadata.key);
851
+ : contextHook.get(argMetadata.key);
930
852
  break;
931
853
  case requestHeadersArgsKey:
932
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
854
+ args[argMetadata.index] = !argMetadata.zodSchema
933
855
  ? request.headers
934
856
  : await argumentsResolution(
935
857
  request.headers.toJSON(),
936
- argsMetadata.zodSchema,
937
- argsMetadata.index,
938
- controllerActionCollection.funcName
858
+ argMetadata.zodSchema,
859
+ argMetadata.index,
860
+ functionName
939
861
  );
940
862
  break;
941
863
  case responseHeadersArgsKey:
942
- controllerActionArguments[argsMetadata.index] = context[argsMetadata.type];
864
+ args[argMetadata.index] = context[argMetadata.type];
943
865
  break;
944
866
  case requestHeaderArgsKey:
945
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
946
- ? request.headers.get(argsMetadata.key) || undefined
867
+ args[argMetadata.index] = !argMetadata.zodSchema
868
+ ? request.headers.get(argMetadata.key) || undefined
947
869
  : await argumentsResolution(
948
- request.headers.get(argsMetadata.key) || undefined,
949
- argsMetadata.zodSchema,
950
- argsMetadata.index,
951
- controllerActionCollection.funcName
870
+ request.headers.get(argMetadata.key) || undefined,
871
+ argMetadata.zodSchema,
872
+ argMetadata.index,
873
+ functionName
952
874
  );
953
875
  break;
954
876
  case paramArgsKey:
955
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
956
- ? context[paramsArgsKey][argsMetadata.key] || undefined
877
+ args[argMetadata.index] = !argMetadata.zodSchema
878
+ ? context[paramsArgsKey][argMetadata.key] || undefined
957
879
  : await argumentsResolution(
958
- context[paramsArgsKey][argsMetadata.key],
959
- argsMetadata.zodSchema,
960
- argsMetadata.index,
961
- controllerActionCollection.funcName
880
+ context[paramsArgsKey][argMetadata.key],
881
+ argMetadata.zodSchema,
882
+ argMetadata.index,
883
+ functionName
962
884
  );
963
885
  break;
964
886
  case routeModelArgsKey:
965
- controllerActionArguments[argsMetadata.index] = context[routeModelArgsKey];
887
+ args[argMetadata.index] = context[routeModelArgsKey];
966
888
  break;
967
889
  default:
968
- controllerActionArguments[argsMetadata.index] = !argsMetadata.zodSchema
969
- ? context[argsMetadata.type]
890
+ args[argMetadata.index] = !argMetadata.zodSchema
891
+ ? context[argMetadata.type]
970
892
  : await argumentsResolution(
971
- context[argsMetadata.type],
972
- argsMetadata.zodSchema,
973
- argsMetadata.index,
974
- controllerActionCollection.funcName
893
+ context[argMetadata.type],
894
+ argMetadata.zodSchema,
895
+ argMetadata.index,
896
+ functionName
975
897
  );
976
898
  break;
977
899
  }
978
900
  }
901
+
902
+ context[responseBodyArgsKey] = await handler(...args);
979
903
  }
980
904
 
981
- context[responseBodyArgsKey] = await controllerActionCollection.func(
982
- ...controllerActionArguments
983
- );
905
+ // Execute controller action
906
+ const controllerActionArguments: any[] = [];
907
+ const {
908
+ func: controllerAction,
909
+ funcName: controllerActionName,
910
+ argumentsMetadata: controllerActionArgumentsMetadata
911
+ } = model;
912
+
913
+ for (const [_key, argMetadata] of Object.entries(controllerActionArgumentsMetadata)) {
914
+ switch (argMetadata.type) {
915
+ case requestArgsKey:
916
+ controllerActionArguments[argMetadata.index] = !argMetadata.zodSchema
917
+ ? request
918
+ : await argumentsResolution(
919
+ request,
920
+ argMetadata.zodSchema,
921
+ argMetadata.index,
922
+ controllerActionName
923
+ );
924
+ break;
925
+ case requestBodyArgsKey:
926
+ controllerActionArguments[argMetadata.index] = !argMetadata.zodSchema
927
+ ? await request[argMetadata.parser || "json"]()
928
+ : await argumentsResolution(
929
+ await request[argMetadata.parser || "json"](),
930
+ argMetadata.zodSchema,
931
+ argMetadata.index,
932
+ controllerActionName
933
+ );
934
+ break;
935
+ case contextArgsKey:
936
+ controllerActionArguments[argMetadata.index] = !argMetadata.key
937
+ ? contextHook
938
+ : contextHook.get(argMetadata.key);
939
+ break;
940
+ case requestHeadersArgsKey:
941
+ controllerActionArguments[argMetadata.index] = !argMetadata.zodSchema
942
+ ? request.headers
943
+ : await argumentsResolution(
944
+ request.headers.toJSON(),
945
+ argMetadata.zodSchema,
946
+ argMetadata.index,
947
+ controllerActionName
948
+ );
949
+ break;
950
+ case responseHeadersArgsKey:
951
+ controllerActionArguments[argMetadata.index] = context[argMetadata.type];
952
+ break;
953
+ case requestHeaderArgsKey:
954
+ controllerActionArguments[argMetadata.index] = !argMetadata.zodSchema
955
+ ? request.headers.get(argMetadata.key) || undefined
956
+ : await argumentsResolution(
957
+ request.headers.get(argMetadata.key) || undefined,
958
+ argMetadata.zodSchema,
959
+ argMetadata.index,
960
+ controllerActionName
961
+ );
962
+ break;
963
+ case paramArgsKey:
964
+ controllerActionArguments[argMetadata.index] = !argMetadata.zodSchema
965
+ ? context[paramsArgsKey][argMetadata.key] || undefined
966
+ : await argumentsResolution(
967
+ context[paramsArgsKey][argMetadata.key],
968
+ argMetadata.zodSchema,
969
+ argMetadata.index,
970
+ controllerActionName
971
+ );
972
+ break;
973
+ case routeModelArgsKey:
974
+ controllerActionArguments[argMetadata.index] = context[routeModelArgsKey];
975
+ break;
976
+ default:
977
+ controllerActionArguments[argMetadata.index] = !argMetadata.zodSchema
978
+ ? context[argMetadata.type]
979
+ : await argumentsResolution(
980
+ context[argMetadata.type],
981
+ argMetadata.zodSchema,
982
+ argMetadata.index,
983
+ controllerActionName
984
+ );
985
+ break;
986
+ }
987
+ }
988
+
989
+ context[responseBodyArgsKey] = await controllerAction(...controllerActionArguments);
984
990
 
985
991
  // Execute close dispatcher(s)
986
992
  for (let i = 0; i < closeDispatcherGroup.length; i++) {
987
993
  const args = [];
988
- const collection = closeDispatcherGroup[i];
989
- const metadata: Record<string, TArgumentsMetadata> =
990
- Reflect.getOwnMetadata(argumentsKey, collection.class, collection.funcName) || {};
991
-
992
- if (metadata) {
993
- for (const [_key, argsMetadata] of Object.entries(metadata)) {
994
- switch (argsMetadata.type) {
995
- case requestArgsKey:
996
- args[argsMetadata.index] = !argsMetadata.zodSchema
997
- ? request
998
- : await argumentsResolution(
999
- request,
1000
- argsMetadata.zodSchema,
1001
- argsMetadata.index,
1002
- collection.funcName
1003
- );
1004
- break;
1005
- case requestBodyArgsKey:
1006
- args[argsMetadata.index] = !argsMetadata.zodSchema
1007
- ? await request[argsMetadata.parser || "json"]()
1008
- : await argumentsResolution(
1009
- await request[argsMetadata.parser || "json"](),
1010
- argsMetadata.zodSchema,
1011
- argsMetadata.index,
1012
- collection.funcName
1013
- );
1014
- break;
1015
- case contextArgsKey:
1016
- args[argsMetadata.index] = !argsMetadata.key
1017
- ? contextHook
1018
- : contextHook.get(argsMetadata.key);
1019
- break;
1020
- case requestHeadersArgsKey:
1021
- args[argsMetadata.index] = !argsMetadata.zodSchema
1022
- ? request.headers
1023
- : await argumentsResolution(
1024
- request.headers.toJSON(),
1025
- argsMetadata.zodSchema,
1026
- argsMetadata.index,
1027
- collection.funcName
1028
- );
1029
- break;
1030
- case responseHeadersArgsKey:
1031
- args[argsMetadata.index] = context[argsMetadata.type];
1032
- break;
1033
- case requestHeaderArgsKey:
1034
- args[argsMetadata.index] = !argsMetadata.zodSchema
1035
- ? request.headers.get(argsMetadata.key) || undefined
1036
- : await argumentsResolution(
1037
- request.headers.get(argsMetadata.key) || undefined,
1038
- argsMetadata.zodSchema,
1039
- argsMetadata.index,
1040
- collection.funcName
1041
- );
1042
- break;
1043
- case paramArgsKey:
1044
- args[argsMetadata.index] = !argsMetadata.zodSchema
1045
- ? context[paramsArgsKey][argsMetadata.key] || undefined
1046
- : await argumentsResolution(
1047
- context[paramsArgsKey][argsMetadata.key],
1048
- argsMetadata.zodSchema,
1049
- argsMetadata.index,
1050
- collection.funcName
1051
- );
1052
- break;
1053
- case routeModelArgsKey:
1054
- args[argsMetadata.index] = context[routeModelArgsKey];
1055
- break;
1056
- default:
1057
- args[argsMetadata.index] = !argsMetadata.zodSchema
1058
- ? context[argsMetadata.type]
1059
- : await argumentsResolution(
1060
- context[argsMetadata.type],
1061
- argsMetadata.zodSchema,
1062
- argsMetadata.index,
1063
- collection.funcName
1064
- );
1065
- break;
1066
- }
994
+ const {
995
+ func: handler,
996
+ funcName: functionName,
997
+ argumentsMetadata
998
+ } = closeDispatcherGroup[i];
999
+
1000
+ for (const [_key, argMetadata] of Object.entries(argumentsMetadata)) {
1001
+ switch (argMetadata.type) {
1002
+ case requestArgsKey:
1003
+ args[argMetadata.index] = !argMetadata.zodSchema
1004
+ ? request
1005
+ : await argumentsResolution(
1006
+ request,
1007
+ argMetadata.zodSchema,
1008
+ argMetadata.index,
1009
+ functionName
1010
+ );
1011
+ break;
1012
+ case requestBodyArgsKey:
1013
+ args[argMetadata.index] = !argMetadata.zodSchema
1014
+ ? await request[argMetadata.parser || "json"]()
1015
+ : await argumentsResolution(
1016
+ await request[argMetadata.parser || "json"](),
1017
+ argMetadata.zodSchema,
1018
+ argMetadata.index,
1019
+ functionName
1020
+ );
1021
+ break;
1022
+ case contextArgsKey:
1023
+ args[argMetadata.index] = !argMetadata.key
1024
+ ? contextHook
1025
+ : contextHook.get(argMetadata.key);
1026
+ break;
1027
+ case requestHeadersArgsKey:
1028
+ args[argMetadata.index] = !argMetadata.zodSchema
1029
+ ? request.headers
1030
+ : await argumentsResolution(
1031
+ request.headers.toJSON(),
1032
+ argMetadata.zodSchema,
1033
+ argMetadata.index,
1034
+ functionName
1035
+ );
1036
+ break;
1037
+ case responseHeadersArgsKey:
1038
+ args[argMetadata.index] = context[argMetadata.type];
1039
+ break;
1040
+ case requestHeaderArgsKey:
1041
+ args[argMetadata.index] = !argMetadata.zodSchema
1042
+ ? request.headers.get(argMetadata.key) || undefined
1043
+ : await argumentsResolution(
1044
+ request.headers.get(argMetadata.key) || undefined,
1045
+ argMetadata.zodSchema,
1046
+ argMetadata.index,
1047
+ functionName
1048
+ );
1049
+ break;
1050
+ case paramArgsKey:
1051
+ args[argMetadata.index] = !argMetadata.zodSchema
1052
+ ? context[paramsArgsKey][argMetadata.key] || undefined
1053
+ : await argumentsResolution(
1054
+ context[paramsArgsKey][argMetadata.key],
1055
+ argMetadata.zodSchema,
1056
+ argMetadata.index,
1057
+ functionName
1058
+ );
1059
+ break;
1060
+ case routeModelArgsKey:
1061
+ args[argMetadata.index] = context[routeModelArgsKey];
1062
+ break;
1063
+ default:
1064
+ args[argMetadata.index] = !argMetadata.zodSchema
1065
+ ? context[argMetadata.type]
1066
+ : await argumentsResolution(
1067
+ context[argMetadata.type],
1068
+ argMetadata.zodSchema,
1069
+ argMetadata.index,
1070
+ functionName
1071
+ );
1072
+ break;
1067
1073
  }
1068
1074
  }
1069
1075
 
1070
- await collection.func(...args);
1076
+ await handler(...args);
1071
1077
  }
1072
1078
 
1073
1079
  if (context[responseBodyArgsKey] instanceof Response) {
@@ -1077,93 +1083,89 @@ const httpFetcher = async (
1077
1083
  // Execute end middleware(s)
1078
1084
  for (let i = 0; i < endMiddlewareGroup.length; i++) {
1079
1085
  const args = [];
1080
- const collection = endMiddlewareGroup[i];
1081
- const metadata: Record<string, TArgumentsMetadata> =
1082
- Reflect.getOwnMetadata(argumentsKey, collection.class, collection.funcName) || {};
1083
-
1084
- if (metadata) {
1085
- for (const [_key, argsMetadata] of Object.entries(metadata)) {
1086
- switch (argsMetadata.type) {
1087
- case requestArgsKey:
1088
- args[argsMetadata.index] = !argsMetadata.zodSchema
1089
- ? request
1090
- : await argumentsResolution(
1091
- request,
1092
- argsMetadata.zodSchema,
1093
- argsMetadata.index,
1094
- collection.funcName
1095
- );
1096
- break;
1097
- case requestBodyArgsKey:
1098
- args[argsMetadata.index] = !argsMetadata.zodSchema
1099
- ? await request[argsMetadata.parser || "json"]()
1100
- : await argumentsResolution(
1101
- await request[argsMetadata.parser || "json"](),
1102
- argsMetadata.zodSchema,
1103
- argsMetadata.index,
1104
- collection.funcName
1105
- );
1106
- break;
1107
- case contextArgsKey:
1108
- args[argsMetadata.index] = !argsMetadata.key
1109
- ? contextHook
1110
- : contextHook.get(argsMetadata.key);
1111
- break;
1112
- case requestHeadersArgsKey:
1113
- args[argsMetadata.index] = !argsMetadata.zodSchema
1114
- ? request.headers
1115
- : await argumentsResolution(
1116
- request.headers.toJSON(),
1117
- argsMetadata.zodSchema,
1118
- argsMetadata.index,
1119
- collection.funcName
1120
- );
1121
- break;
1122
- case responseHeadersArgsKey:
1123
- args[argsMetadata.index] = context[argsMetadata.type];
1124
- break;
1125
- case requestHeaderArgsKey:
1126
- args[argsMetadata.index] = !argsMetadata.zodSchema
1127
- ? request.headers.get(argsMetadata.key) || undefined
1128
- : await argumentsResolution(
1129
- request.headers.get(argsMetadata.key) || undefined,
1130
- argsMetadata.zodSchema,
1131
- argsMetadata.index,
1132
- collection.funcName
1133
- );
1134
- break;
1135
- case paramArgsKey:
1136
- args[argsMetadata.index] = !argsMetadata.zodSchema
1137
- ? context[paramsArgsKey][argsMetadata.key] || undefined
1138
- : await argumentsResolution(
1139
- context[paramsArgsKey][argsMetadata.key],
1140
- argsMetadata.zodSchema,
1141
- argsMetadata.index,
1142
- collection.funcName
1143
- );
1144
- break;
1145
- case routeModelArgsKey:
1146
- args[argsMetadata.index] = context[routeModelArgsKey];
1147
- break;
1148
- default:
1149
- args[argsMetadata.index] = !argsMetadata.zodSchema
1150
- ? !(argsMetadata.type in context)
1151
- ? undefined
1152
- : context[argsMetadata.type]
1153
- : await argumentsResolution(
1154
- !(argsMetadata.type in context)
1155
- ? undefined
1156
- : context[argsMetadata.type],
1157
- argsMetadata.zodSchema,
1158
- argsMetadata.index,
1159
- collection.funcName
1160
- );
1161
- break;
1162
- }
1086
+ const { func: handler, funcName: functionName, argumentsMetadata } = endMiddlewareGroup[i];
1087
+
1088
+ for (const [_key, argMetadata] of Object.entries(argumentsMetadata)) {
1089
+ switch (argMetadata.type) {
1090
+ case requestArgsKey:
1091
+ args[argMetadata.index] = !argMetadata.zodSchema
1092
+ ? request
1093
+ : await argumentsResolution(
1094
+ request,
1095
+ argMetadata.zodSchema,
1096
+ argMetadata.index,
1097
+ functionName
1098
+ );
1099
+ break;
1100
+ case requestBodyArgsKey:
1101
+ args[argMetadata.index] = !argMetadata.zodSchema
1102
+ ? await request[argMetadata.parser || "json"]()
1103
+ : await argumentsResolution(
1104
+ await request[argMetadata.parser || "json"](),
1105
+ argMetadata.zodSchema,
1106
+ argMetadata.index,
1107
+ functionName
1108
+ );
1109
+ break;
1110
+ case contextArgsKey:
1111
+ args[argMetadata.index] = !argMetadata.key
1112
+ ? contextHook
1113
+ : contextHook.get(argMetadata.key);
1114
+ break;
1115
+ case requestHeadersArgsKey:
1116
+ args[argMetadata.index] = !argMetadata.zodSchema
1117
+ ? request.headers
1118
+ : await argumentsResolution(
1119
+ request.headers.toJSON(),
1120
+ argMetadata.zodSchema,
1121
+ argMetadata.index,
1122
+ functionName
1123
+ );
1124
+ break;
1125
+ case responseHeadersArgsKey:
1126
+ args[argMetadata.index] = context[argMetadata.type];
1127
+ break;
1128
+ case requestHeaderArgsKey:
1129
+ args[argMetadata.index] = !argMetadata.zodSchema
1130
+ ? request.headers.get(argMetadata.key) || undefined
1131
+ : await argumentsResolution(
1132
+ request.headers.get(argMetadata.key) || undefined,
1133
+ argMetadata.zodSchema,
1134
+ argMetadata.index,
1135
+ functionName
1136
+ );
1137
+ break;
1138
+ case paramArgsKey:
1139
+ args[argMetadata.index] = !argMetadata.zodSchema
1140
+ ? context[paramsArgsKey][argMetadata.key] || undefined
1141
+ : await argumentsResolution(
1142
+ context[paramsArgsKey][argMetadata.key],
1143
+ argMetadata.zodSchema,
1144
+ argMetadata.index,
1145
+ functionName
1146
+ );
1147
+ break;
1148
+ case routeModelArgsKey:
1149
+ args[argMetadata.index] = context[routeModelArgsKey];
1150
+ break;
1151
+ default:
1152
+ args[argMetadata.index] = !argMetadata.zodSchema
1153
+ ? !(argMetadata.type in context)
1154
+ ? undefined
1155
+ : context[argMetadata.type]
1156
+ : await argumentsResolution(
1157
+ !(argMetadata.type in context)
1158
+ ? undefined
1159
+ : context[argMetadata.type],
1160
+ argMetadata.zodSchema,
1161
+ argMetadata.index,
1162
+ functionName
1163
+ );
1164
+ break;
1163
1165
  }
1164
1166
  }
1165
1167
 
1166
- context[responseBodyArgsKey] = await collection.func(...args);
1168
+ context[responseBodyArgsKey] = await handler(...args);
1167
1169
 
1168
1170
  if (context[responseBodyArgsKey] instanceof Response) {
1169
1171
  return responseConverter(context[responseBodyArgsKey]);