@geekmidas/constructs 0.0.22 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/README.md +90 -0
  2. package/dist/{AWSLambdaFunction-qWpalqfr.d.mts → AWSLambdaFunction-DCh1tOhB.d.mts} +3 -3
  3. package/dist/{AWSLambdaSubscriberAdaptor-CWbBNRz3.d.mts → AWSLambdaSubscriberAdaptor-DtNZPMoV.d.mts} +2 -2
  4. package/dist/{AmazonApiGatewayEndpointAdaptor-BQ0IJdaI.d.mts → AmazonApiGatewayEndpointAdaptor-BaTM2TNu.d.mts} +3 -3
  5. package/dist/{AmazonApiGatewayEndpointAdaptor-DXssXsJi.cjs → AmazonApiGatewayEndpointAdaptor-CPqlw2Rx.cjs} +3 -3
  6. package/dist/{AmazonApiGatewayEndpointAdaptor-DXssXsJi.cjs.map → AmazonApiGatewayEndpointAdaptor-CPqlw2Rx.cjs.map} +1 -1
  7. package/dist/{AmazonApiGatewayEndpointAdaptor-CacGag6F.mjs → AmazonApiGatewayEndpointAdaptor-Cm4iD199.mjs} +3 -3
  8. package/dist/{AmazonApiGatewayEndpointAdaptor-CacGag6F.mjs.map → AmazonApiGatewayEndpointAdaptor-Cm4iD199.mjs.map} +1 -1
  9. package/dist/{AmazonApiGatewayEndpointAdaptor-Da9BR5On.d.cts → AmazonApiGatewayEndpointAdaptor-TP_hLNAa.d.cts} +2 -2
  10. package/dist/{AmazonApiGatewayV1EndpointAdaptor-C4_AZ1ek.d.mts → AmazonApiGatewayV1EndpointAdaptor-B2ZpUFiC.d.mts} +4 -4
  11. package/dist/{AmazonApiGatewayV1EndpointAdaptor-CSm3NsWz.d.cts → AmazonApiGatewayV1EndpointAdaptor-CConfCqz.d.cts} +3 -3
  12. package/dist/{AmazonApiGatewayV1EndpointAdaptor-BpnG55R7.mjs → AmazonApiGatewayV1EndpointAdaptor-D38HuQa9.mjs} +2 -2
  13. package/dist/{AmazonApiGatewayV1EndpointAdaptor-BpnG55R7.mjs.map → AmazonApiGatewayV1EndpointAdaptor-D38HuQa9.mjs.map} +1 -1
  14. package/dist/{AmazonApiGatewayV1EndpointAdaptor-Df4kszio.cjs → AmazonApiGatewayV1EndpointAdaptor-tjpvLBRb.cjs} +2 -2
  15. package/dist/{AmazonApiGatewayV1EndpointAdaptor-Df4kszio.cjs.map → AmazonApiGatewayV1EndpointAdaptor-tjpvLBRb.cjs.map} +1 -1
  16. package/dist/{AmazonApiGatewayV2EndpointAdaptor-DdM8Tr1X.d.mts → AmazonApiGatewayV2EndpointAdaptor-BwMQInBi.d.mts} +4 -4
  17. package/dist/{AmazonApiGatewayV2EndpointAdaptor-ZORzMEET.mjs → AmazonApiGatewayV2EndpointAdaptor-ByYtiJtN.mjs} +2 -2
  18. package/dist/{AmazonApiGatewayV2EndpointAdaptor-ZORzMEET.mjs.map → AmazonApiGatewayV2EndpointAdaptor-ByYtiJtN.mjs.map} +1 -1
  19. package/dist/{AmazonApiGatewayV2EndpointAdaptor-5SIvqPby.cjs → AmazonApiGatewayV2EndpointAdaptor-DcJ_w3ro.cjs} +2 -2
  20. package/dist/{AmazonApiGatewayV2EndpointAdaptor-5SIvqPby.cjs.map → AmazonApiGatewayV2EndpointAdaptor-DcJ_w3ro.cjs.map} +1 -1
  21. package/dist/{AmazonApiGatewayV2EndpointAdaptor-6hsBFVLf.d.cts → AmazonApiGatewayV2EndpointAdaptor-DurJvFwa.d.cts} +3 -3
  22. package/dist/Authorizer-C0ge_tc8.cjs +92 -0
  23. package/dist/Authorizer-C0ge_tc8.cjs.map +1 -0
  24. package/dist/Authorizer-CpSUMTIs.d.cts +125 -0
  25. package/dist/Authorizer-D1w7MpK6.d.mts +125 -0
  26. package/dist/Authorizer-r9U3y_ms.mjs +68 -0
  27. package/dist/Authorizer-r9U3y_ms.mjs.map +1 -0
  28. package/dist/{BaseFunctionBuilder-Ct6zY6Jq.d.mts → BaseFunctionBuilder-Oc2xmxmg.d.mts} +2 -2
  29. package/dist/{Construct-DDR0295I.d.mts → Construct-DCPATqec.d.mts} +1 -1
  30. package/dist/Construct.d.mts +1 -1
  31. package/dist/{Cron-DnMRWPFR.d.mts → Cron-DPEcDCDW.d.mts} +2 -2
  32. package/dist/{CronBuilder-RLDitFmP.d.mts → CronBuilder-CxKTiepV.d.mts} +4 -4
  33. package/dist/{Endpoint-D2Imgihs.d.cts → Endpoint-BJPJTGjV.d.cts} +2 -2
  34. package/dist/{Endpoint-PtQ-wLIS.d.mts → Endpoint-DoY1Owv2.d.mts} +4 -4
  35. package/dist/{EndpointBuilder-W5fdXxYQ.mjs → EndpointBuilder-69uVrKZL.mjs} +15 -2
  36. package/dist/EndpointBuilder-69uVrKZL.mjs.map +1 -0
  37. package/dist/{EndpointBuilder-BPHpUekp.d.mts → EndpointBuilder-BJRkivxQ.d.mts} +6 -5
  38. package/dist/{EndpointBuilder-CYkeYpsL.cjs → EndpointBuilder-Bhyft7WY.cjs} +15 -2
  39. package/dist/EndpointBuilder-Bhyft7WY.cjs.map +1 -0
  40. package/dist/{EndpointBuilder-TApJQhtG.d.cts → EndpointBuilder-CQ-jOXsD.d.cts} +4 -3
  41. package/dist/{EndpointFactory-B27nfeiE.mjs → EndpointFactory-ARUlRlyM.mjs} +68 -14
  42. package/dist/EndpointFactory-ARUlRlyM.mjs.map +1 -0
  43. package/dist/{EndpointFactory-CNlfBDuD.d.mts → EndpointFactory-BKEPcQgE.d.mts} +45 -20
  44. package/dist/{EndpointFactory-D5lFZXqY.cjs → EndpointFactory-BcVbkrxf.cjs} +68 -14
  45. package/dist/EndpointFactory-BcVbkrxf.cjs.map +1 -0
  46. package/dist/{EndpointFactory-B5fOINuc.d.cts → EndpointFactory-DgwmAR_8.d.cts} +45 -20
  47. package/dist/{Function-CD3rXWfa.d.mts → Function-Dthlh2Fb.d.mts} +2 -2
  48. package/dist/{FunctionBuilder-j2VkwuGf.d.mts → FunctionBuilder-CZFBLfdV.d.mts} +4 -4
  49. package/dist/{FunctionExecutionWrapper-B0WP-Vec.d.mts → FunctionExecutionWrapper-CfuajSB5.d.mts} +2 -2
  50. package/dist/{HonoEndpointAdaptor-Bg_vTyA5.mjs → HonoEndpointAdaptor-BmB4Sc7L.mjs} +3 -3
  51. package/dist/{HonoEndpointAdaptor-Bg_vTyA5.mjs.map → HonoEndpointAdaptor-BmB4Sc7L.mjs.map} +1 -1
  52. package/dist/{HonoEndpointAdaptor-B_gJPWGD.cjs → HonoEndpointAdaptor-CnqR6PSB.cjs} +3 -3
  53. package/dist/{HonoEndpointAdaptor-B_gJPWGD.cjs.map → HonoEndpointAdaptor-CnqR6PSB.cjs.map} +1 -1
  54. package/dist/{HonoEndpointAdaptor-CLOpobdq.d.cts → HonoEndpointAdaptor-DBjipl6Q.d.mts} +6 -6
  55. package/dist/{HonoEndpointAdaptor-C9gYYBWu.d.mts → HonoEndpointAdaptor-sSG85VER.d.cts} +8 -8
  56. package/dist/{Subscriber-itwm7ugy.d.mts → Subscriber-BfxLwZpX.d.mts} +2 -2
  57. package/dist/{Subscriber-D-FPWts6.cjs → Subscriber-DvOtIyWq.cjs} +1 -1
  58. package/dist/{Subscriber-D-FPWts6.cjs.map → Subscriber-DvOtIyWq.cjs.map} +1 -1
  59. package/dist/{Subscriber-CGb8LjZa.mjs → Subscriber-JzcFFi4p.mjs} +1 -1
  60. package/dist/{Subscriber-CGb8LjZa.mjs.map → Subscriber-JzcFFi4p.mjs.map} +1 -1
  61. package/dist/{SubscriberBuilder-BfE2cL1q.cjs → SubscriberBuilder-DUuV207i.cjs} +2 -2
  62. package/dist/{SubscriberBuilder-BfE2cL1q.cjs.map → SubscriberBuilder-DUuV207i.cjs.map} +1 -1
  63. package/dist/{SubscriberBuilder-9j3JCu8-.d.mts → SubscriberBuilder-lTiTUS1o.d.mts} +2 -2
  64. package/dist/{SubscriberBuilder-BcAspHv9.mjs → SubscriberBuilder-tm4oVOt3.mjs} +2 -2
  65. package/dist/{SubscriberBuilder-BcAspHv9.mjs.map → SubscriberBuilder-tm4oVOt3.mjs.map} +1 -1
  66. package/dist/{TestEndpointAdaptor-Bew9lWsx.cjs → TestEndpointAdaptor-BtLcw4JW.cjs} +3 -3
  67. package/dist/{TestEndpointAdaptor-Bew9lWsx.cjs.map → TestEndpointAdaptor-BtLcw4JW.cjs.map} +1 -1
  68. package/dist/{TestEndpointAdaptor-C-c8v7VI.d.mts → TestEndpointAdaptor-CGQVysE0.d.mts} +3 -3
  69. package/dist/{TestEndpointAdaptor-BYCwwiYk.d.cts → TestEndpointAdaptor-CJO-og9U.d.cts} +2 -2
  70. package/dist/{TestEndpointAdaptor-JONQJeXc.mjs → TestEndpointAdaptor-o7JbNcL-.mjs} +3 -3
  71. package/dist/{TestEndpointAdaptor-JONQJeXc.mjs.map → TestEndpointAdaptor-o7JbNcL-.mjs.map} +1 -1
  72. package/dist/adaptors/aws.cjs +4 -4
  73. package/dist/adaptors/aws.d.cts +5 -5
  74. package/dist/adaptors/aws.d.mts +15 -15
  75. package/dist/adaptors/aws.mjs +4 -4
  76. package/dist/adaptors/hono.cjs +2 -2
  77. package/dist/adaptors/hono.d.cts +3 -3
  78. package/dist/adaptors/hono.d.mts +9 -9
  79. package/dist/adaptors/hono.mjs +2 -2
  80. package/dist/adaptors/testing.cjs +2 -2
  81. package/dist/adaptors/testing.d.cts +3 -3
  82. package/dist/adaptors/testing.d.mts +9 -9
  83. package/dist/adaptors/testing.mjs +2 -2
  84. package/dist/crons/Cron.d.mts +6 -6
  85. package/dist/crons/CronBuilder.d.mts +7 -7
  86. package/dist/crons/index.d.cts +4 -4
  87. package/dist/crons/index.d.mts +7 -7
  88. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +2 -2
  89. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +3 -3
  90. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +9 -9
  91. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +2 -2
  92. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +3 -3
  93. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +4 -4
  94. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +10 -10
  95. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +3 -3
  96. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +3 -3
  97. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +4 -4
  98. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +10 -10
  99. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +3 -3
  100. package/dist/endpoints/Authorizer.cjs +5 -14
  101. package/dist/endpoints/Authorizer.d.cts +2 -2
  102. package/dist/endpoints/Authorizer.d.mts +2 -2
  103. package/dist/endpoints/Authorizer.mjs +2 -13
  104. package/dist/endpoints/Endpoint.d.cts +2 -2
  105. package/dist/endpoints/Endpoint.d.mts +8 -8
  106. package/dist/endpoints/EndpointBuilder.cjs +2 -1
  107. package/dist/endpoints/EndpointBuilder.d.cts +3 -3
  108. package/dist/endpoints/EndpointBuilder.d.mts +9 -9
  109. package/dist/endpoints/EndpointBuilder.mjs +2 -1
  110. package/dist/endpoints/EndpointFactory.cjs +3 -2
  111. package/dist/endpoints/EndpointFactory.d.cts +4 -4
  112. package/dist/endpoints/EndpointFactory.d.mts +10 -10
  113. package/dist/endpoints/EndpointFactory.mjs +3 -2
  114. package/dist/endpoints/HonoEndpointAdaptor.cjs +2 -2
  115. package/dist/endpoints/HonoEndpointAdaptor.d.cts +3 -3
  116. package/dist/endpoints/HonoEndpointAdaptor.d.mts +9 -9
  117. package/dist/endpoints/HonoEndpointAdaptor.mjs +2 -2
  118. package/dist/endpoints/TestEndpointAdaptor.cjs +2 -2
  119. package/dist/endpoints/TestEndpointAdaptor.d.cts +3 -3
  120. package/dist/endpoints/TestEndpointAdaptor.d.mts +9 -9
  121. package/dist/endpoints/TestEndpointAdaptor.mjs +2 -2
  122. package/dist/endpoints/audit.d.cts +2 -2
  123. package/dist/endpoints/audit.d.mts +8 -8
  124. package/dist/endpoints/helpers.d.cts +2 -2
  125. package/dist/endpoints/helpers.d.mts +8 -8
  126. package/dist/endpoints/index.cjs +3 -2
  127. package/dist/endpoints/index.cjs.map +1 -1
  128. package/dist/endpoints/index.d.cts +6 -6
  129. package/dist/endpoints/index.d.mts +12 -12
  130. package/dist/endpoints/index.mjs +3 -2
  131. package/dist/endpoints/index.mjs.map +1 -1
  132. package/dist/endpoints/processAudits.cjs +1 -1
  133. package/dist/endpoints/processAudits.d.cts +24 -5
  134. package/dist/endpoints/processAudits.d.mts +30 -11
  135. package/dist/endpoints/processAudits.mjs +1 -1
  136. package/dist/functions/AWSLambdaFunction.d.mts +4 -4
  137. package/dist/functions/BaseFunctionBuilder.d.mts +2 -2
  138. package/dist/functions/Function.d.mts +2 -2
  139. package/dist/functions/FunctionBuilder.d.mts +4 -4
  140. package/dist/functions/FunctionExecutionWrapper.d.mts +3 -3
  141. package/dist/functions/TestFunctionAdaptor.d.mts +2 -2
  142. package/dist/functions/index.d.mts +5 -5
  143. package/dist/index-9gJrM7Rw.d.mts +10 -0
  144. package/dist/index.d.mts +2 -2
  145. package/dist/{processAudits-BFokHhCO.cjs → processAudits-CzHkPokQ.cjs} +13 -7
  146. package/dist/processAudits-CzHkPokQ.cjs.map +1 -0
  147. package/dist/{processAudits-DfcB-X-4.mjs → processAudits-Dj8UGqcW.mjs} +13 -7
  148. package/dist/processAudits-Dj8UGqcW.mjs.map +1 -0
  149. package/dist/publisher.d.mts +1 -1
  150. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +3 -3
  151. package/dist/subscribers/Subscriber.cjs +1 -1
  152. package/dist/subscribers/Subscriber.d.mts +2 -2
  153. package/dist/subscribers/Subscriber.mjs +1 -1
  154. package/dist/subscribers/SubscriberBuilder.cjs +2 -2
  155. package/dist/subscribers/SubscriberBuilder.d.mts +3 -3
  156. package/dist/subscribers/SubscriberBuilder.mjs +2 -2
  157. package/dist/subscribers/index.cjs +2 -2
  158. package/dist/subscribers/index.d.cts +2 -2
  159. package/dist/subscribers/index.d.mts +5 -5
  160. package/dist/subscribers/index.mjs +2 -2
  161. package/dist/{types-DKf0juBf.d.mts → types-Cy1IhmUB.d.mts} +1 -1
  162. package/dist/types.d.mts +1 -1
  163. package/package.json +5 -5
  164. package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +2 -0
  165. package/src/endpoints/Authorizer.ts +119 -1
  166. package/src/endpoints/EndpointBuilder.ts +23 -6
  167. package/src/endpoints/EndpointFactory.ts +156 -27
  168. package/src/endpoints/HonoEndpointAdaptor.ts +2 -0
  169. package/src/endpoints/TestEndpointAdaptor.ts +2 -0
  170. package/src/endpoints/processAudits.ts +39 -16
  171. package/dist/Authorizer-BTmly8ps.d.cts +0 -29
  172. package/dist/Authorizer-pmPvIVgv.d.mts +0 -29
  173. package/dist/EndpointBuilder-CYkeYpsL.cjs.map +0 -1
  174. package/dist/EndpointBuilder-W5fdXxYQ.mjs.map +0 -1
  175. package/dist/EndpointFactory-B27nfeiE.mjs.map +0 -1
  176. package/dist/EndpointFactory-D5lFZXqY.cjs.map +0 -1
  177. package/dist/endpoints/Authorizer.cjs.map +0 -1
  178. package/dist/endpoints/Authorizer.mjs.map +0 -1
  179. package/dist/index-licEVXjh.d.mts +0 -10
  180. package/dist/processAudits-BFokHhCO.cjs.map +0 -1
  181. package/dist/processAudits-DfcB-X-4.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require('./chunk-CUT6urMc.cjs');
