@geekmidas/constructs 0.0.12 → 0.0.13

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 (298) 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-Bf9JSWzI.d.cts} +12 -12
  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-Cgk1R0oO.d.mts} +12 -12
  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-DSHl8ZCY.d.cts → HonoEndpointAdaptor-B34kNobH.d.cts} +7 -7
  83. package/dist/{HonoEndpointAdaptor-BElil8O5.d.mts → HonoEndpointAdaptor-BDpi32mH.d.mts} +7 -7
  84. package/dist/{HonoEndpointAdaptor-Cw2if5cG.cjs → HonoEndpointAdaptor-CfLRHHFw.cjs} +8 -4
  85. package/dist/HonoEndpointAdaptor-CfLRHHFw.cjs.map +1 -0
  86. package/dist/{HonoEndpointAdaptor-DAfnTFVS.mjs → HonoEndpointAdaptor-DuyE06nH.mjs} +8 -4
  87. package/dist/HonoEndpointAdaptor-DuyE06nH.mjs.map +1 -0
  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-Bomy7R9z.d.mts +10 -0
  211. package/dist/index-DRYfZHb3.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 +6 -6
  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-CUg_hSq-.d.cts +0 -9
  298. package/dist/index-D-a7e2gv.d.mts +0 -9
@@ -1,4 +1,4 @@
1
- import type { AuditStorage } from '@geekmidas/audit';
1
+ import type { AuditStorage, AuditableAction } from '@geekmidas/audit';
2
2
  import type { EventPublisher } from '@geekmidas/events';
3
3
  import type { Logger } from '@geekmidas/logger';
4
4
  import { ConsoleLogger } from '@geekmidas/logger/console';
@@ -21,6 +21,12 @@ export class FunctionBuilder<
21
21
  TEventPublisherServiceName extends string = string,
22
22
  TAuditStorage extends AuditStorage | undefined = undefined,
23
23
  TAuditStorageServiceName extends string = string,
24
+ TDatabase = undefined,
25
+ TDatabaseServiceName extends string = string,
26
+ TAuditAction extends AuditableAction<string, unknown> = AuditableAction<
27
+ string,
28
+ unknown
29
+ >,
24
30
  > extends BaseFunctionBuilder<
25
31
  TInput,
26
32
  OutSchema,
@@ -29,7 +35,9 @@ export class FunctionBuilder<
29
35
  TEventPublisher,
30
36
  TEventPublisherServiceName,
31
37
  TAuditStorage,
