@geekmidas/constructs 0.0.22 → 0.2.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 (210) hide show
  1. package/README.md +90 -0
  2. package/dist/{AWSLambdaFunction-qWpalqfr.d.mts → AWSLambdaFunction-D9RZhm0N.d.mts} +3 -3
  3. package/dist/{AWSLambdaSubscriberAdaptor-CWbBNRz3.d.mts → AWSLambdaSubscriberAdaptor-C0aZBU64.d.mts} +2 -2
  4. package/dist/{AmazonApiGatewayEndpointAdaptor-DXssXsJi.cjs → AmazonApiGatewayEndpointAdaptor-Bk6ssx3K.cjs} +40 -27
  5. package/dist/AmazonApiGatewayEndpointAdaptor-Bk6ssx3K.cjs.map +1 -0
  6. package/dist/{AmazonApiGatewayEndpointAdaptor-Da9BR5On.d.cts → AmazonApiGatewayEndpointAdaptor-CbJqLU6I.d.cts} +2 -2
  7. package/dist/{AmazonApiGatewayEndpointAdaptor-BQ0IJdaI.d.mts → AmazonApiGatewayEndpointAdaptor-DC3N7zY_.d.mts} +3 -3
  8. package/dist/{AmazonApiGatewayEndpointAdaptor-CacGag6F.mjs → AmazonApiGatewayEndpointAdaptor-pEWzF2uY.mjs} +40 -27
  9. package/dist/AmazonApiGatewayEndpointAdaptor-pEWzF2uY.mjs.map +1 -0
  10. package/dist/{AmazonApiGatewayV1EndpointAdaptor-C4_AZ1ek.d.mts → AmazonApiGatewayV1EndpointAdaptor-BVxgQ-7J.d.mts} +4 -4
  11. package/dist/{AmazonApiGatewayV1EndpointAdaptor-CSm3NsWz.d.cts → AmazonApiGatewayV1EndpointAdaptor-CVwJ5k16.d.cts} +3 -3
  12. package/dist/{AmazonApiGatewayV1EndpointAdaptor-BpnG55R7.mjs → AmazonApiGatewayV1EndpointAdaptor-MJpRbIaQ.mjs} +2 -2
  13. package/dist/{AmazonApiGatewayV1EndpointAdaptor-BpnG55R7.mjs.map → AmazonApiGatewayV1EndpointAdaptor-MJpRbIaQ.mjs.map} +1 -1
  14. package/dist/{AmazonApiGatewayV1EndpointAdaptor-Df4kszio.cjs → AmazonApiGatewayV1EndpointAdaptor-uBp_4zLf.cjs} +2 -2
  15. package/dist/{AmazonApiGatewayV1EndpointAdaptor-Df4kszio.cjs.map → AmazonApiGatewayV1EndpointAdaptor-uBp_4zLf.cjs.map} +1 -1
  16. package/dist/{AmazonApiGatewayV2EndpointAdaptor-6hsBFVLf.d.cts → AmazonApiGatewayV2EndpointAdaptor-1oBZdQH3.d.cts} +3 -3
  17. package/dist/{AmazonApiGatewayV2EndpointAdaptor-DdM8Tr1X.d.mts → AmazonApiGatewayV2EndpointAdaptor-C3H8Hpv7.d.mts} +4 -4
  18. package/dist/{AmazonApiGatewayV2EndpointAdaptor-ZORzMEET.mjs → AmazonApiGatewayV2EndpointAdaptor-ChO8BlDz.mjs} +2 -2
  19. package/dist/{AmazonApiGatewayV2EndpointAdaptor-ZORzMEET.mjs.map → AmazonApiGatewayV2EndpointAdaptor-ChO8BlDz.mjs.map} +1 -1
  20. package/dist/{AmazonApiGatewayV2EndpointAdaptor-5SIvqPby.cjs → AmazonApiGatewayV2EndpointAdaptor-I1W23Nvn.cjs} +2 -2
  21. package/dist/{AmazonApiGatewayV2EndpointAdaptor-5SIvqPby.cjs.map → AmazonApiGatewayV2EndpointAdaptor-I1W23Nvn.cjs.map} +1 -1
  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-Cpx59w_q.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-CoV7J45W.d.mts} +2 -2
  29. package/dist/{Construct-DDR0295I.d.mts → Construct-jBKqb-Zi.d.mts} +1 -1
  30. package/dist/Construct.d.mts +1 -1
  31. package/dist/{Cron-DnMRWPFR.d.mts → Cron-JZkp_fHy.d.mts} +2 -2
  32. package/dist/{CronBuilder-RLDitFmP.d.mts → CronBuilder-BmFDO0Dm.d.mts} +4 -4
  33. package/dist/{Endpoint-DbPsw13b.mjs → Endpoint-B70_KKhu.mjs} +8 -2
  34. package/dist/Endpoint-B70_KKhu.mjs.map +1 -0
  35. package/dist/{Endpoint-CA-byrDr.cjs → Endpoint-BJo9Hhwm.cjs} +8 -2
  36. package/dist/Endpoint-BJo9Hhwm.cjs.map +1 -0
  37. package/dist/{Endpoint-PtQ-wLIS.d.mts → Endpoint-C5djXyae.d.mts} +69 -6
  38. package/dist/{Endpoint-D2Imgihs.d.cts → Endpoint-CC2RGjkl.d.cts} +67 -4
  39. package/dist/{EndpointBuilder-BPHpUekp.d.mts → EndpointBuilder-CD8LkBda.d.mts} +43 -5
  40. package/dist/{EndpointBuilder-CYkeYpsL.cjs → EndpointBuilder-DeswNQdG.cjs} +69 -4
  41. package/dist/EndpointBuilder-DeswNQdG.cjs.map +1 -0
  42. package/dist/{EndpointBuilder-W5fdXxYQ.mjs → EndpointBuilder-FyyoFTJ5.mjs} +69 -4
  43. package/dist/EndpointBuilder-FyyoFTJ5.mjs.map +1 -0
  44. package/dist/{EndpointBuilder-TApJQhtG.d.cts → EndpointBuilder-vXk6eIJk.d.cts} +41 -3
  45. package/dist/{EndpointFactory-CNlfBDuD.d.mts → EndpointFactory-3g-7Rznt.d.cts} +68 -21
  46. package/dist/{EndpointFactory-B5fOINuc.d.cts → EndpointFactory-DaFR9LQG.d.mts} +68 -21
  47. package/dist/{EndpointFactory-D5lFZXqY.cjs → EndpointFactory-DcT_g9M_.cjs} +117 -14
  48. package/dist/EndpointFactory-DcT_g9M_.cjs.map +1 -0
  49. package/dist/{EndpointFactory-B27nfeiE.mjs → EndpointFactory-KJAjBWmO.mjs} +117 -14
  50. package/dist/EndpointFactory-KJAjBWmO.mjs.map +1 -0
  51. package/dist/{Function-CD3rXWfa.d.mts → Function-Vh1t-Qjj.d.mts} +2 -2
  52. package/dist/{FunctionBuilder-j2VkwuGf.d.mts → FunctionBuilder-3jsoFffg.d.mts} +4 -4
  53. package/dist/{FunctionExecutionWrapper-B0WP-Vec.d.mts → FunctionExecutionWrapper-CI3CaoCo.d.mts} +2 -2
  54. package/dist/{HonoEndpointAdaptor-CLOpobdq.d.cts → HonoEndpointAdaptor-BJh4J-J9.d.cts} +4 -4
  55. package/dist/{HonoEndpointAdaptor-Bg_vTyA5.mjs → HonoEndpointAdaptor-CcvXzoYV.mjs} +43 -30
  56. package/dist/HonoEndpointAdaptor-CcvXzoYV.mjs.map +1 -0
  57. package/dist/{HonoEndpointAdaptor-B_gJPWGD.cjs → HonoEndpointAdaptor-DodwLM0-.cjs} +43 -30
  58. package/dist/HonoEndpointAdaptor-DodwLM0-.cjs.map +1 -0
  59. package/dist/{HonoEndpointAdaptor-C9gYYBWu.d.mts → HonoEndpointAdaptor-kb1ByjUL.d.mts} +5 -5
  60. package/dist/{Subscriber-D-FPWts6.cjs → Subscriber-DOt3svUC.cjs} +1 -1
  61. package/dist/{Subscriber-D-FPWts6.cjs.map → Subscriber-DOt3svUC.cjs.map} +1 -1
  62. package/dist/{Subscriber-itwm7ugy.d.mts → Subscriber-aNr1qkxR.d.mts} +2 -2
  63. package/dist/{Subscriber-CGb8LjZa.mjs → Subscriber-kCHbH2fZ.mjs} +1 -1
  64. package/dist/{Subscriber-CGb8LjZa.mjs.map → Subscriber-kCHbH2fZ.mjs.map} +1 -1
  65. package/dist/{SubscriberBuilder-9j3JCu8-.d.mts → SubscriberBuilder-CWS4tdbp.d.mts} +2 -2
  66. package/dist/{SubscriberBuilder-BfE2cL1q.cjs → SubscriberBuilder-Cj2u9k5Q.cjs} +2 -2
  67. package/dist/{SubscriberBuilder-BfE2cL1q.cjs.map → SubscriberBuilder-Cj2u9k5Q.cjs.map} +1 -1
  68. package/dist/{SubscriberBuilder-BcAspHv9.mjs → SubscriberBuilder-DmxMU89X.mjs} +2 -2
  69. package/dist/{SubscriberBuilder-BcAspHv9.mjs.map → SubscriberBuilder-DmxMU89X.mjs.map} +1 -1
  70. package/dist/{TestEndpointAdaptor-JONQJeXc.mjs → TestEndpointAdaptor-1pPixE6y.mjs} +4 -4
  71. package/dist/{TestEndpointAdaptor-JONQJeXc.mjs.map → TestEndpointAdaptor-1pPixE6y.mjs.map} +1 -1
  72. package/dist/{TestEndpointAdaptor-C-c8v7VI.d.mts → TestEndpointAdaptor-5-unBV8O.d.mts} +3 -3
  73. package/dist/{TestEndpointAdaptor-BYCwwiYk.d.cts → TestEndpointAdaptor-Bm0UjDtV.d.cts} +2 -2
  74. package/dist/{TestEndpointAdaptor-Bew9lWsx.cjs → TestEndpointAdaptor-wA-fmq4v.cjs} +4 -4
  75. package/dist/{TestEndpointAdaptor-Bew9lWsx.cjs.map → TestEndpointAdaptor-wA-fmq4v.cjs.map} +1 -1
  76. package/dist/adaptors/aws.cjs +5 -5
  77. package/dist/adaptors/aws.d.cts +5 -5
  78. package/dist/adaptors/aws.d.mts +15 -15
  79. package/dist/adaptors/aws.mjs +5 -5
  80. package/dist/adaptors/hono.cjs +4 -4
  81. package/dist/adaptors/hono.d.cts +3 -3
  82. package/dist/adaptors/hono.d.mts +9 -9
  83. package/dist/adaptors/hono.mjs +4 -4
  84. package/dist/adaptors/testing.cjs +3 -3
  85. package/dist/adaptors/testing.d.cts +3 -3
  86. package/dist/adaptors/testing.d.mts +9 -9
  87. package/dist/adaptors/testing.mjs +3 -3
  88. package/dist/crons/Cron.d.mts +6 -6
  89. package/dist/crons/CronBuilder.d.mts +7 -7
  90. package/dist/crons/index.d.cts +4 -4
  91. package/dist/crons/index.d.mts +7 -7
  92. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +3 -3
  93. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +3 -3
  94. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +9 -9
  95. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +3 -3
  96. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +4 -4
  97. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +4 -4
  98. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +10 -10
  99. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +4 -4
  100. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +4 -4
  101. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +4 -4
  102. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +10 -10
  103. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +4 -4
  104. package/dist/endpoints/Authorizer.cjs +5 -14
  105. package/dist/endpoints/Authorizer.d.cts +2 -2
  106. package/dist/endpoints/Authorizer.d.mts +2 -2
  107. package/dist/endpoints/Authorizer.mjs +2 -13
  108. package/dist/endpoints/Endpoint.cjs +1 -1
  109. package/dist/endpoints/Endpoint.d.cts +2 -2
  110. package/dist/endpoints/Endpoint.d.mts +8 -8
  111. package/dist/endpoints/Endpoint.mjs +1 -1
  112. package/dist/endpoints/EndpointBuilder.cjs +4 -2
  113. package/dist/endpoints/EndpointBuilder.d.cts +3 -3
  114. package/dist/endpoints/EndpointBuilder.d.mts +9 -9
  115. package/dist/endpoints/EndpointBuilder.mjs +4 -2
  116. package/dist/endpoints/EndpointFactory.cjs +5 -3
  117. package/dist/endpoints/EndpointFactory.d.cts +4 -4
  118. package/dist/endpoints/EndpointFactory.d.mts +10 -10
  119. package/dist/endpoints/EndpointFactory.mjs +5 -3
  120. package/dist/endpoints/HonoEndpointAdaptor.cjs +4 -4
  121. package/dist/endpoints/HonoEndpointAdaptor.d.cts +3 -3
  122. package/dist/endpoints/HonoEndpointAdaptor.d.mts +9 -9
  123. package/dist/endpoints/HonoEndpointAdaptor.mjs +4 -4
  124. package/dist/endpoints/TestEndpointAdaptor.cjs +3 -3
  125. package/dist/endpoints/TestEndpointAdaptor.d.cts +3 -3
  126. package/dist/endpoints/TestEndpointAdaptor.d.mts +9 -9
  127. package/dist/endpoints/TestEndpointAdaptor.mjs +3 -3
  128. package/dist/endpoints/audit.d.cts +2 -2
  129. package/dist/endpoints/audit.d.mts +8 -8
  130. package/dist/endpoints/helpers.cjs +2 -2
  131. package/dist/endpoints/helpers.d.cts +2 -2
  132. package/dist/endpoints/helpers.d.mts +8 -8
  133. package/dist/endpoints/helpers.mjs +2 -2
  134. package/dist/endpoints/index.cjs +6 -3
  135. package/dist/endpoints/index.cjs.map +1 -1
  136. package/dist/endpoints/index.d.cts +7 -7
  137. package/dist/endpoints/index.d.mts +13 -13
  138. package/dist/endpoints/index.mjs +6 -4
  139. package/dist/endpoints/index.mjs.map +1 -1
  140. package/dist/endpoints/processAudits.cjs +1 -1
  141. package/dist/endpoints/processAudits.d.cts +24 -5
  142. package/dist/endpoints/processAudits.d.mts +30 -11
  143. package/dist/endpoints/processAudits.mjs +1 -1
  144. package/dist/endpoints/rls.cjs +3 -0
  145. package/dist/endpoints/rls.d.cts +9 -0
  146. package/dist/endpoints/rls.d.mts +9 -0
  147. package/dist/endpoints/rls.mjs +3 -0
  148. package/dist/functions/AWSLambdaFunction.d.mts +4 -4
  149. package/dist/functions/BaseFunctionBuilder.d.mts +2 -2
  150. package/dist/functions/Function.d.mts +2 -2
  151. package/dist/functions/FunctionBuilder.d.mts +4 -4
  152. package/dist/functions/FunctionExecutionWrapper.d.mts +3 -3
  153. package/dist/functions/TestFunctionAdaptor.d.mts +2 -2
  154. package/dist/functions/index.d.mts +5 -5
  155. package/dist/{helpers-CrrdyA04.mjs → helpers-C3B2lVrM.mjs} +2 -2
  156. package/dist/{helpers-CrrdyA04.mjs.map → helpers-C3B2lVrM.mjs.map} +1 -1
  157. package/dist/{helpers-DiPZVJQC.cjs → helpers-DxxSpLfw.cjs} +2 -2
  158. package/dist/{helpers-DiPZVJQC.cjs.map → helpers-DxxSpLfw.cjs.map} +1 -1
  159. package/dist/index-CFyaRrck.d.mts +10 -0
  160. package/dist/index.d.mts +2 -2
  161. package/dist/{processAudits-BFokHhCO.cjs → processAudits-CzHkPokQ.cjs} +13 -7
  162. package/dist/processAudits-CzHkPokQ.cjs.map +1 -0
  163. package/dist/{processAudits-DfcB-X-4.mjs → processAudits-Dj8UGqcW.mjs} +13 -7
  164. package/dist/processAudits-Dj8UGqcW.mjs.map +1 -0
  165. package/dist/publisher.d.mts +1 -1
  166. package/dist/rls-Bf3FRwto.mjs +9 -0
  167. package/dist/rls-Bf3FRwto.mjs.map +1 -0
  168. package/dist/rls-CmJ7bRsz.cjs +15 -0
  169. package/dist/rls-CmJ7bRsz.cjs.map +1 -0
  170. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +3 -3
  171. package/dist/subscribers/Subscriber.cjs +1 -1
  172. package/dist/subscribers/Subscriber.d.mts +2 -2
  173. package/dist/subscribers/Subscriber.mjs +1 -1
  174. package/dist/subscribers/SubscriberBuilder.cjs +2 -2
  175. package/dist/subscribers/SubscriberBuilder.d.mts +3 -3
  176. package/dist/subscribers/SubscriberBuilder.mjs +2 -2
  177. package/dist/subscribers/index.cjs +2 -2
  178. package/dist/subscribers/index.d.cts +2 -2
  179. package/dist/subscribers/index.d.mts +5 -5
  180. package/dist/subscribers/index.mjs +2 -2
  181. package/dist/{types-DKf0juBf.d.mts → types-CScirkHt.d.mts} +1 -1
  182. package/dist/types.d.mts +1 -1
  183. package/package.json +4 -3
  184. package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +59 -26
  185. package/src/endpoints/Authorizer.ts +119 -1
  186. package/src/endpoints/Endpoint.ts +19 -0
  187. package/src/endpoints/EndpointBuilder.ts +80 -6
  188. package/src/endpoints/EndpointFactory.ts +263 -27
  189. package/src/endpoints/HonoEndpointAdaptor.ts +68 -37
  190. package/src/endpoints/TestEndpointAdaptor.ts +2 -0
  191. package/src/endpoints/index.ts +7 -0
  192. package/src/endpoints/processAudits.ts +39 -16
  193. package/src/endpoints/rls.ts +67 -0
  194. package/dist/AmazonApiGatewayEndpointAdaptor-CacGag6F.mjs.map +0 -1
  195. package/dist/AmazonApiGatewayEndpointAdaptor-DXssXsJi.cjs.map +0 -1
  196. package/dist/Authorizer-BTmly8ps.d.cts +0 -29
  197. package/dist/Authorizer-pmPvIVgv.d.mts +0 -29
  198. package/dist/Endpoint-CA-byrDr.cjs.map +0 -1
  199. package/dist/Endpoint-DbPsw13b.mjs.map +0 -1
  200. package/dist/EndpointBuilder-CYkeYpsL.cjs.map +0 -1
  201. package/dist/EndpointBuilder-W5fdXxYQ.mjs.map +0 -1
  202. package/dist/EndpointFactory-B27nfeiE.mjs.map +0 -1
  203. package/dist/EndpointFactory-D5lFZXqY.cjs.map +0 -1
  204. package/dist/HonoEndpointAdaptor-B_gJPWGD.cjs.map +0 -1
  205. package/dist/HonoEndpointAdaptor-Bg_vTyA5.mjs.map +0 -1
  206. package/dist/endpoints/Authorizer.cjs.map +0 -1
  207. package/dist/endpoints/Authorizer.mjs.map +0 -1
  208. package/dist/index-licEVXjh.d.mts +0 -10
  209. package/dist/processAudits-BFokHhCO.cjs.map +0 -1
  210. package/dist/processAudits-DfcB-X-4.mjs.map +0 -1