2
- const require_EndpointBuilder = require('./EndpointBuilder-CYkeYpsL.cjs');
2
+ const require_EndpointBuilder = require('./EndpointBuilder-Bhyft7WY.cjs');
3
3
  const __geekmidas_logger_console = require_chunk.__toESM(require("@geekmidas/logger/console"));
4
4
  const lodash_uniqby = require_chunk.__toESM(require("lodash.uniqby"));
5
5
 
@@ -17,7 +17,8 @@ var EndpointFactory = class EndpointFactory {
17
17
  defaultAuditorStorage;
18
18
  defaultDatabaseService;
19
19
  defaultActorExtractor;
20
- constructor({ basePath, defaultAuthorizeFn, defaultLogger, defaultSessionExtractor, defaultServices = [], defaultEventPublisher, availableAuthorizers = [], defaultAuthorizerName, defaultAuditorStorage, defaultDatabaseService, defaultActorExtractor } = {}) {
20
+ customSecuritySchemes = {};
21
+ constructor({ basePath, defaultAuthorizeFn, defaultLogger, defaultSessionExtractor, defaultServices = [], defaultEventPublisher, availableAuthorizers = [], defaultAuthorizerName, defaultAuditorStorage, defaultDatabaseService, defaultActorExtractor, customSecuritySchemes = {} } = {}) {
21
22
  this.defaultServices = (0, lodash_uniqby.default)(defaultServices, (s) => s.serviceName);
22
23
  this.basePath = basePath || "";
23
24
  this.defaultAuthorizeFn = defaultAuthorizeFn;
@@ -29,6 +30,7 @@ var EndpointFactory = class EndpointFactory {
29
30
  this.defaultAuditorStorage = defaultAuditorStorage;
30
31
  this.defaultDatabaseService = defaultDatabaseService;
31
32
  this.defaultActorExtractor = defaultActorExtractor;
33
+ this.customSecuritySchemes = customSecuritySchemes;
32
34
  }
33
35
  static joinPaths(path, basePath = "") {
34
36
  if (!basePath && !path) return "/";
@@ -55,13 +57,54 @@ var EndpointFactory = class EndpointFactory {
55
57
  defaultAuthorizerName: this.defaultAuthorizerName,
56
58
  defaultAuditorStorage: this.defaultAuditorStorage,
57
59
  defaultDatabaseService: this.defaultDatabaseService,
58
- defaultActorExtractor: this.defaultActorExtractor
60
+ defaultActorExtractor: this.defaultActorExtractor,
61
+ customSecuritySchemes: this.customSecuritySchemes
62
+ });
63
+ }
64
+ /**
65
+ * Define custom security schemes for this factory.
66
+ * These extend the built-in schemes (jwt, bearer, apiKey, oauth2, oidc).
67
+ *
68
+ * @example
69
+ * ```typescript
70
+ * const router = e.securitySchemes({
71
+ * awsIamSigV4: {
72
+ * type: 'apiKey',
73
+ * in: 'header',
74
+ * name: 'Authorization',
75
+ * 'x-amazon-apigateway-authtype': 'awsSigv4',
76
+ * },
77
+ * });
78
+ * ```
79
+ */
80
+ securitySchemes(schemes) {
81
+ return new EndpointFactory({
82
+ defaultServices: this.defaultServices,
83
+ basePath: this.basePath,
84
+ defaultAuthorizeFn: this.defaultAuthorizeFn,
85
+ defaultLogger: this.defaultLogger,
86
+ defaultSessionExtractor: this.defaultSessionExtractor,
87
+ defaultEventPublisher: this.defaultEventPublisher,
88
+ availableAuthorizers: this.availableAuthorizers,
89
+ defaultAuthorizerName: this.defaultAuthorizerName,
90
+ defaultAuditorStorage: this.defaultAuditorStorage,
91
+ defaultDatabaseService: this.defaultDatabaseService,
92
+ defaultActorExtractor: this.defaultActorExtractor,
93
+ customSecuritySchemes: {
94
+ ...this.customSecuritySchemes,
95
+ ...schemes
96
+ }
59
97
  });
60
98
  }
61
99
  /**
62
100
  * Set the default authorizer for all endpoints created from this factory.
63
101
  * Individual endpoints can override this by calling `.authorizer()` on the builder.
64
102
  * Use `'none'` to explicitly disable authorization for all endpoints.
103
+ *
104
+ * Accepts:
105
+ * - Built-in security scheme names: 'jwt', 'bearer', 'apiKey', 'oauth2', 'oidc'
106
+ * - Custom security scheme names defined via `.securitySchemes()`
107
+ * - 'none' to disable authorization
65
108
  */
66
109
  authorizer(name) {
67
110
  if (name !== "none" && this.availableAuthorizers.length > 0) {
@@ -82,7 +125,8 @@ var EndpointFactory = class EndpointFactory {
82
125
  defaultAuthorizerName: name === "none" ? void 0 : name,
83
126
  defaultAuditorStorage: this.defaultAuditorStorage,
84
127
  defaultDatabaseService: this.defaultDatabaseService,
85
- defaultActorExtractor: this.defaultActorExtractor
128
+ defaultActorExtractor: this.defaultActorExtractor,
129
+ customSecuritySchemes: this.customSecuritySchemes
86
130
  });
87
131
  }
88
132
  route(path) {
@@ -98,7 +142,8 @@ var EndpointFactory = class EndpointFactory {
98
142
  defaultAuthorizerName: this.defaultAuthorizerName,
99
143
  defaultAuditorStorage: this.defaultAuditorStorage,
100
144
  defaultDatabaseService: this.defaultDatabaseService,
101
- defaultActorExtractor: this.defaultActorExtractor
145
+ defaultActorExtractor: this.defaultActorExtractor,
146
+ customSecuritySchemes: this.customSecuritySchemes
102
147
  });
103
148
  }
104
149
  authorize(fn) {
@@ -113,7 +158,8 @@ var EndpointFactory = class EndpointFactory {
113
158
  defaultAuthorizerName: this.defaultAuthorizerName,
114
159
  defaultAuditorStorage: this.defaultAuditorStorage,
115
160
  defaultDatabaseService: this.defaultDatabaseService,
116
- defaultActorExtractor: this.defaultActorExtractor
161
+ defaultActorExtractor: this.defaultActorExtractor,
162
+ customSecuritySchemes: this.customSecuritySchemes
117
163
  });
118
164
  }
