@geekmidas/constructs 0.0.10 → 0.0.12

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 (324) hide show
  1. package/dist/{AWSLambdaFunction-DhUb-Vs6.cjs → AWSLambdaFunction-DMxScuaw.cjs} +3 -3
  2. package/dist/{AWSLambdaFunction-DhUb-Vs6.cjs.map → AWSLambdaFunction-DMxScuaw.cjs.map} +1 -1
  3. package/dist/{AWSLambdaFunction-D5V3YVqv.d.cts → AWSLambdaFunction-DSB2oaFG.d.mts} +5 -5
  4. package/dist/{AWSLambdaFunction-D_V-ZQmS.mjs → AWSLambdaFunction-cL8A169J.mjs} +3 -3
  5. package/dist/{AWSLambdaFunction-D_V-ZQmS.mjs.map → AWSLambdaFunction-cL8A169J.mjs.map} +1 -1
  6. package/dist/{AWSLambdaFunction-DvZcnL8a.d.mts → AWSLambdaFunction-t6q2o8EL.d.cts} +5 -5
  7. package/dist/{AWSLambdaSubscriberAdaptor-J_pSz6pu.d.cts → AWSLambdaSubscriberAdaptor-Cknp_nn1.d.cts} +2 -2
  8. package/dist/{AWSLambdaSubscriberAdaptor-G8y3YkWj.mjs → AWSLambdaSubscriberAdaptor-CyFh7MN8.mjs} +1 -1
  9. package/dist/{AWSLambdaSubscriberAdaptor-G8y3YkWj.mjs.map → AWSLambdaSubscriberAdaptor-CyFh7MN8.mjs.map} +1 -1
  10. package/dist/{AWSLambdaSubscriberAdaptor-D6kjKjSf.d.mts → AWSLambdaSubscriberAdaptor-DpHzp-AM.d.mts} +2 -2
  11. package/dist/{AWSLambdaSubscriberAdaptor-CmPZ10JF.cjs → AWSLambdaSubscriberAdaptor-Dum5bkw3.cjs} +1 -1
  12. package/dist/{AWSLambdaSubscriberAdaptor-CmPZ10JF.cjs.map → AWSLambdaSubscriberAdaptor-Dum5bkw3.cjs.map} +1 -1
  13. package/dist/{AmazonApiGatewayEndpointAdaptor-DHcUetbw.mjs → AmazonApiGatewayEndpointAdaptor-CIEhW1TQ.mjs} +47 -16
  14. package/dist/AmazonApiGatewayEndpointAdaptor-CIEhW1TQ.mjs.map +1 -0
  15. package/dist/{AmazonApiGatewayEndpointAdaptor-BnNd8tCz.d.cts → AmazonApiGatewayEndpointAdaptor-CwItKPz2.d.cts} +6 -5
  16. package/dist/{AmazonApiGatewayEndpointAdaptor-DHBF_5jn.cjs → AmazonApiGatewayEndpointAdaptor-H8YvtfQm.cjs} +47 -16
  17. package/dist/AmazonApiGatewayEndpointAdaptor-H8YvtfQm.cjs.map +1 -0
  18. package/dist/{AmazonApiGatewayEndpointAdaptor-B7MKo8h3.d.mts → AmazonApiGatewayEndpointAdaptor-eDQgPNLH.d.mts} +7 -6
  19. package/dist/{AmazonApiGatewayV1EndpointAdaptor-CmUxFoPx.cjs → AmazonApiGatewayV1EndpointAdaptor-0n71d3gq.cjs} +3 -3
  20. package/dist/{AmazonApiGatewayV1EndpointAdaptor-CmUxFoPx.cjs.map → AmazonApiGatewayV1EndpointAdaptor-0n71d3gq.cjs.map} +1 -1
  21. package/dist/{AmazonApiGatewayV1EndpointAdaptor-CsV6zyvn.mjs → AmazonApiGatewayV1EndpointAdaptor-B36zXLJ7.mjs} +3 -3
  22. package/dist/{AmazonApiGatewayV1EndpointAdaptor-CsV6zyvn.mjs.map → AmazonApiGatewayV1EndpointAdaptor-B36zXLJ7.mjs.map} +1 -1
  23. package/dist/{AmazonApiGatewayV1EndpointAdaptor-gO9OxdZl.d.mts → AmazonApiGatewayV1EndpointAdaptor-CnGVpA38.d.mts} +4 -4
  24. package/dist/{AmazonApiGatewayV1EndpointAdaptor-BC-a2tt3.d.cts → AmazonApiGatewayV1EndpointAdaptor-DaCvUL6y.d.cts} +3 -3
  25. package/dist/{AmazonApiGatewayV2EndpointAdaptor-D1uz4wNg.d.mts → AmazonApiGatewayV2EndpointAdaptor-BELz2ijs.d.mts} +4 -4
  26. package/dist/{AmazonApiGatewayV2EndpointAdaptor-_bFcbEa-.mjs → AmazonApiGatewayV2EndpointAdaptor-CE3wZEb8.mjs} +3 -3
  27. package/dist/{AmazonApiGatewayV2EndpointAdaptor-_bFcbEa-.mjs.map → AmazonApiGatewayV2EndpointAdaptor-CE3wZEb8.mjs.map} +1 -1
  28. package/dist/{AmazonApiGatewayV2EndpointAdaptor-zNFUPxSY.d.cts → AmazonApiGatewayV2EndpointAdaptor-DA1PH0nc.d.cts} +3 -3
  29. package/dist/{AmazonApiGatewayV2EndpointAdaptor-cZbaqiUi.cjs → AmazonApiGatewayV2EndpointAdaptor-DtU3Cb8F.cjs} +3 -3
  30. package/dist/{AmazonApiGatewayV2EndpointAdaptor-cZbaqiUi.cjs.map → AmazonApiGatewayV2EndpointAdaptor-DtU3Cb8F.cjs.map} +1 -1
  31. package/dist/{Authorizer-Bbk9ziuG.d.mts → Authorizer-BRCVPz_O.d.mts} +1 -1
  32. package/dist/{Authorizer-iXsSB600.d.cts → Authorizer-DG54w1m2.d.cts} +1 -1
  33. package/dist/{BaseFunctionBuilder-BmsbV0BU.cjs → BaseFunctionBuilder-B8rT07QR.cjs} +7 -2
  34. package/dist/BaseFunctionBuilder-B8rT07QR.cjs.map +1 -0
  35. package/dist/{BaseFunctionBuilder-DCUtCdVL.mjs → BaseFunctionBuilder-CT7p10K1.mjs} +7 -2
  36. package/dist/BaseFunctionBuilder-CT7p10K1.mjs.map +1 -0
  37. package/dist/{BaseFunctionBuilder-C4ZJPkIZ.d.cts → BaseFunctionBuilder-Cf0op65o.d.cts} +7 -4
  38. package/dist/{BaseFunctionBuilder-CxBX0arJ.d.mts → BaseFunctionBuilder-DilipY1y.d.mts} +7 -4
  39. package/dist/{Construct-VEI7M3fs.cjs → Construct-BYSPikVm.cjs} +28 -10
  40. package/dist/Construct-BYSPikVm.cjs.map +1 -0
  41. package/dist/{Construct-C3hsQBy4.mjs → Construct-LWeB1rSQ.mjs} +28 -10
  42. package/dist/Construct-LWeB1rSQ.mjs.map +1 -0
  43. package/dist/{Construct-ci5u8Xnu.d.cts → Construct-ZPqE0vhn.d.mts} +9 -4
  44. package/dist/{Construct-zhmcmIdY.d.mts → Construct-dI_rgdSp.d.cts} +9 -4
  45. package/dist/Construct.cjs +1 -1
  46. package/dist/Construct.d.cts +1 -1
  47. package/dist/Construct.d.mts +1 -1
  48. package/dist/Construct.mjs +1 -1
  49. package/dist/{Cron-ByNYsQDH.d.mts → Cron-6lOgKqSA.d.cts} +3 -3
  50. package/dist/{Cron-DkPL-Fms.d.cts → Cron-BH_07atD.d.mts} +3 -3
  51. package/dist/{Cron-Dfgr8F9d.cjs → Cron-Bnd-2pgE.cjs} +3 -3
  52. package/dist/{Cron-Dfgr8F9d.cjs.map → Cron-Bnd-2pgE.cjs.map} +1 -1
  53. package/dist/{Cron-wP6Ob48_.mjs → Cron-DNRjf2cp.mjs} +3 -3
  54. package/dist/{Cron-wP6Ob48_.mjs.map → Cron-DNRjf2cp.mjs.map} +1 -1
  55. package/dist/{CronBuilder-BknVTWLE.d.mts → CronBuilder-5oK2AL2n.d.cts} +5 -5
  56. package/dist/{CronBuilder-BqTTozUi.d.cts → CronBuilder-D2b4zY4l.d.mts} +5 -5
  57. package/dist/{CronBuilder-C27c5oqh.mjs → CronBuilder-DdR2TuQa.mjs} +5 -5
  58. package/dist/{CronBuilder-C27c5oqh.mjs.map → CronBuilder-DdR2TuQa.mjs.map} +1 -1
  59. package/dist/{CronBuilder-W1ZqCJ7m.cjs → CronBuilder-dtw4ZyH6.cjs} +5 -5
  60. package/dist/{CronBuilder-W1ZqCJ7m.cjs.map → CronBuilder-dtw4ZyH6.cjs.map} +1 -1
  61. package/dist/{Endpoint-C98BwZjA.mjs → Endpoint-B69TqESg.mjs} +15 -8
  62. package/dist/Endpoint-B69TqESg.mjs.map +1 -0
  63. package/dist/{Endpoint-BjpQmTek.cjs → Endpoint-B9PryZES.cjs} +15 -8
  64. package/dist/Endpoint-B9PryZES.cjs.map +1 -0
  65. package/dist/{Endpoint-zHPjZ35J.d.cts → Endpoint-Cs-MsYlY.d.cts} +80 -12
  66. package/dist/{Endpoint-C16whGI-.d.mts → Endpoint-DuZlyjd4.d.mts} +80 -12
  67. package/dist/EndpointBuilder-BrB-K1jO.d.mts +86 -0
  68. package/dist/EndpointBuilder-C-PHInEW.d.cts +86 -0
  69. package/dist/{EndpointBuilder-CCUx4vep.mjs → EndpointBuilder-DnVL-EU_.mjs} +47 -5
  70. package/dist/EndpointBuilder-DnVL-EU_.mjs.map +1 -0
  71. package/dist/{EndpointBuilder-D2Zu8i9b.cjs → EndpointBuilder-DofwCnWJ.cjs} +47 -5
  72. package/dist/EndpointBuilder-DofwCnWJ.cjs.map +1 -0
  73. package/dist/{EndpointFactory-KkyIOE62.d.cts → EndpointFactory-6zNpVSYp.d.mts} +12 -11
  74. package/dist/{EndpointFactory-C4YhgXOc.cjs → EndpointFactory-Ba9mx9MU.cjs} +3 -3
  75. package/dist/{EndpointFactory-C4YhgXOc.cjs.map → EndpointFactory-Ba9mx9MU.cjs.map} +1 -1
  76. package/dist/{EndpointFactory-VnSAdwdv.d.mts → EndpointFactory-e5WYVR6t.d.cts} +12 -11
  77. package/dist/{EndpointFactory-RAb2zcw0.mjs → EndpointFactory-pPaIGFHV.mjs} +3 -3
  78. package/dist/{EndpointFactory-RAb2zcw0.mjs.map → EndpointFactory-pPaIGFHV.mjs.map} +1 -1
  79. package/dist/{Function-BbLYIKLL.d.cts → Function-6EWabl_X.d.cts} +5 -4
  80. package/dist/{Function-1Fh6Tdkg.cjs → Function-CO-s2pB8.cjs} +6 -6
  81. package/dist/Function-CO-s2pB8.cjs.map +1 -0
  82. package/dist/{Function-D-QEfH7k.mjs → Function-COnc-tWM.mjs} +6 -6
  83. package/dist/Function-COnc-tWM.mjs.map +1 -0
  84. package/dist/{Function-DFRZZCC-.d.mts → Function-G3JPHMaY.d.mts} +5 -4
  85. package/dist/{FunctionBuilder-DdGjpiFT.d.cts → FunctionBuilder-B3fpp3hA.d.cts} +13 -11
  86. package/dist/{FunctionBuilder-DuktGyZc.d.mts → FunctionBuilder-ByaB_LQ4.d.mts} +13 -11
  87. package/dist/{FunctionBuilder-Bxyr1Pf9.mjs → FunctionBuilder-CMhLQ4dt.mjs} +11 -6
  88. package/dist/FunctionBuilder-CMhLQ4dt.mjs.map +1 -0
  89. package/dist/{FunctionBuilder-DcEFYgbn.cjs → FunctionBuilder-_hMwZUof.cjs} +11 -6
  90. package/dist/FunctionBuilder-_hMwZUof.cjs.map +1 -0
  91. package/dist/{FunctionExecutionWrapper-CRYi047B.d.cts → FunctionExecutionWrapper-Ci-ookJG.d.cts} +2 -2
  92. package/dist/{FunctionExecutionWrapper-DaR-dSLw.d.mts → FunctionExecutionWrapper-DHFMLrOl.d.mts} +2 -2
  93. package/dist/{FunctionExecutionWrapper-BL6PE6Dv.mjs → FunctionExecutionWrapper-i9v5L3Av.mjs} +2 -2
  94. package/dist/{FunctionExecutionWrapper-BL6PE6Dv.mjs.map → FunctionExecutionWrapper-i9v5L3Av.mjs.map} +1 -1
  95. package/dist/{FunctionExecutionWrapper-Ee-CE8Fz.cjs → FunctionExecutionWrapper-sxJNTpuc.cjs} +2 -2
  96. package/dist/{FunctionExecutionWrapper-Ee-CE8Fz.cjs.map → FunctionExecutionWrapper-sxJNTpuc.cjs.map} +1 -1
  97. package/dist/{HonoEndpointAdaptor-CY1mXTe6.d.mts → HonoEndpointAdaptor-BElil8O5.d.mts} +9 -8
  98. package/dist/{HonoEndpointAdaptor-DcvZdYzx.cjs → HonoEndpointAdaptor-Cw2if5cG.cjs} +51 -20
  99. package/dist/HonoEndpointAdaptor-Cw2if5cG.cjs.map +1 -0
  100. package/dist/{HonoEndpointAdaptor-CyVPl4w2.mjs → HonoEndpointAdaptor-DAfnTFVS.mjs} +51 -20
  101. package/dist/HonoEndpointAdaptor-DAfnTFVS.mjs.map +1 -0
  102. package/dist/{HonoEndpointAdaptor-CYvrXBe-.d.cts → HonoEndpointAdaptor-DSHl8ZCY.d.cts} +8 -7
  103. package/dist/{Subscriber-Cy28j8MS.d.cts → Subscriber-BhzqUzs-.d.cts} +2 -2
  104. package/dist/{Subscriber-CTczVFsF.mjs → Subscriber-CGb8LjZa.mjs} +2 -2
  105. package/dist/{Subscriber-CTczVFsF.mjs.map → Subscriber-CGb8LjZa.mjs.map} +1 -1
  106. package/dist/{Subscriber-BL30GpWp.cjs → Subscriber-D-FPWts6.cjs} +2 -2
  107. package/dist/{Subscriber-BL30GpWp.cjs.map → Subscriber-D-FPWts6.cjs.map} +1 -1
  108. package/dist/{Subscriber-g3IWM1_d.d.mts → Subscriber-s6yfjeOc.d.mts} +2 -2
  109. package/dist/{SubscriberBuilder-BzK8kc2a.d.cts → SubscriberBuilder-BCVkp-ga.d.cts} +2 -2
  110. package/dist/{SubscriberBuilder-CekL3BoP.mjs → SubscriberBuilder-BcAspHv9.mjs} +2 -2
  111. package/dist/{SubscriberBuilder-CekL3BoP.mjs.map → SubscriberBuilder-BcAspHv9.mjs.map} +1 -1
  112. package/dist/{SubscriberBuilder-D1hojYLa.cjs → SubscriberBuilder-BfE2cL1q.cjs} +2 -2
  113. package/dist/{SubscriberBuilder-D1hojYLa.cjs.map → SubscriberBuilder-BfE2cL1q.cjs.map} +1 -1
  114. package/dist/{SubscriberBuilder-YjQ7qIpQ.d.mts → SubscriberBuilder-aCua5_wA.d.mts} +2 -2
  115. package/dist/{TestEndpointAdaptor-C-ahwGW6.cjs → TestEndpointAdaptor-Bn1WRFph.cjs} +47 -18
  116. package/dist/TestEndpointAdaptor-Bn1WRFph.cjs.map +1 -0
  117. package/dist/{TestEndpointAdaptor-DGWuai69.d.mts → TestEndpointAdaptor-DnlAA_rm.d.mts} +7 -6
  118. package/dist/{TestEndpointAdaptor-B4z9G5Ap.mjs → TestEndpointAdaptor-DubQOJk_.mjs} +47 -18
  119. package/dist/TestEndpointAdaptor-DubQOJk_.mjs.map +1 -0
  120. package/dist/{TestEndpointAdaptor-uXliWYjS.d.cts → TestEndpointAdaptor-o-xtSyQ3.d.cts} +6 -5
  121. package/dist/adaptors/aws.cjs +14 -13
  122. package/dist/adaptors/aws.d.cts +14 -14
  123. package/dist/adaptors/aws.d.mts +15 -15
  124. package/dist/adaptors/aws.mjs +14 -13
  125. package/dist/adaptors/hono.cjs +10 -9
  126. package/dist/adaptors/hono.d.cts +8 -8
  127. package/dist/adaptors/hono.d.mts +9 -9
  128. package/dist/adaptors/hono.mjs +10 -9
  129. package/dist/adaptors/testing.cjs +8 -7
  130. package/dist/adaptors/testing.d.cts +8 -8
  131. package/dist/adaptors/testing.d.mts +9 -9
  132. package/dist/adaptors/testing.mjs +8 -7
  133. package/dist/crons/Cron.cjs +6 -6
  134. package/dist/crons/Cron.d.cts +6 -6
  135. package/dist/crons/Cron.d.mts +6 -6
  136. package/dist/crons/Cron.mjs +6 -6
  137. package/dist/crons/CronBuilder.cjs +7 -7
  138. package/dist/crons/CronBuilder.d.cts +7 -7
  139. package/dist/crons/CronBuilder.d.mts +7 -7
  140. package/dist/crons/CronBuilder.mjs +7 -7
  141. package/dist/crons/index.cjs +7 -7
  142. package/dist/crons/index.d.cts +11 -11
  143. package/dist/crons/index.d.mts +11 -11
  144. package/dist/crons/index.mjs +7 -7
  145. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +8 -7
  146. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +8 -8
  147. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +9 -9
  148. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +8 -7
  149. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +10 -9
  150. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +9 -9
  151. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +10 -10
  152. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +10 -9
  153. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +10 -9
  154. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +9 -9
  155. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +10 -10
  156. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +10 -9
  157. package/dist/endpoints/Authorizer.d.cts +1 -1
  158. package/dist/endpoints/Authorizer.d.mts +1 -1
  159. package/dist/endpoints/Endpoint.cjs +6 -6
  160. package/dist/endpoints/Endpoint.d.cts +7 -7
  161. package/dist/endpoints/Endpoint.d.mts +8 -8
  162. package/dist/endpoints/Endpoint.mjs +6 -6
  163. package/dist/endpoints/EndpointBuilder.cjs +7 -7
  164. package/dist/endpoints/EndpointBuilder.d.cts +8 -8
  165. package/dist/endpoints/EndpointBuilder.d.mts +9 -9
  166. package/dist/endpoints/EndpointBuilder.mjs +7 -7
  167. package/dist/endpoints/EndpointFactory.cjs +8 -8
  168. package/dist/endpoints/EndpointFactory.d.cts +9 -9
  169. package/dist/endpoints/EndpointFactory.d.mts +10 -10
  170. package/dist/endpoints/EndpointFactory.mjs +8 -8
  171. package/dist/endpoints/HonoEndpointAdaptor.cjs +10 -9
  172. package/dist/endpoints/HonoEndpointAdaptor.d.cts +8 -8
  173. package/dist/endpoints/HonoEndpointAdaptor.d.mts +9 -9
  174. package/dist/endpoints/HonoEndpointAdaptor.mjs +10 -9
  175. package/dist/endpoints/TestEndpointAdaptor.cjs +8 -7
  176. package/dist/endpoints/TestEndpointAdaptor.d.cts +8 -8
  177. package/dist/endpoints/TestEndpointAdaptor.d.mts +9 -9
  178. package/dist/endpoints/TestEndpointAdaptor.mjs +8 -7
  179. package/dist/endpoints/audit.cjs +0 -0
  180. package/dist/endpoints/audit.d.cts +9 -0
  181. package/dist/endpoints/audit.d.mts +9 -0
  182. package/dist/endpoints/audit.mjs +0 -0
  183. package/dist/endpoints/helpers.cjs +7 -7
  184. package/dist/endpoints/helpers.d.cts +7 -7
  185. package/dist/endpoints/helpers.d.mts +8 -8
  186. package/dist/endpoints/helpers.mjs +7 -7
  187. package/dist/endpoints/index.cjs +8 -8
  188. package/dist/endpoints/index.cjs.map +1 -1
  189. package/dist/endpoints/index.d.cts +12 -12
  190. package/dist/endpoints/index.d.mts +13 -13
  191. package/dist/endpoints/index.mjs +8 -8
  192. package/dist/endpoints/index.mjs.map +1 -1
  193. package/dist/endpoints/parseHonoQuery.cjs +1 -1
  194. package/dist/endpoints/parseHonoQuery.mjs +1 -1
  195. package/dist/endpoints/parseQueryParams.cjs +1 -1
  196. package/dist/endpoints/parseQueryParams.mjs +1 -1
  197. package/dist/endpoints/processAudits.cjs +5 -0
  198. package/dist/endpoints/processAudits.d.cts +74 -0
  199. package/dist/endpoints/processAudits.d.mts +74 -0
  200. package/dist/endpoints/processAudits.mjs +3 -0
  201. package/dist/functions/AWSLambdaFunction.cjs +6 -6
  202. package/dist/functions/AWSLambdaFunction.d.cts +4 -4
  203. package/dist/functions/AWSLambdaFunction.d.mts +4 -4
  204. package/dist/functions/AWSLambdaFunction.mjs +6 -6
  205. package/dist/functions/BaseFunctionBuilder.cjs +2 -2
  206. package/dist/functions/BaseFunctionBuilder.d.cts +2 -2
  207. package/dist/functions/BaseFunctionBuilder.d.mts +2 -2
  208. package/dist/functions/BaseFunctionBuilder.mjs +2 -2
  209. package/dist/functions/Function.cjs +2 -2
  210. package/dist/functions/Function.d.cts +2 -2
  211. package/dist/functions/Function.d.mts +2 -2
  212. package/dist/functions/Function.mjs +2 -2
  213. package/dist/functions/FunctionBuilder.cjs +4 -4
  214. package/dist/functions/FunctionBuilder.d.cts +4 -4
  215. package/dist/functions/FunctionBuilder.d.mts +4 -4
  216. package/dist/functions/FunctionBuilder.mjs +4 -4
  217. package/dist/functions/FunctionExecutionWrapper.cjs +5 -5
  218. package/dist/functions/FunctionExecutionWrapper.d.cts +3 -3
  219. package/dist/functions/FunctionExecutionWrapper.d.mts +3 -3
  220. package/dist/functions/FunctionExecutionWrapper.mjs +5 -5
  221. package/dist/functions/TestFunctionAdaptor.cjs +4 -4
  222. package/dist/functions/TestFunctionAdaptor.d.cts +2 -2
  223. package/dist/functions/TestFunctionAdaptor.d.mts +2 -2
  224. package/dist/functions/TestFunctionAdaptor.mjs +4 -4
  225. package/dist/functions/index.cjs +5 -5
  226. package/dist/functions/index.d.cts +5 -5
  227. package/dist/functions/index.d.mts +5 -5
  228. package/dist/functions/index.mjs +5 -5
  229. package/dist/functions-BYqZAob8.mjs +8 -0
  230. package/dist/{functions-DD-00sWF.mjs.map → functions-BYqZAob8.mjs.map} +1 -1
  231. package/dist/{functions-BtgBiuC_.cjs → functions-D03lqK-r.cjs} +2 -2
  232. package/dist/{functions-BtgBiuC_.cjs.map → functions-D03lqK-r.cjs.map} +1 -1
  233. package/dist/{helpers-QM_FSjPY.cjs → helpers-BApRyhly.cjs} +2 -2
  234. package/dist/{helpers-QM_FSjPY.cjs.map → helpers-BApRyhly.cjs.map} +1 -1
  235. package/dist/{helpers-DtPeOhUV.mjs → helpers-BPDogwac.mjs} +2 -2
  236. package/dist/{helpers-DtPeOhUV.mjs.map → helpers-BPDogwac.mjs.map} +1 -1
  237. package/dist/index-CUg_hSq-.d.cts +9 -0
  238. package/dist/index-D-a7e2gv.d.mts +9 -0
  239. package/dist/index.cjs +1 -1
  240. package/dist/index.d.cts +1 -1
  241. package/dist/index.d.mts +2 -2
  242. package/dist/index.mjs +1 -1
  243. package/dist/{parseHonoQuery-DopC24vB.cjs → parseHonoQuery-CT8Cvin-.cjs} +1 -1
  244. package/dist/{parseHonoQuery-DopC24vB.cjs.map → parseHonoQuery-CT8Cvin-.cjs.map} +1 -1
  245. package/dist/{parseHonoQuery-znDKBhdE.mjs → parseHonoQuery-CwFKw2ua.mjs} +1 -1
  246. package/dist/{parseHonoQuery-znDKBhdE.mjs.map → parseHonoQuery-CwFKw2ua.mjs.map} +1 -1
  247. package/dist/{parseQueryParams-BJaRh3OB.mjs → parseQueryParams-CHINupbZ.mjs} +1 -1
  248. package/dist/{parseQueryParams-BJaRh3OB.mjs.map → parseQueryParams-CHINupbZ.mjs.map} +1 -1
  249. package/dist/{parseQueryParams-BzPop4I1.cjs → parseQueryParams-CwvXXwkW.cjs} +1 -1
  250. package/dist/{parseQueryParams-BzPop4I1.cjs.map → parseQueryParams-CwvXXwkW.cjs.map} +1 -1
  251. package/dist/processAudits-BFokHhCO.cjs +174 -0
  252. package/dist/processAudits-BFokHhCO.cjs.map +1 -0
  253. package/dist/processAudits-DfcB-X-4.mjs +156 -0
  254. package/dist/processAudits-DfcB-X-4.mjs.map +1 -0
  255. package/dist/publisher.d.cts +1 -1
  256. package/dist/publisher.d.mts +1 -1
  257. package/dist/subscribers/AWSLambdaSubscriberAdaptor.cjs +1 -1
  258. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.cts +3 -3
  259. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +3 -3
  260. package/dist/subscribers/AWSLambdaSubscriberAdaptor.mjs +1 -1
  261. package/dist/subscribers/Subscriber.cjs +2 -2
  262. package/dist/subscribers/Subscriber.d.cts +2 -2
  263. package/dist/subscribers/Subscriber.d.mts +2 -2
  264. package/dist/subscribers/Subscriber.mjs +2 -2
  265. package/dist/subscribers/SubscriberBuilder.cjs +3 -3
  266. package/dist/subscribers/SubscriberBuilder.d.cts +3 -3
  267. package/dist/subscribers/SubscriberBuilder.d.mts +3 -3
  268. package/dist/subscribers/SubscriberBuilder.mjs +3 -3
  269. package/dist/subscribers/index.cjs +3 -3
  270. package/dist/subscribers/index.d.cts +5 -5
  271. package/dist/subscribers/index.d.mts +5 -5
  272. package/dist/subscribers/index.mjs +3 -3
  273. package/dist/{types-CVq20-fE.d.mts → types-DKf0juBf.d.mts} +1 -1
  274. package/dist/types.d.mts +1 -1
  275. package/package.json +14 -10
  276. package/src/Construct.ts +31 -5
  277. package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +88 -19
  278. package/src/endpoints/Endpoint.ts +66 -13
  279. package/src/endpoints/EndpointBuilder.ts +183 -19
  280. package/src/endpoints/HonoEndpointAdaptor.ts +114 -33
  281. package/src/endpoints/TestEndpointAdaptor.ts +96 -21
  282. package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.events.spec.ts +8 -0
  283. package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.spec.ts +29 -0
  284. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.audits.spec.ts +626 -0
  285. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.events.spec.ts +9 -0
  286. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.kysely-audit.integration.spec.ts +718 -0
  287. package/src/endpoints/__tests__/Endpoint.spec.ts +19 -0
  288. package/src/endpoints/__tests__/EndpointBuilder.audit.spec.ts +424 -0
  289. package/src/endpoints/__tests__/HonoEndpointAdaptor.audit-transactions.spec.ts +685 -0
  290. package/src/endpoints/__tests__/HonoEndpointAdaptor.audits.spec.ts +632 -0
  291. package/src/endpoints/__tests__/HonoEndpointAdaptor.events.spec.ts +8 -0
  292. package/src/endpoints/__tests__/HonoEndpointAdaptor.kysely-audit.integration.spec.ts +678 -0
  293. package/src/endpoints/__tests__/HonoEndpointAdaptor.openapi.spec.ts +4 -0
  294. package/src/endpoints/__tests__/HonoEndpointAdaptor.spec.ts +25 -0
  295. package/src/endpoints/audit.ts +87 -0
  296. package/src/endpoints/index.ts +1 -0
  297. package/src/endpoints/processAudits.ts +339 -0
  298. package/src/functions/BaseFunctionBuilder.ts +50 -7
  299. package/src/functions/Function.ts +13 -9
  300. package/src/functions/FunctionBuilder.ts +78 -14
  301. package/src/functions/__tests__/FunctionBuilder.state-isolation.spec.ts +43 -2
  302. package/dist/AmazonApiGatewayEndpointAdaptor-DHBF_5jn.cjs.map +0 -1
  303. package/dist/AmazonApiGatewayEndpointAdaptor-DHcUetbw.mjs.map +0 -1
  304. package/dist/BaseFunctionBuilder-BmsbV0BU.cjs.map +0 -1
  305. package/dist/BaseFunctionBuilder-DCUtCdVL.mjs.map +0 -1
  306. package/dist/Construct-C3hsQBy4.mjs.map +0 -1
  307. package/dist/Construct-VEI7M3fs.cjs.map +0 -1
  308. package/dist/Endpoint-BjpQmTek.cjs.map +0 -1
  309. package/dist/Endpoint-C98BwZjA.mjs.map +0 -1
  310. package/dist/EndpointBuilder-B5l7zQU1.d.cts +0 -55
  311. package/dist/EndpointBuilder-BzqR0xvt.d.mts +0 -55
  312. package/dist/EndpointBuilder-CCUx4vep.mjs.map +0 -1
  313. package/dist/EndpointBuilder-D2Zu8i9b.cjs.map +0 -1
  314. package/dist/Function-1Fh6Tdkg.cjs.map +0 -1
  315. package/dist/Function-D-QEfH7k.mjs.map +0 -1
  316. package/dist/FunctionBuilder-Bxyr1Pf9.mjs.map +0 -1
  317. package/dist/FunctionBuilder-DcEFYgbn.cjs.map +0 -1
  318. package/dist/HonoEndpointAdaptor-CyVPl4w2.mjs.map +0 -1
  319. package/dist/HonoEndpointAdaptor-DcvZdYzx.cjs.map +0 -1
  320. package/dist/TestEndpointAdaptor-B4z9G5Ap.mjs.map +0 -1
  321. package/dist/TestEndpointAdaptor-C-ahwGW6.cjs.map +0 -1
  322. package/dist/functions-DD-00sWF.mjs +0 -8
  323. package/dist/index-CcmV3PKF.d.cts +0 -9
  324. package/dist/index-DQt3pQtF.d.mts +0 -9
