@geekmidas/constructs 0.0.12 → 0.0.14

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 (297) hide show
  1. package/README.md +448 -0
  2. package/dist/AWSLambdaFunction-B-Oxr8qt.d.cts +30 -0
  3. package/dist/{AWSLambdaFunction-DMxScuaw.cjs → AWSLambdaFunction-C-fuCLA3.cjs} +28 -5
  4. package/dist/AWSLambdaFunction-C-fuCLA3.cjs.map +1 -0
  5. package/dist/AWSLambdaFunction-CAm9r5ZX.d.mts +30 -0
  6. package/dist/{AWSLambdaFunction-cL8A169J.mjs → AWSLambdaFunction-H65WfXLt.mjs} +28 -5
  7. package/dist/AWSLambdaFunction-H65WfXLt.mjs.map +1 -0
  8. package/dist/{AmazonApiGatewayEndpointAdaptor-eDQgPNLH.d.mts → AmazonApiGatewayEndpointAdaptor-4hPy5vty.d.mts} +4 -4
  9. package/dist/{AmazonApiGatewayEndpointAdaptor-CIEhW1TQ.mjs → AmazonApiGatewayEndpointAdaptor-C6Jk5HSy.mjs} +6 -2
  10. package/dist/AmazonApiGatewayEndpointAdaptor-C6Jk5HSy.mjs.map +1 -0
  11. package/dist/{AmazonApiGatewayEndpointAdaptor-H8YvtfQm.cjs → AmazonApiGatewayEndpointAdaptor-CI9L7Ucn.cjs} +6 -2
  12. package/dist/AmazonApiGatewayEndpointAdaptor-CI9L7Ucn.cjs.map +1 -0
  13. package/dist/{AmazonApiGatewayEndpointAdaptor-CwItKPz2.d.cts → AmazonApiGatewayEndpointAdaptor-ro0RMLzr.d.cts} +4 -4
  14. package/dist/{AmazonApiGatewayV1EndpointAdaptor-B36zXLJ7.mjs → AmazonApiGatewayV1EndpointAdaptor-BMy8DdNJ.mjs} +2 -2
  15. package/dist/{AmazonApiGatewayV1EndpointAdaptor-B36zXLJ7.mjs.map → AmazonApiGatewayV1EndpointAdaptor-BMy8DdNJ.mjs.map} +1 -1
  16. package/dist/{AmazonApiGatewayV1EndpointAdaptor-DaCvUL6y.d.cts → AmazonApiGatewayV1EndpointAdaptor-BWJWKqQT.d.cts} +3 -3
  17. package/dist/{AmazonApiGatewayV1EndpointAdaptor-0n71d3gq.cjs → AmazonApiGatewayV1EndpointAdaptor-DYL1bCBS.cjs} +2 -2
  18. package/dist/{AmazonApiGatewayV1EndpointAdaptor-0n71d3gq.cjs.map → AmazonApiGatewayV1EndpointAdaptor-DYL1bCBS.cjs.map} +1 -1
  19. package/dist/{AmazonApiGatewayV1EndpointAdaptor-CnGVpA38.d.mts → AmazonApiGatewayV1EndpointAdaptor-hyR-WwyP.d.mts} +3 -3
  20. package/dist/{AmazonApiGatewayV2EndpointAdaptor-CE3wZEb8.mjs → AmazonApiGatewayV2EndpointAdaptor-BU5wQMOe.mjs} +2 -2
  21. package/dist/{AmazonApiGatewayV2EndpointAdaptor-CE3wZEb8.mjs.map → AmazonApiGatewayV2EndpointAdaptor-BU5wQMOe.mjs.map} +1 -1
  22. package/dist/{AmazonApiGatewayV2EndpointAdaptor-DtU3Cb8F.cjs → AmazonApiGatewayV2EndpointAdaptor-CPLCMeaN.cjs} +2 -2
  23. package/dist/{AmazonApiGatewayV2EndpointAdaptor-DtU3Cb8F.cjs.map → AmazonApiGatewayV2EndpointAdaptor-CPLCMeaN.cjs.map} +1 -1
  24. package/dist/{AmazonApiGatewayV2EndpointAdaptor-DA1PH0nc.d.cts → AmazonApiGatewayV2EndpointAdaptor-D1Irdggp.d.cts} +3 -3
  25. package/dist/{AmazonApiGatewayV2EndpointAdaptor-BELz2ijs.d.mts → AmazonApiGatewayV2EndpointAdaptor-DX3SuI5S.d.mts} +3 -3
  26. package/dist/{Authorizer-BRCVPz_O.d.mts → Authorizer-BTmly8ps.d.cts} +1 -1
  27. package/dist/{Authorizer-DG54w1m2.d.cts → Authorizer-pmPvIVgv.d.mts} +1 -1
  28. package/dist/{BaseFunctionBuilder-CT7p10K1.mjs → BaseFunctionBuilder-B5gkW0Kt.mjs} +10 -1
  29. package/dist/BaseFunctionBuilder-B5gkW0Kt.mjs.map +1 -0
  30. package/dist/{BaseFunctionBuilder-B8rT07QR.cjs → BaseFunctionBuilder-C5Se7pdL.cjs} +10 -1
  31. package/dist/BaseFunctionBuilder-C5Se7pdL.cjs.map +1 -0
  32. package/dist/{BaseFunctionBuilder-DilipY1y.d.mts → BaseFunctionBuilder-CbDnPZpD.d.mts} +10 -4
  33. package/dist/{BaseFunctionBuilder-Cf0op65o.d.cts → BaseFunctionBuilder-DUZMbEr3.d.cts} +10 -4
  34. package/dist/{Cron-Bnd-2pgE.cjs → Cron-Bi3QOge_.cjs} +4 -4
  35. package/dist/Cron-Bi3QOge_.cjs.map +1 -0
  36. package/dist/{Cron-6lOgKqSA.d.cts → Cron-COdfP0Jd.d.cts} +4 -4
  37. package/dist/{Cron-BH_07atD.d.mts → Cron-D8cn_ahj.d.mts} +4 -4
  38. package/dist/{Cron-DNRjf2cp.mjs → Cron-Dy_HW2Vv.mjs} +4 -4
  39. package/dist/Cron-Dy_HW2Vv.mjs.map +1 -0
  40. package/dist/{CronBuilder-DdR2TuQa.mjs → CronBuilder-Bl3A2Zp4.mjs} +13 -4
  41. package/dist/CronBuilder-Bl3A2Zp4.mjs.map +1 -0
  42. package/dist/{CronBuilder-5oK2AL2n.d.cts → CronBuilder-DntF6H3A.d.cts} +17 -12
  43. package/dist/{CronBuilder-D2b4zY4l.d.mts → CronBuilder-DoMnSs_0.d.mts} +17 -12
  44. package/dist/{CronBuilder-dtw4ZyH6.cjs → CronBuilder-Dv_w7Yri.cjs} +13 -4
  45. package/dist/CronBuilder-Dv_w7Yri.cjs.map +1 -0
  46. package/dist/{Endpoint-DuZlyjd4.d.mts → Endpoint-Bbs_sFvg.d.mts} +49 -20
  47. package/dist/{Endpoint-Cs-MsYlY.d.cts → Endpoint-Bu8Phz6y.d.cts} +49 -20
  48. package/dist/{Endpoint-B9PryZES.cjs → Endpoint-DDpF7NO1.cjs} +11 -6
  49. package/dist/Endpoint-DDpF7NO1.cjs.map +1 -0
  50. package/dist/{Endpoint-B69TqESg.mjs → Endpoint-S6Yh2_PN.mjs} +11 -6
  51. package/dist/Endpoint-S6Yh2_PN.mjs.map +1 -0
  52. package/dist/{EndpointBuilder-C-PHInEW.d.cts → EndpointBuilder-CPxmF_w7.d.cts} +30 -13
  53. package/dist/{EndpointBuilder-BrB-K1jO.d.mts → EndpointBuilder-Csfyfjd7.d.mts} +30 -13
  54. package/dist/{EndpointBuilder-DofwCnWJ.cjs → EndpointBuilder-DpGmObMb.cjs} +25 -4
  55. package/dist/EndpointBuilder-DpGmObMb.cjs.map +1 -0
  56. package/dist/{EndpointBuilder-DnVL-EU_.mjs → EndpointBuilder-aE2E6WTx.mjs} +25 -4
  57. package/dist/EndpointBuilder-aE2E6WTx.mjs.map +1 -0
  58. package/dist/{EndpointFactory-6zNpVSYp.d.mts → EndpointFactory-BU_R-9LH.d.mts} +10 -10
  59. package/dist/{EndpointFactory-Ba9mx9MU.cjs → EndpointFactory-BfH6mjJ3.cjs} +2 -2
  60. package/dist/EndpointFactory-BfH6mjJ3.cjs.map +1 -0
  61. package/dist/{EndpointFactory-e5WYVR6t.d.cts → EndpointFactory-D0Ql2Ofm.d.cts} +11 -11
  62. package/dist/{EndpointFactory-pPaIGFHV.mjs → EndpointFactory-D4leYk1N.mjs} +2 -2
  63. package/dist/EndpointFactory-D4leYk1N.mjs.map +1 -0
  64. package/dist/{Function-CO-s2pB8.cjs → Function-DagDbeXo.cjs} +3 -2
  65. package/dist/Function-DagDbeXo.cjs.map +1 -0
  66. package/dist/{Function-COnc-tWM.mjs → Function-DfKsM5Kx.mjs} +3 -2
  67. package/dist/Function-DfKsM5Kx.mjs.map +1 -0
  68. package/dist/{Function-G3JPHMaY.d.mts → Function-V9M9UVHp.d.mts} +24 -7
  69. package/dist/{Function-6EWabl_X.d.cts → Function-VI1TB3Mh.d.cts} +24 -7
  70. package/dist/{FunctionBuilder-CMhLQ4dt.mjs → FunctionBuilder-CVT7bG2o.mjs} +20 -4
  71. package/dist/FunctionBuilder-CVT7bG2o.mjs.map +1 -0
  72. package/dist/{FunctionBuilder-B3fpp3hA.d.cts → FunctionBuilder-CjVEFTYC.d.cts} +22 -12
  73. package/dist/{FunctionBuilder-ByaB_LQ4.d.mts → FunctionBuilder-D1ofSeMd.d.mts} +22 -12
  74. package/dist/{FunctionBuilder-_hMwZUof.cjs → FunctionBuilder-DXvG_XD-.cjs} +20 -4
  75. package/dist/FunctionBuilder-DXvG_XD-.cjs.map +1 -0
  76. package/dist/FunctionExecutionWrapper-Bubnr0zA.mjs +101 -0
  77. package/dist/FunctionExecutionWrapper-Bubnr0zA.mjs.map +1 -0
  78. package/dist/FunctionExecutionWrapper-CwtwYozd.d.cts +48 -0
  79. package/dist/FunctionExecutionWrapper-DkNycmOh.cjs +107 -0
  80. package/dist/FunctionExecutionWrapper-DkNycmOh.cjs.map +1 -0
  81. package/dist/FunctionExecutionWrapper-rhbIYT0Q.d.mts +48 -0
  82. package/dist/{HonoEndpointAdaptor-Cw2if5cG.cjs → HonoEndpointAdaptor-CfLRHHFw.cjs} +8 -4
  83. package/dist/HonoEndpointAdaptor-CfLRHHFw.cjs.map +1 -0
  84. package/dist/{HonoEndpointAdaptor-BElil8O5.d.mts → HonoEndpointAdaptor-DANYfDu9.d.mts} +7 -7
  85. package/dist/{HonoEndpointAdaptor-DAfnTFVS.mjs → HonoEndpointAdaptor-DuyE06nH.mjs} +8 -4
  86. package/dist/HonoEndpointAdaptor-DuyE06nH.mjs.map +1 -0
  87. package/dist/{HonoEndpointAdaptor-DSHl8ZCY.d.cts → HonoEndpointAdaptor-_uLz8Bak.d.cts} +7 -7
  88. package/dist/{Subscriber-D-FPWts6.cjs → Subscriber-Bdh8rMSL.cjs} +1 -1
  89. package/dist/{Subscriber-D-FPWts6.cjs.map → Subscriber-Bdh8rMSL.cjs.map} +1 -1
  90. package/dist/{Subscriber-CGb8LjZa.mjs → Subscriber-CJOWwaw1.mjs} +1 -1
  91. package/dist/{Subscriber-CGb8LjZa.mjs.map → Subscriber-CJOWwaw1.mjs.map} +1 -1
  92. package/dist/{SubscriberBuilder-BcAspHv9.mjs → SubscriberBuilder-BWQmiYd8.mjs} +2 -2
  93. package/dist/{SubscriberBuilder-BcAspHv9.mjs.map → SubscriberBuilder-BWQmiYd8.mjs.map} +1 -1
  94. package/dist/{SubscriberBuilder-BfE2cL1q.cjs → SubscriberBuilder-DieD_60p.cjs} +2 -2
  95. package/dist/{SubscriberBuilder-BfE2cL1q.cjs.map → SubscriberBuilder-DieD_60p.cjs.map} +1 -1
  96. package/dist/{TestEndpointAdaptor-DubQOJk_.mjs → TestEndpointAdaptor-BEyZa0Yg.mjs} +7 -3
  97. package/dist/TestEndpointAdaptor-BEyZa0Yg.mjs.map +1 -0
  98. package/dist/{TestEndpointAdaptor-Bn1WRFph.cjs → TestEndpointAdaptor-C8425RJ0.cjs} +7 -3
  99. package/dist/TestEndpointAdaptor-C8425RJ0.cjs.map +1 -0
  100. package/dist/{TestEndpointAdaptor-o-xtSyQ3.d.cts → TestEndpointAdaptor-H5To8PH7.d.cts} +2 -2
  101. package/dist/{TestEndpointAdaptor-DnlAA_rm.d.mts → TestEndpointAdaptor-jxn68ayg.d.mts} +2 -2
  102. package/dist/adaptors/aws.cjs +10 -10
  103. package/dist/adaptors/aws.d.cts +11 -11
  104. package/dist/adaptors/aws.d.mts +11 -11
  105. package/dist/adaptors/aws.mjs +10 -10
  106. package/dist/adaptors/hono.cjs +7 -7
  107. package/dist/adaptors/hono.d.cts +7 -7
  108. package/dist/adaptors/hono.d.mts +7 -7
  109. package/dist/adaptors/hono.mjs +7 -7
  110. package/dist/adaptors/testing.cjs +6 -6
  111. package/dist/adaptors/testing.d.cts +7 -7
  112. package/dist/adaptors/testing.d.mts +7 -7
  113. package/dist/adaptors/testing.mjs +6 -6
  114. package/dist/crons/Cron.cjs +5 -5
  115. package/dist/crons/Cron.d.cts +5 -5
  116. package/dist/crons/Cron.d.mts +5 -5
  117. package/dist/crons/Cron.mjs +5 -5
  118. package/dist/crons/CronBuilder.cjs +6 -6
  119. package/dist/crons/CronBuilder.d.cts +6 -6
  120. package/dist/crons/CronBuilder.d.mts +6 -6
  121. package/dist/crons/CronBuilder.mjs +6 -6
  122. package/dist/crons/index.cjs +6 -6
  123. package/dist/crons/index.d.cts +10 -10
  124. package/dist/crons/index.d.mts +10 -10
  125. package/dist/crons/index.mjs +6 -6
  126. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +6 -6
  127. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +7 -7
  128. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +7 -7
  129. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +6 -6
  130. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +7 -7
  131. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +8 -8
  132. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +8 -8
  133. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +7 -7
  134. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +7 -7
  135. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +8 -8
  136. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +8 -8
  137. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +7 -7
  138. package/dist/endpoints/Authorizer.d.cts +1 -1
  139. package/dist/endpoints/Authorizer.d.mts +1 -1
  140. package/dist/endpoints/Endpoint.cjs +5 -5
  141. package/dist/endpoints/Endpoint.d.cts +6 -6
  142. package/dist/endpoints/Endpoint.d.mts +6 -6
  143. package/dist/endpoints/Endpoint.mjs +5 -5
  144. package/dist/endpoints/EndpointBuilder.cjs +6 -6
  145. package/dist/endpoints/EndpointBuilder.d.cts +7 -7
  146. package/dist/endpoints/EndpointBuilder.d.mts +7 -7
  147. package/dist/endpoints/EndpointBuilder.mjs +6 -6
  148. package/dist/endpoints/EndpointFactory.cjs +7 -7
  149. package/dist/endpoints/EndpointFactory.d.cts +8 -8
  150. package/dist/endpoints/EndpointFactory.d.mts +8 -8
  151. package/dist/endpoints/EndpointFactory.mjs +7 -7
  152. package/dist/endpoints/HonoEndpointAdaptor.cjs +7 -7
  153. package/dist/endpoints/HonoEndpointAdaptor.d.cts +7 -7
  154. package/dist/endpoints/HonoEndpointAdaptor.d.mts +7 -7
  155. package/dist/endpoints/HonoEndpointAdaptor.mjs +7 -7
  156. package/dist/endpoints/TestEndpointAdaptor.cjs +6 -6
  157. package/dist/endpoints/TestEndpointAdaptor.d.cts +7 -7
  158. package/dist/endpoints/TestEndpointAdaptor.d.mts +7 -7
  159. package/dist/endpoints/TestEndpointAdaptor.mjs +6 -6
  160. package/dist/endpoints/audit.d.cts +6 -6
  161. package/dist/endpoints/audit.d.mts +6 -6
  162. package/dist/endpoints/helpers.cjs +6 -6
  163. package/dist/endpoints/helpers.d.cts +6 -6
  164. package/dist/endpoints/helpers.d.mts +6 -6
  165. package/dist/endpoints/helpers.mjs +6 -6
  166. package/dist/endpoints/index.cjs +7 -7
  167. package/dist/endpoints/index.d.cts +10 -10
  168. package/dist/endpoints/index.d.mts +10 -10
  169. package/dist/endpoints/index.mjs +7 -7
  170. package/dist/endpoints/processAudits.d.cts +7 -7
  171. package/dist/endpoints/processAudits.d.mts +7 -7
  172. package/dist/functions/AWSLambdaFunction.cjs +5 -5
  173. package/dist/functions/AWSLambdaFunction.d.cts +3 -3
  174. package/dist/functions/AWSLambdaFunction.d.mts +3 -3
  175. package/dist/functions/AWSLambdaFunction.mjs +5 -5
  176. package/dist/functions/BaseFunctionBuilder.cjs +1 -1
  177. package/dist/functions/BaseFunctionBuilder.d.cts +1 -1
  178. package/dist/functions/BaseFunctionBuilder.d.mts +1 -1
  179. package/dist/functions/BaseFunctionBuilder.mjs +1 -1
  180. package/dist/functions/Function.cjs +1 -1
  181. package/dist/functions/Function.d.cts +1 -1
  182. package/dist/functions/Function.d.mts +1 -1
  183. package/dist/functions/Function.mjs +1 -1
  184. package/dist/functions/FunctionBuilder.cjs +3 -3
  185. package/dist/functions/FunctionBuilder.d.cts +3 -3
  186. package/dist/functions/FunctionBuilder.d.mts +3 -3
  187. package/dist/functions/FunctionBuilder.mjs +3 -3
  188. package/dist/functions/FunctionExecutionWrapper.cjs +4 -4
  189. package/dist/functions/FunctionExecutionWrapper.d.cts +2 -2
  190. package/dist/functions/FunctionExecutionWrapper.d.mts +2 -2
  191. package/dist/functions/FunctionExecutionWrapper.mjs +4 -4
  192. package/dist/functions/TestFunctionAdaptor.cjs +37 -4
  193. package/dist/functions/TestFunctionAdaptor.cjs.map +1 -1
  194. package/dist/functions/TestFunctionAdaptor.d.cts +9 -6
  195. package/dist/functions/TestFunctionAdaptor.d.mts +9 -6
  196. package/dist/functions/TestFunctionAdaptor.mjs +37 -4
  197. package/dist/functions/TestFunctionAdaptor.mjs.map +1 -1
  198. package/dist/functions/index.cjs +4 -4
  199. package/dist/functions/index.d.cts +4 -4
  200. package/dist/functions/index.d.mts +4 -4
  201. package/dist/functions/index.mjs +4 -4
  202. package/dist/{functions-D03lqK-r.cjs → functions-FCb-wWFC.cjs} +2 -2
  203. package/dist/{functions-D03lqK-r.cjs.map → functions-FCb-wWFC.cjs.map} +1 -1
  204. package/dist/functions-JhRsNoAZ.mjs +8 -0
  205. package/dist/{functions-BYqZAob8.mjs.map → functions-JhRsNoAZ.mjs.map} +1 -1
  206. package/dist/{helpers-BPDogwac.mjs → helpers-2CLKTnRm.mjs} +2 -2
  207. package/dist/{helpers-BPDogwac.mjs.map → helpers-2CLKTnRm.mjs.map} +1 -1
  208. package/dist/{helpers-BApRyhly.cjs → helpers-Khuhi_Qx.cjs} +2 -2
  209. package/dist/{helpers-BApRyhly.cjs.map → helpers-Khuhi_Qx.cjs.map} +1 -1
  210. package/dist/{index-CUg_hSq-.d.cts → index-DRf5AP3P.d.mts} +4 -3
  211. package/dist/index-twsdbZWU.d.cts +10 -0
  212. package/dist/processAudits-BFokHhCO.cjs.map +1 -1
  213. package/dist/processAudits-DfcB-X-4.mjs.map +1 -1
  214. package/dist/publisher-Bw4770Hi.mjs.map +1 -1
  215. package/dist/publisher-lFQleddL.cjs.map +1 -1
  216. package/dist/publisher.d.cts +2 -1
  217. package/dist/publisher.d.mts +2 -1
  218. package/dist/subscribers/Subscriber.cjs +1 -1
  219. package/dist/subscribers/Subscriber.mjs +1 -1
  220. package/dist/subscribers/SubscriberBuilder.cjs +2 -2
  221. package/dist/subscribers/SubscriberBuilder.mjs +2 -2
  222. package/dist/subscribers/index.cjs +2 -2
  223. package/dist/subscribers/index.d.cts +2 -2
  224. package/dist/subscribers/index.d.mts +2 -2
  225. package/dist/subscribers/index.mjs +2 -2
  226. package/package.json +7 -7
  227. package/src/crons/Cron.ts +12 -3
  228. package/src/crons/CronBuilder.ts +85 -13
  229. package/src/crons/__tests__/CronBuilder.state-isolation.spec.ts +2 -2
  230. package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +29 -6
  231. package/src/endpoints/Endpoint.ts +156 -40
  232. package/src/endpoints/EndpointBuilder.ts +123 -17
  233. package/src/endpoints/EndpointFactory.ts +5 -1
  234. package/src/endpoints/HonoEndpointAdaptor.ts +35 -5
  235. package/src/endpoints/TestEndpointAdaptor.ts +22 -2
  236. package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.spec.ts +1 -1
  237. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.audits.spec.ts +2 -2
  238. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.events.spec.ts +9 -9
  239. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.kysely-audit.integration.spec.ts +79 -40
  240. package/src/endpoints/__tests__/Endpoint.cookies.spec.ts +3 -1
  241. package/src/endpoints/__tests__/Endpoint.manifest.spec.ts +1 -1
  242. package/src/endpoints/__tests__/EndpointBuilder.audit.spec.ts +35 -11
  243. package/src/endpoints/__tests__/EndpointFactory.authorizers.spec.ts +51 -14
  244. package/src/endpoints/__tests__/EndpointFactory.reference-audit.spec.ts +8 -8
  245. package/src/endpoints/__tests__/EndpointFactory.state-isolation.spec.ts +11 -11
  246. package/src/endpoints/__tests__/HonoEndpointAdaptor.audit-transactions.spec.ts +44 -26
  247. package/src/endpoints/__tests__/HonoEndpointAdaptor.audits.spec.ts +10 -10
  248. package/src/endpoints/__tests__/HonoEndpointAdaptor.events.spec.ts +8 -8
  249. package/src/endpoints/__tests__/HonoEndpointAdaptor.kysely-audit.integration.spec.ts +446 -61
  250. package/src/endpoints/__tests__/HonoEndpointAdaptor.openapi.spec.ts +4 -4
  251. package/src/endpoints/audit.ts +1 -1
  252. package/src/endpoints/processAudits.ts +32 -23
  253. package/src/functions/AWSLambdaFunction.ts +125 -12
  254. package/src/functions/BaseFunctionBuilder.ts +51 -3
  255. package/src/functions/Function.ts +73 -9
  256. package/src/functions/FunctionBuilder.ts +153 -17
  257. package/src/functions/FunctionExecutionWrapper.ts +133 -2
  258. package/src/functions/TestFunctionAdaptor.ts +94 -8
  259. package/src/functions/__tests__/AWSLambdaFunctionAdaptor.spec.ts +82 -0
  260. package/src/functions/__tests__/Function.audits.spec.ts +393 -0
  261. package/src/functions/__tests__/Function.spec.ts +76 -0
  262. package/src/functions/__tests__/FunctionBuilder.state-isolation.spec.ts +11 -5
  263. package/src/publisher.ts +12 -1
  264. package/dist/AWSLambdaFunction-DMxScuaw.cjs.map +0 -1
  265. package/dist/AWSLambdaFunction-DSB2oaFG.d.mts +0 -27
  266. package/dist/AWSLambdaFunction-cL8A169J.mjs.map +0 -1
  267. package/dist/AWSLambdaFunction-t6q2o8EL.d.cts +0 -27
  268. package/dist/AmazonApiGatewayEndpointAdaptor-CIEhW1TQ.mjs.map +0 -1
  269. package/dist/AmazonApiGatewayEndpointAdaptor-H8YvtfQm.cjs.map +0 -1
  270. package/dist/BaseFunctionBuilder-B8rT07QR.cjs.map +0 -1
  271. package/dist/BaseFunctionBuilder-CT7p10K1.mjs.map +0 -1
  272. package/dist/Cron-Bnd-2pgE.cjs.map +0 -1
  273. package/dist/Cron-DNRjf2cp.mjs.map +0 -1
  274. package/dist/CronBuilder-DdR2TuQa.mjs.map +0 -1
  275. package/dist/CronBuilder-dtw4ZyH6.cjs.map +0 -1
  276. package/dist/Endpoint-B69TqESg.mjs.map +0 -1
  277. package/dist/Endpoint-B9PryZES.cjs.map +0 -1
  278. package/dist/EndpointBuilder-DnVL-EU_.mjs.map +0 -1
  279. package/dist/EndpointBuilder-DofwCnWJ.cjs.map +0 -1
  280. package/dist/EndpointFactory-Ba9mx9MU.cjs.map +0 -1
  281. package/dist/EndpointFactory-pPaIGFHV.mjs.map +0 -1
  282. package/dist/Function-CO-s2pB8.cjs.map +0 -1
  283. package/dist/Function-COnc-tWM.mjs.map +0 -1
  284. package/dist/FunctionBuilder-CMhLQ4dt.mjs.map +0 -1
  285. package/dist/FunctionBuilder-_hMwZUof.cjs.map +0 -1
  286. package/dist/FunctionExecutionWrapper-Ci-ookJG.d.cts +0 -24
  287. package/dist/FunctionExecutionWrapper-DHFMLrOl.d.mts +0 -24
  288. package/dist/FunctionExecutionWrapper-i9v5L3Av.mjs +0 -36
  289. package/dist/FunctionExecutionWrapper-i9v5L3Av.mjs.map +0 -1
  290. package/dist/FunctionExecutionWrapper-sxJNTpuc.cjs +0 -42
  291. package/dist/FunctionExecutionWrapper-sxJNTpuc.cjs.map +0 -1
  292. package/dist/HonoEndpointAdaptor-Cw2if5cG.cjs.map +0 -1
  293. package/dist/HonoEndpointAdaptor-DAfnTFVS.mjs.map +0 -1
  294. package/dist/TestEndpointAdaptor-Bn1WRFph.cjs.map +0 -1
  295. package/dist/TestEndpointAdaptor-DubQOJk_.mjs.map +0 -1
  296. package/dist/functions-BYqZAob8.mjs +0 -8
  297. package/dist/index-D-a7e2gv.d.mts +0 -9