119
165
  services(services) {
@@ -128,7 +174,8 @@ var EndpointFactory = class EndpointFactory {
128
174
  defaultAuthorizerName: this.defaultAuthorizerName,
129
175
  defaultAuditorStorage: this.defaultAuditorStorage,
130
176
  defaultDatabaseService: this.defaultDatabaseService,
131
- defaultActorExtractor: this.defaultActorExtractor
177
+ defaultActorExtractor: this.defaultActorExtractor,
178
+ customSecuritySchemes: this.customSecuritySchemes
132
179
  });
133
180
  }
134
181
  logger(logger) {
@@ -143,7 +190,8 @@ var EndpointFactory = class EndpointFactory {
143
190
  defaultAuthorizerName: this.defaultAuthorizerName,
144
191
  defaultAuditorStorage: this.defaultAuditorStorage,
145
192
  defaultDatabaseService: this.defaultDatabaseService,
146
- defaultActorExtractor: this.defaultActorExtractor
193
+ defaultActorExtractor: this.defaultActorExtractor,
194
+ customSecuritySchemes: this.customSecuritySchemes
147
195
  });
148
196
  }
149
197
  publisher(publisher) {
@@ -158,7 +206,8 @@ var EndpointFactory = class EndpointFactory {
158
206
  defaultAuthorizerName: this.defaultAuthorizerName,
159
207
  defaultAuditorStorage: this.defaultAuditorStorage,
160
208
  defaultDatabaseService: this.defaultDatabaseService,
161
- defaultActorExtractor: this.defaultActorExtractor
209
+ defaultActorExtractor: this.defaultActorExtractor,
210
+ customSecuritySchemes: this.customSecuritySchemes
162
211
  });
163
212
  }
164
213
  session(session) {
@@ -173,7 +222,8 @@ var EndpointFactory = class EndpointFactory {
173
222
  defaultAuthorizerName: this.defaultAuthorizerName,
174
223
  defaultAuditorStorage: this.defaultAuditorStorage,
175
224
  defaultDatabaseService: this.defaultDatabaseService,
176
- defaultActorExtractor: this.defaultActorExtractor
225
+ defaultActorExtractor: this.defaultActorExtractor,
226
+ customSecuritySchemes: this.customSecuritySchemes
177
227
  });
178
228
  }