@@ -1,11 +1,11 @@
1
- import "../Construct-DDR0295I.mjs";
2
- import "../types-DKf0juBf.mjs";
3
- import "../Function-CD3rXWfa.mjs";
4
- import "../BaseFunctionBuilder-Ct6zY6Jq.mjs";
5
- import "../FunctionBuilder-j2VkwuGf.mjs";
6
- import "../index-licEVXjh.mjs";
7
- import "../Authorizer-pmPvIVgv.mjs";
8
- import { CookieFn, Endpoint, HeaderFn } from "../Endpoint-PtQ-wLIS.mjs";
1
+ import "../Construct-jBKqb-Zi.mjs";
2
+ import "../types-CScirkHt.mjs";
3
+ import "../Function-Vh1t-Qjj.mjs";
4
+ import "../BaseFunctionBuilder-CoV7J45W.mjs";
5
+ import "../FunctionBuilder-3jsoFffg.mjs";
6
+ import "../index-CFyaRrck.mjs";
7
+ import "../Authorizer-Cpx59w_q.mjs";
8
+ import { CookieFn, Endpoint, HeaderFn } from "../Endpoint-C5djXyae.mjs";
9
9
  import { Service, ServiceDiscovery } from "@geekmidas/services";
10
10
  import { AuditStorage, AuditableAction, Auditor } from "@geekmidas/audit";
11
11
  import { Logger } from "@geekmidas/logger";
@@ -58,17 +58,36 @@ declare function createAuditContext<TServices extends Service[] = [], TSession =
58
58
  cookie: CookieFn;
59
59
  services: Record<string, unknown>;
60
60
  }): Promise<AuditExecutionContext<TAuditAction> | undefined>;
61
+ /**
62
+ * Options for executeWithAuditTransaction.
63
+ */
64
+ interface ExecuteWithAuditTransactionOptions {
65
+ /**
66
+ * Database connection to use for the transaction.
67
+ * If this is already a transaction, it will be reused instead of creating a nested one.
68
+ * If not provided, the storage's internal database is used.
69
+ */
70
+ db?: unknown;
71
+ }
61
72
  /**
62
73
  * Execute a handler with automatic audit transaction support.
63
- * If the audit storage has a database (via getDatabase()), wraps execution
74
+ * If the audit storage provides a withTransaction method, wraps execution
64
75
  * in a transaction so audits are atomic with handler's database operations.
65
76
  *
77
+ * This is database-agnostic - each storage implementation provides its own
78
+ * transaction handling based on the underlying database (Kysely, Drizzle, etc.).
79
+ *
80
+ * If the db parameter is provided and is already a transaction, the storage
81
+ * will reuse it instead of creating a nested transaction (similar to
82
+ * packages/db/src/kysely.ts#withTransaction).
83
+ *
66
84
  * @param auditContext - The audit context from createAuditContext
67
85
  * @param handler - The handler function to execute (receives auditor)
68
86
  * @param onComplete - Called after handler with response, to process declarative audits
87
+ * @param options - Optional configuration including database connection
69
88
  * @returns The handler result
70
89
  */