package/README.md CHANGED
@@ -12,6 +12,7 @@ A comprehensive framework for building type-safe HTTP endpoints, cloud functions
12
12
  - **Multiple Adapters**: AWS Lambda, API Gateway (v1/v2), and Hono support
13
13
  - **StandardSchema Validation**: Works with Zod, Valibot, and other validation libraries
14
14
  - **Event Publishing**: Integrated event publishing from any construct
15
+ - **Audit Logging**: Transaction-aware audit system with automatic rollback support
15
16
  - **Rate Limiting**: Built-in rate limiting with configurable storage
16
17
  - **OpenAPI Integration**: Generate OpenAPI specifications from endpoints
17
18
 
@@ -318,6 +319,452 @@ export const createUser = e
318
319
  });
319
320
  ```
320
321
 
322
+ ### Database Context
323
+
324
+ Inject a database instance directly into the handler context using `.database()`:
325
+
326
+ ```typescript
327
+ import { e } from '@geekmidas/constructs/endpoints';
328
+ import type { Service } from '@geekmidas/services';
329
+ import type { EnvironmentParser } from '@geekmidas/envkit';
330
+ import { Kysely, PostgresDialect } from 'kysely';
331
+ import { z } from 'zod';
332
+
333
+ // Define a database service
334
+ const databaseService = {
335
+ serviceName: 'database' as const,
336
+ async register(envParser: EnvironmentParser<{}>) {
337
+ const config = envParser.create((get) => ({
338
+ url: get('DATABASE_URL').string()
339
+ })).parse();
340
+
341
+ return new Kysely<Database>({
342
+ dialect: new PostgresDialect({
343
+ connectionString: config.url
344
+ })
345
+ });
346
+ }
347
+ } satisfies Service<'database', Kysely<Database>>;
348
+
349
+ // Use .database() to inject db into context
350
+ export const getUsers = e
351
+ .get('/users')
352
+ .output(z.array(userSchema))
353
+ .database(databaseService)
354
+ .handle(async ({ db }) => {
355
+ // db is always defined when .database() is called (not optional)
356
+ const users = await db
357
+ .selectFrom('users')
358
+ .selectAll()
359
+ .execute();
360
+
361
+ return users;
362
+ });
363
+ ```
364
+
365
+ **Key features:**
366
+
367
+ - **Type-safe**: `db` is only available in the context when `.database()` is called
368
+ - **Non-optional**: Unlike `services.database`, `db` is always defined (not `undefined`)
369
+ - **Automatic transaction**: When combined with `.auditor()` using `KyselyAuditStorage`, `db` is automatically the transaction
370
+
371
+ #### Database with Audit Transactions
372
+
373
+ When using both `.database()` and `.auditor()` with the same database, `db` is automatically the transaction - ensuring ACID compliance without any extra code:
374
+
375
+ ```typescript
376
+ export const createUser = e
377
+ .post('/users')
378
+ .body(z.object({ name: z.string(), email: z.string().email() }))
379
+ .output(userSchema)
380
+ .database(databaseService)
381
+ .auditor(auditStorageService)
382
+ .handle(async ({ body, db }) => {
383
+ // db is automatically the transaction when auditor uses KyselyAuditStorage
384
+ // Both the user insert and audit records commit/rollback together
385
+ const user = await db
386
+ .insertInto('users')
387
+ .values({ id: crypto.randomUUID(), ...body })
388
+ .returningAll()
389
+ .executeTakeFirstOrThrow();
390
+
391
+ return user;
392
+ });
393
+ ```
394
+
395
+ **How it works:**
396
+ - Without `.auditor()`: `db` is the raw database connection
397
+ - With `.auditor()` using `KyselyAuditStorage` **with matching `databaseServiceName`**: `db` is automatically the transaction
398
+ - With `.auditor()` using a different storage or different database: `db` remains the raw database
399
+
400
+ For automatic transaction sharing, the audit storage must declare the same database service name:
401
+
402
+ ```typescript
403
+ const auditStorageService = {
404
+ serviceName: 'auditStorage' as const,
405
+ async register(envParser: EnvironmentParser<{}>) {
406
+ const db = await databaseService.register(envParser);
407
+ return new KyselyAuditStorage({
408
+ db,
409
+ tableName: 'audit_logs',
410
+ databaseServiceName: 'database', // Must match databaseService.serviceName
411
+ });
412
+ }
413
+ };
414
+ ```
415
+
416
+ ### Audit Logging
417
+
418
+ Add transaction-aware audit logging to track data changes. Audits run **inside** the same database transaction as your mutations, ensuring they're atomically committed or rolled back together.
419
+
420
+ #### Setting Up Audit Storage
421
+
422
+ First, create an audit storage service using `@geekmidas/audit`:
423
+
424
+ ```typescript
425
+ import { KyselyAuditStorage } from '@geekmidas/audit/kysely';
426
+ import type { Service } from '@geekmidas/services';
427
+ import type { EnvironmentParser } from '@geekmidas/envkit';
428
+
429
+ const auditStorageService = {
430
+ serviceName: 'auditStorage' as const,
431
+ async register(envParser: EnvironmentParser<{}>) {
432
+ const db = await databaseService.register(envParser);
433
+ return new KyselyAuditStorage({
434
+ db,
435
+ tableName: 'audit_logs',
436
+ // Set this to enable automatic transaction sharing with .database()
437
+ databaseServiceName: databaseService.serviceName,
438
+ });
439
+ }
440
+ } satisfies Service<'auditStorage', KyselyAuditStorage<Database>>;
441
+ ```
442
+
443
+ #### Defining Audit Action Types
444
+
445
+ Define type-safe audit actions for your application:
446
+
447
+ ```typescript
448
+ import type { AuditableAction } from '@geekmidas/audit';
449
+
450
+ type AppAuditAction =
451
+ | AuditableAction<'user.created', { userId: string; email: string }>
452
+ | AuditableAction<'user.updated', { userId: string; changes: string[] }>
453
+ | AuditableAction<'user.deleted', { userId: string; reason?: string }>
454
+ | AuditableAction<'order.placed', { orderId: string; total: number }>;
455
+ ```
456
+
457
+ #### Declarative Audits
458
+
459
+ Define audits declaratively on the endpoint - they're automatically recorded after successful handler execution:
460
+
461
+ ```typescript
462
+ import { e } from '@geekmidas/constructs/endpoints';
463
+ import { z } from 'zod';
464
+
465
+ const userSchema = z.object({
466
+ id: z.string(),
467
+ name: z.string(),
468
+ email: z.string().email()
469
+ });
470
+
471
+ export const createUser = e
472
+ .post('/users')
473
+ .body(z.object({ name: z.string(), email: z.string().email() }))
474
+ .output(userSchema)
475
+ .database(databaseService)
476
+ .auditor(auditStorageService)
477
+ // Optional: extract actor from request context
478
+ .actor(({ session, header }) => ({
479
+ id: session?.userId ?? 'anonymous',
480
+ type: session ? 'user' : 'anonymous',
481
+ ip: header('x-forwarded-for'),
482
+ }))
483
+ // Declarative audits - type-safe with AppAuditAction
484
+ .audit<AppAuditAction>([
485
+ {
486
+ type: 'user.created',
487
+ payload: (response) => ({
488
+ userId: response.id,
489
+ email: response.email,
490
+ }),
491
+ // Optional: only audit when condition is true
492
+ when: (response) => response.email !== 'system@example.com',
493
+ // Optional: link audit to entity for querying
494
+ entityId: (response) => response.id,
495
+ table: 'users',
496
+ },
497
+ ])
498
+ .handle(async ({ body, db }) => {
499
+ // db is automatically the transaction when auditor uses KyselyAuditStorage
500
+ const user = await db
501
+ .insertInto('users')
502
+ .values({ id: crypto.randomUUID(), ...body })
503
+ .returningAll()
504
+ .executeTakeFirstOrThrow();
505
+
506
+ return user;
507
+ });
508
+ ```
509
+
510
+ **Important**: When using `KyselyAuditStorage`, the adaptor wraps handler execution in a database transaction. The `db` in the context is automatically the transaction, so you can use it directly for ACID-compliant mutations.
511
+
512
+ #### Manual Audits in Handlers
513
+
514
+ For complex scenarios, use `ctx.auditor` to record audits manually within your handler:
515
+
516
+ ```typescript
517
+ export const processOrder = e
518
+ .post('/orders')
519
+ .database(databaseService)
520
+ .services([paymentService])
521
+ .auditor(auditStorageService)
522
+ .actor(({ session }) => ({ id: session.userId, type: 'user' }))
523
+ .handle(async ({ body, db, services, auditor }) => {
524
+ // db is automatically the transaction when auditor uses KyselyAuditStorage
525
+ const order = await db
526
+ .insertInto('orders')
527
+ .values(body)
528
+ .returningAll()
529
+ .executeTakeFirstOrThrow();
530
+
531
+ // Manual audit for payment (external service call)
532
+ const payment = await services.payment.charge(order.total);
533
+ auditor.audit('payment.processed', {
534
+ orderId: order.id,
535
+ amount: order.total,
536
+ transactionId: payment.transactionId,
537
+ });
538
+
539
+ // Conditional audit for high-value orders
540
+ if (order.total > 10000) {
541
+ auditor.audit('order.high_value', {
542
+ orderId: order.id,
543
+ total: order.total,
544
+ requiresReview: true,
545
+ });
546
+ }
547
+
548
+ return order;
549
+ });
550
+ ```
551
+
552
+ #### Combined Declarative and Manual Audits
553
+
554
+ You can use both approaches together:
555
+
556
+ ```typescript
557
+ export const updateUser = e
558
+ .put('/users/:id')
559
+ .params(z.object({ id: z.string() }))
560
+ .body(z.object({ name: z.string().optional(), email: z.string().email().optional() }))
561
+ .output(userSchema)
562
+ .database(databaseService)
563
+ .auditor(auditStorageService)
564
+ .actor(({ session }) => ({ id: session.userId, type: 'user' }))
565
+ // Declarative audit - always runs on success
566
+ .audit<AppAuditAction>([
567
+ {
568
+ type: 'user.updated',
569
+ payload: (response) => ({
570
+ userId: response.id,
571
+ changes: ['profile'],
572
+ }),
573
+ },
574
+ ])
575
+ .handle(async ({ params, body, db, auditor }) => {
576
+ // db is automatically the transaction when auditor uses KyselyAuditStorage
577
+
578
+ // Fetch old values for comparison
579
+ const oldUser = await db
580
+ .selectFrom('users')
581
+ .where('id', '=', params.id)
582
+ .selectAll()
583
+ .executeTakeFirstOrThrow();
584
+
585
+ // Update user
586
+ const user = await db
587
+ .updateTable('users')
588
+ .set(body)
589
+ .where('id', '=', params.id)
590
+ .returningAll()
591
+ .executeTakeFirstOrThrow();
592
+
593
+ // Manual audit with old/new values for detailed change tracking
594
+ if (oldUser.email !== user.email) {
595
+ auditor.audit('user.email_changed', {
596
+ userId: user.id,
597
+ oldEmail: oldUser.email,
598
+ newEmail: user.email,
599
+ });
600
+ }
601
+
602
+ return user;
603
+ });
604
+ ```
605
+
606
+ #### How Transaction Support Works
607
+
608
+ When using `KyselyAuditStorage`, the adaptor automatically:
609
+
610
+ 1. **Creates an audit context** before handler execution
611
+ 2. **Wraps execution in a transaction** using `withAuditableTransaction`
612
+ 3. **Passes the auditor** to your handler via `ctx.auditor`
613
+ 4. **Processes declarative audits** after the handler succeeds
614
+ 5. **Flushes all audits** to storage inside the transaction
615
+ 6. **Commits or rolls back** - if the handler throws, both data and audits are rolled back
616
+
617
+ ```
618
+ ┌─────────────────────────────────────────────────────────────┐
619
+ │ Request Flow │
620
+ ├─────────────────────────────────────────────────────────────┤
621
+ │ 1. Create audit context (auditor + storage) │
622
+ │ 2. BEGIN TRANSACTION │
623
+ │ ├── Execute handler (with ctx.auditor) │
624
+ │ ├── Handler calls auditor.audit() for manual audits │
625
+ │ ├── Process declarative .audit() definitions │
626
+ │ ├── Flush all audit records to storage │
627
+ │ 3. COMMIT (or ROLLBACK if handler throws) │
628
+ └─────────────────────────────────────────────────────────────┘
629
+ ```
630
+
631
+ This ensures:
632
+ - **Atomicity**: Audits are never written if the mutation fails
633
+ - **Consistency**: No orphaned audit records for failed operations
634
+ - **Rollback safety**: Manual audits recorded before a later error are also rolled back
635
+
636
+ #### Audit Table Migration
637
+
638
+ Create a Kysely migration for the audit table:
639
+
640
+ ```typescript
641
+ // migrations/YYYYMMDDHHMMSS_create_audit_logs.ts
642
+ import type { Kysely } from 'kysely';
643
+ import { sql } from 'kysely';
644
+
645
+ export async function up(db: Kysely<unknown>): Promise<void> {
646
+ await db.schema
647
+ .createTable('audit_logs')
648
+ .addColumn('id', 'varchar(32)', (col) => col.primaryKey())
649
+ .addColumn('type', 'varchar', (col) => col.notNull())
650
+ .addColumn('operation', 'varchar', (col) => col.notNull())
651
+ .addColumn('table', 'varchar')
652
+ .addColumn('entity_id', 'varchar')
653
+ .addColumn('old_values', 'jsonb')
654
+ .addColumn('new_values', 'jsonb')
655
+ .addColumn('payload', 'jsonb')
656
+ .addColumn('timestamp', 'timestamp', (col) =>
657
+ col.defaultTo(sql`now()`).notNull(),
658
+ )
659
+ .addColumn('actor_id', 'varchar')
660
+ .addColumn('actor_type', 'varchar')
661
+ .addColumn('actor_data', 'jsonb')
662
+ .addColumn('metadata', 'jsonb')
663
+ .execute();
664
+
665
+ // Create indexes for common queries
666
+ await db.schema
667
+ .createIndex('idx_audit_logs_type')
668
+ .on('audit_logs')
669
+ .column('type')
670
+ .execute();
671
+
672
+ await db.schema
673
+ .createIndex('idx_audit_logs_entity')
674
+ .on('audit_logs')
675
+ .column('entity_id')
676
+ .execute();
677
+
678
+ await db.schema
679
+ .createIndex('idx_audit_logs_actor')
680
+ .on('audit_logs')
681
+ .column('actor_id')
682
+ .execute();
683
+
684
+ await db.schema
685
+ .createIndex('idx_audit_logs_timestamp')
686
+ .on('audit_logs')
687
+ .column('timestamp')
688
+ .execute();
689
+ }
690
+
691
+ export async function down(db: Kysely<unknown>): Promise<void> {
692
+ await db.schema.dropTable('audit_logs').execute();
693
+ }
694
+ ```
695
+
696
+ If using camelCase column names with Kysely's `CamelCasePlugin`:
697
+
698
+ ```typescript
699
+ // migrations/YYYYMMDDHHMMSS_create_audit_logs.ts
700
+ import type { Kysely } from 'kysely';
701
+ import { sql } from 'kysely';
702
+
703
+ export async function up(db: Kysely<unknown>): Promise<void> {
704
+ await db.schema
705
+ .createTable('auditLogs')
706
+ .addColumn('id', 'varchar(32)', (col) => col.primaryKey())
707
+ .addColumn('type', 'varchar', (col) => col.notNull())
708
+ .addColumn('operation', 'varchar', (col) => col.notNull())
709
+ .addColumn('table', 'varchar')
710
+ .addColumn('entityId', 'varchar')
711
+ .addColumn('oldValues', 'jsonb')
712
+ .addColumn('newValues', 'jsonb')
713
+ .addColumn('payload', 'jsonb')
714
+ .addColumn('timestamp', 'timestamp', (col) =>
715
+ col.defaultTo(sql`now()`).notNull(),
716
+ )
717
+ .addColumn('actorId', 'varchar')
718
+ .addColumn('actorType', 'varchar')
719
+ .addColumn('actorData', 'jsonb')
720
+ .addColumn('metadata', 'jsonb')
721
+ .execute();
722
+
723
+ await db.schema
724
+ .createIndex('idx_audit_logs_type')
725
+ .on('auditLogs')
726
+ .column('type')
727
+ .execute();
728
+
729
+ await db.schema
730
+ .createIndex('idx_audit_logs_entity')
731
+ .on('auditLogs')
732
+ .column('entityId')
733
+ .execute();
734
+
735
+ await db.schema
736
+ .createIndex('idx_audit_logs_actor')
737
+ .on('auditLogs')
738
+ .column('actorId')
739
+ .execute();
740
+
741
+ await db.schema
742
+ .createIndex('idx_audit_logs_timestamp')
743
+ .on('auditLogs')
744
+ .column('timestamp')
745
+ .execute();
746
+ }
747
+
748
+ export async function down(db: Kysely<unknown>): Promise<void> {
749
+ await db.schema.dropTable('auditLogs').execute();
750
+ }
751
+ ```
752
+
753
+ #### Querying Audit Records
754
+
755
+ The `KyselyAuditStorage` provides a `query` method:
756
+
757
+ ```typescript
758
+ // In a handler or service
759
+ const audits = await auditStorage.query({
760
+ entityId: userId,
761
+ table: 'users',
762
+ limit: 50,
763
+ orderBy: 'timestamp',
764
+ orderDirection: 'desc',
765
+ });
766
+ ```
767
+
321
768
  ### Rate Limiting
322
769
 
323
770
  Add rate limiting to endpoints:
@@ -603,6 +1050,7 @@ const envVars = await endpoint.getEnvironment();
603
1050
 
604
1051
  - [@geekmidas/services](../services) - Service discovery and dependency injection
605
1052
  - [@geekmidas/events](../events) - Event publishing and subscription
1053
+ - [@geekmidas/audit](../audit) - Transaction-aware audit logging
606
1054
  - [@geekmidas/logger](../logger) - Structured logging
607
1055
  - [@geekmidas/envkit](../envkit) - Environment configuration
608
1056
  - [@geekmidas/errors](../errors) - HTTP error classes
@@ -0,0 +1,30 @@
1
+ import { Function, FunctionHandler } from "./Function-VI1TB3Mh.cjs";
2
+ import { FunctionExecutionWrapper } from "./FunctionExecutionWrapper-CwtwYozd.cjs";
3
+ import { AuditStorage, AuditableAction } from "@geekmidas/audit";
4
+ import { EventPublisher } from "@geekmidas/events";
5
+ import { Logger } from "@geekmidas/logger";
6
+ import { Service } from "@geekmidas/services";
7
+ import { StandardSchemaV1 } from "@standard-schema/spec";
8
+ import { ComposableStandardSchema } from "@geekmidas/schema";
9
+ import { EnvironmentParser } from "@geekmidas/envkit";
10
+ import { Handler } from "aws-lambda";
11
+
12
+ //#region src/functions/AWSLambdaFunction.d.ts
13
+ type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<TEvent, TResult>;
14
+ declare class AWSLambdaFunction<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> extends FunctionExecutionWrapper<TInput, TOutSchema, TServices, TLogger, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction> {
15
+ readonly fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>;
16
+ constructor(envParser: EnvironmentParser<{}>, fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>);
17
+ private error;
18
+ private baseInput;
19
+ private input;
20
+ private loggerMiddleware;
21
+ private services;
22
+ private database;
23
+ private auditor;
24
+ private events;
25
+ private _handler;
26
+ get handler(): AWSLambdaHandler;
27
+ }
28
+ //#endregion
29
+ export { AWSLambdaFunction, AWSLambdaHandler };
30
+ //# sourceMappingURL=AWSLambdaFunction-B-Oxr8qt.d.cts.map
@@ -1,6 +1,6 @@
1
1
  const require_chunk = require('./chunk-CUT6urMc.cjs');
2
- const require_FunctionBuilder = require('./FunctionBuilder-_hMwZUof.cjs');
3
- const require_FunctionExecutionWrapper = require('./FunctionExecutionWrapper-sxJNTpuc.cjs');
2
+ const require_FunctionBuilder = require('./FunctionBuilder-DXvG_XD-.cjs');
3
+ const require_FunctionExecutionWrapper = require('./FunctionExecutionWrapper-DkNycmOh.cjs');
4
4
  const __geekmidas_errors = require_chunk.__toESM(require("@geekmidas/errors"));
5
5
  const __middy_core = require_chunk.__toESM(require("@middy/core"));
6
6
 
@@ -54,6 +54,27 @@ var AWSLambdaFunction = class extends require_FunctionExecutionWrapper.FunctionE
54
54
  req.event.services = await this.getServices();
55
55
  } };
56
56
  }
57
+ database() {
58
+ return { before: async (req) => {
59
+ req.event.db = await this.getDatabase();
60
+ } };
61
+ }
62
+ auditor() {
63
+ return {
64
+ before: async (req) => {
65
+ req.event.auditor = await this.createAuditor();
66
+ },
67
+ after: async (req) => {
68
+ if (req.event.auditor) {
69
+ const records = req.event.auditor.getRecords();
70
+ if (records.length > 0) {
71
+ this.logger.debug({ auditCount: records.length }, "Flushing function audits");
72
+ await req.event.auditor.flush();
73
+ }
74
+ }
75
+ }
76
+ };
77
+ }
57
78
  events() {
58
79
  return { after: async (req) => {
59
80
  const response = req.response || void 0;
@@ -64,14 +85,16 @@ var AWSLambdaFunction = class extends require_FunctionExecutionWrapper.FunctionE
64
85
  const result = await this.fn["fn"]({
65
86
  input: event.parsedInput,
66
87
  services: event.services,
67
- logger: event.logger
88
+ logger: event.logger,
89
+ db: event.db,
90
+ auditor: event.auditor
68
91
  });
69
92
  const output = await this.fn.parseOutput(result);
70
93
  return output;
71
94
  }
72
95
  get handler() {
73
96
  const handler = this._handler.bind(this);
74
- return (0, __middy_core.default)(handler).use(this.loggerMiddleware()).use(this.baseInput()).use(this.error()).use(this.services()).use(this.input()).use(this.events());
97
+ return (0, __middy_core.default)(handler).use(this.loggerMiddleware()).use(this.baseInput()).use(this.error()).use(this.services()).use(this.database()).use(this.auditor()).use(this.input()).use(this.events());
75
98
  }
76
99
  };
77
100
 
@@ -82,4 +105,4 @@ Object.defineProperty(exports, 'AWSLambdaFunction', {
82
105
  return AWSLambdaFunction;
83
106
  }
84
107
  });
85
- //# sourceMappingURL=AWSLambdaFunction-DMxScuaw.cjs.map
108
+ //# sourceMappingURL=AWSLambdaFunction-C-fuCLA3.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AWSLambdaFunction-C-fuCLA3.cjs","names":["FunctionExecutionWrapper","envParser: EnvironmentParser<{}>","fn: Function<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName,\n TAuditAction,\n FunctionHandler<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditStorage,\n TAuditAction\n >\n >","event: FunctionEvent<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TDatabase,\n TAuditAction\n >"],"sources":["../src/functions/AWSLambdaFunction.ts"],"sourcesContent":["import type { AuditStorage, AuditableAction, Auditor } from '@geekmidas/audit';\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { Context, Handler } from 'aws-lambda';\nimport type { Function, FunctionHandler } from './Function';\nimport { FunctionBuilder } from './FunctionBuilder';\n\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type {\n ComposableStandardSchema,\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport { FunctionExecutionWrapper } from './FunctionExecutionWrapper';\n\nexport type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<\n TEvent,\n TResult\n>;\n\ntype FunctionEvent<\n TEvent,\n TInput extends ComposableStandardSchema | undefined,\n TServices extends Service[],\n TLogger extends Logger,\n TDatabase = undefined,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> = TEvent & {\n parsedInput: InferComposableStandardSchema<TInput>;\n services: ServiceRecord<TServices>;\n logger: TLogger;\n db: TDatabase | undefined;\n auditor: Auditor<TAuditAction> | undefined;\n};\n\ntype Middleware<\n TEvent,\n TInput extends ComposableStandardSchema | undefined,\n TServices extends Service[],\n TLogger extends Logger,\n TOutSchema extends StandardSchemaV1 | undefined,\n TDatabase = undefined,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> = MiddlewareObj<\n FunctionEvent<TEvent, TInput, TServices, TLogger, TDatabase, TAuditAction>,\n InferComposableStandardSchema<TOutSchema>,\n Error,\n Context\n>;\n\nexport class AWSLambdaFunction<\n TInput extends ComposableStandardSchema | undefined = undefined,\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TDatabase = undefined,\n TDatabaseServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> extends FunctionExecutionWrapper<\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName,\n TAuditAction\n> {\n constructor(\n envParser: EnvironmentParser<{}>,\n readonly fn: Function<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName,\n TAuditAction,\n FunctionHandler<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditStorage,\n TAuditAction\n >\n >,\n ) {\n super(envParser, fn);\n }\n\n private error<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n onError: (req) => {\n const logger = req.event?.logger || this.fn.logger;\n logger.error(req.error || {}, 'Error processing function');\n\n // Re-throw the wrapped error to let Lambda handle it\n throw wrapError(req.error);\n },\n };\n }\n\n private baseInput<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: (req) => {},\n };\n }\n\n private input<\n TEvent extends { input: InferComposableStandardSchema<TInput> },\n >(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n try {\n // Parse input if schema is provided\n if (this.fn.input) {\n const parsedInput =\n await FunctionBuilder.parseComposableStandardSchema(\n req.event,\n this.fn.input,\n );\n\n req.event.parsedInput =\n parsedInput as InferComposableStandardSchema<TInput>;\n } else {\n // If no schema, pass the event as-is\n req.event.parsedInput = req.event as any;\n }\n } catch (error) {\n this.logger.error(\n { error, event: req.event },\n 'Failed to parse input',\n );\n throw error;\n }\n },\n };\n }\n\n private loggerMiddleware<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: (req) => {\n this._logger = this.fn.logger.child({\n fn: {\n name: req.context.functionName,\n version: req.context.functionVersion,\n memory: req.context.memoryLimitInMB,\n },\n req: {\n id: req.context.awsRequestId,\n },\n }) as TLogger;\n\n req.event.logger = this._logger;\n },\n };\n }\n\n private services<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n req.event.services = await this.getServices();\n },\n };\n }\n\n private database<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n req.event.db = await this.getDatabase();\n },\n };\n }\n\n private auditor<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n req.event.auditor = await this.createAuditor();\n },\n after: async (req) => {\n // Flush any pending audits after successful execution\n if (req.event.auditor) {\n const records = req.event.auditor.getRecords();\n if (records.length > 0) {\n this.logger.debug(\n { auditCount: records.length },\n 'Flushing function audits',\n );\n await req.event.auditor.flush();\n }\n }\n },\n };\n }\n\n private events<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n after: async (req) => {\n const response = (req.response ||\n undefined) as InferStandardSchema<TOutSchema>;\n await this.publishEvents(response);\n },\n };\n }\n\n private async _handler<TEvent>(\n event: FunctionEvent<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TDatabase,\n TAuditAction\n >,\n ) {\n // Execute the function with the parsed context\n const result = await this.fn['fn']({\n input: event.parsedInput,\n services: event.services,\n logger: event.logger,\n db: event.db,\n auditor: event.auditor,\n } as any);\n\n // Parse output if schema is provided\n const output = await this.fn.parseOutput(result);\n\n return output;\n }\n\n get handler(): AWSLambdaHandler {\n const handler = this._handler.bind(this);\n\n // Apply middleware in order\n return middy(handler)\n .use(this.loggerMiddleware())\n .use(this.baseInput())\n .use(this.error())\n .use(this.services())\n .use(this.database())\n .use(this.auditor())\n .use(this.input())\n .use(this.events()) as unknown as AWSLambdaHandler;\n }\n}\n"],"mappings":";;;;;;;AA4DA,IAAa,oBAAb,cAeUA,0DAYR;CACA,YACEC,WACSC,IAsBT;AACA,QAAM,WAAW,GAAG;EAvBX;CAwBV;CAED,AAAQ,QAQN;AACA,SAAO,EACL,SAAS,CAAC,QAAQ;GAChB,MAAM,SAAS,IAAI,OAAO,UAAU,KAAK,GAAG;AAC5C,UAAO,MAAM,IAAI,SAAS,CAAE,GAAE,4BAA4B;AAG1D,SAAM,kCAAU,IAAI,MAAM;EAC3B,EACF;CACF;CAED,AAAQ,YAQN;AACA,SAAO,EACL,QAAQ,CAAC,QAAQ,CAAE,EACpB;CACF;CAED,AAAQ,QAUN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI;AAEF,QAAI,KAAK,GAAG,OAAO;KACjB,MAAM,cACJ,MAAM,wCAAgB,8BACpB,IAAI,OACJ,KAAK,GAAG,MACT;AAEH,SAAI,MAAM,cACR;IACH,MAEC,KAAI,MAAM,cAAc,IAAI;GAE/B,SAAQ,OAAO;AACd,SAAK,OAAO,MACV;KAAE;KAAO,OAAO,IAAI;IAAO,GAC3B,wBACD;AACD,UAAM;GACP;EACF,EACF;CACF;CAED,AAAQ,mBAQN;AACA,SAAO,EACL,QAAQ,CAAC,QAAQ;AACf,QAAK,UAAU,KAAK,GAAG,OAAO,MAAM;IAClC,IAAI;KACF,MAAM,IAAI,QAAQ;KAClB,SAAS,IAAI,QAAQ;KACrB,QAAQ,IAAI,QAAQ;IACrB;IACD,KAAK,EACH,IAAI,IAAI,QAAQ,aACjB;GACF,EAAC;AAEF,OAAI,MAAM,SAAS,KAAK;EACzB,EACF;CACF;CAED,AAAQ,WAQN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI,MAAM,WAAW,MAAM,KAAK,aAAa;EAC9C,EACF;CACF;CAED,AAAQ,WAQN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI,MAAM,KAAK,MAAM,KAAK,aAAa;EACxC,EACF;CACF;CAED,AAAQ,UAQN;AACA,SAAO;GACL,QAAQ,OAAO,QAAQ;AACrB,QAAI,MAAM,UAAU,MAAM,KAAK,eAAe;GAC/C;GACD,OAAO,OAAO,QAAQ;AAEpB,QAAI,IAAI,MAAM,SAAS;KACrB,MAAM,UAAU,IAAI,MAAM,QAAQ,YAAY;AAC9C,SAAI,QAAQ,SAAS,GAAG;AACtB,WAAK,OAAO,MACV,EAAE,YAAY,QAAQ,OAAQ,GAC9B,2BACD;AACD,YAAM,IAAI,MAAM,QAAQ,OAAO;KAChC;IACF;GACF;EACF;CACF;CAED,AAAQ,SAQN;AACA,SAAO,EACL,OAAO,OAAO,QAAQ;GACpB,MAAM,WAAY,IAAI;AAEtB,SAAM,KAAK,cAAc,SAAS;EACnC,EACF;CACF;CAED,MAAc,SACZC,OAQA;EAEA,MAAM,SAAS,MAAM,KAAK,GAAG,MAAM;GACjC,OAAO,MAAM;GACb,UAAU,MAAM;GAChB,QAAQ,MAAM;GACd,IAAI,MAAM;GACV,SAAS,MAAM;EAChB,EAAQ;EAGT,MAAM,SAAS,MAAM,KAAK,GAAG,YAAY,OAAO;AAEhD,SAAO;CACR;CAED,IAAI,UAA4B;EAC9B,MAAM,UAAU,KAAK,SAAS,KAAK,KAAK;AAGxC,SAAO,0BAAM,QAAQ,CAClB,IAAI,KAAK,kBAAkB,CAAC,CAC5B,IAAI,KAAK,WAAW,CAAC,CACrB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,SAAS,CAAC,CACnB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,QAAQ,CAAC;CACtB;AACF"}
@@ -0,0 +1,30 @@
1
+ import { Function, FunctionHandler } from "./Function-V9M9UVHp.mjs";
2
+ import { FunctionExecutionWrapper } from "./FunctionExecutionWrapper-rhbIYT0Q.mjs";
3
+ import { Service } from "@geekmidas/services";
4
+ import { AuditStorage, AuditableAction } from "@geekmidas/audit";
5
+ import { EnvironmentParser } from "@geekmidas/envkit";
6
+ import { EventPublisher } from "@geekmidas/events";
7
+ import { Logger } from "@geekmidas/logger";
8
+ import { StandardSchemaV1 } from "@standard-schema/spec";
9
+ import { ComposableStandardSchema } from "@geekmidas/schema";
10
+ import { Handler } from "aws-lambda";
11
+
12
+ //#region src/functions/AWSLambdaFunction.d.ts
13
+ type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<TEvent, TResult>;
14
+ declare class AWSLambdaFunction<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> extends FunctionExecutionWrapper<TInput, TOutSchema, TServices, TLogger, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction> {
15
+ readonly fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>;
16
+ constructor(envParser: EnvironmentParser<{}>, fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>);
17
+ private error;
18
+ private baseInput;
19
+ private input;
20
+ private loggerMiddleware;
21
+ private services;
22
+ private database;
23
+ private auditor;
24
+ private events;
25
+ private _handler;
26
+ get handler(): AWSLambdaHandler;
27
+ }
28
+ //#endregion
29
+ export { AWSLambdaFunction, AWSLambdaHandler };
30
+ //# sourceMappingURL=AWSLambdaFunction-CAm9r5ZX.d.mts.map
@@ -1,5 +1,5 @@
1
- import { FunctionBuilder } from "./FunctionBuilder-CMhLQ4dt.mjs";
2
- import { FunctionExecutionWrapper } from "./FunctionExecutionWrapper-i9v5L3Av.mjs";
1
+ import { FunctionBuilder } from "./FunctionBuilder-CVT7bG2o.mjs";
2
+ import { FunctionExecutionWrapper } from "./FunctionExecutionWrapper-Bubnr0zA.mjs";
3
3
  import { wrapError } from "@geekmidas/errors";
4
4
  import middy from "@middy/core";
5
5
 
@@ -53,6 +53,27 @@ var AWSLambdaFunction = class extends FunctionExecutionWrapper {
53
53
  req.event.services = await this.getServices();
54
54
  } };
55
55
  }
56
+ database() {
57
+ return { before: async (req) => {
58
+ req.event.db = await this.getDatabase();
59
+ } };
60
+ }
61
+ auditor() {
62
+ return {
63
+ before: async (req) => {
64
+ req.event.auditor = await this.createAuditor();
65
+ },
66
+ after: async (req) => {
67
+ if (req.event.auditor) {
68
+ const records = req.event.auditor.getRecords();
69
+ if (records.length > 0) {
70
+ this.logger.debug({ auditCount: records.length }, "Flushing function audits");
71
+ await req.event.auditor.flush();
72
+ }
73
+ }
74
+ }
75
+ };
76
+ }
56
77
  events() {
57
78
  return { after: async (req) => {
58
79
  const response = req.response || void 0;
@@ -63,17 +84,19 @@ var AWSLambdaFunction = class extends FunctionExecutionWrapper {
63
84
  const result = await this.fn["fn"]({
64
85
  input: event.parsedInput,
65
86
  services: event.services,
66
- logger: event.logger
87
+ logger: event.logger,
88
+ db: event.db,
89
+ auditor: event.auditor
67
90
  });
68
91
  const output = await this.fn.parseOutput(result);
69
92
  return output;
70
93
  }
71
94
  get handler() {
72
95
  const handler = this._handler.bind(this);
73
- return middy(handler).use(this.loggerMiddleware()).use(this.baseInput()).use(this.error()).use(this.services()).use(this.input()).use(this.events());
96
+ return middy(handler).use(this.loggerMiddleware()).use(this.baseInput()).use(this.error()).use(this.services()).use(this.database()).use(this.auditor()).use(this.input()).use(this.events());
74
97
  }
75
98
  };
76
99
 
77
100
  //#endregion
78
101
  export { AWSLambdaFunction };
79
- //# sourceMappingURL=AWSLambdaFunction-cL8A169J.mjs.map
102
+ //# sourceMappingURL=AWSLambdaFunction-H65WfXLt.mjs.map