179
229
  /**
@@ -191,7 +241,8 @@ var EndpointFactory = class EndpointFactory {
191
241
  availableAuthorizers: this.availableAuthorizers,
192
242
  defaultAuthorizerName: this.defaultAuthorizerName,
193
243
  defaultAuditorStorage: this.defaultAuditorStorage,
194
- defaultDatabaseService: service
244
+ defaultDatabaseService: service,
245
+ customSecuritySchemes: this.customSecuritySchemes
195
246
  });
196
247
  }
197
248
  /**
@@ -211,7 +262,8 @@ var EndpointFactory = class EndpointFactory {
211
262
  defaultAuthorizerName: this.defaultAuthorizerName,
212
263
  defaultAuditorStorage: storage,
213
264
  defaultDatabaseService: this.defaultDatabaseService,
214
- defaultActorExtractor: this.defaultActorExtractor
265
+ defaultActorExtractor: this.defaultActorExtractor,
266
+ customSecuritySchemes: this.customSecuritySchemes
215
267
  });
216
268
  }
217
269
  /**
@@ -230,7 +282,8 @@ var EndpointFactory = class EndpointFactory {
230
282
  defaultAuthorizerName: this.defaultAuthorizerName,
231
283
  defaultAuditorStorage: this.defaultAuditorStorage,
232
284
  defaultDatabaseService: this.defaultDatabaseService,
233
- defaultActorExtractor: extractor
285
+ defaultActorExtractor: extractor,
286
+ customSecuritySchemes: this.customSecuritySchemes
234
287
  });
235
288
  }
236
289
  createBuilder(method, path) {
@@ -246,6 +299,7 @@ var EndpointFactory = class EndpointFactory {
246
299
  if (this.defaultAuditorStorage) builder._setAuditorStorage(this.defaultAuditorStorage);
247
300
  if (this.defaultDatabaseService) builder._setDatabaseService(this.defaultDatabaseService);
248
301
  if (this.defaultActorExtractor) builder._actorExtractor = this.defaultActorExtractor;
302
+ builder._customSecuritySchemes = this.customSecuritySchemes;
249
303
  return builder;
250
304
  }
251
305
  post(path) {
@@ -282,4 +336,4 @@ Object.defineProperty(exports, 'e', {
282
336
  return e;
283
337
  }
284
338
  });
285
- //# sourceMappingURL=EndpointFactory-D5lFZXqY.cjs.map
339
+ //# sourceMappingURL=EndpointFactory-BcVbkrxf.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EndpointFactory-BcVbkrxf.cjs","names":["ConsoleLogger","path: P","basePath: TBasePath","authorizers: T","schemes: T","name:\n | BuiltInSecuritySchemeId\n | keyof TSecuritySchemes\n | TAuthorizers[number]\n | 'none'","path: TPath","fn: AuthorizeFn<TServices, TLogger, TSession>","services: S","logger: L","publisher: Service<TServiceName, T>","session: SessionFn<TServices, TLogger, T, TDatabase>","service: Service<TName, T>","storage: Service<TName, T>","extractor: ActorExtractor<TServices, TSession, TLogger>","method: TMethod","EndpointBuilder"],"sources":["../src/endpoints/EndpointFactory.ts"],"sourcesContent":["import type {\n AuditStorage,\n AuditableAction,\n ExtractStorageAuditAction,\n} from '@geekmidas/audit';\nimport type { EventPublisher, MappedEvent } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport { ConsoleLogger } from '@geekmidas/logger/console';\nimport type { Service } from '@geekmidas/services';\nimport uniqBy from 'lodash.uniqby';\nimport type { HttpMethod } from '../types';\nimport type {\n Authorizer,\n BuiltInSecuritySchemeId,\n SecurityScheme,\n} from './Authorizer';\nimport type { AuthorizeFn, SessionFn } from './Endpoint';\nimport { EndpointBuilder } from './EndpointBuilder';\nimport type { ActorExtractor } from './audit';\n\nconst DEFAULT_LOGGER = new ConsoleLogger() as any;\n\nexport class EndpointFactory<\n TServices extends Service[] = [],\n TBasePath extends string = '',\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TAuthorizers extends readonly string[] = readonly string[],\n TAuditStorage extends AuditStorage<any> | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TAuditAction extends AuditableAction<\n string,\n unknown\n > = ExtractStorageAuditAction<NonNullable<TAuditStorage>>,\n TDatabase = undefined,\n TDatabaseServiceName extends string = string,\n TSecuritySchemes extends Record<string, SecurityScheme> = Record<\n string,\n SecurityScheme\n >,\n> {\n // @ts-ignore\n private defaultServices: TServices;\n private basePath: TBasePath = '' as TBasePath;\n private defaultAuthorizeFn?: AuthorizeFn<TServices, TLogger, TSession>;\n private defaultEventPublisher:\n | Service<TEventPublisherServiceName, TEventPublisher>\n | undefined;\n private defaultSessionExtractor?: SessionFn<\n TServices,\n TLogger,\n TSession,\n TDatabase\n >;\n private defaultLogger: TLogger = DEFAULT_LOGGER;\n private availableAuthorizers: Authorizer[] = [];\n private defaultAuthorizerName?: TAuthorizers[number];\n private defaultAuditorStorage:\n | Service<TAuditStorageServiceName, TAuditStorage>\n | undefined;\n private defaultDatabaseService:\n | Service<TDatabaseServiceName, TDatabase>\n | undefined;\n private defaultActorExtractor?: ActorExtractor<TServices, TSession, TLogger>;\n private customSecuritySchemes: TSecuritySchemes = {} as TSecuritySchemes;\n\n constructor({\n basePath,\n defaultAuthorizeFn,\n defaultLogger,\n defaultSessionExtractor,\n // @ts-ignore\n defaultServices = [] as TServices,\n defaultEventPublisher,\n availableAuthorizers = [],\n defaultAuthorizerName,\n defaultAuditorStorage,\n defaultDatabaseService,\n defaultActorExtractor,\n customSecuritySchemes = {} as TSecuritySchemes,\n }: EndpointFactoryOptions<\n TServices,\n TBasePath,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n > = {}) {\n // Initialize default services\n this.defaultServices = uniqBy(\n defaultServices,\n (s) => s.serviceName,\n ) as TServices;\n\n this.basePath = basePath || ('' as TBasePath);\n this.defaultAuthorizeFn = defaultAuthorizeFn;\n this.defaultLogger = defaultLogger || (DEFAULT_LOGGER as TLogger);\n this.defaultSessionExtractor = defaultSessionExtractor;\n this.defaultEventPublisher = defaultEventPublisher;\n this.availableAuthorizers = availableAuthorizers;\n this.defaultAuthorizerName = defaultAuthorizerName;\n this.defaultAuditorStorage = defaultAuditorStorage;\n this.defaultDatabaseService = defaultDatabaseService;\n this.defaultActorExtractor = defaultActorExtractor;\n this.customSecuritySchemes = customSecuritySchemes;\n }\n\n static joinPaths<TBasePath extends string, P extends string>(\n path: P,\n basePath: TBasePath = '' as TBasePath,\n ): JoinPaths<TBasePath, P> {\n // Handle empty cases\n if (!basePath && !path) return '/' as JoinPaths<TBasePath, P>;\n if (!basePath)\n return (path.startsWith('/') ? path : '/' + path) as JoinPaths<\n TBasePath,\n P\n >;\n if (!path)\n return (\n basePath.startsWith('/') ? basePath : '/' + basePath\n ) as JoinPaths<TBasePath, P>;\n\n const base = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;\n const segment = path.startsWith('/') ? path : '/' + path;\n\n let result = base + segment;\n\n // Ensure leading slash\n if (!result.startsWith('/')) {\n result = '/' + result;\n }\n\n // Normalize multiple slashes (except in the middle of the path where they might be intentional)\n result = result.replace(/^\\/+/g, '/');\n\n // Remove trailing slash unless it's the root path \"/\"\n if (result.length > 1 && result.endsWith('/')) {\n result = result.slice(0, -1);\n }\n\n return result as JoinPaths<TBasePath, P>;\n }\n\n // Configure available authorizers\n authorizers<const T extends readonly string[]>(\n authorizers: T,\n ): EndpointFactory<\n TServices,\n TBasePath,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n T,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n > {\n const authorizerConfigs = authorizers.map((name) => ({\n name,\n }));\n return new EndpointFactory<\n TServices,\n TBasePath,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n T,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n >({\n defaultServices: this.defaultServices,\n basePath: this.basePath,\n defaultAuthorizeFn: this.defaultAuthorizeFn,\n defaultLogger: this.defaultLogger,\n defaultSessionExtractor: this.defaultSessionExtractor,\n defaultEventPublisher: this.defaultEventPublisher,\n availableAuthorizers: authorizerConfigs,\n defaultAuthorizerName: this.defaultAuthorizerName,\n defaultAuditorStorage: this.defaultAuditorStorage,\n defaultDatabaseService: this.defaultDatabaseService,\n defaultActorExtractor: this.defaultActorExtractor,\n customSecuritySchemes: this.customSecuritySchemes,\n });\n }\n\n /**\n * Define custom security schemes for this factory.\n * These extend the built-in schemes (jwt, bearer, apiKey, oauth2, oidc).\n *\n * @example\n * ```typescript\n * const router = e.securitySchemes({\n * awsIamSigV4: {\n * type: 'apiKey',\n * in: 'header',\n * name: 'Authorization',\n * 'x-amazon-apigateway-authtype': 'awsSigv4',\n * },\n * });\n * ```\n */\n securitySchemes<T extends Record<string, SecurityScheme>>(\n schemes: T,\n ): EndpointFactory<\n TServices,\n TBasePath,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes & T\n > {\n return new EndpointFactory<\n TServices,\n TBasePath,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes & T\n >({\n defaultServices: this.defaultServices,\n basePath: this.basePath,\n defaultAuthorizeFn: this.defaultAuthorizeFn,\n defaultLogger: this.defaultLogger,\n defaultSessionExtractor: this.defaultSessionExtractor,\n defaultEventPublisher: this.defaultEventPublisher,\n availableAuthorizers: this.availableAuthorizers,\n defaultAuthorizerName: this.defaultAuthorizerName,\n defaultAuditorStorage: this.defaultAuditorStorage,\n defaultDatabaseService: this.defaultDatabaseService,\n defaultActorExtractor: this.defaultActorExtractor,\n customSecuritySchemes: {\n ...this.customSecuritySchemes,\n ...schemes,\n } as TSecuritySchemes & T,\n });\n }\n\n /**\n * Set the default authorizer for all endpoints created from this factory.\n * Individual endpoints can override this by calling `.authorizer()` on the builder.\n * Use `'none'` to explicitly disable authorization for all endpoints.\n *\n * Accepts:\n * - Built-in security scheme names: 'jwt', 'bearer', 'apiKey', 'oauth2', 'oidc'\n * - Custom security scheme names defined via `.securitySchemes()`\n * - 'none' to disable authorization\n */\n authorizer(\n name:\n | BuiltInSecuritySchemeId\n | keyof TSecuritySchemes\n | TAuthorizers[number]\n | 'none',\n ): EndpointFactory<\n TServices,\n TBasePath,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n > {\n // Validate that the authorizer exists in available authorizers (if authorizers() was called)\n if (name !== 'none' && this.availableAuthorizers.length > 0) {\n const authorizerExists = this.availableAuthorizers.some(\n (a) => a.name === name,\n );\n if (!authorizerExists) {\n const available = this.availableAuthorizers\n .map((a) => a.name)\n .join(', ');\n throw new Error(\n `Authorizer \"${name as string}\" not found in available authorizers: ${available}`,\n );\n }\n }\n\n return new EndpointFactory<\n TServices,\n TBasePath,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n >({\n defaultServices: this.defaultServices,\n basePath: this.basePath,\n defaultAuthorizeFn: this.defaultAuthorizeFn,\n defaultLogger: this.defaultLogger,\n defaultSessionExtractor: this.defaultSessionExtractor,\n defaultEventPublisher: this.defaultEventPublisher,\n availableAuthorizers: this.availableAuthorizers,\n defaultAuthorizerName:\n name === 'none' ? undefined : (name as TAuthorizers[number]),\n defaultAuditorStorage: this.defaultAuditorStorage,\n defaultDatabaseService: this.defaultDatabaseService,\n defaultActorExtractor: this.defaultActorExtractor,\n customSecuritySchemes: this.customSecuritySchemes,\n });\n }\n\n // Create a sub-router with a path prefix\n route<TPath extends string>(\n path: TPath,\n ): EndpointFactory<\n TServices,\n JoinPaths<TBasePath, TPath>,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n > {\n const newBasePath = EndpointFactory.joinPaths(path, this.basePath);\n return new EndpointFactory<\n TServices,\n JoinPaths<TBasePath, TPath>,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n >({\n defaultServices: this.defaultServices,\n basePath: newBasePath,\n defaultAuthorizeFn: this.defaultAuthorizeFn,\n defaultLogger: this.defaultLogger,\n defaultSessionExtractor: this.defaultSessionExtractor,\n defaultEventPublisher: this.defaultEventPublisher,\n availableAuthorizers: this.availableAuthorizers,\n defaultAuthorizerName: this.defaultAuthorizerName,\n defaultAuditorStorage: this.defaultAuditorStorage,\n defaultDatabaseService: this.defaultDatabaseService,\n defaultActorExtractor: this.defaultActorExtractor,\n customSecuritySchemes: this.customSecuritySchemes,\n });\n }\n\n // Create a new factory with authorization\n authorize(\n fn: AuthorizeFn<TServices, TLogger, TSession>,\n ): EndpointFactory<\n TServices,\n TBasePath,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n > {\n return new EndpointFactory<\n TServices,\n TBasePath,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n >({\n defaultServices: this.defaultServices,\n basePath: this.basePath,\n defaultAuthorizeFn: fn,\n defaultLogger: this.defaultLogger,\n defaultSessionExtractor: this.defaultSessionExtractor,\n defaultEventPublisher: this.defaultEventPublisher,\n availableAuthorizers: this.availableAuthorizers,\n defaultAuthorizerName: this.defaultAuthorizerName,\n defaultAuditorStorage: this.defaultAuditorStorage,\n defaultDatabaseService: this.defaultDatabaseService,\n defaultActorExtractor: this.defaultActorExtractor,\n customSecuritySchemes: this.customSecuritySchemes,\n });\n }\n\n // Create a new factory with services\n services<S extends Service[]>(\n services: S,\n ): EndpointFactory<\n [...S, ...TServices],\n TBasePath,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n > {\n return new EndpointFactory<\n [...S, ...TServices],\n TBasePath,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n >({\n defaultServices: [...services, ...this.defaultServices],\n basePath: this.basePath,\n defaultAuthorizeFn: this.defaultAuthorizeFn,\n defaultLogger: this.defaultLogger,\n defaultSessionExtractor: this.defaultSessionExtractor,\n defaultEventPublisher: this.defaultEventPublisher,\n availableAuthorizers: this.availableAuthorizers,\n defaultAuthorizerName: this.defaultAuthorizerName,\n defaultAuditorStorage: this.defaultAuditorStorage,\n defaultDatabaseService: this.defaultDatabaseService,\n defaultActorExtractor: this.defaultActorExtractor,\n customSecuritySchemes: this.customSecuritySchemes,\n });\n }\n\n logger<L extends Logger>(\n logger: L,\n ): EndpointFactory<\n TServices,\n TBasePath,\n L,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n > {\n return new EndpointFactory<\n TServices,\n TBasePath,\n L,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n >({\n defaultServices: this.defaultServices,\n basePath: this.basePath,\n defaultAuthorizeFn: this.defaultAuthorizeFn as unknown as AuthorizeFn<\n TServices,\n L,\n TSession\n >,\n defaultLogger: logger,\n defaultSessionExtractor: this\n .defaultSessionExtractor as unknown as SessionFn<\n TServices,\n L,\n TSession\n >,\n defaultEventPublisher: this.defaultEventPublisher,\n availableAuthorizers: this.availableAuthorizers,\n defaultAuthorizerName: this.defaultAuthorizerName,\n defaultAuditorStorage: this.defaultAuditorStorage,\n defaultDatabaseService: this.defaultDatabaseService,\n defaultActorExtractor: this\n .defaultActorExtractor as unknown as ActorExtractor<\n TServices,\n TSession,\n L\n >,\n customSecuritySchemes: this.customSecuritySchemes,\n });\n }\n\n publisher<\n T extends EventPublisher<any>,\n TServiceName extends string = string,\n >(\n publisher: Service<TServiceName, T>,\n ): EndpointFactory<\n TServices,\n TBasePath,\n TLogger,\n TSession,\n T,\n TServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n > {\n return new EndpointFactory<\n TServices,\n TBasePath,\n TLogger,\n TSession,\n T,\n TServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n >({\n defaultServices: this.defaultServices,\n basePath: this.basePath,\n defaultAuthorizeFn: this.defaultAuthorizeFn,\n defaultLogger: this.defaultLogger,\n defaultSessionExtractor: this.defaultSessionExtractor,\n defaultEventPublisher: publisher,\n availableAuthorizers: this.availableAuthorizers,\n defaultAuthorizerName: this.defaultAuthorizerName,\n defaultAuditorStorage: this.defaultAuditorStorage,\n defaultDatabaseService: this.defaultDatabaseService,\n defaultActorExtractor: this.defaultActorExtractor,\n customSecuritySchemes: this.customSecuritySchemes,\n });\n }\n\n session<T>(\n session: SessionFn<TServices, TLogger, T, TDatabase>,\n ): EndpointFactory<\n TServices,\n TBasePath,\n TLogger,\n T,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n > {\n return new EndpointFactory<\n TServices,\n TBasePath,\n TLogger,\n T,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n >({\n defaultServices: this.defaultServices,\n basePath: this.basePath,\n defaultAuthorizeFn: this.defaultAuthorizeFn as unknown as AuthorizeFn<\n TServices,\n TLogger,\n T\n >,\n defaultLogger: this.defaultLogger,\n defaultSessionExtractor: session,\n defaultEventPublisher: this.defaultEventPublisher,\n availableAuthorizers: this.availableAuthorizers,\n defaultAuthorizerName: this.defaultAuthorizerName,\n defaultAuditorStorage: this.defaultAuditorStorage,\n defaultDatabaseService: this.defaultDatabaseService,\n defaultActorExtractor: this\n .defaultActorExtractor as unknown as ActorExtractor<\n TServices,\n T,\n TLogger\n >,\n customSecuritySchemes: this.customSecuritySchemes,\n });\n }\n\n /**\n * Set the database service for endpoints created from this factory.\n * The database will be available in handler context as `db`.\n */\n database<T, TName extends string>(\n service: Service<TName, T>,\n ): EndpointFactory<\n TServices,\n TBasePath,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n T,\n TName,\n TSecuritySchemes\n > {\n return new EndpointFactory<\n TServices,\n TBasePath,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n T,\n TName,\n TSecuritySchemes\n >({\n defaultServices: this.defaultServices,\n basePath: this.basePath,\n defaultAuthorizeFn: this.defaultAuthorizeFn,\n defaultLogger: this.defaultLogger,\n // Reset session extractor when database changes - user should call .session() after .database()\n // to get proper type inference for the new database type\n defaultSessionExtractor: this.defaultSessionExtractor as unknown as\n | SessionFn<TServices, TLogger, TSession, T>\n | undefined,\n defaultEventPublisher: this.defaultEventPublisher,\n availableAuthorizers: this.availableAuthorizers,\n defaultAuthorizerName: this.defaultAuthorizerName,\n defaultAuditorStorage: this.defaultAuditorStorage,\n defaultDatabaseService: service,\n customSecuritySchemes: this.customSecuritySchemes,\n });\n }\n\n /**\n * Set the auditor storage service for endpoints created from this factory.\n * This enables audit functionality and makes `auditor` available in handler context.\n * The audit action type is automatically inferred from the storage's generic parameter.\n */\n auditor<T extends AuditStorage<any>, TName extends string>(\n storage: Service<TName, T>,\n ): EndpointFactory<\n TServices,\n TBasePath,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n T,\n TName,\n ExtractStorageAuditAction<T>,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n > {\n return new EndpointFactory<\n TServices,\n TBasePath,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n T,\n TName,\n ExtractStorageAuditAction<T>,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n >({\n defaultServices: this.defaultServices,\n basePath: this.basePath,\n defaultAuthorizeFn: this.defaultAuthorizeFn,\n defaultLogger: this.defaultLogger,\n defaultSessionExtractor: this.defaultSessionExtractor,\n defaultEventPublisher: this.defaultEventPublisher,\n availableAuthorizers: this.availableAuthorizers,\n defaultAuthorizerName: this.defaultAuthorizerName,\n defaultAuditorStorage: storage,\n defaultDatabaseService: this.defaultDatabaseService,\n defaultActorExtractor: this\n .defaultActorExtractor as unknown as ActorExtractor<\n TServices,\n TSession,\n TLogger\n >,\n customSecuritySchemes: this.customSecuritySchemes,\n });\n }\n\n /**\n * Set the actor extractor function for endpoints created from this factory.\n * The actor is extracted from the request context and attached to all audits.\n */\n actor(\n extractor: ActorExtractor<TServices, TSession, TLogger>,\n ): EndpointFactory<\n TServices,\n TBasePath,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n > {\n return new EndpointFactory<\n TServices,\n TBasePath,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName,\n TSecuritySchemes\n >({\n defaultServices: this.defaultServices,\n basePath: this.basePath,\n defaultAuthorizeFn: this.defaultAuthorizeFn,\n defaultLogger: this.defaultLogger,\n defaultSessionExtractor: this.defaultSessionExtractor,\n defaultEventPublisher: this.defaultEventPublisher,\n availableAuthorizers: this.availableAuthorizers,\n defaultAuthorizerName: this.defaultAuthorizerName,\n defaultAuditorStorage: this.defaultAuditorStorage,\n defaultDatabaseService: this.defaultDatabaseService,\n defaultActorExtractor: extractor,\n customSecuritySchemes: this.customSecuritySchemes,\n });\n }\n\n private createBuilder<TMethod extends HttpMethod, TPath extends string>(\n method: TMethod,\n path: TPath,\n ): EndpointBuilder<\n JoinPaths<TBasePath, TPath>,\n TMethod,\n {},\n TServices,\n TLogger,\n undefined,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n > {\n const fullPath = EndpointFactory.joinPaths(path, this.basePath);\n const builder = new EndpointBuilder<\n JoinPaths<TBasePath, TPath>,\n TMethod,\n {},\n TServices,\n TLogger,\n undefined,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuthorizers,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >(fullPath, method);\n\n if (this.defaultAuthorizeFn) {\n // @ts-ignore\n builder._authorize = this.defaultAuthorizeFn;\n }\n if (this.defaultServices.length) {\n // Create a copy to avoid sharing references between builders\n builder._services = [...this.defaultServices] as TServices;\n }\n\n if (this.defaultLogger) {\n builder._logger = this.defaultLogger as TLogger;\n }\n\n if (this.defaultSessionExtractor) {\n builder._getSession = this.defaultSessionExtractor as SessionFn<\n TServices,\n TLogger,\n TSession\n >;\n }\n\n if (this.defaultEventPublisher) {\n builder._setPublisher(this.defaultEventPublisher);\n }\n\n // Set available authorizers and default\n builder._availableAuthorizers = this.availableAuthorizers;\n if (this.defaultAuthorizerName) {\n builder._authorizerName = this.defaultAuthorizerName;\n }\n\n // Set auditor storage if configured\n if (this.defaultAuditorStorage) {\n builder._setAuditorStorage(this.defaultAuditorStorage as any);\n }\n\n // Set database service if configured\n if (this.defaultDatabaseService) {\n builder._setDatabaseService(this.defaultDatabaseService as any);\n }\n\n // Set actor extractor if configured\n if (this.defaultActorExtractor) {\n builder._actorExtractor = this.defaultActorExtractor;\n }\n\n // Set custom security schemes\n builder._customSecuritySchemes = this.customSecuritySchemes;\n\n return builder;\n }\n\n post<TPath extends string>(path: TPath) {\n return this.createBuilder('POST', path);\n }\n\n get<TPath extends string>(path: TPath) {\n return this.createBuilder('GET', path);\n }\n\n put<TPath extends string>(path: TPath) {\n return this.createBuilder('PUT', path);\n }\n\n delete<TPath extends string>(path: TPath) {\n return this.createBuilder('DELETE', path);\n }\n\n patch<TPath extends string>(path: TPath) {\n return this.createBuilder('PATCH', path);\n }\n\n options<TPath extends string>(path: TPath) {\n return this.createBuilder('OPTIONS', path);\n }\n}\n\nexport type RemoveTrailingSlash<T extends string> = T extends `${infer Rest}/`\n ? Rest extends ''\n ? T // Keep \"/\" as is\n : Rest\n : T;\n\nexport type JoinPaths<\n TBasePath extends string,\n TPath extends string,\n> = RemoveTrailingSlash<\n TBasePath extends ''\n ? TPath\n : TPath extends ''\n ? TBasePath\n : TBasePath extends '/'\n ? TPath extends `/${string}`\n ? TPath\n : `/${TPath}`\n : TBasePath extends `${infer Base}/`\n ? TPath extends `/${infer Rest}`\n ? `${Base}/${Rest}`\n : `${Base}/${TPath}`\n : TPath extends `/${infer Rest}`\n ? `${TBasePath}/${Rest}`\n : `${TBasePath}/${TPath}`\n>;\n\nexport interface EndpointFactoryOptions<\n TServices extends Service[] = [],\n TBasePath extends string = '',\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TAuthorizers extends readonly string[] = readonly string[],\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TDatabase = undefined,\n TDatabaseServiceName extends string = string,\n TSecuritySchemes extends Record<string, SecurityScheme> = Record<\n string,\n SecurityScheme\n >,\n> {\n defaultServices?: TServices;\n basePath?: TBasePath;\n defaultAuthorizeFn?: AuthorizeFn<TServices, TLogger, TSession>;\n defaultLogger?: TLogger;\n defaultSessionExtractor?: SessionFn<TServices, TLogger, TSession, TDatabase>;\n defaultEventPublisher?: Service<TEventPublisherServiceName, TEventPublisher>;\n defaultEvents?: MappedEvent<TEventPublisher, undefined>[];\n availableAuthorizers?: Authorizer[];\n defaultAuthorizerName?: TAuthorizers[number];\n defaultAuditorStorage?: Service<TAuditStorageServiceName, TAuditStorage>;\n defaultDatabaseService?: Service<TDatabaseServiceName, TDatabase>;\n defaultActorExtractor?: ActorExtractor<TServices, TSession, TLogger>;\n customSecuritySchemes?: TSecuritySchemes;\n}\n\nexport const e = new EndpointFactory();\n"],"mappings":"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"}
@@ -1,13 +1,13 @@
1
- import { Authorizer } from "./Authorizer-BTmly8ps.cjs";
2
- import { ActorExtractor, AuthorizeFn, SessionFn } from "./Endpoint-D2Imgihs.cjs";
3
- import { EndpointBuilder } from "./EndpointBuilder-TApJQhtG.cjs";
1
+ import { Authorizer, BuiltInSecuritySchemeId, SecurityScheme } from "./Authorizer-CpSUMTIs.cjs";
2
+ import { ActorExtractor, AuthorizeFn, SessionFn } from "./Endpoint-BJPJTGjV.cjs";
3
+ import { EndpointBuilder } from "./EndpointBuilder-CQ-jOXsD.cjs";
4
4
  import { AuditStorage, AuditableAction, ExtractStorageAuditAction } from "@geekmidas/audit";
5
5
  import { EventPublisher, MappedEvent } from "@geekmidas/events";
6
6
  import { Logger } from "@geekmidas/logger";
7
7
  import { Service } from "@geekmidas/services";
8
8
 
9
9
  //#region src/endpoints/EndpointFactory.d.ts
10
- declare class EndpointFactory<TServices extends Service[] = [], TBasePath extends string = '', TLogger extends Logger = Logger, TSession = unknown, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuthorizers extends readonly string[] = readonly string[], TAuditStorage extends AuditStorage<any> | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = ExtractStorageAuditAction<NonNullable<TAuditStorage>>, TDatabase = undefined, TDatabaseServiceName extends string = string> {
10
+ declare class EndpointFactory<TServices extends Service[] = [], TBasePath extends string = '', TLogger extends Logger = Logger, TSession = unknown, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuthorizers extends readonly string[] = readonly string[], TAuditStorage extends AuditStorage<any> | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = ExtractStorageAuditAction<NonNullable<TAuditStorage>>, TDatabase = undefined, TDatabaseServiceName extends string = string, TSecuritySchemes extends Record<string, SecurityScheme> = Record<string, SecurityScheme>> {
11
11
  private defaultServices;
12
12
  private basePath;
13
13
  private defaultAuthorizeFn?;
@@ -19,6 +19,7 @@ declare class EndpointFactory<TServices extends Service[] = [], TBasePath extend
19
19
  private defaultAuditorStorage;
20
20
  private defaultDatabaseService;
21
21
  private defaultActorExtractor?;
22
+ private customSecuritySchemes;
22
23
  constructor({
23
24
  basePath,
24
25
  defaultAuthorizeFn,
@@ -30,38 +31,61 @@ declare class EndpointFactory<TServices extends Service[] = [], TBasePath extend
30
31
  defaultAuthorizerName,
31
32
  defaultAuditorStorage,
32
33
  defaultDatabaseService,
33
- defaultActorExtractor
34
- }?: EndpointFactoryOptions<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName>);
34
+ defaultActorExtractor,
35
+ customSecuritySchemes
36
+ }?: EndpointFactoryOptions<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TSecuritySchemes>);
35
37
  static joinPaths<TBasePath extends string, P extends string>(path: P, basePath?: TBasePath): JoinPaths<TBasePath, P>;
36
- authorizers<const T extends readonly string[]>(authorizers: T): EndpointFactory<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, T, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>;
38
+ authorizers<const T extends readonly string[]>(authorizers: T): EndpointFactory<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, T, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName, TSecuritySchemes>;
39
+ /**
40
+ * Define custom security schemes for this factory.
41
+ * These extend the built-in schemes (jwt, bearer, apiKey, oauth2, oidc).
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * const router = e.securitySchemes({
46
+ * awsIamSigV4: {
47
+ * type: 'apiKey',
48
+ * in: 'header',
49
+ * name: 'Authorization',
50
+ * 'x-amazon-apigateway-authtype': 'awsSigv4',
51
+ * },
52
+ * });
53
+ * ```
54
+ */
55
+ securitySchemes<T extends Record<string, SecurityScheme>>(schemes: T): EndpointFactory<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName, TSecuritySchemes & T>;
37
56
  /**
38
57
  * Set the default authorizer for all endpoints created from this factory.
39
58
  * Individual endpoints can override this by calling `.authorizer()` on the builder.
40
59
  * Use `'none'` to explicitly disable authorization for all endpoints.
60
+ *
61
+ * Accepts:
62
+ * - Built-in security scheme names: 'jwt', 'bearer', 'apiKey', 'oauth2', 'oidc'
63
+ * - Custom security scheme names defined via `.securitySchemes()`
64
+ * - 'none' to disable authorization
41
65
  */
42
- authorizer(name: TAuthorizers[number] | 'none'): EndpointFactory<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>;
43
- route<TPath extends string>(path: TPath): EndpointFactory<TServices, JoinPaths<TBasePath, TPath>, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>;
44
- authorize(fn: AuthorizeFn<TServices, TLogger, TSession>): EndpointFactory<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>;
45
- services<S extends Service[]>(services: S): EndpointFactory<[...S, ...TServices], TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>;
46
- logger<L extends Logger>(logger: L): EndpointFactory<TServices, TBasePath, L, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>;
47
- publisher<T extends EventPublisher<any>, TServiceName extends string = string>(publisher: Service<TServiceName, T>): EndpointFactory<TServices, TBasePath, TLogger, TSession, T, TServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>;
48
- session<T>(session: SessionFn<TServices, TLogger, T, TDatabase>): EndpointFactory<TServices, TBasePath, TLogger, T, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>;
66
+ authorizer(name: BuiltInSecuritySchemeId | keyof TSecuritySchemes | TAuthorizers[number] | 'none'): EndpointFactory<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName, TSecuritySchemes>;
67
+ route<TPath extends string>(path: TPath): EndpointFactory<TServices, JoinPaths<TBasePath, TPath>, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName, TSecuritySchemes>;
68
+ authorize(fn: AuthorizeFn<TServices, TLogger, TSession>): EndpointFactory<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName, TSecuritySchemes>;
69
+ services<S extends Service[]>(services: S): EndpointFactory<[...S, ...TServices], TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName, TSecuritySchemes>;
70
+ logger<L extends Logger>(logger: L): EndpointFactory<TServices, TBasePath, L, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName, TSecuritySchemes>;
71
+ publisher<T extends EventPublisher<any>, TServiceName extends string = string>(publisher: Service<TServiceName, T>): EndpointFactory<TServices, TBasePath, TLogger, TSession, T, TServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName, TSecuritySchemes>;
72
+ session<T>(session: SessionFn<TServices, TLogger, T, TDatabase>): EndpointFactory<TServices, TBasePath, TLogger, T, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName, TSecuritySchemes>;
49
73
  /**
50
74
  * Set the database service for endpoints created from this factory.
51
75
  * The database will be available in handler context as `db`.
52
76
  */
53
- database<T, TName extends string>(service: Service<TName, T>): EndpointFactory<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, T, TName>;
77
+ database<T, TName extends string>(service: Service<TName, T>): EndpointFactory<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, T, TName, TSecuritySchemes>;
54
78
  /**
55
79
  * Set the auditor storage service for endpoints created from this factory.
56
80
  * This enables audit functionality and makes `auditor` available in handler context.
57
81
  * The audit action type is automatically inferred from the storage's generic parameter.
58
82
  */
59
- auditor<T extends AuditStorage<any>, TName extends string>(storage: Service<TName, T>): EndpointFactory<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, T, TName, ExtractStorageAuditAction<T>, TDatabase, TDatabaseServiceName>;
83
+ auditor<T extends AuditStorage<any>, TName extends string>(storage: Service<TName, T>): EndpointFactory<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, T, TName, ExtractStorageAuditAction<T>, TDatabase, TDatabaseServiceName, TSecuritySchemes>;
60
84
  /**
61
85
  * Set the actor extractor function for endpoints created from this factory.
62
86
  * The actor is extracted from the request context and attached to all audits.
63
87
  */
64
- actor(extractor: ActorExtractor<TServices, TSession, TLogger>): EndpointFactory<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>;
88
+ actor(extractor: ActorExtractor<TServices, TSession, TLogger>): EndpointFactory<TServices, TBasePath, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName, TSecuritySchemes>;
65
89
  private createBuilder;
66
90
  post<TPath extends string>(path: TPath): EndpointBuilder<RemoveTrailingSlash<TBasePath extends "" ? TPath : TPath extends "" ? TBasePath : TBasePath extends "/" ? TPath extends `/${string}` ? TPath : `/${TPath}` : TBasePath extends `${infer Base}/` ? TPath extends `/${infer Rest}` ? `${Base}/${Rest}` : `${Base}/${TPath}` : TPath extends `/${infer Rest_1}` ? `${TBasePath}/${Rest_1}` : `${TBasePath}/${TPath}`>, "POST", {}, TServices, TLogger, undefined, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>;
67
91
  get<TPath extends string>(path: TPath): EndpointBuilder<RemoveTrailingSlash<TBasePath extends "" ? TPath : TPath extends "" ? TBasePath : TBasePath extends "/" ? TPath extends `/${string}` ? TPath : `/${TPath}` : TBasePath extends `${infer Base}/` ? TPath extends `/${infer Rest}` ? `${Base}/${Rest}` : `${Base}/${TPath}` : TPath extends `/${infer Rest_1}` ? `${TBasePath}/${Rest_1}` : `${TBasePath}/${TPath}`>, "GET", {}, TServices, TLogger, undefined, TSession, TEventPublisher, TEventPublisherServiceName, TAuthorizers, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>;
@@ -72,7 +96,7 @@ declare class EndpointFactory<TServices extends Service[] = [], TBasePath extend
72
96
  }