71
- declare function executeWithAuditTransaction<T, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>>(auditContext: AuditExecutionContext<TAuditAction> | undefined, handler: (auditor?: Auditor<TAuditAction>) => Promise<T>, onComplete?: (response: T, auditor: Auditor<TAuditAction>) => Promise<void>): Promise<T>;
90
+ declare function executeWithAuditTransaction<T, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>>(auditContext: AuditExecutionContext<TAuditAction> | undefined, handler: (auditor?: Auditor<TAuditAction>) => Promise<T>, onComplete?: (response: T, auditor: Auditor<TAuditAction>) => Promise<void>, options?: ExecuteWithAuditTransactionOptions): Promise<T>;
72
91
  //#endregion
73
- export { AuditExecutionContext, createAuditContext, executeWithAuditTransaction, processEndpointAudits };
92
+ export { AuditExecutionContext, ExecuteWithAuditTransactionOptions, createAuditContext, executeWithAuditTransaction, processEndpointAudits };
74
93
  //# sourceMappingURL=processAudits.d.mts.map
@@ -1,3 +1,3 @@
1
- import { createAuditContext, executeWithAuditTransaction, processEndpointAudits } from "../processAudits-DfcB-X-4.mjs";
1
+ import { createAuditContext, executeWithAuditTransaction, processEndpointAudits } from "../processAudits-Dj8UGqcW.mjs";
2
2
 
3
3
  export { createAuditContext, executeWithAuditTransaction, processEndpointAudits };
@@ -0,0 +1,3 @@
1
+ const require_rls = require('../rls-CmJ7bRsz.cjs');
2
+
3
+ exports.RLS_BYPASS = require_rls.RLS_BYPASS;
@@ -0,0 +1,9 @@
1
+ import "../Construct-Dkd8Kvc9.cjs";
2
+ import "../types-Bp9ysFXd.cjs";
3
+ import "../Function-DHD1V9QW.cjs";
4
+ import "../BaseFunctionBuilder-DaQA0uKE.cjs";
5
+ import "../FunctionBuilder-FV6r3I7X.cjs";
6
+ import "../index-Ceo-GuhJ.cjs";
7
+ import "../Authorizer-CpSUMTIs.cjs";
8
+ import { RLS_BYPASS, RlsBypass, RlsConfig, RlsContext, RlsContextExtractor } from "../Endpoint-CC2RGjkl.cjs";
9
+ export { RLS_BYPASS, RlsBypass, RlsConfig, RlsContext, RlsContextExtractor };
@@ -0,0 +1,9 @@
1
+ import "../Construct-jBKqb-Zi.mjs";
2
+ import "../types-CScirkHt.mjs";
3
+ import "../Function-Vh1t-Qjj.mjs";
4
+ import "../BaseFunctionBuilder-CoV7J45W.mjs";
5
+ import "../FunctionBuilder-3jsoFffg.mjs";
6
+ import "../index-CFyaRrck.mjs";
7
+ import "../Authorizer-Cpx59w_q.mjs";
8
+ import { RLS_BYPASS, RlsBypass, RlsConfig, RlsContext, RlsContextExtractor } from "../Endpoint-C5djXyae.mjs";
9
+ export { RLS_BYPASS, RlsBypass, RlsConfig, RlsContext, RlsContextExtractor };
@@ -0,0 +1,3 @@
1
+ import { RLS_BYPASS } from "../rls-Bf3FRwto.mjs";
2
+
3
+ export { RLS_BYPASS };
@@ -1,5 +1,5 @@
1
- import "../Construct-DDR0295I.mjs";
2
- import "../Function-CD3rXWfa.mjs";
3
- import "../FunctionExecutionWrapper-B0WP-Vec.mjs";
4
- import { AWSLambdaFunction, AWSLambdaHandler } from "../AWSLambdaFunction-qWpalqfr.mjs";
1
+ import "../Construct-jBKqb-Zi.mjs";
2
+ import "../Function-Vh1t-Qjj.mjs";
3
+ import "../FunctionExecutionWrapper-CI3CaoCo.mjs";
4
+ import { AWSLambdaFunction, AWSLambdaHandler } from "../AWSLambdaFunction-D9RZhm0N.mjs";
5
5
  export { AWSLambdaFunction, AWSLambdaHandler };
@@ -1,3 +1,3 @@
1
- import "../Construct-DDR0295I.mjs";
2
- import { BaseFunctionBuilder } from "../BaseFunctionBuilder-Ct6zY6Jq.mjs";
1
+ import "../Construct-jBKqb-Zi.mjs";
2
+ import { BaseFunctionBuilder } from "../BaseFunctionBuilder-CoV7J45W.mjs";
3
3
  export { BaseFunctionBuilder };
@@ -1,3 +1,3 @@
1
- import "../Construct-DDR0295I.mjs";
2
- import { Function, FunctionContext, FunctionFactory, FunctionHandler } from "../Function-CD3rXWfa.mjs";
1
+ import "../Construct-jBKqb-Zi.mjs";
2
+ import { Function, FunctionContext, FunctionFactory, FunctionHandler } from "../Function-Vh1t-Qjj.mjs";
3
3
  export { Function, FunctionContext, FunctionFactory, FunctionHandler };
@@ -1,5 +1,5 @@
1
- import "../Construct-DDR0295I.mjs";
2
- import "../Function-CD3rXWfa.mjs";
3
- import "../BaseFunctionBuilder-Ct6zY6Jq.mjs";
4
- import { FunctionBuilder } from "../FunctionBuilder-j2VkwuGf.mjs";
1
+ import "../Construct-jBKqb-Zi.mjs";
2
+ import "../Function-Vh1t-Qjj.mjs";
3
+ import "../BaseFunctionBuilder-CoV7J45W.mjs";
4
+ import { FunctionBuilder } from "../FunctionBuilder-3jsoFffg.mjs";
5
5
  export { FunctionBuilder };
@@ -1,4 +1,4 @@
1
- import "../Construct-DDR0295I.mjs";
2
- import "../Function-CD3rXWfa.mjs";
3
- import { FunctionExecutionWrapper } from "../FunctionExecutionWrapper-B0WP-Vec.mjs";
1
+ import "../Construct-jBKqb-Zi.mjs";
2
+ import "../Function-Vh1t-Qjj.mjs";
3
+ import { FunctionExecutionWrapper } from "../FunctionExecutionWrapper-CI3CaoCo.mjs";
4
4
  export { FunctionExecutionWrapper };
@@ -1,5 +1,5 @@
1
- import "../Construct-DDR0295I.mjs";
2
- import { Function } from "../Function-CD3rXWfa.mjs";
1
+ import "../Construct-jBKqb-Zi.mjs";
2
+ import { Function } from "../Function-Vh1t-Qjj.mjs";
3
3
  import { Service, ServiceDiscovery, ServiceRecord } from "@geekmidas/services";
4
4
  import { AuditStorage, AuditableAction, Auditor } from "@geekmidas/audit";
5
5
  import { EventPublisher } from "@geekmidas/events";
@@ -1,6 +1,6 @@
1
- import "../Construct-DDR0295I.mjs";
2
- import { Function, FunctionContext, FunctionHandler } from "../Function-CD3rXWfa.mjs";
3
- import { BaseFunctionBuilder } from "../BaseFunctionBuilder-Ct6zY6Jq.mjs";
4
- import { FunctionBuilder } from "../FunctionBuilder-j2VkwuGf.mjs";
5
- import { f } from "../index-licEVXjh.mjs";
1
+ import "../Construct-jBKqb-Zi.mjs";
2
+ import { Function, FunctionContext, FunctionHandler } from "../Function-Vh1t-Qjj.mjs";
3
+ import { BaseFunctionBuilder } from "../BaseFunctionBuilder-CoV7J45W.mjs";
4
+ import { FunctionBuilder } from "../FunctionBuilder-3jsoFffg.mjs";
5
+ import { f } from "../index-CFyaRrck.mjs";
6
6
  export { BaseFunctionBuilder, Function, FunctionBuilder, FunctionContext, FunctionHandler, f };
@@ -1,4 +1,4 @@
1
- import { Endpoint } from "./Endpoint-DbPsw13b.mjs";
1
+ import { Endpoint } from "./Endpoint-B70_KKhu.mjs";
2
2
  import path from "node:path";
3
3
  import fg from "fast-glob";
4
4
 