@@ -0,0 +1,718 @@
1
+ import type { AuditableAction } from '@geekmidas/audit';
2
+ import {
3
+ KyselyAuditStorage,
4
+ type AuditLogTable,
5
+ } from '@geekmidas/audit/kysely';
6
+ import { EnvironmentParser } from '@geekmidas/envkit';
7
+ import type { Logger } from '@geekmidas/logger';
8
+ import type { Service } from '@geekmidas/services';
9
+ import { ServiceDiscovery } from '@geekmidas/services';
10
+ import { createMockContext, createMockV2Event } from '@geekmidas/testkit/aws';
11
+ import {
12
+ CamelCasePlugin,
13
+ type Generated,
14
+ Kysely,
15
+ PostgresDialect,
16
+ sql,
17
+ } from 'kysely';
18
+ import pg from 'pg';
19
+ import {
20
+ afterAll,
21
+ afterEach,
22
+ beforeAll,
23
+ beforeEach,
24
+ describe,
25
+ expect,
26
+ it,
27
+ vi,
28
+ } from 'vitest';
29
+ import { z } from 'zod';
30
+ import { TEST_DATABASE_CONFIG } from '../../../../testkit/test/globalSetup';
31
+ import { AmazonApiGatewayV2Endpoint } from '../AmazonApiGatewayV2EndpointAdaptor';
32
+ import { Endpoint, type EndpointContext } from '../Endpoint';
33
+ import type { MappedAudit } from '../audit';
34
+
35
+ // Database schema - use different table names to avoid conflicts with HonoEndpoint tests
36
+ interface TestDatabase {
37
+ awsAuditLogs: AuditLogTable;
38
+ awsUsers: {
39
+ id: Generated<number>;
40
+ name: string;
41
+ email: string;
42
+ };
43
+ }
44
+
45
+ // Audit action types
46
+ type TestAuditAction =
47
+ | AuditableAction<'user.created', { userId: number; email: string }>
48
+ | AuditableAction<'user.updated', { userId: number; changes: string[] }>
49
+ | AuditableAction<'user.deleted', { userId: number }>;
50
+
51
+ describe('AmazonApiGatewayV2Endpoint Kysely Audit Integration', () => {
52
+ let db: Kysely<TestDatabase>;
53
+ let auditStorage: KyselyAuditStorage<TestDatabase>;
54
+ let mockLogger: Logger;
55
+ let envParser: EnvironmentParser<{}>;
56
+
57
+ const createMockLogger = (): Logger => ({
58
+ debug: vi.fn(),
59
+ info: vi.fn(),
60
+ warn: vi.fn(),
61
+ error: vi.fn(),
62
+ fatal: vi.fn(),
63
+ trace: vi.fn(),
64
+ child: vi.fn(function (this: Logger) {
65
+ return this;
66
+ }),
67
+ });
68
+
69
+ beforeAll(async () => {
70
+ db = new Kysely<TestDatabase>({
71
+ dialect: new PostgresDialect({
72
+ pool: new pg.Pool({
73
+ ...TEST_DATABASE_CONFIG,
74
+ database: 'postgres',
75
+ }),
76
+ }),
77
+ plugins: [new CamelCasePlugin()],
78
+ });
79
+
80
+ // Create audit_logs table
81
+ await db.schema
82
+ .createTable('awsAuditLogs')
83
+ .ifNotExists()
84
+ .addColumn('id', 'varchar(32)', (col) => col.primaryKey())
85
+ .addColumn('type', 'varchar', (col) => col.notNull())
86
+ .addColumn('operation', 'varchar', (col) => col.notNull())
87
+ .addColumn('table', 'varchar')
88
+ .addColumn('entityId', 'varchar')
89
+ .addColumn('oldValues', 'jsonb')
90
+ .addColumn('newValues', 'jsonb')
91
+ .addColumn('payload', 'jsonb')
92
+ .addColumn('timestamp', 'timestamp', (col) =>
93
+ col.defaultTo(sql`now()`).notNull(),
94
+ )
95
+ .addColumn('actorId', 'varchar')
96
+ .addColumn('actorType', 'varchar')
97
+ .addColumn('actorData', 'jsonb')
98
+ .addColumn('metadata', 'jsonb')
99
+ .execute();
100
+
101
+ // Create users table
102
+ await db.schema
103
+ .createTable('awsUsers')
104
+ .ifNotExists()
105
+ .addColumn('id', 'serial', (col) => col.primaryKey())
106
+ .addColumn('name', 'varchar', (col) => col.notNull())
107
+ .addColumn('email', 'varchar', (col) => col.notNull().unique())
108
+ .execute();
109
+
110
+ auditStorage = new KyselyAuditStorage({
111
+ db,
112
+ tableName: 'awsAuditLogs',
113
+ });
114
+ });
115
+
116
+ beforeEach(() => {
117
+ mockLogger = createMockLogger();
118
+ envParser = new EnvironmentParser({});
119
+ ServiceDiscovery.reset();
120
+ });
121
+
122
+ afterEach(async () => {
123
+ await db.deleteFrom('awsAuditLogs').execute();
124
+ await db.deleteFrom('awsUsers').execute();
125
+ });
126
+
127
+ afterAll(async () => {
128
+ await db.schema.dropTable('awsAuditLogs').ifExists().execute();
129
+ await db.schema.dropTable('awsUsers').ifExists().execute();
130
+ await db.destroy();
131
+ });
132
+
133
+ describe('declarative audits with real database', () => {
134
+ it('should write declarative audit to database on successful request', async () => {
135
+ const auditStorageService: Service<
136
+ 'auditStorage',
137
+ KyselyAuditStorage<TestDatabase>
138
+ > = {
139
+ serviceName: 'auditStorage' as const,
140
+ register: vi.fn().mockResolvedValue(auditStorage),
141
+ };
142
+
143
+ const outputSchema = z.object({ id: z.number(), email: z.string() });
144
+
145
+ const audits: MappedAudit<TestAuditAction, typeof outputSchema>[] = [
146
+ {
147
+ type: 'user.created',
148
+ payload: (response) => ({
149
+ userId: response.id,
150
+ email: response.email,
151
+ }),
152
+ },
153
+ ];
154
+
155
+ const endpoint = new Endpoint({
156
+ route: '/users',
157
+ method: 'POST',
158
+ fn: async () => {
159
+ return { id: 1, email: 'test@example.com' };
160
+ },
161
+ input: undefined,
162
+ output: outputSchema,
163
+ services: [],
164
+ logger: mockLogger,
165
+ timeout: undefined,
166
+ memorySize: undefined,
167
+ status: 201,
168
+ getSession: undefined,
169
+ authorize: undefined,
170
+ description: undefined,
171
+ events: [],
172
+ publisherService: undefined,
173
+ auditorStorageService: auditStorageService,
174
+ audits,
175
+ });
176
+
177
+ const adapter = new AmazonApiGatewayV2Endpoint(envParser, endpoint as any);
178
+ const handler = adapter.handler;
179
+
180
+ const event = createMockV2Event({
181
+ requestContext: {
182
+ ...createMockV2Event().requestContext,
183
+ http: {
184
+ method: 'POST',
185
+ path: '/users',
186
+ protocol: 'HTTP/1.1',
187
+ sourceIp: '192.168.1.1',
188
+ userAgent: 'test-agent',
189
+ },
190
+ },
191
+ body: JSON.stringify({}),
192
+ });
193
+ const context = createMockContext();
194
+ const response = await handler(event, context);
195
+
196
+ expect(response.statusCode).toBe(201);
197
+
198
+ // Verify audit was written to the real database
199
+ const auditsInDb = await db
200
+ .selectFrom('awsAuditLogs')
201
+ .selectAll()
202
+ .execute();
203
+
204
+ expect(auditsInDb).toHaveLength(1);
205
+ expect(auditsInDb[0].type).toBe('user.created');
206
+ expect(auditsInDb[0].payload).toEqual({
207
+ userId: 1,
208
+ email: 'test@example.com',
209
+ });
210
+ });
211
+
212
+ it('should not write audit when handler fails', async () => {
213
+ const auditStorageService: Service<
214
+ 'auditStorage',
215
+ KyselyAuditStorage<TestDatabase>
216
+ > = {
217
+ serviceName: 'auditStorage' as const,
218
+ register: vi.fn().mockResolvedValue(auditStorage),
219
+ };
220
+
221
+ const outputSchema = z.object({ id: z.number(), email: z.string() });
222
+
223
+ const audits: MappedAudit<TestAuditAction, typeof outputSchema>[] = [
224
+ {
225
+ type: 'user.created',
226
+ payload: (response) => ({
227
+ userId: response.id,
228
+ email: response.email,
229
+ }),
230
+ },
231
+ ];
232
+
233
+ const endpoint = new Endpoint({
234
+ route: '/users',
235
+ method: 'POST',
236
+ fn: async () => {
237
+ throw new Error('Handler failed');
238
+ },
239
+ input: undefined,
240
+ output: outputSchema,
241
+ services: [],
242
+ logger: mockLogger,
243
+ timeout: undefined,
244
+ memorySize: undefined,
245
+ status: 201,
246
+ getSession: undefined,
247
+ authorize: undefined,
248
+ description: undefined,
249
+ events: [],
250
+ publisherService: undefined,
251
+ auditorStorageService: auditStorageService,
252
+ audits,
253
+ });
254
+
255
+ const adapter = new AmazonApiGatewayV2Endpoint(envParser, endpoint as any);
256
+ const handler = adapter.handler;
257
+
258
+ const event = createMockV2Event({
259
+ requestContext: {
260
+ ...createMockV2Event().requestContext,
261
+ http: {
262
+ method: 'POST',
263
+ path: '/users',
264
+ protocol: 'HTTP/1.1',
265
+ sourceIp: '192.168.1.1',
266
+ userAgent: 'test-agent',
267
+ },
268
+ },
269
+ body: JSON.stringify({}),
270
+ });
271
+ const context = createMockContext();
272
+ const response = await handler(event, context);
273
+
274
+ expect(response.statusCode).toBe(500);
275
+
276
+ // Verify no audit was written
277
+ const auditsInDb = await db
278
+ .selectFrom('awsAuditLogs')
279
+ .selectAll()
280
+ .execute();
281
+
282
+ expect(auditsInDb).toHaveLength(0);
283
+ });
284
+ });
285
+
286
+ describe('manual audits with real database', () => {
287
+ it('should write manual audits from handler to database', async () => {
288
+ const auditStorageService: Service<
289
+ 'auditStorage',
290
+ KyselyAuditStorage<TestDatabase>
291
+ > = {
292
+ serviceName: 'auditStorage' as const,
293
+ register: vi.fn().mockResolvedValue(auditStorage),
294
+ };
295
+
296
+ const outputSchema = z.object({ id: z.number(), email: z.string() });
297
+
298
+ const endpoint = new Endpoint({
299
+ route: '/users',
300
+ method: 'POST',
301
+ fn: async (
302
+ ctx: EndpointContext<undefined, [], Logger, unknown, TestAuditAction>,
303
+ ) => {
304
+ // Manual audit in handler
305
+ if (ctx.auditor) {
306
+ ctx.auditor.audit('user.created', {
307
+ userId: 42,
308
+ email: 'manual@example.com',
309
+ });
310
+ }
311
+
312
+ return { id: 42, email: 'manual@example.com' };
313
+ },
314
+ input: undefined,
315
+ output: outputSchema,
316
+ services: [],
317
+ logger: mockLogger,
318
+ timeout: undefined,
319
+ memorySize: undefined,
320
+ status: 201,
321
+ getSession: undefined,
322
+ authorize: undefined,
323
+ description: undefined,
324
+ events: [],
325
+ publisherService: undefined,
326
+ auditorStorageService: auditStorageService,
327
+ audits: [],
328
+ });
329
+
330
+ const adapter = new AmazonApiGatewayV2Endpoint(envParser, endpoint as any);
331
+ const handler = adapter.handler;
332
+
333
+ const event = createMockV2Event({
334
+ requestContext: {
335
+ ...createMockV2Event().requestContext,
336
+ http: {
337
+ method: 'POST',
338
+ path: '/users',
339
+ protocol: 'HTTP/1.1',
340
+ sourceIp: '192.168.1.1',
341
+ userAgent: 'test-agent',
342
+ },
343
+ },
344
+ body: JSON.stringify({}),
345
+ });
346
+ const context = createMockContext();
347
+ const response = await handler(event, context);
348
+
349
+ expect(response.statusCode).toBe(201);
350
+
351
+ // Verify manual audit was written
352
+ const auditsInDb = await db
353
+ .selectFrom('awsAuditLogs')
354
+ .selectAll()
355
+ .execute();
356
+
357
+ expect(auditsInDb).toHaveLength(1);
358
+ expect(auditsInDb[0].type).toBe('user.created');
359
+ expect(auditsInDb[0].payload).toEqual({
360
+ userId: 42,
361
+ email: 'manual@example.com',
362
+ });
363
+ });
364
+
365
+ it('should not write manual audit when handler fails after audit call', async () => {
366
+ const auditStorageService: Service<
367
+ 'auditStorage',
368
+ KyselyAuditStorage<TestDatabase>
369
+ > = {
370
+ serviceName: 'auditStorage' as const,
371
+ register: vi.fn().mockResolvedValue(auditStorage),
372
+ };
373
+
374
+ const outputSchema = z.object({ id: z.number(), email: z.string() });
375
+
376
+ const endpoint = new Endpoint({
377
+ route: '/users',
378
+ method: 'POST',
379
+ fn: async (
380
+ ctx: EndpointContext<undefined, [], Logger, unknown, TestAuditAction>,
381
+ ) => {
382
+ // Manual audit before failure
383
+ if (ctx.auditor) {
384
+ ctx.auditor.audit('user.created', {
385
+ userId: 99,
386
+ email: 'shouldnotexist@example.com',
387
+ });
388
+ }
389
+
390
+ // Fail after audit
391
+ throw new Error('Handler failed after audit');
392
+ },
393
+ input: undefined,
394
+ output: outputSchema,
395
+ services: [],
396
+ logger: mockLogger,
397
+ timeout: undefined,
398
+ memorySize: undefined,
399
+ status: 201,
400
+ getSession: undefined,
401
+ authorize: undefined,
402
+ description: undefined,
403
+ events: [],
404
+ publisherService: undefined,
405
+ auditorStorageService: auditStorageService,
406
+ audits: [],
407
+ });
408
+
409
+ const adapter = new AmazonApiGatewayV2Endpoint(envParser, endpoint as any);
410
+ const handler = adapter.handler;
411
+
412
+ const event = createMockV2Event({
413
+ requestContext: {
414
+ ...createMockV2Event().requestContext,
415
+ http: {
416
+ method: 'POST',
417
+ path: '/users',
418
+ protocol: 'HTTP/1.1',
419
+ sourceIp: '192.168.1.1',
420
+ userAgent: 'test-agent',
421
+ },
422
+ },
423
+ body: JSON.stringify({}),
424
+ });
425
+ const context = createMockContext();
426
+ const response = await handler(event, context);
427
+
428
+ expect(response.statusCode).toBe(500);
429
+
430
+ // Verify no audit was written (transaction rolled back)
431
+ const auditsInDb = await db
432
+ .selectFrom('awsAuditLogs')
433
+ .selectAll()
434
+ .execute();
435
+
436
+ expect(auditsInDb).toHaveLength(0);
437
+ });
438
+ });
439
+
440
+ describe('transactional consistency with real database', () => {
441
+ it('should commit both user insert and audit on success', async () => {
442
+ const databaseService: Service<'database', Kysely<TestDatabase>> = {
443
+ serviceName: 'database' as const,
444
+ register: vi.fn().mockResolvedValue(db),
445
+ };
446
+
447
+ const auditStorageService: Service<
448
+ 'auditStorage',
449
+ KyselyAuditStorage<TestDatabase>
450
+ > = {
451
+ serviceName: 'auditStorage' as const,
452
+ register: vi.fn().mockResolvedValue(auditStorage),
453
+ };
454
+
455
+ const outputSchema = z.object({ id: z.number(), email: z.string() });
456
+
457
+ const endpoint = new Endpoint({
458
+ route: '/users',
459
+ method: 'POST',
460
+ fn: async (
461
+ ctx: EndpointContext<
462
+ undefined,
463
+ [typeof databaseService],
464
+ Logger,
465
+ unknown,
466
+ TestAuditAction
467
+ >,
468
+ ) => {
469
+ const database = ctx.services.database;
470
+
471
+ // Insert user
472
+ const user = await database
473
+ .insertInto('awsUsers')
474
+ .values({ name: 'Success User', email: 'success@example.com' })
475
+ .returningAll()
476
+ .executeTakeFirstOrThrow();
477
+
478
+ // Record audit
479
+ if (ctx.auditor) {
480
+ ctx.auditor.audit('user.created', {
481
+ userId: user.id,
482
+ email: user.email,
483
+ });
484
+ }
485
+
486
+ return { id: user.id, email: user.email };
487
+ },
488
+ input: undefined,
489
+ output: outputSchema,
490
+ services: [databaseService],
491
+ logger: mockLogger,
492
+ timeout: undefined,
493
+ memorySize: undefined,
494
+ status: 201,
495
+ getSession: undefined,
496
+ authorize: undefined,
497
+ description: undefined,
498
+ events: [],
499
+ publisherService: undefined,
500
+ auditorStorageService: auditStorageService,
501
+ audits: [],
502
+ });
503
+
504
+ const adapter = new AmazonApiGatewayV2Endpoint(envParser, endpoint as any);
505
+ const handler = adapter.handler;
506
+
507
+ const event = createMockV2Event({
508
+ requestContext: {
509
+ ...createMockV2Event().requestContext,
510
+ http: {
511
+ method: 'POST',
512
+ path: '/users',
513
+ protocol: 'HTTP/1.1',
514
+ sourceIp: '192.168.1.1',
515
+ userAgent: 'test-agent',
516
+ },
517
+ },
518
+ body: JSON.stringify({}),
519
+ });
520
+ const context = createMockContext();
521
+ const response = await handler(event, context);
522
+
523
+ expect(response.statusCode).toBe(201);
524
+
525
+ // Verify user was created
526
+ const usersInDb = await db.selectFrom('awsUsers').selectAll().execute();
527
+ expect(usersInDb).toHaveLength(1);
528
+ expect(usersInDb[0].email).toBe('success@example.com');
529
+
530
+ // Verify audit was written
531
+ const auditsInDb = await db
532
+ .selectFrom('awsAuditLogs')
533
+ .selectAll()
534
+ .execute();
535
+ expect(auditsInDb).toHaveLength(1);
536
+ expect(auditsInDb[0].type).toBe('user.created');
537
+ expect(auditsInDb[0].payload).toEqual({
538
+ userId: usersInDb[0].id,
539
+ email: 'success@example.com',
540
+ });
541
+ });
542
+
543
+ it('should handle combined declarative and manual audits', async () => {
544
+ const auditStorageService: Service<
545
+ 'auditStorage',
546
+ KyselyAuditStorage<TestDatabase>
547
+ > = {
548
+ serviceName: 'auditStorage' as const,
549
+ register: vi.fn().mockResolvedValue(auditStorage),
550
+ };
551
+
552
+ const outputSchema = z.object({ id: z.number(), email: z.string() });
553
+
554
+ // Declarative audit
555
+ const audits: MappedAudit<TestAuditAction, typeof outputSchema>[] = [
556
+ {
557
+ type: 'user.created',
558
+ payload: (response) => ({
559
+ userId: response.id,
560
+ email: response.email,
561
+ }),
562
+ },
563
+ ];
564
+
565
+ const endpoint = new Endpoint({
566
+ route: '/users',
567
+ method: 'POST',
568
+ fn: async (
569
+ ctx: EndpointContext<undefined, [], Logger, unknown, TestAuditAction>,
570
+ ) => {
571
+ // Manual audit
572
+ if (ctx.auditor) {
573
+ ctx.auditor.audit('user.updated', {
574
+ userId: 100,
575
+ changes: ['verified'],
576
+ });
577
+ }
578
+
579
+ return { id: 100, email: 'combined@example.com' };
580
+ },
581
+ input: undefined,
582
+ output: outputSchema,
583
+ services: [],
584
+ logger: mockLogger,
585
+ timeout: undefined,
586
+ memorySize: undefined,
587
+ status: 201,
588
+ getSession: undefined,
589
+ authorize: undefined,
590
+ description: undefined,
591
+ events: [],
592
+ publisherService: undefined,
593
+ auditorStorageService: auditStorageService,
594
+ audits,
595
+ });
596
+
597
+ const adapter = new AmazonApiGatewayV2Endpoint(envParser, endpoint as any);
598
+ const handler = adapter.handler;
599
+
600
+ const event = createMockV2Event({
601
+ requestContext: {
602
+ ...createMockV2Event().requestContext,
603
+ http: {
604
+ method: 'POST',
605
+ path: '/users',
606
+ protocol: 'HTTP/1.1',
607
+ sourceIp: '192.168.1.1',
608
+ userAgent: 'test-agent',
609
+ },
610
+ },
611
+ body: JSON.stringify({}),
612
+ });
613
+ const context = createMockContext();
614
+ const response = await handler(event, context);
615
+
616
+ expect(response.statusCode).toBe(201);
617
+
618
+ // Verify both audits were written
619
+ const auditsInDb = await db
620
+ .selectFrom('awsAuditLogs')
621
+ .selectAll()
622
+ .execute();
623
+
624
+ expect(auditsInDb).toHaveLength(2);
625
+
626
+ const auditTypes = auditsInDb.map((a) => a.type).sort();
627
+ expect(auditTypes).toEqual(['user.created', 'user.updated']);
628
+ });
629
+ });
630
+
631
+ describe('actor extraction with real database', () => {
632
+ it('should include actor information in audit records', async () => {
633
+ const auditStorageService: Service<
634
+ 'auditStorage',
635
+ KyselyAuditStorage<TestDatabase>
636
+ > = {
637
+ serviceName: 'auditStorage' as const,
638
+ register: vi.fn().mockResolvedValue(auditStorage),
639
+ };
640
+
641
+ const outputSchema = z.object({ id: z.number(), email: z.string() });
642
+
643
+ const audits: MappedAudit<TestAuditAction, typeof outputSchema>[] = [
644
+ {
645
+ type: 'user.created',
646
+ payload: (response) => ({
647
+ userId: response.id,
648
+ email: response.email,
649
+ }),
650
+ },
651
+ ];
652
+
653
+ const endpoint = new Endpoint({
654
+ route: '/users',
655
+ method: 'POST',
656
+ fn: async () => {
657
+ return { id: 1, email: 'actor-test@example.com' };
658
+ },
659
+ input: undefined,
660
+ output: outputSchema,
661
+ services: [],
662
+ logger: mockLogger,
663
+ timeout: undefined,
664
+ memorySize: undefined,
665
+ status: 201,
666
+ getSession: undefined,
667
+ authorize: undefined,
668
+ description: undefined,
669
+ events: [],
670
+ publisherService: undefined,
671
+ auditorStorageService: auditStorageService,
672
+ audits,
673
+ actorExtractor: async ({ header }) => {
674
+ const userId = header('x-user-id');
675
+ return {
676
+ id: userId ?? 'anonymous',
677
+ type: userId ? 'user' : 'anonymous',
678
+ };
679
+ },
680
+ });
681
+
682
+ const adapter = new AmazonApiGatewayV2Endpoint(envParser, endpoint as any);
683
+ const handler = adapter.handler;
684
+
685
+ const event = createMockV2Event({
686
+ requestContext: {
687
+ ...createMockV2Event().requestContext,
688
+ http: {
689
+ method: 'POST',
690
+ path: '/users',
691
+ protocol: 'HTTP/1.1',
692
+ sourceIp: '192.168.1.1',
693
+ userAgent: 'test-agent',
694
+ },
695
+ },
696
+ headers: {
697
+ 'content-type': 'application/json',
698
+ 'x-user-id': 'user-123',
699
+ },
700
+ body: JSON.stringify({}),
701
+ });
702
+ const context = createMockContext();
703
+ const response = await handler(event, context);
704
+
705
+ expect(response.statusCode).toBe(201);
706
+
707
+ // Verify actor was included in audit
708
+ const auditsInDb = await db
709
+ .selectFrom('awsAuditLogs')
710
+ .selectAll()
711
+ .execute();
712
+
713
+ expect(auditsInDb).toHaveLength(1);
714
+ expect(auditsInDb[0].actorId).toBe('user-123');
715
+ expect(auditsInDb[0].actorType).toBe('user');
716
+ });
717
+ });
718
+ });