73
97
  type RemoveTrailingSlash<T extends string> = T extends `${infer Rest}/` ? Rest extends '' ? T : Rest : T;
74
98
  type JoinPaths<TBasePath extends string, TPath extends string> = RemoveTrailingSlash<TBasePath extends '' ? TPath : TPath extends '' ? TBasePath : TBasePath extends '/' ? TPath extends `/${string}` ? TPath : `/${TPath}` : TBasePath extends `${infer Base}/` ? TPath extends `/${infer Rest}` ? `${Base}/${Rest}` : `${Base}/${TPath}` : TPath extends `/${infer Rest}` ? `${TBasePath}/${Rest}` : `${TBasePath}/${TPath}`>;
75
- interface EndpointFactoryOptions<TServices extends Service[] = [], TBasePath extends string = '', TLogger extends Logger = Logger, TSession = unknown, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuthorizers extends readonly string[] = readonly string[], TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string> {
99
+ interface EndpointFactoryOptions<TServices extends Service[] = [], TBasePath extends string = '', TLogger extends Logger = Logger, TSession = unknown, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuthorizers extends readonly string[] = readonly string[], TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TSecuritySchemes extends Record<string, SecurityScheme> = Record<string, SecurityScheme>> {
76
100
  defaultServices?: TServices;
77
101
  basePath?: TBasePath;
78
102
  defaultAuthorizeFn?: AuthorizeFn<TServices, TLogger, TSession>;
@@ -85,8 +109,9 @@ interface EndpointFactoryOptions<TServices extends Service[] = [], TBasePath ext
85
109
  defaultAuditorStorage?: Service<TAuditStorageServiceName, TAuditStorage>;
86
110
  defaultDatabaseService?: Service<TDatabaseServiceName, TDatabase>;
87
111
  defaultActorExtractor?: ActorExtractor<TServices, TSession, TLogger>;
112
+ customSecuritySchemes?: TSecuritySchemes;
88
113
  }
89
- declare const e: EndpointFactory<[], "", Logger, unknown, undefined, string, readonly string[], undefined, string, never, undefined, string>;
114
+ declare const e: EndpointFactory<[], "", Logger, unknown, undefined, string, readonly string[], undefined, string, never, undefined, string, Record<string, SecurityScheme>>;
90
115
  //#endregion
91
116
  export { EndpointFactory, EndpointFactoryOptions, JoinPaths, RemoveTrailingSlash, e };
92
- //# sourceMappingURL=EndpointFactory-B5fOINuc.d.cts.map
117
+ //# sourceMappingURL=EndpointFactory-DgwmAR_8.d.cts.map
@@ -1,4 +1,4 @@
1
- import { Construct, ConstructType } from "./Construct-DDR0295I.mjs";
1
+ import { Construct, ConstructType } from "./Construct-DCPATqec.mjs";
2
2
  import { Service, ServiceRecord } from "@geekmidas/services";
3
3
  import { AuditStorage, AuditableAction, Auditor } from "@geekmidas/audit";
4
4
  import { EventPublisher, MappedEvent } from "@geekmidas/events";
@@ -73,4 +73,4 @@ type FunctionContext<Input extends ComposableStandardSchema | undefined = undefi
73
73
  } & DatabaseContext<TDatabase> & AuditorContext<TAuditAction, TAuditStorage>;