@@ -80,4 +80,4 @@ async function getEndpointsFromRoutes(routes, cwd) {
80
80
 
81
81
  //#endregion
82
82
  export { getEndpointsFromRoutes, getProjectRoot };
83
- //# sourceMappingURL=helpers-CrrdyA04.mjs.map
83
+ //# sourceMappingURL=helpers-C3B2lVrM.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers-CrrdyA04.mjs","names":["cwd: string","routes: string[]","endpoints: Endpoint<string, HttpMethod, any, any, TServices>[]"],"sources":["../src/endpoints/helpers.ts"],"sourcesContent":["import path from 'node:path';\nimport fg from 'fast-glob';\nimport { Endpoint } from './Endpoint';\n\nimport type { Service } from '@geekmidas/services';\nimport type { HttpMethod } from '../types';\n\n// Re-export utility functions\n\n/**\n * Recursively finds the project root directory by looking for lock files.\n * Traverses up the directory tree until it finds a package manager lock file.\n *\n * @param cwd - The current working directory to start searching from\n * @returns Promise resolving to the absolute path of the project root\n *\n * @example\n * ```typescript\n * const projectRoot = await getProjectRoot(process.cwd());\n * console.log(`Project root: ${projectRoot}`);\n * // Output: Project root: /Users/user/my-project\n * ```\n */\nexport async function getProjectRoot(cwd: string): Promise<string> {\n if (cwd === '/') {\n return cwd;\n }\n\n const stream = fg.stream(\n ['yarn.lock', 'pnpm-lock.yaml', 'package-lock.json', 'deno.lock'],\n { dot: true, cwd },\n );\n\n let isRoot = false;\n\n for await (const _ of stream) {\n isRoot = true;\n break;\n }\n\n if (isRoot) {\n return cwd;\n }\n\n return getProjectRoot(path.resolve(cwd, '..'));\n}\n\n/**\n * Discovers and imports all Endpoint instances from the specified route patterns.\n * Uses fast-glob to find files matching the patterns and extracts exported Endpoints.\n *\n * @template TServices - Array of service types used by the endpoints\n * @param routes - Array of glob patterns to match route files (e.g., ['src/routes/*.ts'])\n * @param cwd - The current working directory to resolve paths from\n * @returns Promise resolving to an array of Endpoint instances found in the matched files\n *\n * @example\n * ```typescript\n * // Find all endpoints in the routes directory\n * const endpoints = await getEndpointsFromRoutes(\n * ['src/routes/**\\/*.ts'],\n * process.cwd()\n * );\n *\n * // Register endpoints with your server\n * for (const endpoint of endpoints) {\n * server.register(endpoint);\n * }\n * ```\n *\n * @remarks\n * - Only exports that are valid Endpoint instances are included\n * - Files are imported dynamically, so they must be valid ES modules\n * - The function filters out non-Endpoint exports automatically\n */\nexport async function getEndpointsFromRoutes<TServices extends Service[]>(\n routes: string[],\n cwd: string,\n): Promise<Endpoint<string, HttpMethod, any, any, TServices>[]> {\n const stream = fg.stream(routes, { cwd });\n\n const endpoints: Endpoint<string, HttpMethod, any, any, TServices>[] = [];\n\n for await (const f of stream) {\n // Resolve the absolute path for the route file\n const routePath = path.resolve(cwd, f.toString());\n // Dynamically import the route module\n const route = await import(routePath);\n\n // Filter exported values to find only Endpoint instances\n const handlers = Object.values(route).filter((value) => {\n return Endpoint.isEndpoint(value);\n }) as unknown as Endpoint<string, HttpMethod, any, any, TServices>[];\n\n endpoints.push(...handlers);\n }\n\n return endpoints;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAuBA,eAAsB,eAAeA,KAA8B;AACjE,KAAI,QAAQ,IACV,QAAO;CAGT,MAAM,SAAS,GAAG,OAChB;EAAC;EAAa;EAAkB;EAAqB;CAAY,GACjE;EAAE,KAAK;EAAM;CAAK,EACnB;CAED,IAAI,SAAS;AAEb,YAAW,MAAM,KAAK,QAAQ;AAC5B,WAAS;AACT;CACD;AAED,KAAI,OACF,QAAO;AAGT,QAAO,eAAe,KAAK,QAAQ,KAAK,KAAK,CAAC;AAC/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BD,eAAsB,uBACpBC,QACAD,KAC8D;CAC9D,MAAM,SAAS,GAAG,OAAO,QAAQ,EAAE,IAAK,EAAC;CAEzC,MAAME,YAAiE,CAAE;AAEzE,YAAW,MAAM,KAAK,QAAQ;EAE5B,MAAM,YAAY,KAAK,QAAQ,KAAK,EAAE,UAAU,CAAC;EAEjD,MAAM,QAAQ,MAAM,OAAO;EAG3B,MAAM,WAAW,OAAO,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU;AACtD,UAAO,SAAS,WAAW,MAAM;EAClC,EAAC;AAEF,YAAU,KAAK,GAAG,SAAS;CAC5B;AAED,QAAO;AACR"}
1
+ {"version":3,"file":"helpers-C3B2lVrM.mjs","names":["cwd: string","routes: string[]","endpoints: Endpoint<string, HttpMethod, any, any, TServices>[]"],"sources":["../src/endpoints/helpers.ts"],"sourcesContent":["import path from 'node:path';\nimport fg from 'fast-glob';\nimport { Endpoint } from './Endpoint';\n\nimport type { Service } from '@geekmidas/services';\nimport type { HttpMethod } from '../types';\n\n// Re-export utility functions\n\n/**\n * Recursively finds the project root directory by looking for lock files.\n * Traverses up the directory tree until it finds a package manager lock file.\n *\n * @param cwd - The current working directory to start searching from\n * @returns Promise resolving to the absolute path of the project root\n *\n * @example\n * ```typescript\n * const projectRoot = await getProjectRoot(process.cwd());\n * console.log(`Project root: ${projectRoot}`);\n * // Output: Project root: /Users/user/my-project\n * ```\n */\nexport async function getProjectRoot(cwd: string): Promise<string> {\n if (cwd === '/') {\n return cwd;\n }\n\n const stream = fg.stream(\n ['yarn.lock', 'pnpm-lock.yaml', 'package-lock.json', 'deno.lock'],\n { dot: true, cwd },\n );\n\n let isRoot = false;\n\n for await (const _ of stream) {\n isRoot = true;\n break;\n }\n\n if (isRoot) {\n return cwd;\n }\n\n return getProjectRoot(path.resolve(cwd, '..'));\n}\n\n/**\n * Discovers and imports all Endpoint instances from the specified route patterns.\n * Uses fast-glob to find files matching the patterns and extracts exported Endpoints.\n *\n * @template TServices - Array of service types used by the endpoints\n * @param routes - Array of glob patterns to match route files (e.g., ['src/routes/*.ts'])\n * @param cwd - The current working directory to resolve paths from\n * @returns Promise resolving to an array of Endpoint instances found in the matched files\n *\n * @example\n * ```typescript\n * // Find all endpoints in the routes directory\n * const endpoints = await getEndpointsFromRoutes(\n * ['src/routes/**\\/*.ts'],\n * process.cwd()\n * );\n *\n * // Register endpoints with your server\n * for (const endpoint of endpoints) {\n * server.register(endpoint);\n * }\n * ```\n *\n * @remarks\n * - Only exports that are valid Endpoint instances are included\n * - Files are imported dynamically, so they must be valid ES modules\n * - The function filters out non-Endpoint exports automatically\n */\nexport async function getEndpointsFromRoutes<TServices extends Service[]>(\n routes: string[],\n cwd: string,\n): Promise<Endpoint<string, HttpMethod, any, any, TServices>[]> {\n const stream = fg.stream(routes, { cwd });\n\n const endpoints: Endpoint<string, HttpMethod, any, any, TServices>[] = [];\n\n for await (const f of stream) {\n // Resolve the absolute path for the route file\n const routePath = path.resolve(cwd, f.toString());\n // Dynamically import the route module\n const route = await import(routePath);\n\n // Filter exported values to find only Endpoint instances\n const handlers = Object.values(route).filter((value) => {\n return Endpoint.isEndpoint(value);\n }) as unknown as Endpoint<string, HttpMethod, any, any, TServices>[];\n\n endpoints.push(...handlers);\n }\n\n return endpoints;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAuBA,eAAsB,eAAeA,KAA8B;AACjE,KAAI,QAAQ,IACV,QAAO;CAGT,MAAM,SAAS,GAAG,OAChB;EAAC;EAAa;EAAkB;EAAqB;CAAY,GACjE;EAAE,KAAK;EAAM;CAAK,EACnB;CAED,IAAI,SAAS;AAEb,YAAW,MAAM,KAAK,QAAQ;AAC5B,WAAS;AACT;CACD;AAED,KAAI,OACF,QAAO;AAGT,QAAO,eAAe,KAAK,QAAQ,KAAK,KAAK,CAAC;AAC/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BD,eAAsB,uBACpBC,QACAD,KAC8D;CAC9D,MAAM,SAAS,GAAG,OAAO,QAAQ,EAAE,IAAK,EAAC;CAEzC,MAAME,YAAiE,CAAE;AAEzE,YAAW,MAAM,KAAK,QAAQ;EAE5B,MAAM,YAAY,KAAK,QAAQ,KAAK,EAAE,UAAU,CAAC;EAEjD,MAAM,QAAQ,MAAM,OAAO;EAG3B,MAAM,WAAW,OAAO,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU;AACtD,UAAO,SAAS,WAAW,MAAM;EAClC,EAAC;AAEF,YAAU,KAAK,GAAG,SAAS;CAC5B;AAED,QAAO;AACR"}
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require('./chunk-CUT6urMc.cjs');
2
- const require_Endpoint = require('./Endpoint-CA-byrDr.cjs');
2
+ const require_Endpoint = require('./Endpoint-BJo9Hhwm.cjs');
3
3
  const node_path = require_chunk.__toESM(require("node:path"));
4
4
  const fast_glob = require_chunk.__toESM(require("fast-glob"));
5
5
 
@@ -92,4 +92,4 @@ Object.defineProperty(exports, 'getProjectRoot', {
92
92
  return getProjectRoot;
93
93
  }
94
94
  });
95
- //# sourceMappingURL=helpers-DiPZVJQC.cjs.map
95
+ //# sourceMappingURL=helpers-DxxSpLfw.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers-DiPZVJQC.cjs","names":["cwd: string","routes: string[]","endpoints: Endpoint<string, HttpMethod, any, any, TServices>[]"],"sources":["../src/endpoints/helpers.ts"],"sourcesContent":["import path from 'node:path';\nimport fg from 'fast-glob';\nimport { Endpoint } from './Endpoint';\n\nimport type { Service } from '@geekmidas/services';\nimport type { HttpMethod } from '../types';\n\n// Re-export utility functions\n\n/**\n * Recursively finds the project root directory by looking for lock files.\n * Traverses up the directory tree until it finds a package manager lock file.\n *\n * @param cwd - The current working directory to start searching from\n * @returns Promise resolving to the absolute path of the project root\n *\n * @example\n * ```typescript\n * const projectRoot = await getProjectRoot(process.cwd());\n * console.log(`Project root: ${projectRoot}`);\n * // Output: Project root: /Users/user/my-project\n * ```\n */\nexport async function getProjectRoot(cwd: string): Promise<string> {\n if (cwd === '/') {\n return cwd;\n }\n\n const stream = fg.stream(\n ['yarn.lock', 'pnpm-lock.yaml', 'package-lock.json', 'deno.lock'],\n { dot: true, cwd },\n );\n\n let isRoot = false;\n\n for await (const _ of stream) {\n isRoot = true;\n break;\n }\n\n if (isRoot) {\n return cwd;\n }\n\n return getProjectRoot(path.resolve(cwd, '..'));\n}\n\n/**\n * Discovers and imports all Endpoint instances from the specified route patterns.\n * Uses fast-glob to find files matching the patterns and extracts exported Endpoints.\n *\n * @template TServices - Array of service types used by the endpoints\n * @param routes - Array of glob patterns to match route files (e.g., ['src/routes/*.ts'])\n * @param cwd - The current working directory to resolve paths from\n * @returns Promise resolving to an array of Endpoint instances found in the matched files\n *\n * @example\n * ```typescript\n * // Find all endpoints in the routes directory\n * const endpoints = await getEndpointsFromRoutes(\n * ['src/routes/**\\/*.ts'],\n * process.cwd()\n * );\n *\n * // Register endpoints with your server\n * for (const endpoint of endpoints) {\n * server.register(endpoint);\n * }\n * ```\n *\n * @remarks\n * - Only exports that are valid Endpoint instances are included\n * - Files are imported dynamically, so they must be valid ES modules\n * - The function filters out non-Endpoint exports automatically\n */\nexport async function getEndpointsFromRoutes<TServices extends Service[]>(\n routes: string[],\n cwd: string,\n): Promise<Endpoint<string, HttpMethod, any, any, TServices>[]> {\n const stream = fg.stream(routes, { cwd });\n\n const endpoints: Endpoint<string, HttpMethod, any, any, TServices>[] = [];\n\n for await (const f of stream) {\n // Resolve the absolute path for the route file\n const routePath = path.resolve(cwd, f.toString());\n // Dynamically import the route module\n const route = await import(routePath);\n\n // Filter exported values to find only Endpoint instances\n const handlers = Object.values(route).filter((value) => {\n return Endpoint.isEndpoint(value);\n }) as unknown as Endpoint<string, HttpMethod, any, any, TServices>[];\n\n endpoints.push(...handlers);\n }\n\n return endpoints;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuBA,eAAsB,eAAeA,KAA8B;AACjE,KAAI,QAAQ,IACV,QAAO;CAGT,MAAM,SAAS,kBAAG,OAChB;EAAC;EAAa;EAAkB;EAAqB;CAAY,GACjE;EAAE,KAAK;EAAM;CAAK,EACnB;CAED,IAAI,SAAS;AAEb,YAAW,MAAM,KAAK,QAAQ;AAC5B,WAAS;AACT;CACD;AAED,KAAI,OACF,QAAO;AAGT,QAAO,eAAe,kBAAK,QAAQ,KAAK,KAAK,CAAC;AAC/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BD,eAAsB,uBACpBC,QACAD,KAC8D;CAC9D,MAAM,SAAS,kBAAG,OAAO,QAAQ,EAAE,IAAK,EAAC;CAEzC,MAAME,YAAiE,CAAE;AAEzE,YAAW,MAAM,KAAK,QAAQ;EAE5B,MAAM,YAAY,kBAAK,QAAQ,KAAK,EAAE,UAAU,CAAC;EAEjD,MAAM,QAAQ,MAAM,OAAO;EAG3B,MAAM,WAAW,OAAO,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU;AACtD,UAAO,0BAAS,WAAW,MAAM;EAClC,EAAC;AAEF,YAAU,KAAK,GAAG,SAAS;CAC5B;AAED,QAAO;AACR"}
1
+ {"version":3,"file":"helpers-DxxSpLfw.cjs","names":["cwd: string","routes: string[]","endpoints: Endpoint<string, HttpMethod, any, any, TServices>[]"],"sources":["../src/endpoints/helpers.ts"],"sourcesContent":["import path from 'node:path';\nimport fg from 'fast-glob';\nimport { Endpoint } from './Endpoint';\n\nimport type { Service } from '@geekmidas/services';\nimport type { HttpMethod } from '../types';\n\n// Re-export utility functions\n\n/**\n * Recursively finds the project root directory by looking for lock files.\n * Traverses up the directory tree until it finds a package manager lock file.\n *\n * @param cwd - The current working directory to start searching from\n * @returns Promise resolving to the absolute path of the project root\n *\n * @example\n * ```typescript\n * const projectRoot = await getProjectRoot(process.cwd());\n * console.log(`Project root: ${projectRoot}`);\n * // Output: Project root: /Users/user/my-project\n * ```\n */\nexport async function getProjectRoot(cwd: string): Promise<string> {\n if (cwd === '/') {\n return cwd;\n }\n\n const stream = fg.stream(\n ['yarn.lock', 'pnpm-lock.yaml', 'package-lock.json', 'deno.lock'],\n { dot: true, cwd },\n );\n\n let isRoot = false;\n\n for await (const _ of stream) {\n isRoot = true;\n break;\n }\n\n if (isRoot) {\n return cwd;\n }\n\n return getProjectRoot(path.resolve(cwd, '..'));\n}\n\n/**\n * Discovers and imports all Endpoint instances from the specified route patterns.\n * Uses fast-glob to find files matching the patterns and extracts exported Endpoints.\n *\n * @template TServices - Array of service types used by the endpoints\n * @param routes - Array of glob patterns to match route files (e.g., ['src/routes/*.ts'])\n * @param cwd - The current working directory to resolve paths from\n * @returns Promise resolving to an array of Endpoint instances found in the matched files\n *\n * @example\n * ```typescript\n * // Find all endpoints in the routes directory\n * const endpoints = await getEndpointsFromRoutes(\n * ['src/routes/**\\/*.ts'],\n * process.cwd()\n * );\n *\n * // Register endpoints with your server\n * for (const endpoint of endpoints) {\n * server.register(endpoint);\n * }\n * ```\n *\n * @remarks\n * - Only exports that are valid Endpoint instances are included\n * - Files are imported dynamically, so they must be valid ES modules\n * - The function filters out non-Endpoint exports automatically\n */\nexport async function getEndpointsFromRoutes<TServices extends Service[]>(\n routes: string[],\n cwd: string,\n): Promise<Endpoint<string, HttpMethod, any, any, TServices>[]> {\n const stream = fg.stream(routes, { cwd });\n\n const endpoints: Endpoint<string, HttpMethod, any, any, TServices>[] = [];\n\n for await (const f of stream) {\n // Resolve the absolute path for the route file\n const routePath = path.resolve(cwd, f.toString());\n // Dynamically import the route module\n const route = await import(routePath);\n\n // Filter exported values to find only Endpoint instances\n const handlers = Object.values(route).filter((value) => {\n return Endpoint.isEndpoint(value);\n }) as unknown as Endpoint<string, HttpMethod, any, any, TServices>[];\n\n endpoints.push(...handlers);\n }\n\n return endpoints;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuBA,eAAsB,eAAeA,KAA8B;AACjE,KAAI,QAAQ,IACV,QAAO;CAGT,MAAM,SAAS,kBAAG,OAChB;EAAC;EAAa;EAAkB;EAAqB;CAAY,GACjE;EAAE,KAAK;EAAM;CAAK,EACnB;CAED,IAAI,SAAS;AAEb,YAAW,MAAM,KAAK,QAAQ;AAC5B,WAAS;AACT;CACD;AAED,KAAI,OACF,QAAO;AAGT,QAAO,eAAe,kBAAK,QAAQ,KAAK,KAAK,CAAC;AAC/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BD,eAAsB,uBACpBC,QACAD,KAC8D;CAC9D,MAAM,SAAS,kBAAG,OAAO,QAAQ,EAAE,IAAK,EAAC;CAEzC,MAAME,YAAiE,CAAE;AAEzE,YAAW,MAAM,KAAK,QAAQ;EAE5B,MAAM,YAAY,kBAAK,QAAQ,KAAK,EAAE,UAAU,CAAC;EAEjD,MAAM,QAAQ,MAAM,OAAO;EAG3B,MAAM,WAAW,OAAO,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU;AACtD,UAAO,0BAAS,WAAW,MAAM;EAClC,EAAC;AAEF,YAAU,KAAK,GAAG,SAAS;CAC5B;AAED,QAAO;AACR"}
@@ -0,0 +1,10 @@
1
+ import { FunctionBuilder } from "./FunctionBuilder-3jsoFffg.mjs";
2
+ import * as _geekmidas_audit9 from "@geekmidas/audit";
3
+ import * as _geekmidas_logger8 from "@geekmidas/logger";
4
+ import * as _geekmidas_schema7 from "@geekmidas/schema";
5
+
6
+ //#region src/functions/index.d.ts
7
+ declare const f: FunctionBuilder<_geekmidas_schema7.ComposableStandardSchema, undefined, [], _geekmidas_logger8.Logger, undefined, string, undefined, string, undefined, string, _geekmidas_audit9.AuditableAction<string, unknown>>;
8
+ //#endregion
9
+ export { f };
10
+ //# sourceMappingURL=index-CFyaRrck.d.mts.map
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { Construct, ConstructType } from "./Construct-DDR0295I.mjs";
2
- import { HttpMethod, LowerHttpMethod, RemoveUndefined } from "./types-DKf0juBf.mjs";
1
+ import { Construct, ConstructType } from "./Construct-jBKqb-Zi.mjs";
2
+ import { HttpMethod, LowerHttpMethod, RemoveUndefined } from "./types-CScirkHt.mjs";
3
3
  import { Service, ServiceRecord } from "@geekmidas/services";
4
4
  export { Construct, ConstructType, HttpMethod, LowerHttpMethod, RemoveUndefined, Service, ServiceRecord };
@@ -1,6 +1,5 @@
1
1
  const require_chunk = require('./chunk-CUT6urMc.cjs');
2
2
  const __geekmidas_audit = require_chunk.__toESM(require("@geekmidas/audit"));
3
- const __geekmidas_audit_kysely = require_chunk.__toESM(require("@geekmidas/audit/kysely"));
4
3
 
5
4
  //#region src/endpoints/processAudits.ts
6
5
  /**
@@ -129,23 +128,30 @@ async function createAuditContext(endpoint, serviceDiscovery, logger, ctx) {
129
128
  }
130
129
  /**
131
130
  * Execute a handler with automatic audit transaction support.
132
- * If the audit storage has a database (via getDatabase()), wraps execution
131
+ * If the audit storage provides a withTransaction method, wraps execution
133
132
  * in a transaction so audits are atomic with handler's database operations.
134
133
  *
134
+ * This is database-agnostic - each storage implementation provides its own
135
+ * transaction handling based on the underlying database (Kysely, Drizzle, etc.).
136
+ *
137
+ * If the db parameter is provided and is already a transaction, the storage
138
+ * will reuse it instead of creating a nested transaction (similar to
139
+ * packages/db/src/kysely.ts#withTransaction).
140
+ *
135
141
  * @param auditContext - The audit context from createAuditContext
136
142
  * @param handler - The handler function to execute (receives auditor)
137
143
  * @param onComplete - Called after handler with response, to process declarative audits
144
+ * @param options - Optional configuration including database connection
138
145
  * @returns The handler result
139
146
  */
140
- async function executeWithAuditTransaction(auditContext, handler, onComplete) {
147
+ async function executeWithAuditTransaction(auditContext, handler, onComplete, options) {
141
148
  if (!auditContext) return handler(void 0);
142
149
  const { auditor, storage } = auditContext;
143
- const db = storage.getDatabase?.();
144
- if (db) return (0, __geekmidas_audit_kysely.withAuditableTransaction)(db, auditor, async () => {
150
+ if (storage.withTransaction) return storage.withTransaction(auditor, async () => {
145
151
  const response$1 = await handler(auditor);
146
152
  if (onComplete) await onComplete(response$1, auditor);
147
153
  return response$1;
148
- });
154
+ }, options?.db);
149
155
  const response = await handler(auditor);
150
156
  if (onComplete) await onComplete(response, auditor);
151
157
  await auditor.flush();
@@ -171,4 +177,4 @@ Object.defineProperty(exports, 'processEndpointAudits', {
171
177
  return processEndpointAudits;
172
178
  }
173
179
  });
174
- //# sourceMappingURL=processAudits-BFokHhCO.cjs.map
180
+ //# sourceMappingURL=processAudits-CzHkPokQ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processAudits-CzHkPokQ.cjs","names":["endpoint: Endpoint<\n any,\n any,\n any,\n OutSchema,\n TServices,\n TLogger,\n TSession,\n any,\n any,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction\n >","response: InferStandardSchema<OutSchema>","serviceDiscovery: ServiceDiscovery<any, any>","logger: TLogger","ctx: {\n session: TSession;\n header: HeaderFn;\n cookie: CookieFn;\n services: Record<string, unknown>;\n }","existingAuditor?: Auditor<TAuditAction>","auditor: Auditor<TAuditAction>","actor: AuditActor","DefaultAuditor","endpoint: Endpoint<\n any,\n any,\n any,\n any,\n TServices,\n TLogger,\n TSession,\n any,\n any,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >","auditContext: AuditExecutionContext<TAuditAction> | undefined","handler: (auditor?: Auditor<TAuditAction>) => Promise<T>","onComplete?: (response: T, auditor: Auditor<TAuditAction>) => Promise<void>","options?: ExecuteWithAuditTransactionOptions","response"],"sources":["../src/endpoints/processAudits.ts"],"sourcesContent":["import type {\n AuditActor,\n AuditStorage,\n AuditableAction,\n Auditor,\n} from '@geekmidas/audit';\nimport { DefaultAuditor } from '@geekmidas/audit';\nimport type { Logger } from '@geekmidas/logger';\nimport type { InferStandardSchema } from '@geekmidas/schema';\nimport type { Service, ServiceDiscovery } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { CookieFn, Endpoint, HeaderFn } from './Endpoint';\nimport type { ActorExtractor, MappedAudit } from './audit';\n\n/**\n * Process declarative audit definitions after successful endpoint execution.\n * Similar to publishConstructEvents for events.\n *\n * @param endpoint - The endpoint with audit configuration\n * @param response - The handler response to generate audit payloads from\n * @param serviceDiscovery - Service discovery for registering audit storage\n * @param logger - Logger for debug/error messages\n * @param ctx - Request context (session, headers, cookies, services)\n * @param existingAuditor - Optional existing auditor instance (e.g., from handler context).\n * If provided, uses this auditor (with its stored transaction).\n * If not provided, creates a new auditor.\n */\nexport async function processEndpointAudits<\n TServices extends Service[] = [],\n TSession = unknown,\n TLogger extends Logger = Logger,\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n>(\n endpoint: Endpoint<\n any,\n any,\n any,\n OutSchema,\n TServices,\n TLogger,\n TSession,\n any,\n any,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction\n >,\n response: InferStandardSchema<OutSchema>,\n serviceDiscovery: ServiceDiscovery<any, any>,\n logger: TLogger,\n ctx: {\n session: TSession;\n header: HeaderFn;\n cookie: CookieFn;\n services: Record<string, unknown>;\n },\n existingAuditor?: Auditor<TAuditAction>,\n): Promise<void> {\n try {\n const audits = endpoint.audits as MappedAudit<TAuditAction, OutSchema>[];\n\n // If we have an existing auditor (from handler context), we need to flush\n // any manual audits it collected, even if there are no declarative audits\n const hasExistingRecords =\n existingAuditor && existingAuditor.getRecords().length > 0;\n\n // Skip if no declarative audits and no existing records to flush\n if (!audits?.length && !hasExistingRecords) {\n logger.debug('No audits to process');\n return;\n }\n\n // If no auditor storage service and we have things to process, warn\n if (!endpoint.auditorStorageService) {\n if (hasExistingRecords || audits?.length) {\n logger.warn('No auditor storage service available');\n }\n return;\n }\n\n // Get or create auditor\n let auditor: Auditor<TAuditAction>;\n\n if (existingAuditor) {\n // Use existing auditor (preserves stored transaction and manual audits)\n auditor = existingAuditor;\n logger.debug('Using existing auditor from handler context');\n } else {\n // Create new auditor (backward compatibility)\n const services = await serviceDiscovery.register([\n endpoint.auditorStorageService,\n ]);\n const storage = services[\n endpoint.auditorStorageService.serviceName\n ] as AuditStorage;\n\n // Extract actor if configured\n let actor: AuditActor = { id: 'system', type: 'system' };\n if (endpoint.actorExtractor) {\n try {\n actor = await (\n endpoint.actorExtractor as ActorExtractor<\n TServices,\n TSession,\n TLogger\n >\n )({\n services: ctx.services as any,\n session: ctx.session,\n header: ctx.header,\n cookie: ctx.cookie,\n logger,\n });\n } catch (error) {\n logger.error(error as Error, 'Failed to extract actor for audits');\n // Continue with system actor\n }\n }\n\n auditor = new DefaultAuditor<TAuditAction>({\n actor,\n storage,\n metadata: {\n endpoint: endpoint.route,\n method: endpoint.method,\n },\n });\n }\n\n // Process each declarative audit\n if (audits?.length) {\n for (const audit of audits) {\n logger.debug({ audit: audit.type }, 'Processing declarative audit');\n\n // Check when condition\n if (audit.when && !audit.when(response as any)) {\n logger.debug(\n { audit: audit.type },\n 'Audit skipped due to when condition',\n );\n continue;\n }\n\n // Extract payload\n const payload = audit.payload(response as any);\n\n // Extract entityId if configured\n const entityId = audit.entityId?.(response as any);\n\n // Record the audit\n auditor.audit(audit.type as any, payload as any, {\n table: audit.table,\n entityId,\n });\n }\n }\n\n // Flush audits to storage\n // Note: If existingAuditor has a stored transaction (via setTransaction),\n // flush() will use it automatically\n const recordCount = auditor.getRecords().length;\n if (recordCount > 0) {\n // Check if auditor has a stored transaction (for logging purposes)\n const trx =\n 'getTransaction' in auditor\n ? (auditor as { getTransaction(): unknown }).getTransaction()\n : undefined;\n logger.debug(\n { auditCount: recordCount, hasTransaction: !!trx },\n 'Flushing audits',\n );\n await auditor.flush();\n }\n } catch (error) {\n logger.error(error as Error, 'Failed to process audits');\n // Don't rethrow - audit failures shouldn't fail the request\n }\n}\n\n/**\n * Context for audit-aware handler execution.\n */\nexport interface AuditExecutionContext<\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> {\n /** The auditor instance for recording audits */\n auditor: Auditor<TAuditAction>;\n /** The audit storage instance */\n storage: AuditStorage;\n}\n\n/**\n * Create audit context for handler execution.\n * Returns the auditor and storage for use in the handler.\n *\n * @param endpoint - The endpoint with audit configuration\n * @param serviceDiscovery - Service discovery for getting audit storage\n * @param logger - Logger for debug/error messages\n * @param ctx - Request context for actor extraction\n * @returns Audit context with auditor and storage, or undefined if not configured\n */\nexport async function createAuditContext<\n TServices extends Service[] = [],\n TSession = unknown,\n TLogger extends Logger = Logger,\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 any,\n any,\n any,\n any,\n TServices,\n TLogger,\n TSession,\n any,\n any,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >,\n serviceDiscovery: ServiceDiscovery<any, any>,\n logger: TLogger,\n ctx: {\n session: TSession;\n header: HeaderFn;\n cookie: CookieFn;\n services: Record<string, unknown>;\n },\n): Promise<AuditExecutionContext<TAuditAction> | undefined> {\n if (!endpoint.auditorStorageService) {\n return undefined;\n }\n\n const services = await serviceDiscovery.register([\n endpoint.auditorStorageService,\n ]);\n const storage = services[\n endpoint.auditorStorageService.serviceName\n ] as AuditStorage;\n\n // Extract actor if configured\n let actor: AuditActor = { id: 'system', type: 'system' };\n if (endpoint.actorExtractor) {\n try {\n actor = await (\n endpoint.actorExtractor as ActorExtractor<TServices, TSession, TLogger>\n )({\n services: ctx.services as any,\n session: ctx.session,\n header: ctx.header,\n cookie: ctx.cookie,\n logger,\n });\n } catch (error) {\n logger.error(error as Error, 'Failed to extract actor for audits');\n }\n }\n\n const auditor = new DefaultAuditor<TAuditAction>({\n actor,\n storage,\n metadata: {\n endpoint: endpoint.route,\n method: endpoint.method,\n },\n });\n\n return { auditor, storage };\n}\n\n/**\n * Options for executeWithAuditTransaction.\n */\nexport interface ExecuteWithAuditTransactionOptions {\n /**\n * Database connection to use for the transaction.\n * If this is already a transaction, it will be reused instead of creating a nested one.\n * If not provided, the storage's internal database is used.\n */\n db?: unknown;\n}\n\n/**\n * Execute a handler with automatic audit transaction support.\n * If the audit storage provides a withTransaction method, wraps execution\n * in a transaction so audits are atomic with handler's database operations.\n *\n * This is database-agnostic - each storage implementation provides its own\n * transaction handling based on the underlying database (Kysely, Drizzle, etc.).\n *\n * If the db parameter is provided and is already a transaction, the storage\n * will reuse it instead of creating a nested transaction (similar to\n * packages/db/src/kysely.ts#withTransaction).\n *\n * @param auditContext - The audit context from createAuditContext\n * @param handler - The handler function to execute (receives auditor)\n * @param onComplete - Called after handler with response, to process declarative audits\n * @param options - Optional configuration including database connection\n * @returns The handler result\n */\nexport async function executeWithAuditTransaction<\n T,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n>(\n auditContext: AuditExecutionContext<TAuditAction> | undefined,\n handler: (auditor?: Auditor<TAuditAction>) => Promise<T>,\n onComplete?: (response: T, auditor: Auditor<TAuditAction>) => Promise<void>,\n options?: ExecuteWithAuditTransactionOptions,\n): Promise<T> {\n // No audit context - just run handler\n if (!auditContext) {\n return handler(undefined);\n }\n\n const { auditor, storage } = auditContext;\n\n // Check if storage provides a transaction wrapper\n if (storage.withTransaction) {\n // Wrap in transaction - audits are atomic with handler operations\n // The storage's withTransaction handles setTransaction and flush\n // Pass db so existing transactions are reused\n return storage.withTransaction(\n auditor,\n async () => {\n const response = await handler(auditor);\n\n // Process declarative audits within the transaction\n if (onComplete) {\n await onComplete(response, auditor);\n }\n\n return response;\n },\n options?.db,\n );\n }\n\n // No transaction support - run handler and flush audits after\n const response = await handler(auditor);\n\n if (onComplete) {\n await onComplete(response, auditor);\n }\n\n // Flush audits (no transaction)\n await auditor.flush();\n\n return response;\n}\n"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { DefaultAuditor } from "@geekmidas/audit";
2
- import { withAuditableTransaction } from "@geekmidas/audit/kysely";
3
2
 
4
3
  //#region src/endpoints/processAudits.ts
5
4
  /**
@@ -128,23 +127,30 @@ async function createAuditContext(endpoint, serviceDiscovery, logger, ctx) {
128
127
  }
129
128
  /**
130
129
  * Execute a handler with automatic audit transaction support.
131
- * If the audit storage has a database (via getDatabase()), wraps execution
130
+ * If the audit storage provides a withTransaction method, wraps execution
132
131
  * in a transaction so audits are atomic with handler's database operations.
133
132
  *
133
+ * This is database-agnostic - each storage implementation provides its own
134
+ * transaction handling based on the underlying database (Kysely, Drizzle, etc.).
135
+ *
136
+ * If the db parameter is provided and is already a transaction, the storage
137
+ * will reuse it instead of creating a nested transaction (similar to
138
+ * packages/db/src/kysely.ts#withTransaction).
139
+ *
134
140
  * @param auditContext - The audit context from createAuditContext
135
141
  * @param handler - The handler function to execute (receives auditor)
136
142
  * @param onComplete - Called after handler with response, to process declarative audits
143
+ * @param options - Optional configuration including database connection
137
144
  * @returns The handler result
138
145
  */
139
- async function executeWithAuditTransaction(auditContext, handler, onComplete) {
146
+ async function executeWithAuditTransaction(auditContext, handler, onComplete, options) {
140
147
  if (!auditContext) return handler(void 0);
141
148
  const { auditor, storage } = auditContext;
142
- const db = storage.getDatabase?.();
143
- if (db) return withAuditableTransaction(db, auditor, async () => {
149
+ if (storage.withTransaction) return storage.withTransaction(auditor, async () => {
144
150
  const response$1 = await handler(auditor);
145
151
  if (onComplete) await onComplete(response$1, auditor);
146
152
  return response$1;
147
- });
153
+ }, options?.db);
148
154
  const response = await handler(auditor);
149
155
  if (onComplete) await onComplete(response, auditor);
150
156
  await auditor.flush();
@@ -153,4 +159,4 @@ async function executeWithAuditTransaction(auditContext, handler, onComplete) {
153
159
 
154
160
  //#endregion
155
161
  export { createAuditContext, executeWithAuditTransaction, processEndpointAudits };
156
- //# sourceMappingURL=processAudits-DfcB-X-4.mjs.map
162
+ //# sourceMappingURL=processAudits-Dj8UGqcW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processAudits-Dj8UGqcW.mjs","names":["endpoint: Endpoint<\n any,\n any,\n any,\n OutSchema,\n TServices,\n TLogger,\n TSession,\n any,\n any,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction\n >","response: InferStandardSchema<OutSchema>","serviceDiscovery: ServiceDiscovery<any, any>","logger: TLogger","ctx: {\n session: TSession;\n header: HeaderFn;\n cookie: CookieFn;\n services: Record<string, unknown>;\n }","existingAuditor?: Auditor<TAuditAction>","auditor: Auditor<TAuditAction>","actor: AuditActor","endpoint: Endpoint<\n any,\n any,\n any,\n any,\n TServices,\n TLogger,\n TSession,\n any,\n any,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >","auditContext: AuditExecutionContext<TAuditAction> | undefined","handler: (auditor?: Auditor<TAuditAction>) => Promise<T>","onComplete?: (response: T, auditor: Auditor<TAuditAction>) => Promise<void>","options?: ExecuteWithAuditTransactionOptions","response"],"sources":["../src/endpoints/processAudits.ts"],"sourcesContent":["import type {\n AuditActor,\n AuditStorage,\n AuditableAction,\n Auditor,\n} from '@geekmidas/audit';\nimport { DefaultAuditor } from '@geekmidas/audit';\nimport type { Logger } from '@geekmidas/logger';\nimport type { InferStandardSchema } from '@geekmidas/schema';\nimport type { Service, ServiceDiscovery } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { CookieFn, Endpoint, HeaderFn } from './Endpoint';\nimport type { ActorExtractor, MappedAudit } from './audit';\n\n/**\n * Process declarative audit definitions after successful endpoint execution.\n * Similar to publishConstructEvents for events.\n *\n * @param endpoint - The endpoint with audit configuration\n * @param response - The handler response to generate audit payloads from\n * @param serviceDiscovery - Service discovery for registering audit storage\n * @param logger - Logger for debug/error messages\n * @param ctx - Request context (session, headers, cookies, services)\n * @param existingAuditor - Optional existing auditor instance (e.g., from handler context).\n * If provided, uses this auditor (with its stored transaction).\n * If not provided, creates a new auditor.\n */\nexport async function processEndpointAudits<\n TServices extends Service[] = [],\n TSession = unknown,\n TLogger extends Logger = Logger,\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n>(\n endpoint: Endpoint<\n any,\n any,\n any,\n OutSchema,\n TServices,\n TLogger,\n TSession,\n any,\n any,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction\n >,\n response: InferStandardSchema<OutSchema>,\n serviceDiscovery: ServiceDiscovery<any, any>,\n logger: TLogger,\n ctx: {\n session: TSession;\n header: HeaderFn;\n cookie: CookieFn;\n services: Record<string, unknown>;\n },\n existingAuditor?: Auditor<TAuditAction>,\n): Promise<void> {\n try {\n const audits = endpoint.audits as MappedAudit<TAuditAction, OutSchema>[];\n\n // If we have an existing auditor (from handler context), we need to flush\n // any manual audits it collected, even if there are no declarative audits\n const hasExistingRecords =\n existingAuditor && existingAuditor.getRecords().length > 0;\n\n // Skip if no declarative audits and no existing records to flush\n if (!audits?.length && !hasExistingRecords) {\n logger.debug('No audits to process');\n return;\n }\n\n // If no auditor storage service and we have things to process, warn\n if (!endpoint.auditorStorageService) {\n if (hasExistingRecords || audits?.length) {\n logger.warn('No auditor storage service available');\n }\n return;\n }\n\n // Get or create auditor\n let auditor: Auditor<TAuditAction>;\n\n if (existingAuditor) {\n // Use existing auditor (preserves stored transaction and manual audits)\n auditor = existingAuditor;\n logger.debug('Using existing auditor from handler context');\n } else {\n // Create new auditor (backward compatibility)\n const services = await serviceDiscovery.register([\n endpoint.auditorStorageService,\n ]);\n const storage = services[\n endpoint.auditorStorageService.serviceName\n ] as AuditStorage;\n\n // Extract actor if configured\n let actor: AuditActor = { id: 'system', type: 'system' };\n if (endpoint.actorExtractor) {\n try {\n actor = await (\n endpoint.actorExtractor as ActorExtractor<\n TServices,\n TSession,\n TLogger\n >\n )({\n services: ctx.services as any,\n session: ctx.session,\n header: ctx.header,\n cookie: ctx.cookie,\n logger,\n });\n } catch (error) {\n logger.error(error as Error, 'Failed to extract actor for audits');\n // Continue with system actor\n }\n }\n\n auditor = new DefaultAuditor<TAuditAction>({\n actor,\n storage,\n metadata: {\n endpoint: endpoint.route,\n method: endpoint.method,\n },\n });\n }\n\n // Process each declarative audit\n if (audits?.length) {\n for (const audit of audits) {\n logger.debug({ audit: audit.type }, 'Processing declarative audit');\n\n // Check when condition\n if (audit.when && !audit.when(response as any)) {\n logger.debug(\n { audit: audit.type },\n 'Audit skipped due to when condition',\n );\n continue;\n }\n\n // Extract payload\n const payload = audit.payload(response as any);\n\n // Extract entityId if configured\n const entityId = audit.entityId?.(response as any);\n\n // Record the audit\n auditor.audit(audit.type as any, payload as any, {\n table: audit.table,\n entityId,\n });\n }\n }\n\n // Flush audits to storage\n // Note: If existingAuditor has a stored transaction (via setTransaction),\n // flush() will use it automatically\n const recordCount = auditor.getRecords().length;\n if (recordCount > 0) {\n // Check if auditor has a stored transaction (for logging purposes)\n const trx =\n 'getTransaction' in auditor\n ? (auditor as { getTransaction(): unknown }).getTransaction()\n : undefined;\n logger.debug(\n { auditCount: recordCount, hasTransaction: !!trx },\n 'Flushing audits',\n );\n await auditor.flush();\n }\n } catch (error) {\n logger.error(error as Error, 'Failed to process audits');\n // Don't rethrow - audit failures shouldn't fail the request\n }\n}\n\n/**\n * Context for audit-aware handler execution.\n */\nexport interface AuditExecutionContext<\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> {\n /** The auditor instance for recording audits */\n auditor: Auditor<TAuditAction>;\n /** The audit storage instance */\n storage: AuditStorage;\n}\n\n/**\n * Create audit context for handler execution.\n * Returns the auditor and storage for use in the handler.\n *\n * @param endpoint - The endpoint with audit configuration\n * @param serviceDiscovery - Service discovery for getting audit storage\n * @param logger - Logger for debug/error messages\n * @param ctx - Request context for actor extraction\n * @returns Audit context with auditor and storage, or undefined if not configured\n */\nexport async function createAuditContext<\n TServices extends Service[] = [],\n TSession = unknown,\n TLogger extends Logger = Logger,\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 any,\n any,\n any,\n any,\n TServices,\n TLogger,\n TSession,\n any,\n any,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction,\n TDatabase,\n TDatabaseServiceName\n >,\n serviceDiscovery: ServiceDiscovery<any, any>,\n logger: TLogger,\n ctx: {\n session: TSession;\n header: HeaderFn;\n cookie: CookieFn;\n services: Record<string, unknown>;\n },\n): Promise<AuditExecutionContext<TAuditAction> | undefined> {\n if (!endpoint.auditorStorageService) {\n return undefined;\n }\n\n const services = await serviceDiscovery.register([\n endpoint.auditorStorageService,\n ]);\n const storage = services[\n endpoint.auditorStorageService.serviceName\n ] as AuditStorage;\n\n // Extract actor if configured\n let actor: AuditActor = { id: 'system', type: 'system' };\n if (endpoint.actorExtractor) {\n try {\n actor = await (\n endpoint.actorExtractor as ActorExtractor<TServices, TSession, TLogger>\n )({\n services: ctx.services as any,\n session: ctx.session,\n header: ctx.header,\n cookie: ctx.cookie,\n logger,\n });\n } catch (error) {\n logger.error(error as Error, 'Failed to extract actor for audits');\n }\n }\n\n const auditor = new DefaultAuditor<TAuditAction>({\n actor,\n storage,\n metadata: {\n endpoint: endpoint.route,\n method: endpoint.method,\n },\n });\n\n return { auditor, storage };\n}\n\n/**\n * Options for executeWithAuditTransaction.\n */\nexport interface ExecuteWithAuditTransactionOptions {\n /**\n * Database connection to use for the transaction.\n * If this is already a transaction, it will be reused instead of creating a nested one.\n * If not provided, the storage's internal database is used.\n */\n db?: unknown;\n}\n\n/**\n * Execute a handler with automatic audit transaction support.\n * If the audit storage provides a withTransaction method, wraps execution\n * in a transaction so audits are atomic with handler's database operations.\n *\n * This is database-agnostic - each storage implementation provides its own\n * transaction handling based on the underlying database (Kysely, Drizzle, etc.).\n *\n * If the db parameter is provided and is already a transaction, the storage\n * will reuse it instead of creating a nested transaction (similar to\n * packages/db/src/kysely.ts#withTransaction).\n *\n * @param auditContext - The audit context from createAuditContext\n * @param handler - The handler function to execute (receives auditor)\n * @param onComplete - Called after handler with response, to process declarative audits\n * @param options - Optional configuration including database connection\n * @returns The handler result\n */\nexport async function executeWithAuditTransaction<\n T,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n>(\n auditContext: AuditExecutionContext<TAuditAction> | undefined,\n handler: (auditor?: Auditor<TAuditAction>) => Promise<T>,\n onComplete?: (response: T, auditor: Auditor<TAuditAction>) => Promise<void>,\n options?: ExecuteWithAuditTransactionOptions,\n): Promise<T> {\n // No audit context - just run handler\n if (!auditContext) {\n return handler(undefined);\n }\n\n const { auditor, storage } = auditContext;\n\n // Check if storage provides a transaction wrapper\n if (storage.withTransaction) {\n // Wrap in transaction - audits are atomic with handler operations\n // The storage's withTransaction handles setTransaction and flush\n // Pass db so existing transactions are reused\n return storage.withTransaction(\n auditor,\n async () => {\n const response = await handler(auditor);\n\n // Process declarative audits within the transaction\n if (onComplete) {\n await onComplete(response, auditor);\n }\n\n return response;\n },\n options?.db,\n );\n }\n\n // No transaction support - run handler and flush audits after\n const response = await handler(auditor);\n\n if (onComplete) {\n await onComplete(response, auditor);\n }\n\n // Flush audits (no transaction)\n await auditor.flush();\n\n return response;\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Construct } from "./Construct-DDR0295I.mjs";
1
+ import { Construct } from "./Construct-jBKqb-Zi.mjs";
2
2
  import { Service, ServiceDiscovery } from "@geekmidas/services";
3
3
  import { AuditStorage } from "@geekmidas/audit";
4
4
  import { EventPublisher, MappedEvent } from "@geekmidas/events";
@@ -0,0 +1,9 @@
1
+ //#region src/endpoints/rls.ts
2
+ /**
3
+ * Symbol used to bypass RLS for an endpoint.
4
+ */
5
+ const RLS_BYPASS = Symbol.for("geekmidas.rls.bypass");
6
+
7
+ //#endregion
8
+ export { RLS_BYPASS };
9
+ //# sourceMappingURL=rls-Bf3FRwto.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rls-Bf3FRwto.mjs","names":[],"sources":["../src/endpoints/rls.ts"],"sourcesContent":["import type { Logger } from '@geekmidas/logger';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport type { CookieFn, HeaderFn } from './Endpoint';\n\n/**\n * RLS context - key-value pairs to set as PostgreSQL session variables.\n * Keys become `prefix.key` (e.g., `app.user_id`).\n */\nexport interface RlsContext {\n [key: string]: string | number | boolean | null | undefined;\n}\n\n/**\n * Function type for extracting RLS context from request context.\n *\n * @template TServices - Available service dependencies\n * @template TSession - Session data type\n * @template TLogger - Logger type\n *\n * @example\n * ```ts\n * const extractor: RlsContextExtractor<[], UserSession> = ({ session }) => ({\n * user_id: session.userId,\n * tenant_id: session.tenantId,\n * roles: session.roles.join(','),\n * });\n * ```\n */\nexport type RlsContextExtractor<\n TServices extends Service[] = [],\n TSession = unknown,\n TLogger extends Logger = Logger,\n> = (ctx: {\n services: ServiceRecord<TServices>;\n session: TSession;\n header: HeaderFn;\n cookie: CookieFn;\n logger: TLogger;\n}) => RlsContext | Promise<RlsContext>;\n\n/**\n * Configuration for RLS on an endpoint or factory.\n *\n * @template TServices - Available service dependencies\n * @template TSession - Session data type\n * @template TLogger - Logger type\n */\nexport interface RlsConfig<\n TServices extends Service[] = [],\n TSession = unknown,\n TLogger extends Logger = Logger,\n> {\n /** Function to extract RLS context from request */\n extractor: RlsContextExtractor<TServices, TSession, TLogger>;\n /** Prefix for PostgreSQL session variables (default: 'app') */\n prefix?: string;\n}\n\n/**\n * Symbol used to bypass RLS for an endpoint.\n */\nexport const RLS_BYPASS = Symbol.for('geekmidas.rls.bypass');\n\n/**\n * Type for RLS bypass marker.\n */\nexport type RlsBypass = typeof RLS_BYPASS;\n"],"mappings":";;;;AA6DA,MAAa,aAAa,OAAO,IAAI,uBAAuB"}
@@ -0,0 +1,15 @@
1
+
2
+ //#region src/endpoints/rls.ts
3
+ /**
4
+ * Symbol used to bypass RLS for an endpoint.
5
+ */
6
+ const RLS_BYPASS = Symbol.for("geekmidas.rls.bypass");
7
+
8
+ //#endregion
9
+ Object.defineProperty(exports, 'RLS_BYPASS', {
10
+ enumerable: true,
11
+ get: function () {
12
+ return RLS_BYPASS;
13
+ }
14
+ });
15
+ //# sourceMappingURL=rls-CmJ7bRsz.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rls-CmJ7bRsz.cjs","names":[],"sources":["../src/endpoints/rls.ts"],"sourcesContent":["import type { Logger } from '@geekmidas/logger';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport type { CookieFn, HeaderFn } from './Endpoint';\n\n/**\n * RLS context - key-value pairs to set as PostgreSQL session variables.\n * Keys become `prefix.key` (e.g., `app.user_id`).\n */\nexport interface RlsContext {\n [key: string]: string | number | boolean | null | undefined;\n}\n\n/**\n * Function type for extracting RLS context from request context.\n *\n * @template TServices - Available service dependencies\n * @template TSession - Session data type\n * @template TLogger - Logger type\n *\n * @example\n * ```ts\n * const extractor: RlsContextExtractor<[], UserSession> = ({ session }) => ({\n * user_id: session.userId,\n * tenant_id: session.tenantId,\n * roles: session.roles.join(','),\n * });\n * ```\n */\nexport type RlsContextExtractor<\n TServices extends Service[] = [],\n TSession = unknown,\n TLogger extends Logger = Logger,\n> = (ctx: {\n services: ServiceRecord<TServices>;\n session: TSession;\n header: HeaderFn;\n cookie: CookieFn;\n logger: TLogger;\n}) => RlsContext | Promise<RlsContext>;\n\n/**\n * Configuration for RLS on an endpoint or factory.\n *\n * @template TServices - Available service dependencies\n * @template TSession - Session data type\n * @template TLogger - Logger type\n */\nexport interface RlsConfig<\n TServices extends Service[] = [],\n TSession = unknown,\n TLogger extends Logger = Logger,\n> {\n /** Function to extract RLS context from request */\n extractor: RlsContextExtractor<TServices, TSession, TLogger>;\n /** Prefix for PostgreSQL session variables (default: 'app') */\n prefix?: string;\n}\n\n/**\n * Symbol used to bypass RLS for an endpoint.\n */\nexport const RLS_BYPASS = Symbol.for('geekmidas.rls.bypass');\n\n/**\n * Type for RLS bypass marker.\n */\nexport type RlsBypass = typeof RLS_BYPASS;\n"],"mappings":";;;;;AA6DA,MAAa,aAAa,OAAO,IAAI,uBAAuB"}
@@ -1,4 +1,4 @@
1
- import "../Construct-DDR0295I.mjs";
2
- import "../Subscriber-itwm7ugy.mjs";
3
- import { AWSLambdaHandler, AWSLambdaSubscriber } from "../AWSLambdaSubscriberAdaptor-CWbBNRz3.mjs";
1
+ import "../Construct-jBKqb-Zi.mjs";
2
+ import "../Subscriber-aNr1qkxR.mjs";
3
+ import { AWSLambdaHandler, AWSLambdaSubscriber } from "../AWSLambdaSubscriberAdaptor-C0aZBU64.mjs";
4
4
  export { AWSLambdaHandler, AWSLambdaSubscriber };
@@ -1,4 +1,4 @@
1
1
  require('../Construct-BYSPikVm.cjs');
2
- const require_Subscriber = require('../Subscriber-D-FPWts6.cjs');
2
+ const require_Subscriber = require('../Subscriber-DOt3svUC.cjs');
3
3
 
4
4
  exports.Subscriber = require_Subscriber.Subscriber;
@@ -1,3 +1,3 @@
1
- import "../Construct-DDR0295I.mjs";
2
- import { Subscriber, SubscriberContext, SubscriberHandler } from "../Subscriber-itwm7ugy.mjs";
1
+ import "../Construct-jBKqb-Zi.mjs";
2
+ import { Subscriber, SubscriberContext, SubscriberHandler } from "../Subscriber-aNr1qkxR.mjs";
3
3
  export { Subscriber, SubscriberContext, SubscriberHandler };
@@ -1,4 +1,4 @@
1
1
  import "../Construct-LWeB1rSQ.mjs";
2
- import { Subscriber } from "../Subscriber-CGb8LjZa.mjs";
2
+ import { Subscriber } from "../Subscriber-kCHbH2fZ.mjs";
3
3
 
4
4
  export { Subscriber };
@@ -1,5 +1,5 @@
1
1
  require('../Construct-BYSPikVm.cjs');
2
- require('../Subscriber-D-FPWts6.cjs');
3
- const require_SubscriberBuilder = require('../SubscriberBuilder-BfE2cL1q.cjs');
2
+ require('../Subscriber-DOt3svUC.cjs');
3
+ const require_SubscriberBuilder = require('../SubscriberBuilder-Cj2u9k5Q.cjs');
4
4
 
5
5
  exports.SubscriberBuilder = require_SubscriberBuilder.SubscriberBuilder;
@@ -1,4 +1,4 @@
1
- import "../Construct-DDR0295I.mjs";
2
- import "../Subscriber-itwm7ugy.mjs";
3
- import { SubscriberBuilder } from "../SubscriberBuilder-9j3JCu8-.mjs";
1
+ import "../Construct-jBKqb-Zi.mjs";
2
+ import "../Subscriber-aNr1qkxR.mjs";
3
+ import { SubscriberBuilder } from "../SubscriberBuilder-CWS4tdbp.mjs";
4
4
  export { SubscriberBuilder };
@@ -1,5 +1,5 @@
1
1
  import "../Construct-LWeB1rSQ.mjs";
2
- import "../Subscriber-CGb8LjZa.mjs";
3
- import { SubscriberBuilder } from "../SubscriberBuilder-BcAspHv9.mjs";
2
+ import "../Subscriber-kCHbH2fZ.mjs";
3
+ import { SubscriberBuilder } from "../SubscriberBuilder-DmxMU89X.mjs";
4
4
 
5
5
  export { SubscriberBuilder };
@@ -1,6 +1,6 @@
1
1
  require('../Construct-BYSPikVm.cjs');
2
- const require_Subscriber = require('../Subscriber-D-FPWts6.cjs');
3
- const require_SubscriberBuilder = require('../SubscriberBuilder-BfE2cL1q.cjs');
2
+ const require_Subscriber = require('../Subscriber-DOt3svUC.cjs');
3
+ const require_SubscriberBuilder = require('../SubscriberBuilder-Cj2u9k5Q.cjs');
4
4
 
5
5
  //#region src/subscribers/index.ts
6
6
  const s = new require_SubscriberBuilder.SubscriberBuilder();
@@ -1,10 +1,10 @@
1
1
  import "../Construct-Dkd8Kvc9.cjs";
2
2
  import { Subscriber } from "../Subscriber-DMSzvO_J.cjs";
3
3
  import { SubscriberBuilder } from "../SubscriberBuilder-BxJM3Hz_.cjs";
4
- import * as _geekmidas_logger4 from "@geekmidas/logger";
4
+ import * as _geekmidas_logger10 from "@geekmidas/logger";
5
5
 
6
6
  //#region src/subscribers/index.d.ts
7
- declare const s: SubscriberBuilder<[], _geekmidas_logger4.Logger, undefined, undefined, string, []>;
7
+ declare const s: SubscriberBuilder<[], _geekmidas_logger10.Logger, undefined, undefined, string, []>;
8
8
  //#endregion
9
9
  export { Subscriber, SubscriberBuilder, s };
10
10
  //# sourceMappingURL=index.d.cts.map
@@ -1,10 +1,10 @@
1
- import "../Construct-DDR0295I.mjs";
2
- import { Subscriber } from "../Subscriber-itwm7ugy.mjs";
3
- import { SubscriberBuilder } from "../SubscriberBuilder-9j3JCu8-.mjs";
4
- import * as _geekmidas_logger9 from "@geekmidas/logger";
1
+ import "../Construct-jBKqb-Zi.mjs";
2
+ import { Subscriber } from "../Subscriber-aNr1qkxR.mjs";
3
+ import { SubscriberBuilder } from "../SubscriberBuilder-CWS4tdbp.mjs";
4
+ import * as _geekmidas_logger10 from "@geekmidas/logger";
5
5
 
6
6
  //#region src/subscribers/index.d.ts
7
- declare const s: SubscriberBuilder<[], _geekmidas_logger9.Logger, undefined, undefined, string, []>;
7
+ declare const s: SubscriberBuilder<[], _geekmidas_logger10.Logger, undefined, undefined, string, []>;
8
8
  //#endregion
9
9
  export { Subscriber, SubscriberBuilder, s };
10
10
  //# sourceMappingURL=index.d.mts.map
@@ -1,6 +1,6 @@
1
1
  import "../Construct-LWeB1rSQ.mjs";
2
- import { Subscriber } from "../Subscriber-CGb8LjZa.mjs";
3
- import { SubscriberBuilder } from "../SubscriberBuilder-BcAspHv9.mjs";
2
+ import { Subscriber } from "../Subscriber-kCHbH2fZ.mjs";
3
+ import { SubscriberBuilder } from "../SubscriberBuilder-DmxMU89X.mjs";
4
4
 
5
5
  //#region src/subscribers/index.ts
6
6
  const s = new SubscriberBuilder();
@@ -4,4 +4,4 @@ type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS';
4
4
  type LowerHttpMethod<T extends HttpMethod> = Lowercase<T>;
5
5
  //#endregion
6
6
  export { HttpMethod, LowerHttpMethod, RemoveUndefined };
7
- //# sourceMappingURL=types-DKf0juBf.d.mts.map
7
+ //# sourceMappingURL=types-CScirkHt.d.mts.map