32
- TAuditStorageServiceName
38
+ TAuditStorageServiceName,
39
+ TDatabase,
40
+ TDatabaseServiceName
33
41
  > {
34
42
  protected _memorySize?: number;
35
43
 
@@ -57,7 +65,10 @@ export class FunctionBuilder<
57
65
  TEventPublisher,
58
66
  TEventPublisherServiceName,
59
67
  TAuditStorage,
60
- TAuditStorageServiceName
68
+ TAuditStorageServiceName,
69
+ TDatabase,
70
+ TDatabaseServiceName,
71
+ TAuditAction
61
72
  > {
62
73
  this.outputSchema = schema as unknown as OutSchema;
63
74
 
@@ -69,7 +80,10 @@ export class FunctionBuilder<
69
80
  TEventPublisher,
70
81
  TEventPublisherServiceName,
71
82
  TAuditStorage,
72
- TAuditStorageServiceName
83
+ TAuditStorageServiceName,
84
+ TDatabase,
85
+ TDatabaseServiceName,
86
+ TAuditAction
73
87
  >;
74
88
  }
75
89
 
@@ -83,7 +97,10 @@ export class FunctionBuilder<
83
97
  TEventPublisher,
84
98
  TEventPublisherServiceName,
85
99
  TAuditStorage,
86
- TAuditStorageServiceName
100
+ TAuditStorageServiceName,
101
+ TDatabase,
102
+ TDatabaseServiceName,
103
+ TAuditAction
87
104
  > {
88
105
  this.inputSchema = schema as unknown as TInput;
89
106
 
@@ -95,7 +112,10 @@ export class FunctionBuilder<
95
112
  TEventPublisher,
96
113
  TEventPublisherServiceName,
97
114
  TAuditStorage,
98
- TAuditStorageServiceName
115
+ TAuditStorageServiceName,
116
+ TDatabase,
117
+ TDatabaseServiceName,
118
+ TAuditAction
99
119
  >;
100
120
  }
101
121
 
@@ -109,7 +129,10 @@ export class FunctionBuilder<
109
129
  TEventPublisher,
110
130
  TEventPublisherServiceName,
111
131
  TAuditStorage,
112
- TAuditStorageServiceName
132
+ TAuditStorageServiceName,
133
+ TDatabase,
134
+ TDatabaseServiceName,
135
+ TAuditAction
113
136
  > {
114
137
  this._services = uniqBy(
115
138
  [...this._services, ...services],
@@ -124,7 +147,10 @@ export class FunctionBuilder<
124
147
  TEventPublisher,
125
148
  TEventPublisherServiceName,
126
149
  TAuditStorage,
127
- TAuditStorageServiceName
150
+ TAuditStorageServiceName,
151
+ TDatabase,
152
+ TDatabaseServiceName,
153
+ TAuditAction
128
154
  >;
129
155
  }
130
156
 
@@ -138,7 +164,10 @@ export class FunctionBuilder<
138
164
  TEventPublisher,
139
165
  TEventPublisherServiceName,
140
166
  TAuditStorage,
141
- TAuditStorageServiceName
167
+ TAuditStorageServiceName,
168
+ TDatabase,
169
+ TDatabaseServiceName,
170
+ TAuditAction
142
171
  > {
143
172
  this._logger = logger as unknown as TLogger;
144
173
 
@@ -150,7 +179,10 @@ export class FunctionBuilder<
150
179
  TEventPublisher,
151
180
  TEventPublisherServiceName,
152
181
  TAuditStorage,
153
- TAuditStorageServiceName
182
+ TAuditStorageServiceName,
183
+ TDatabase,
184
+ TDatabaseServiceName,
185
+ TAuditAction
154
186
  >;
155
187
  }
156
188
 
@@ -164,7 +196,10 @@ export class FunctionBuilder<
164
196
  T,
165
197
  TName,
166
198
  TAuditStorage,
167
- TAuditStorageServiceName
199
+ TAuditStorageServiceName,
200
+ TDatabase,
201
+ TDatabaseServiceName,
202
+ TAuditAction
168
203
  > {
169
204
  this._publisher = publisher as unknown as Service<
170
205
  TEventPublisherServiceName,
@@ -179,7 +214,10 @@ export class FunctionBuilder<
179
214
  T,
180
215
  TName,
181
216
  TAuditStorage,
182
- TAuditStorageServiceName
217
+ TAuditStorageServiceName,
218
+ TDatabase,
219
+ TDatabaseServiceName,
220
+ TAuditAction
183
221
  >;
184
222
  }
185
223
 
@@ -193,7 +231,10 @@ export class FunctionBuilder<
193
231
  TEventPublisher,
194
232
  TEventPublisherServiceName,
195
233
  T,
196
- TName
234
+ TName,
235
+ TDatabase,
236
+ TDatabaseServiceName,
237
+ TAuditAction
197
238
  > {
198
239
  this._auditorStorage = storage as unknown as Service<
199
240
  TAuditStorageServiceName,
@@ -208,22 +249,115 @@ export class FunctionBuilder<
208
249
  TEventPublisher,
209
250
  TEventPublisherServiceName,
210
251
  T,
211
- TName
252
+ TName,
253
+ TDatabase,
254
+ TDatabaseServiceName,
255
+ TAuditAction
256
+ >;
257
+ }
258
+
259
+ /**
260
+ * Set the audit action types for this function.
261
+ * This provides type-safety for the auditor in the handler context.
262
+ */
263
+ actions<T extends AuditableAction<string, unknown>>(): FunctionBuilder<
264
+ TInput,
265
+ OutSchema,
266
+ TServices,
267
+ TLogger,
268
+ TEventPublisher,
269
+ TEventPublisherServiceName,
270
+ TAuditStorage,
271
+ TAuditStorageServiceName,
272
+ TDatabase,
273
+ TDatabaseServiceName,
274
+ T
275
+ > {
276
+ return this as unknown as FunctionBuilder<
277
+ TInput,
278
+ OutSchema,
279
+ TServices,
280
+ TLogger,
281
+ TEventPublisher,
282
+ TEventPublisherServiceName,
283
+ TAuditStorage,
284
+ TAuditStorageServiceName,
285
+ TDatabase,
286
+ TDatabaseServiceName,
287
+ T
288
+ >;
289
+ }
290
+
291
+ /**
292
+ * Set the database service for this function.
293
+ * The database will be available in the handler context as `db`.
294
+ */
295
+ database<T, TName extends string>(
296
+ service: Service<TName, T>,
297
+ ): FunctionBuilder<
298
+ TInput,
299
+ OutSchema,
300
+ TServices,
301
+ TLogger,
302
+ TEventPublisher,
303
+ TEventPublisherServiceName,
304
+ TAuditStorage,
305
+ TAuditStorageServiceName,
306
+ T,
307
+ TName,
308
+ TAuditAction
309
+ > {
310
+ this._databaseService = service as unknown as Service<
311
+ TDatabaseServiceName,
312
+ TDatabase
313
+ >;
314
+
315
+ return this as unknown as FunctionBuilder<
316
+ TInput,
317
+ OutSchema,
318
+ TServices,
319
+ TLogger,
320
+ TEventPublisher,
321
+ TEventPublisherServiceName,
322
+ TAuditStorage,
323
+ TAuditStorageServiceName,
324
+ T,
325
+ TName,
326
+ TAuditAction
212
327
  >;
213
328
  }
214
329
 
215
330
  handle(
216
- fn: FunctionHandler<TInput, TServices, TLogger, OutSchema>,
331
+ fn: FunctionHandler<
332
+ TInput,
333
+ TServices,
334
+ TLogger,
335
+ OutSchema,
336
+ TDatabase,
337
+ TAuditStorage,
338
+ TAuditAction
339
+ >,
217
340
  ): Function<
218
341
  TInput,
219
342
  TServices,
220
343
  TLogger,
221
344
  OutSchema,
222
- FunctionHandler<TInput, TServices, TLogger, OutSchema>,
223
345
  TEventPublisher,
224
346
  TEventPublisherServiceName,
225
347
  TAuditStorage,
226
- TAuditStorageServiceName
348
+ TAuditStorageServiceName,
349
+ TDatabase,
350
+ TDatabaseServiceName,
351
+ TAuditAction,
352
+ FunctionHandler<
353
+ TInput,
354
+ TServices,
355
+ TLogger,
356
+ OutSchema,
357
+ TDatabase,
358
+ TAuditStorage,
359
+ TAuditAction
360
+ >
227
361
  > {
228
362
  const func = new Function(
229
363
  fn,
@@ -237,6 +371,7 @@ export class FunctionBuilder<
237
371
  this._events,
238
372
  this._memorySize,
239
373
  this._auditorStorage,
374
+ this._databaseService,
240
375
  );
241
376
 
242
377
  // Reset builder state after creating the function to prevent pollution
@@ -245,6 +380,7 @@ export class FunctionBuilder<
245
380
  this._events = [];
246
381
  this._publisher = undefined;
247
382
  this._auditorStorage = undefined;
383
+ this._databaseService = undefined;
248
384
  this.inputSchema = undefined;
249
385
  this.outputSchema = undefined;
250
386
  this._timeout = undefined;
@@ -1,3 +1,6 @@
1
+ import type { AuditStorage, AuditableAction, Auditor } from '@geekmidas/audit';
2
+ import { DefaultAuditor } from '@geekmidas/audit';
3
+ import { withAuditableTransaction } from '@geekmidas/audit/kysely';
1
4
  import type { EnvironmentParser } from '@geekmidas/envkit';
2
5
  import type { EventPublisher } from '@geekmidas/events';
3
6
  import type { Logger } from '@geekmidas/logger';
@@ -23,6 +26,14 @@ export abstract class FunctionExecutionWrapper<
23
26
  TLogger extends Logger = Logger,
24
27
  TEventPublisher extends EventPublisher<any> | undefined = undefined,
25
28
  TEventPublisherServiceName extends string = string,
29
+ TAuditStorage extends AuditStorage | undefined = undefined,
30
+ TAuditStorageServiceName extends string = string,
31
+ TDatabase = undefined,
32
+ TDatabaseServiceName extends string = string,
33
+ TAuditAction extends AuditableAction<string, unknown> = AuditableAction<
34
+ string,
35
+ unknown
36
+ >,
26
37
  > {
27
38
  constructor(
28
39
  protected envParser: EnvironmentParser<{}>,
@@ -31,9 +42,22 @@ export abstract class FunctionExecutionWrapper<
31
42
  TServices,
32
43
  TLogger,
33
44
  TOutSchema,
34
- FunctionHandler<TInput, TServices, TLogger, TOutSchema>,
35
45
  TEventPublisher,
36
- TEventPublisherServiceName
46
+ TEventPublisherServiceName,
47
+ TAuditStorage,
48
+ TAuditStorageServiceName,
49
+ TDatabase,
50
+ TDatabaseServiceName,
51
+ TAuditAction,
52
+ FunctionHandler<
53
+ TInput,
54
+ TServices,
55
+ TLogger,
56
+ TOutSchema,
57
+ TDatabase,
58
+ TAuditStorage,
59
+ TAuditAction
60
+ >
37
61
  >,
38
62
  ) {}
39
63
 
@@ -56,6 +80,113 @@ export abstract class FunctionExecutionWrapper<
56
80
  return this.serviceDiscovery.register(this.fn.services);
57
81
  }
58
82
 
83
+ async getDatabase(): Promise<TDatabase | undefined> {
84
+ if (!this.fn.databaseService) {
85
+ return undefined;
86
+ }
87
+
88
+ const services = await this.serviceDiscovery.register([
89
+ this.fn.databaseService,
90
+ ]);
91
+
92
+ return services[
93
+ this.fn.databaseService.serviceName as keyof typeof services
94
+ ] as TDatabase;
95
+ }
96
+
97
+ /**
98
+ * Get the audit storage service if configured.
99
+ * Returns undefined if no auditor storage is configured.
100
+ */
101
+ async getAuditStorage(): Promise<TAuditStorage | undefined> {
102
+ if (!this.fn.auditorStorageService) {
103
+ return undefined;
104
+ }
105
+
106
+ const services = await this.serviceDiscovery.register([
107
+ this.fn.auditorStorageService,
108
+ ]);
109
+
110
+ return services[
111
+ this.fn.auditorStorageService.serviceName as keyof typeof services
112
+ ] as TAuditStorage;
113
+ }
114
+
115
+ /**
116
+ * Create an auditor instance for the function.
117
+ * Returns undefined if no auditor storage is configured.
118
+ */
119
+ async createAuditor(): Promise<Auditor<TAuditAction> | undefined> {
120
+ const storage = await this.getAuditStorage();
121
+ if (!storage) {
122
+ return undefined;
123
+ }
124
+
125
+ return new DefaultAuditor<TAuditAction>({
126
+ actor: { id: 'system', type: 'system' },
127
+ storage: storage as AuditStorage,
128
+ metadata: {
129
+ function: this.fn.type,
130
+ },
131
+ });
132
+ }
133
+
134
+ /**
135
+ * Execute handler with audit transaction support.
136
+ * If the audit storage has a database (via getDatabase()), wraps execution
137
+ * in a transaction so audits are atomic with handler's database operations.
138
+ *
139
+ * @param handler - The handler function to execute (receives auditor and db)
140
+ * @returns The handler result
141
+ */
142
+ async executeWithAudit<T>(
143
+ handler: (ctx: {
144
+ auditor?: Auditor<TAuditAction>;
145
+ db?: TDatabase;
146
+ }) => Promise<T>,
147
+ ): Promise<T> {
148
+ const auditor = await this.createAuditor();
149
+ const storage = await this.getAuditStorage();
150
+
151
+ // No audit context - just run handler with regular db
152
+ if (!auditor || !storage) {
153
+ const db = await this.getDatabase();
154
+ return handler({ db });
155
+ }
156
+
157
+ // Check if storage has a database and db service names match
158
+ const storageDb = (storage as AuditStorage).getDatabase?.();
159
+ const databaseServiceName = this.fn.databaseService?.serviceName;
160
+ const auditDbServiceName = this.fn.auditorStorageService?.serviceName;
161
+
162
+ // If the audit storage has a database and we're using the same database service
163
+ // (or the audit storage provides the database), use transactional execution
164
+ if (storageDb && databaseServiceName && auditDbServiceName) {
165
+ return withAuditableTransaction(
166
+ storageDb as any,
167
+ auditor as any,
168
+ async (trx) => {
169
+ // Use transaction as db
170
+ const response = await handler({
171
+ auditor,
172
+ db: trx as TDatabase,
173
+ });
174
+ // Audits are flushed by withAuditableTransaction before commit
175
+ return response;
176
+ },
177
+ );
178
+ }
179
+
180
+ // No database on storage or service names don't match - run handler and flush audits after
181
+ const db = await this.getDatabase();
182
+ const response = await handler({ auditor, db });
183
+
184
+ // Flush audits (no transaction)
185
+ await auditor.flush();
186
+
187
+ return response;
188
+ }
189
+
59
190
  async getFunctionInput<TEvent>(
60
191
  event: TEvent,
61
192
  ): Promise<InferComposableStandardSchema<TInput>> {
@@ -1,3 +1,5 @@
1
+ import type { AuditStorage, AuditableAction, Auditor } from '@geekmidas/audit';
2
+ import { DefaultAuditor } from '@geekmidas/audit';
1
3
  import { EnvironmentParser } from '@geekmidas/envkit';
2
4
  import type { EventPublisher } from '@geekmidas/events';
3
5
  import type { Logger } from '@geekmidas/logger';
@@ -17,12 +19,20 @@ import type { Function } from './Function';
17
19
  import { FunctionBuilder } from './FunctionBuilder';
18
20
 
19
21
  export class TestFunctionAdaptor<
20
- TInput extends StandardSchemaV1 | undefined = undefined,
22
+ TInput extends ComposableStandardSchema | undefined = undefined,
21
23
  TOutSchema extends StandardSchemaV1 | undefined = undefined,
22
24
  TServices extends Service[] = [],
23
25
  TLogger extends Logger = Logger,
24
26
  TEventPublisher extends EventPublisher<any> | undefined = undefined,
25
27
  TEventPublisherServiceName extends string = string,
28
+ TAuditStorage extends AuditStorage | undefined = undefined,
29
+ TAuditStorageServiceName extends string = string,
30
+ TDatabase = undefined,
31
+ TDatabaseServiceName extends string = string,
32
+ TAuditAction extends AuditableAction<string, unknown> = AuditableAction<
33
+ string,
34
+ unknown
35
+ >,
26
36
  > {
27
37
  static getDefaultServiceDiscovery<
28
38
  TInput extends ComposableStandardSchema | undefined = undefined,
@@ -31,15 +41,28 @@ export class TestFunctionAdaptor<
31
41
  TLogger extends Logger = Logger,
32
42
  TEventPublisher extends EventPublisher<any> | undefined = undefined,
33
43
  TEventPublisherServiceName extends string = string,
44
+ TAuditStorage extends AuditStorage | undefined = undefined,
45
+ TAuditStorageServiceName extends string = string,
46
+ TDatabase = undefined,
47
+ TDatabaseServiceName extends string = string,
48
+ TAuditAction extends AuditableAction<string, unknown> = AuditableAction<
49
+ string,
50
+ unknown
51
+ >,
34
52
  >(
35
53
  fn: Function<
36
54
  TInput,
37
55
  TServices,
38
56
  TLogger,
39
57
  TOutSchema,
40
- any,
41
58
  TEventPublisher,
42
- TEventPublisherServiceName
59
+ TEventPublisherServiceName,
60
+ TAuditStorage,
61
+ TAuditStorageServiceName,
62
+ TDatabase,
63
+ TDatabaseServiceName,
64
+ TAuditAction,
65
+ any
43
66
  >,
44
67
  ) {
45
68
  return ServiceDiscovery.getInstance(fn.logger, new EnvironmentParser({}));
@@ -51,9 +74,14 @@ export class TestFunctionAdaptor<
51
74
  TServices,
52
75
  TLogger,
53
76
  TOutSchema,
54
- any,
55
77
  TEventPublisher,
56
- TEventPublisherServiceName
78
+ TEventPublisherServiceName,
79
+ TAuditStorage,
80
+ TAuditStorageServiceName,
81
+ TDatabase,
82
+ TDatabaseServiceName,
83
+ TAuditAction,
84
+ any
57
85
  >,
58
86
  private serviceDiscovery: ServiceDiscovery<
59
87
  any,
@@ -66,7 +94,9 @@ export class TestFunctionAdaptor<
66
94
  TInput,
67
95
  TServices,
68
96
  TEventPublisher,
69
- TEventPublisherServiceName
97
+ TEventPublisherServiceName,
98
+ TDatabase,
99
+ TAuditAction
70
100
  >,
71
101
  ): Promise<InferStandardSchema<TOutSchema>> {
72
102
  // Parse input if schema is provided
@@ -89,16 +119,65 @@ export class TestFunctionAdaptor<
89
119
  services = await this.serviceDiscovery.register(this.fn.services);
90
120
  }
91
121
 
122
+ // Resolve database (use provided db or register from function)
123
+ let db: TDatabase | undefined;
124
+ if ('db' in ctx && ctx.db !== undefined) {
125
+ db = ctx.db;
126
+ } else if (this.fn.databaseService) {
127
+ const dbServices = await this.serviceDiscovery.register([
128
+ this.fn.databaseService,
129
+ ]);
130
+ db = dbServices[
131
+ this.fn.databaseService.serviceName as keyof typeof dbServices
132
+ ] as TDatabase;
133
+ }
134
+
135
+ // Resolve auditor (use provided auditor or create from function)
136
+ let auditor: Auditor<TAuditAction> | undefined;
137
+ if ('auditor' in ctx && ctx.auditor !== undefined) {
138
+ auditor = ctx.auditor;
139
+ } else if (this.fn.auditorStorageService) {
140
+ const auditServices = await this.serviceDiscovery.register([
141
+ this.fn.auditorStorageService,
142
+ ]);
143
+ const storage = auditServices[
144
+ this.fn.auditorStorageService.serviceName as keyof typeof auditServices
145
+ ] as AuditStorage;
146
+
147
+ auditor = new DefaultAuditor<TAuditAction>({
148
+ actor: { id: 'system', type: 'system' },
149
+ storage,
150
+ metadata: {
151
+ function: this.fn.type,
152
+ test: true,
153
+ },
154
+ });
155
+ }
156
+
92
157
  // Execute the function
93
158
  const response = await this.fn['fn']({
94
159
  input: parsedInput,
95
160
  services,
96
161
  logger,
97
- });
162
+ db,
163
+ auditor,
164
+ } as any);
98
165
 
99
166
  // Parse output if schema is provided
100
167
  const output = await this.fn.parseOutput(response);
101
168
 
169
+ // Flush audits if any were recorded
170
+ if (auditor) {
171
+ const records = auditor.getRecords();
172
+ if (records.length > 0) {
173
+ logger.debug(
174
+ { auditCount: records.length },
175
+ 'Flushing function audits',
176
+ );
177
+ await auditor.flush();
178
+ }
179
+ }
180
+
102
181
  // Register publisher service if provided in context
103
182
 
104
183
  await publishEvents(
@@ -114,12 +193,19 @@ export class TestFunctionAdaptor<
114
193
  }
115
194
 
116
195
  export type TestFunctionRequest<
117
- TInput extends StandardSchemaV1 | undefined = undefined,
196
+ TInput extends ComposableStandardSchema | undefined = undefined,
118
197
  TServices extends Service[] = [],
119
198
  TEventPublisher extends EventPublisher<any> | undefined = undefined,
120
199
  TEventPublisherServiceName extends string = string,
200
+ TDatabase = undefined,
201
+ TAuditAction extends AuditableAction<string, unknown> = AuditableAction<
202
+ string,
203
+ unknown
204
+ >,
121
205
  > = {
122
206
  input: InferComposableStandardSchema<TInput>;
123
207
  services: ServiceRecord<TServices>;
124
208
  publisher?: Service<TEventPublisherServiceName, TEventPublisher>;
209
+ db?: TDatabase;
210
+ auditor?: Auditor<TAuditAction>;
125
211
  } & InferComposableStandardSchema<{ input: TInput }>;
@@ -373,4 +373,86 @@ describe('AWSLambdaFunction', () => {
373
373
  });
374
374
 
375
375
  // Skipping timeout tests for now as middleware order needs to be adjusted
376
+
377
+ describe('database', () => {
378
+ // Mock database service
379
+ class MockDatabase {
380
+ async query(sql: string) {
381
+ return [{ id: '1', name: 'Test User' }];
382
+ }
383
+ }
384
+
385
+ class DatabaseService implements Service<'database', MockDatabase> {
386
+ serviceName = 'database' as const;
387
+ db = new MockDatabase();
388
+
389
+ async register() {
390
+ return this.db;
391
+ }
392
+ }
393
+
394
+ it('should inject database into function context', async () => {
395
+ const databaseService = new DatabaseService();
396
+ const handler = vi.fn(async ({ db }) => {
397
+ const result = await db.query('SELECT * FROM users');
398
+ return { users: result };
399
+ });
400
+
401
+ const outputSchema = z.object({
402
+ users: z.array(z.object({ id: z.string(), name: z.string() })),
403
+ });
404
+
405
+ const fn = new Function(
406
+ handler,
407
+ undefined,
408
+ undefined,
409
+ undefined,
410
+ outputSchema,
411
+ [],
412
+ logger,
413
+ undefined,
414
+ [],
415
+ undefined,
416
+ undefined,
417
+ databaseService,
418
+ );
419
+
420
+ const adaptor = new AWSLambdaFunction(envParser, fn);
421
+ const lambdaHandler = adaptor.handler;
422
+
423
+ const result = await lambdaHandler({}, createMockContext(), vi.fn());
424
+
425
+ expect(result).toEqual({ users: [{ id: '1', name: 'Test User' }] });
426
+ expect(handler).toHaveBeenCalledWith(
427
+ expect.objectContaining({
428
+ db: expect.any(MockDatabase),
429
+ }),
430
+ );
431
+ });
432
+
433
+ it('should have db as undefined when no database service is configured', async () => {
434
+ const handler = vi.fn(async ({ db }) => {
435
+ return { hasDb: db !== undefined };
436
+ });
437
+
438
+ const outputSchema = z.object({ hasDb: z.boolean() });
439
+
440
+ const fn = new Function(
441
+ handler,
442
+ undefined,
443
+ undefined,
444
+ undefined,
445
+ outputSchema,
446
+ [],
447
+ logger,
448
+ );
449
+
450
+ const adaptor = new AWSLambdaFunction(envParser, fn);
451
+ const lambdaHandler = adaptor.handler;
452
+
453
+ const result = await lambdaHandler({}, createMockContext(), vi.fn());
454
+
455
+ expect(result).toEqual({ hasDb: false });
456
+ });
457
+ });
376
458
  });