74
74
  //#endregion
75
75
  export { Function, FunctionContext, FunctionFactory, FunctionHandler };
76
- //# sourceMappingURL=Function-CD3rXWfa.d.mts.map
76
+ //# sourceMappingURL=Function-Dthlh2Fb.d.mts.map
@@ -1,6 +1,6 @@
1
- import { ConstructType } from "./Construct-DDR0295I.mjs";
2
- import { Function, FunctionHandler } from "./Function-CD3rXWfa.mjs";
3
- import { BaseFunctionBuilder } from "./BaseFunctionBuilder-Ct6zY6Jq.mjs";
1
+ import { ConstructType } from "./Construct-DCPATqec.mjs";
2
+ import { Function, FunctionHandler } from "./Function-Dthlh2Fb.mjs";
3
+ import { BaseFunctionBuilder } from "./BaseFunctionBuilder-Oc2xmxmg.mjs";
4
4
  import { Service } from "@geekmidas/services";
5
5
  import { AuditStorage, AuditableAction } from "@geekmidas/audit";
6
6
  import { EventPublisher } from "@geekmidas/events";
@@ -35,4 +35,4 @@ declare class FunctionBuilder<TInput extends ComposableStandardSchema, OutSchema
35
35
  }
36
36
  //#endregion
37
37
  export { FunctionBuilder };
38
- //# sourceMappingURL=FunctionBuilder-j2VkwuGf.d.mts.map
38
+ //# sourceMappingURL=FunctionBuilder-CZFBLfdV.d.mts.map
@@ -1,4 +1,4 @@
1
- import { Function, FunctionHandler } from "./Function-CD3rXWfa.mjs";
1
+ import { Function, FunctionHandler } from "./Function-Dthlh2Fb.mjs";
2
2
  import { Service, ServiceDiscovery, ServiceRecord } from "@geekmidas/services";
3
3
  import { AuditStorage, AuditableAction, Auditor } from "@geekmidas/audit";
4
4
  import { EnvironmentParser } from "@geekmidas/envkit";
@@ -45,4 +45,4 @@ declare abstract class FunctionExecutionWrapper<TInput extends ComposableStandar
45
45
  }
46
46
  //#endregion
47
47
  export { FunctionExecutionWrapper };
48
- //# sourceMappingURL=FunctionExecutionWrapper-B0WP-Vec.d.mts.map
48
+ //# sourceMappingURL=FunctionExecutionWrapper-CfuajSB5.d.mts.map
@@ -1,6 +1,6 @@
1
1
  import { publishConstructEvents } from "./publisher-Bw4770Hi.mjs";
2
2
  import { Endpoint, ResponseBuilder } from "./Endpoint-DbPsw13b.mjs";
3
- import { createAuditContext, executeWithAuditTransaction } from "./processAudits-DfcB-X-4.mjs";
3
+ import { createAuditContext, executeWithAuditTransaction } from "./processAudits-Dj8UGqcW.mjs";
4
4
  import { getEndpointsFromRoutes } from "./helpers-CrrdyA04.mjs";
5
5
  import { parseHonoQuery } from "./parseHonoQuery-CwFKw2ua.mjs";
6
6
  import { wrapError } from "@geekmidas/errors";
@@ -161,7 +161,7 @@ var HonoEndpoint = class HonoEndpoint {
161
161
  entityId
162
162
  });
163
163
  }
164
- });
164
+ }, { db: rawDb });
165
165
  const { output, metadata } = result;
166
166
  try {
167
167
  let status = endpoint.status;
@@ -213,4 +213,4 @@ var HonoEndpoint = class HonoEndpoint {
213
213
 
214
214
  //#endregion
215
215
  export { HonoEndpoint };
216
- //# sourceMappingURL=HonoEndpointAdaptor-Bg_vTyA5.mjs.map
216
+ //# sourceMappingURL=HonoEndpointAdaptor-BmB4Sc7L.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"HonoEndpointAdaptor-Bg_vTyA5.mjs","names":["endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >","c: Context<any, string, {}>","data: unknown","schema?: T","serviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>","app: Hono","serviceDiscovery: ServiceDiscovery<any, any>","logger","routes: string[]","envParser: EnvironmentParser<{}>","logger: TLogger","options?: HonoEndpointOptions","endpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[]","metadata","output","result","validationError: any","e: any","docsPath: string","openApiOptions?: HonoEndpointOptions['openApiOptions']"],"sources":["../src/endpoints/HonoEndpointAdaptor.ts"],"sourcesContent":["import type { AuditStorage, AuditableAction } from '@geekmidas/audit';\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport { checkRateLimit, getRateLimitHeaders } from '@geekmidas/rate-limit';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { type Context, Hono } from 'hono';\nimport { setCookie } from 'hono/cookie';\nimport { logger as honoLogger } from 'hono/logger';\nimport { timing } from 'hono/timing';\nimport { validator } from 'hono/validator';\nimport type { HttpMethod, LowerHttpMethod } from '../types';\nimport {\n Endpoint,\n type EndpointContext,\n type EndpointSchemas,\n ResponseBuilder,\n} from './Endpoint';\nimport { getEndpointsFromRoutes } from './helpers';\nimport { parseHonoQuery } from './parseHonoQuery';\n\nimport { wrapError } from '@geekmidas/errors';\nimport {\n type Service,\n ServiceDiscovery,\n type ServiceRecord,\n} from '@geekmidas/services';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\nimport { publishConstructEvents } from '../publisher';\nimport type { MappedAudit } from './audit';\nimport {\n createAuditContext,\n executeWithAuditTransaction,\n} from './processAudits';\n\nexport interface HonoEndpointOptions {\n /**\n * Path where OpenAPI documentation will be served.\n * Set to false to disable docs route.\n * @default '/docs'\n */\n docsPath?: string | false;\n /**\n * OpenAPI schema options\n */\n openApiOptions?: {\n title?: string;\n version?: string;\n description?: string;\n };\n}\n\nexport class HonoEndpoint<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n TDatabase = undefined,\n TDatabaseServiceName extends string = string,\n> {\n constructor(\n private readonly endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >,\n ) {}\n\n static isDev = process.env.NODE_ENV === 'development';\n\n static async validate<T extends StandardSchemaV1>(\n c: Context<any, string, {}>,\n data: unknown,\n schema?: T,\n ) {\n if (!schema) {\n return undefined;\n }\n\n const parsed = await Endpoint.validate(schema, data);\n\n if (parsed.issues) {\n return c.json(parsed.issues, 422);\n }\n\n return parsed.value;\n }\n addRoute(\n serviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,\n app: Hono,\n ): void {\n HonoEndpoint.addRoute(this.endpoint, serviceDiscovery, app);\n }\n\n static applyEventMiddleware(\n app: Hono,\n serviceDiscovery: ServiceDiscovery<any, any>,\n ) {\n app.use(async (c, next) => {\n await next();\n // @ts-ignore\n const endpoint = c.get('__endpoint') as Endpoint<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >;\n // @ts-ignore\n const response = c.get('__response');\n // @ts-ignore\n const logger = c.get('__logger') as Logger;\n\n if (Endpoint.isSuccessStatus(c.res.status) && endpoint) {\n // Process events (audits are handled in the handler with transaction support)\n await publishConstructEvents<any, any>(\n endpoint,\n response,\n serviceDiscovery,\n logger,\n );\n }\n });\n }\n\n static async fromRoutes<TLogger extends Logger, TServices extends Service[]>(\n routes: string[],\n envParser: EnvironmentParser<{}>,\n app = new Hono(),\n logger: TLogger,\n cwd = process.cwd(),\n options?: HonoEndpointOptions,\n ): Promise<Hono> {\n const endpoints = await getEndpointsFromRoutes<TServices>(routes, cwd);\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, envParser);\n\n HonoEndpoint.addRoutes(endpoints, serviceDiscovery, app, options);\n\n return app;\n }\n\n static addRoutes<\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n >(\n endpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[],\n serviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,\n app: Hono,\n options?: HonoEndpointOptions,\n ): void {\n // Add timing middleware (always enabled)\n app.use('*', timing());\n\n // Add logger middleware in development mode\n\n if (HonoEndpoint.isDev) {\n app.use('*', honoLogger());\n }\n\n // Add docs route if not disabled\n const docsPath =\n options?.docsPath !== false ? options?.docsPath || '/docs' : null;\n if (docsPath) {\n HonoEndpoint.addDocsRoute(\n endpoints,\n app,\n docsPath,\n options?.openApiOptions,\n );\n }\n\n // Sort endpoints to ensure static routes come before dynamic ones\n const sortedEndpoints = endpoints.sort((a, b) => {\n const aSegments = a.route.split('/');\n const bSegments = b.route.split('/');\n\n // Compare each segment\n for (let i = 0; i < Math.max(aSegments.length, bSegments.length); i++) {\n const aSegment = aSegments[i] || '';\n const bSegment = bSegments[i] || '';\n\n // If one is dynamic and the other is not, static comes first\n const aIsDynamic = aSegment.startsWith(':');\n const bIsDynamic = bSegment.startsWith(':');\n\n if (!aIsDynamic && bIsDynamic) return -1;\n if (aIsDynamic && !bIsDynamic) return 1;\n\n // If both are the same type, compare alphabetically\n if (aSegment !== bSegment) {\n return aSegment.localeCompare(bSegment);\n }\n }\n\n return 0;\n });\n HonoEndpoint.applyEventMiddleware(app, serviceDiscovery);\n for (const endpoint of sortedEndpoints) {\n HonoEndpoint.addRoute(endpoint, serviceDiscovery, app);\n }\n }\n\n static addRoute<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n TDatabase = undefined,\n TDatabaseServiceName extends string = string,\n >(\n endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >,\n serviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,\n app: Hono,\n ): void {\n const { route } = endpoint;\n const method = endpoint.method.toLowerCase() as LowerHttpMethod<TMethod>;\n\n app[method](\n route,\n validator('json', (value, c) =>\n HonoEndpoint.validate(c, value, endpoint.input?.body),\n ),\n validator('query', (_, c) => {\n const parsedQuery = parseHonoQuery(c);\n return HonoEndpoint.validate(c, parsedQuery, endpoint.input?.query);\n }),\n validator('param', (params, c) =>\n HonoEndpoint.validate(c, params, endpoint.input?.params),\n ),\n async (c) => {\n const logger = endpoint.logger.child({\n endpoint: endpoint.fullPath,\n route: endpoint.route,\n host: c.header('host'),\n method: endpoint.method,\n path: c.req.path,\n }) as TLogger;\n\n try {\n const headerValues = c.req.header();\n\n const header = Endpoint.createHeaders(headerValues);\n const cookie = Endpoint.createCookies(headerValues.cookie);\n\n const services = await serviceDiscovery.register(endpoint.services);\n\n // Resolve database service early so it's available for session extraction\n const rawDb = endpoint.databaseService\n ? await serviceDiscovery\n .register([endpoint.databaseService])\n .then(\n (s) =>\n s[endpoint.databaseService!.serviceName as keyof typeof s],\n )\n : undefined;\n\n const session = await endpoint.getSession({\n services,\n logger,\n header,\n cookie,\n ...(rawDb !== undefined && { db: rawDb }),\n } as any);\n\n const isAuthorized = await endpoint.authorize({\n header,\n cookie,\n services,\n logger,\n session,\n });\n\n if (!isAuthorized) {\n logger.warn('Unauthorized access attempt');\n return c.json({ error: 'Unauthorized' }, 401);\n }\n\n // Check rate limit if configured\n if (endpoint.rateLimit) {\n const rateLimitInfo = await checkRateLimit(endpoint.rateLimit, {\n header,\n services,\n logger,\n session,\n path: c.req.path,\n method: endpoint.method,\n });\n\n // Set rate limit headers\n const rateLimitHeaders = getRateLimitHeaders(\n rateLimitInfo,\n endpoint.rateLimit,\n );\n for (const [key, value] of Object.entries(rateLimitHeaders)) {\n if (value) {\n c.header(key, value);\n }\n }\n }\n\n // Create audit context if audit storage is configured\n const auditContext = await createAuditContext(\n endpoint,\n serviceDiscovery,\n logger,\n {\n session,\n header,\n cookie,\n services: services as Record<string, unknown>,\n },\n );\n\n // Warn if declarative audits are configured but no audit storage\n const audits = endpoint.audits as MappedAudit<\n TAuditAction,\n TOutSchema\n >[];\n if (!auditContext && audits?.length) {\n logger.warn('No auditor storage service available');\n }\n\n // Execute handler with automatic audit transaction support\n const result = await executeWithAuditTransaction(\n auditContext,\n async (auditor) => {\n // Use audit transaction as db only if the storage uses the same database service\n const sameDatabase =\n auditContext?.storage?.databaseServiceName &&\n auditContext.storage.databaseServiceName ===\n endpoint.databaseService?.serviceName;\n const db = sameDatabase\n ? (auditor?.getTransaction?.() ?? rawDb)\n : rawDb;\n\n const responseBuilder = new ResponseBuilder();\n const response = await endpoint.handler(\n {\n services,\n logger,\n body: c.req.valid('json'),\n query: c.req.valid('query'),\n params: c.req.valid('param'),\n session,\n header,\n cookie,\n auditor,\n db,\n } as unknown as EndpointContext<\n TInput,\n TServices,\n TLogger,\n TSession,\n TAuditAction,\n TDatabase,\n TAuditStorage\n >,\n responseBuilder,\n );\n\n // Check if response has metadata\n let data = response;\n let metadata = responseBuilder.getMetadata();\n\n if (Endpoint.hasMetadata(response)) {\n data = response.data;\n metadata = response.metadata;\n }\n\n const output = endpoint.outputSchema\n ? await endpoint.parseOutput(data)\n : undefined;\n\n return { output, metadata, responseBuilder };\n },\n // Process declarative audits after handler (inside transaction)\n async (result, auditor) => {\n if (!audits?.length) return;\n\n for (const audit of audits) {\n if (audit.when && !audit.when(result.output as any)) {\n continue;\n }\n const payload = audit.payload(result.output as any);\n const entityId = audit.entityId?.(result.output as any);\n auditor.audit(audit.type as any, payload as any, {\n table: audit.table,\n entityId,\n });\n }\n },\n );\n\n const { output, metadata } = result;\n\n try {\n let status = endpoint.status as ContentfulStatusCode;\n\n // Apply response metadata\n if (metadata.status) {\n status = metadata.status as ContentfulStatusCode;\n }\n\n if (metadata.headers) {\n for (const [key, value] of Object.entries(metadata.headers)) {\n c.header(key, value);\n }\n }\n\n if (metadata.cookies) {\n for (const [name, { value, options }] of metadata.cookies) {\n setCookie(c, name, value, options);\n }\n }\n\n // @ts-ignore\n c.set('__response', output);\n // @ts-ignore\n c.set('__endpoint', endpoint);\n // @ts-ignore\n c.set('__logger', logger);\n // @ts-ignore\n c.set('__session', session);\n // @ts-ignore\n c.set('__services', services);\n\n if (HonoEndpoint.isDev) {\n logger.info({ status, body: output }, 'Outgoing response');\n }\n // @ts-ignore\n return c.json(output, status);\n } catch (validationError: any) {\n logger.error(validationError, 'Output validation failed');\n const error = wrapError(\n validationError,\n 422,\n 'Response validation failed',\n );\n if (HonoEndpoint.isDev) {\n logger.info(\n { status: error.statusCode, body: error },\n 'Outgoing response',\n );\n }\n return c.json(error, error.statusCode as ContentfulStatusCode);\n }\n } catch (e: any) {\n logger.error(e, 'Error processing endpoint request');\n const error = wrapError(e, 500, 'Internal Server Error');\n if (HonoEndpoint.isDev) {\n logger.info(\n { status: error.statusCode, body: error },\n 'Outgoing response',\n );\n }\n return c.json(error, error.statusCode as ContentfulStatusCode);\n }\n },\n );\n }\n\n static addDocsRoute<\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n >(\n endpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[],\n app: Hono,\n docsPath: string,\n openApiOptions?: HonoEndpointOptions['openApiOptions'],\n ): void {\n app.get(docsPath, async (c) => {\n try {\n const openApiSchema = await Endpoint.buildOpenApiSchema(\n endpoints,\n openApiOptions,\n );\n\n return c.json(openApiSchema);\n } catch (error) {\n console.error('Error generating OpenAPI schema:', error);\n return c.json(\n { error: 'Failed to generate OpenAPI documentation' },\n 500,\n );\n }\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"HonoEndpointAdaptor-BmB4Sc7L.mjs","names":["endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >","c: Context<any, string, {}>","data: unknown","schema?: T","serviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>","app: Hono","serviceDiscovery: ServiceDiscovery<any, any>","logger","routes: string[]","envParser: EnvironmentParser<{}>","logger: TLogger","options?: HonoEndpointOptions","endpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[]","metadata","output","result","validationError: any","e: any","docsPath: string","openApiOptions?: HonoEndpointOptions['openApiOptions']"],"sources":["../src/endpoints/HonoEndpointAdaptor.ts"],"sourcesContent":["import type { AuditStorage, AuditableAction } from '@geekmidas/audit';\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport { checkRateLimit, getRateLimitHeaders } from '@geekmidas/rate-limit';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { type Context, Hono } from 'hono';\nimport { setCookie } from 'hono/cookie';\nimport { logger as honoLogger } from 'hono/logger';\nimport { timing } from 'hono/timing';\nimport { validator } from 'hono/validator';\nimport type { HttpMethod, LowerHttpMethod } from '../types';\nimport {\n Endpoint,\n type EndpointContext,\n type EndpointSchemas,\n ResponseBuilder,\n} from './Endpoint';\nimport { getEndpointsFromRoutes } from './helpers';\nimport { parseHonoQuery } from './parseHonoQuery';\n\nimport { wrapError } from '@geekmidas/errors';\nimport {\n type Service,\n ServiceDiscovery,\n type ServiceRecord,\n} from '@geekmidas/services';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\nimport { publishConstructEvents } from '../publisher';\nimport type { MappedAudit } from './audit';\nimport {\n createAuditContext,\n executeWithAuditTransaction,\n} from './processAudits';\n\nexport interface HonoEndpointOptions {\n /**\n * Path where OpenAPI documentation will be served.\n * Set to false to disable docs route.\n * @default '/docs'\n */\n docsPath?: string | false;\n /**\n * OpenAPI schema options\n */\n openApiOptions?: {\n title?: string;\n version?: string;\n description?: string;\n };\n}\n\nexport class HonoEndpoint<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n TDatabase = undefined,\n TDatabaseServiceName extends string = string,\n> {\n constructor(\n private readonly endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >,\n ) {}\n\n static isDev = process.env.NODE_ENV === 'development';\n\n static async validate<T extends StandardSchemaV1>(\n c: Context<any, string, {}>,\n data: unknown,\n schema?: T,\n ) {\n if (!schema) {\n return undefined;\n }\n\n const parsed = await Endpoint.validate(schema, data);\n\n if (parsed.issues) {\n return c.json(parsed.issues, 422);\n }\n\n return parsed.value;\n }\n addRoute(\n serviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,\n app: Hono,\n ): void {\n HonoEndpoint.addRoute(this.endpoint, serviceDiscovery, app);\n }\n\n static applyEventMiddleware(\n app: Hono,\n serviceDiscovery: ServiceDiscovery<any, any>,\n ) {\n app.use(async (c, next) => {\n await next();\n // @ts-ignore\n const endpoint = c.get('__endpoint') as Endpoint<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n any\n >;\n // @ts-ignore\n const response = c.get('__response');\n // @ts-ignore\n const logger = c.get('__logger') as Logger;\n\n if (Endpoint.isSuccessStatus(c.res.status) && endpoint) {\n // Process events (audits are handled in the handler with transaction support)\n await publishConstructEvents<any, any>(\n endpoint,\n response,\n serviceDiscovery,\n logger,\n );\n }\n });\n }\n\n static async fromRoutes<TLogger extends Logger, TServices extends Service[]>(\n routes: string[],\n envParser: EnvironmentParser<{}>,\n app = new Hono(),\n logger: TLogger,\n cwd = process.cwd(),\n options?: HonoEndpointOptions,\n ): Promise<Hono> {\n const endpoints = await getEndpointsFromRoutes<TServices>(routes, cwd);\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, envParser);\n\n HonoEndpoint.addRoutes(endpoints, serviceDiscovery, app, options);\n\n return app;\n }\n\n static addRoutes<\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n >(\n endpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[],\n serviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,\n app: Hono,\n options?: HonoEndpointOptions,\n ): void {\n // Add timing middleware (always enabled)\n app.use('*', timing());\n\n // Add logger middleware in development mode\n\n if (HonoEndpoint.isDev) {\n app.use('*', honoLogger());\n }\n\n // Add docs route if not disabled\n const docsPath =\n options?.docsPath !== false ? options?.docsPath || '/docs' : null;\n if (docsPath) {\n HonoEndpoint.addDocsRoute(\n endpoints,\n app,\n docsPath,\n options?.openApiOptions,\n );\n }\n\n // Sort endpoints to ensure static routes come before dynamic ones\n const sortedEndpoints = endpoints.sort((a, b) => {\n const aSegments = a.route.split('/');\n const bSegments = b.route.split('/');\n\n // Compare each segment\n for (let i = 0; i < Math.max(aSegments.length, bSegments.length); i++) {\n const aSegment = aSegments[i] || '';\n const bSegment = bSegments[i] || '';\n\n // If one is dynamic and the other is not, static comes first\n const aIsDynamic = aSegment.startsWith(':');\n const bIsDynamic = bSegment.startsWith(':');\n\n if (!aIsDynamic && bIsDynamic) return -1;\n if (aIsDynamic && !bIsDynamic) return 1;\n\n // If both are the same type, compare alphabetically\n if (aSegment !== bSegment) {\n return aSegment.localeCompare(bSegment);\n }\n }\n\n return 0;\n });\n HonoEndpoint.applyEventMiddleware(app, serviceDiscovery);\n for (const endpoint of sortedEndpoints) {\n HonoEndpoint.addRoute(endpoint, serviceDiscovery, app);\n }\n }\n\n static addRoute<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n TDatabase = undefined,\n TDatabaseServiceName extends string = string,\n >(\n endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >,\n serviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,\n app: Hono,\n ): void {\n const { route } = endpoint;\n const method = endpoint.method.toLowerCase() as LowerHttpMethod<TMethod>;\n\n app[method](\n route,\n validator('json', (value, c) =>\n HonoEndpoint.validate(c, value, endpoint.input?.body),\n ),\n validator('query', (_, c) => {\n const parsedQuery = parseHonoQuery(c);\n return HonoEndpoint.validate(c, parsedQuery, endpoint.input?.query);\n }),\n validator('param', (params, c) =>\n HonoEndpoint.validate(c, params, endpoint.input?.params),\n ),\n async (c) => {\n const logger = endpoint.logger.child({\n endpoint: endpoint.fullPath,\n route: endpoint.route,\n host: c.header('host'),\n method: endpoint.method,\n path: c.req.path,\n }) as TLogger;\n\n try {\n const headerValues = c.req.header();\n\n const header = Endpoint.createHeaders(headerValues);\n const cookie = Endpoint.createCookies(headerValues.cookie);\n\n const services = await serviceDiscovery.register(endpoint.services);\n\n // Resolve database service early so it's available for session extraction\n const rawDb = endpoint.databaseService\n ? await serviceDiscovery\n .register([endpoint.databaseService])\n .then(\n (s) =>\n s[endpoint.databaseService!.serviceName as keyof typeof s],\n )\n : undefined;\n\n const session = await endpoint.getSession({\n services,\n logger,\n header,\n cookie,\n ...(rawDb !== undefined && { db: rawDb }),\n } as any);\n\n const isAuthorized = await endpoint.authorize({\n header,\n cookie,\n services,\n logger,\n session,\n });\n\n if (!isAuthorized) {\n logger.warn('Unauthorized access attempt');\n return c.json({ error: 'Unauthorized' }, 401);\n }\n\n // Check rate limit if configured\n if (endpoint.rateLimit) {\n const rateLimitInfo = await checkRateLimit(endpoint.rateLimit, {\n header,\n services,\n logger,\n session,\n path: c.req.path,\n method: endpoint.method,\n });\n\n // Set rate limit headers\n const rateLimitHeaders = getRateLimitHeaders(\n rateLimitInfo,\n endpoint.rateLimit,\n );\n for (const [key, value] of Object.entries(rateLimitHeaders)) {\n if (value) {\n c.header(key, value);\n }\n }\n }\n\n // Create audit context if audit storage is configured\n const auditContext = await createAuditContext(\n endpoint,\n serviceDiscovery,\n logger,\n {\n session,\n header,\n cookie,\n services: services as Record<string, unknown>,\n },\n );\n\n // Warn if declarative audits are configured but no audit storage\n const audits = endpoint.audits as MappedAudit<\n TAuditAction,\n TOutSchema\n >[];\n if (!auditContext && audits?.length) {\n logger.warn('No auditor storage service available');\n }\n\n // Execute handler with automatic audit transaction support\n const result = await executeWithAuditTransaction(\n auditContext,\n async (auditor) => {\n // Use audit transaction as db only if the storage uses the same database service\n const sameDatabase =\n auditContext?.storage?.databaseServiceName &&\n auditContext.storage.databaseServiceName ===\n endpoint.databaseService?.serviceName;\n const db = sameDatabase\n ? (auditor?.getTransaction?.() ?? rawDb)\n : rawDb;\n\n const responseBuilder = new ResponseBuilder();\n const response = await endpoint.handler(\n {\n services,\n logger,\n body: c.req.valid('json'),\n query: c.req.valid('query'),\n params: c.req.valid('param'),\n session,\n header,\n cookie,\n auditor,\n db,\n } as unknown as EndpointContext<\n TInput,\n TServices,\n TLogger,\n TSession,\n TAuditAction,\n TDatabase,\n TAuditStorage\n >,\n responseBuilder,\n );\n\n // Check if response has metadata\n let data = response;\n let metadata = responseBuilder.getMetadata();\n\n if (Endpoint.hasMetadata(response)) {\n data = response.data;\n metadata = response.metadata;\n }\n\n const output = endpoint.outputSchema\n ? await endpoint.parseOutput(data)\n : undefined;\n\n return { output, metadata, responseBuilder };\n },\n // Process declarative audits after handler (inside transaction)\n async (result, auditor) => {\n if (!audits?.length) return;\n\n for (const audit of audits) {\n if (audit.when && !audit.when(result.output as any)) {\n continue;\n }\n const payload = audit.payload(result.output as any);\n const entityId = audit.entityId?.(result.output as any);\n auditor.audit(audit.type as any, payload as any, {\n table: audit.table,\n entityId,\n });\n }\n },\n // Pass rawDb so storage can reuse existing transactions\n { db: rawDb },\n );\n\n const { output, metadata } = result;\n\n try {\n let status = endpoint.status as ContentfulStatusCode;\n\n // Apply response metadata\n if (metadata.status) {\n status = metadata.status as ContentfulStatusCode;\n }\n\n if (metadata.headers) {\n for (const [key, value] of Object.entries(metadata.headers)) {\n c.header(key, value);\n }\n }\n\n if (metadata.cookies) {\n for (const [name, { value, options }] of metadata.cookies) {\n setCookie(c, name, value, options);\n }\n }\n\n // @ts-ignore\n c.set('__response', output);\n // @ts-ignore\n c.set('__endpoint', endpoint);\n // @ts-ignore\n c.set('__logger', logger);\n // @ts-ignore\n c.set('__session', session);\n // @ts-ignore\n c.set('__services', services);\n\n if (HonoEndpoint.isDev) {\n logger.info({ status, body: output }, 'Outgoing response');\n }\n // @ts-ignore\n return c.json(output, status);\n } catch (validationError: any) {\n logger.error(validationError, 'Output validation failed');\n const error = wrapError(\n validationError,\n 422,\n 'Response validation failed',\n );\n if (HonoEndpoint.isDev) {\n logger.info(\n { status: error.statusCode, body: error },\n 'Outgoing response',\n );\n }\n return c.json(error, error.statusCode as ContentfulStatusCode);\n }\n } catch (e: any) {\n logger.error(e, 'Error processing endpoint request');\n const error = wrapError(e, 500, 'Internal Server Error');\n if (HonoEndpoint.isDev) {\n logger.info(\n { status: error.statusCode, body: error },\n 'Outgoing response',\n );\n }\n return c.json(error, error.statusCode as ContentfulStatusCode);\n }\n },\n );\n }\n\n static addDocsRoute<\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n >(\n endpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[],\n app: Hono,\n docsPath: string,\n openApiOptions?: HonoEndpointOptions['openApiOptions'],\n ): void {\n app.get(docsPath, async (c) => {\n try {\n const openApiSchema = await Endpoint.buildOpenApiSchema(\n endpoints,\n openApiOptions,\n );\n\n return c.json(openApiSchema);\n } catch (error) {\n console.error('Error generating OpenAPI schema:', error);\n return c.json(\n { error: 'Failed to generate OpenAPI documentation' },\n 500,\n );\n }\n });\n }\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  const require_chunk = require('./chunk-CUT6urMc.cjs');
2
2
  const require_publisher = require('./publisher-lFQleddL.cjs');
3
3
  const require_Endpoint = require('./Endpoint-CA-byrDr.cjs');
4
- const require_processAudits = require('./processAudits-BFokHhCO.cjs');
4
+ const require_processAudits = require('./processAudits-CzHkPokQ.cjs');
5
5
  const require_helpers = require('./helpers-DiPZVJQC.cjs');
6
6
  const require_parseHonoQuery = require('./parseHonoQuery-CT8Cvin-.cjs');
7
7
  const __geekmidas_errors = require_chunk.__toESM(require("@geekmidas/errors"));
@@ -162,7 +162,7 @@ var HonoEndpoint = class HonoEndpoint {
162
162
  entityId
163
163
  });
164
164
  }
165
- });
165
+ }, { db: rawDb });
166
166
  const { output, metadata } = result;
167
167
  try {
168
168
  let status = endpoint.status;
@@ -219,4 +219,4 @@ Object.defineProperty(exports, 'HonoEndpoint', {
219
219
  return HonoEndpoint;
220
220
  }
221
221
  });
222
- //# sourceMappingURL=HonoEndpointAdaptor-B_gJPWGD.cjs.map
222
+ //# sourceMappingURL=HonoEndpointAdaptor-CnqR6PSB.cjs.map