@geekmidas/constructs 0.3.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (550) hide show
  1. package/dist/{AWSLambdaFunction-EPGY4s7i.cjs → AWSLambdaFunction-Ba1DcsW2.cjs} +6 -6
  2. package/dist/AWSLambdaFunction-Ba1DcsW2.cjs.map +1 -0
  3. package/dist/{AWSLambdaFunction-BdebRMUh.d.mts → AWSLambdaFunction-CKe73Qr0.d.cts} +6 -6
  4. package/dist/AWSLambdaFunction-CKe73Qr0.d.cts.map +1 -0
  5. package/dist/{AWSLambdaFunction-D0tEOTXQ.d.cts → AWSLambdaFunction-CuG3HNZx.d.mts} +6 -6
  6. package/dist/AWSLambdaFunction-CuG3HNZx.d.mts.map +1 -0
  7. package/dist/{AWSLambdaFunction-C54a1doJ.mjs → AWSLambdaFunction-DnMm4xvz.mjs} +6 -6
  8. package/dist/AWSLambdaFunction-DnMm4xvz.mjs.map +1 -0
  9. package/dist/{AWSLambdaSubscriberAdaptor-Dx-Ks1Jp.d.cts → AWSLambdaSubscriberAdaptor-B4HH-WuQ.d.mts} +4 -4
  10. package/dist/AWSLambdaSubscriberAdaptor-B4HH-WuQ.d.mts.map +1 -0
  11. package/dist/{AWSLambdaSubscriberAdaptor-BLfO612H.mjs → AWSLambdaSubscriberAdaptor-BD3FwGUb.mjs} +3 -3
  12. package/dist/AWSLambdaSubscriberAdaptor-BD3FwGUb.mjs.map +1 -0
  13. package/dist/{AWSLambdaSubscriberAdaptor-DrFAvHOp.d.mts → AWSLambdaSubscriberAdaptor-BEqQ96VJ.d.cts} +4 -4
  14. package/dist/AWSLambdaSubscriberAdaptor-BEqQ96VJ.d.cts.map +1 -0
  15. package/dist/{AWSLambdaSubscriberAdaptor-BNcYYZ-P.cjs → AWSLambdaSubscriberAdaptor-DQDnt1Xk.cjs} +3 -3
  16. package/dist/AWSLambdaSubscriberAdaptor-DQDnt1Xk.cjs.map +1 -0
  17. package/dist/{AmazonApiGatewayEndpointAdaptor-BT9JXihC.mjs → AmazonApiGatewayEndpointAdaptor-Bvy-Hgjf.mjs} +56 -14
  18. package/dist/AmazonApiGatewayEndpointAdaptor-Bvy-Hgjf.mjs.map +1 -0
  19. package/dist/{AmazonApiGatewayEndpointAdaptor-DNFvvdmW.cjs → AmazonApiGatewayEndpointAdaptor-Cpxluhfg.cjs} +55 -13
  20. package/dist/AmazonApiGatewayEndpointAdaptor-Cpxluhfg.cjs.map +1 -0
  21. package/dist/{AmazonApiGatewayEndpointAdaptor-qlKXuZxy.d.mts → AmazonApiGatewayEndpointAdaptor-DTgdZ8I1.d.mts} +52 -6
  22. package/dist/AmazonApiGatewayEndpointAdaptor-DTgdZ8I1.d.mts.map +1 -0
  23. package/dist/{AmazonApiGatewayEndpointAdaptor-DLqnYQ4E.d.cts → AmazonApiGatewayEndpointAdaptor-DsWnO6x9.d.cts} +51 -5
  24. package/dist/AmazonApiGatewayEndpointAdaptor-DsWnO6x9.d.cts.map +1 -0
  25. package/dist/{AmazonApiGatewayV1EndpointAdaptor-DyUaJIhB.d.cts → AmazonApiGatewayV1EndpointAdaptor-7ELXUBFK.d.cts} +4 -4
  26. package/dist/AmazonApiGatewayV1EndpointAdaptor-7ELXUBFK.d.cts.map +1 -0
  27. package/dist/{AmazonApiGatewayV1EndpointAdaptor-Ccl8B8kG.cjs → AmazonApiGatewayV1EndpointAdaptor-B8vIYYNh.cjs} +4 -4
  28. package/dist/AmazonApiGatewayV1EndpointAdaptor-B8vIYYNh.cjs.map +1 -0
  29. package/dist/{AmazonApiGatewayV1EndpointAdaptor-CShQI8Gk.mjs → AmazonApiGatewayV1EndpointAdaptor-ByXGIju8.mjs} +4 -4
  30. package/dist/AmazonApiGatewayV1EndpointAdaptor-ByXGIju8.mjs.map +1 -0
  31. package/dist/{AmazonApiGatewayV1EndpointAdaptor-MRUxs3Xi.d.mts → AmazonApiGatewayV1EndpointAdaptor-RWRmFPrN.d.mts} +5 -5
  32. package/dist/AmazonApiGatewayV1EndpointAdaptor-RWRmFPrN.d.mts.map +1 -0
  33. package/dist/{AmazonApiGatewayV2EndpointAdaptor-D8-0Aab4.cjs → AmazonApiGatewayV2EndpointAdaptor-DIetspUm.cjs} +4 -4
  34. package/dist/AmazonApiGatewayV2EndpointAdaptor-DIetspUm.cjs.map +1 -0
  35. package/dist/{AmazonApiGatewayV2EndpointAdaptor-lCRzGE4q.mjs → AmazonApiGatewayV2EndpointAdaptor-DWemCZvl.mjs} +4 -4
  36. package/dist/AmazonApiGatewayV2EndpointAdaptor-DWemCZvl.mjs.map +1 -0
  37. package/dist/{AmazonApiGatewayV2EndpointAdaptor-M1-w0U5R.d.cts → AmazonApiGatewayV2EndpointAdaptor-D_uMTmuJ.d.cts} +4 -6
  38. package/dist/AmazonApiGatewayV2EndpointAdaptor-D_uMTmuJ.d.cts.map +1 -0
  39. package/dist/{AmazonApiGatewayV2EndpointAdaptor-fuLM6M9k.d.mts → AmazonApiGatewayV2EndpointAdaptor-wnOMDv6o.d.mts} +5 -7
  40. package/dist/AmazonApiGatewayV2EndpointAdaptor-wnOMDv6o.d.mts.map +1 -0
  41. package/dist/{Authorizer-C0ge_tc8.cjs → Authorizer-BXxBee2P.cjs} +1 -1
  42. package/dist/Authorizer-BXxBee2P.cjs.map +1 -0
  43. package/dist/{Authorizer-r9U3y_ms.mjs → Authorizer-BgjU8-z6.mjs} +1 -1
  44. package/dist/Authorizer-BgjU8-z6.mjs.map +1 -0
  45. package/dist/{Authorizer-gWxYsGEp.d.mts → Authorizer-DCcYOx3h.d.mts} +1 -1
  46. package/dist/Authorizer-DCcYOx3h.d.mts.map +1 -0
  47. package/dist/{Authorizer-B-btowNd.d.cts → Authorizer-DWtwC8we.d.cts} +1 -1
  48. package/dist/Authorizer-DWtwC8we.d.cts.map +1 -0
  49. package/dist/{BaseFunctionBuilder-Czi1Jwza.mjs → BaseFunctionBuilder-0qlenb9z.mjs} +2 -2
  50. package/dist/BaseFunctionBuilder-0qlenb9z.mjs.map +1 -0
  51. package/dist/BaseFunctionBuilder-BAtutR6q.d.cts.map +1 -1
  52. package/dist/{BaseFunctionBuilder-DRY419e7.d.mts → BaseFunctionBuilder-CDfDWWAQ.d.mts} +2 -2
  53. package/dist/BaseFunctionBuilder-CDfDWWAQ.d.mts.map +1 -0
  54. package/dist/{BaseFunctionBuilder-MYG3C9ug.cjs → BaseFunctionBuilder-D7o93EGv.cjs} +2 -2
  55. package/dist/BaseFunctionBuilder-D7o93EGv.cjs.map +1 -0
  56. package/dist/{Construct-Ba5cMxib.cjs → Construct-BlnyYtJC.cjs} +31 -2
  57. package/dist/Construct-BlnyYtJC.cjs.map +1 -0
  58. package/dist/Construct-C4rPE67v.d.cts.map +1 -1
  59. package/dist/{Construct-DdyGHuag.mjs → Construct-D5dCvxZ3.mjs} +31 -2
  60. package/dist/Construct-D5dCvxZ3.mjs.map +1 -0
  61. package/dist/{Construct-XrijZFFh.d.mts → Construct-dZiwVo0q.d.mts} +1 -1
  62. package/dist/Construct-dZiwVo0q.d.mts.map +1 -0
  63. package/dist/Construct.cjs +1 -1
  64. package/dist/Construct.d.mts +1 -1
  65. package/dist/Construct.mjs +1 -1
  66. package/dist/{Cron-bDLcTvV5.d.cts → Cron-B6FnTu7k.d.cts} +2 -2
  67. package/dist/Cron-B6FnTu7k.d.cts.map +1 -0
  68. package/dist/{Cron-CGF4YAfM.cjs → Cron-BAPQetlC.cjs} +3 -3
  69. package/dist/Cron-BAPQetlC.cjs.map +1 -0
  70. package/dist/{Cron-BxhGs5up.mjs → Cron-CAk_ddH8.mjs} +3 -3
  71. package/dist/Cron-CAk_ddH8.mjs.map +1 -0
  72. package/dist/{Cron-cdjlSKNp.d.mts → Cron-D3bEljxQ.d.mts} +2 -2
  73. package/dist/Cron-D3bEljxQ.d.mts.map +1 -0
  74. package/dist/{CronBuilder-DKVXyE0Q.d.cts → CronBuilder-CA8euP0z.d.cts} +4 -4
  75. package/dist/CronBuilder-CA8euP0z.d.cts.map +1 -0
  76. package/dist/{CronBuilder-BC4m5-p1.d.mts → CronBuilder-DvdiKzhq.d.mts} +4 -4
  77. package/dist/CronBuilder-DvdiKzhq.d.mts.map +1 -0
  78. package/dist/{CronBuilder-CcxKRtVP.cjs → CronBuilder-DxXA5ymv.cjs} +4 -4
  79. package/dist/CronBuilder-DxXA5ymv.cjs.map +1 -0
  80. package/dist/{CronBuilder-d2jh-IB2.mjs → CronBuilder-e8TaHPYm.mjs} +4 -4
  81. package/dist/CronBuilder-e8TaHPYm.mjs.map +1 -0
  82. package/dist/{Endpoint-BPv9_-m_.d.cts → Endpoint-BOlbY5iq.d.cts} +3 -3
  83. package/dist/Endpoint-BOlbY5iq.d.cts.map +1 -0
  84. package/dist/{Endpoint-CuOEswxJ.mjs → Endpoint-BbdNmtlM.mjs} +6 -6
  85. package/dist/Endpoint-BbdNmtlM.mjs.map +1 -0
  86. package/dist/{Endpoint-BdwG75G_.d.mts → Endpoint-Dlv7nxgj.d.mts} +4 -4
  87. package/dist/Endpoint-Dlv7nxgj.d.mts.map +1 -0
  88. package/dist/{Endpoint-BVGZXFyV.cjs → Endpoint-DxvnlfXg.cjs} +6 -6
  89. package/dist/Endpoint-DxvnlfXg.cjs.map +1 -0
  90. package/dist/{EndpointBuilder-Cgj1P_ra.cjs → EndpointBuilder-40Iz5CjY.cjs} +6 -6
  91. package/dist/EndpointBuilder-40Iz5CjY.cjs.map +1 -0
  92. package/dist/{EndpointBuilder-DnCB1h1j.mjs → EndpointBuilder-BaVvhW9m.mjs} +6 -6
  93. package/dist/EndpointBuilder-BaVvhW9m.mjs.map +1 -0
  94. package/dist/{EndpointBuilder-DIy_m1bu.d.cts → EndpointBuilder-CFfWWjUa.d.cts} +3 -3
  95. package/dist/EndpointBuilder-CFfWWjUa.d.cts.map +1 -0
  96. package/dist/{EndpointBuilder-B3az942t.d.mts → EndpointBuilder-T_K2NLWw.d.mts} +5 -5
  97. package/dist/EndpointBuilder-T_K2NLWw.d.mts.map +1 -0
  98. package/dist/{EndpointFactory-CyPbm3AD.d.cts → EndpointFactory-ChzBVEM9.d.cts} +4 -4
  99. package/dist/EndpointFactory-ChzBVEM9.d.cts.map +1 -0
  100. package/dist/{EndpointFactory-CbdxPCIH.mjs → EndpointFactory-DfNjSgVG.mjs} +7 -7
  101. package/dist/EndpointFactory-DfNjSgVG.mjs.map +1 -0
  102. package/dist/{EndpointFactory-C-0nE6Jg.d.mts → EndpointFactory-GAL_tuPf.d.mts} +4 -4
  103. package/dist/EndpointFactory-GAL_tuPf.d.mts.map +1 -0
  104. package/dist/{EndpointFactory-CYj6BYok.cjs → EndpointFactory-r6jxPvQ8.cjs} +7 -7
  105. package/dist/EndpointFactory-r6jxPvQ8.cjs.map +1 -0
  106. package/dist/{Function-BVHqIDp9.mjs → Function-D8tBamM3.mjs} +3 -3
  107. package/dist/Function-D8tBamM3.mjs.map +1 -0
  108. package/dist/{Function-DN2G6OT5.d.mts → Function-DBmU3uGI.d.mts} +3 -3
  109. package/dist/Function-DBmU3uGI.d.mts.map +1 -0
  110. package/dist/{Function-Cf7f_kCz.d.cts → Function-PNW4HdNE.d.cts} +2 -2
  111. package/dist/Function-PNW4HdNE.d.cts.map +1 -0
  112. package/dist/{Function-DDZb1525.cjs → Function-iLKrUXuw.cjs} +3 -3
  113. package/dist/Function-iLKrUXuw.cjs.map +1 -0
  114. package/dist/{FunctionBuilder-DswJ-9sD.cjs → FunctionBuilder-BEpPgeho.cjs} +4 -4
  115. package/dist/FunctionBuilder-BEpPgeho.cjs.map +1 -0
  116. package/dist/{FunctionBuilder-Cxx8D2na.d.mts → FunctionBuilder-Bv4H2I1a.d.mts} +4 -4
  117. package/dist/FunctionBuilder-Bv4H2I1a.d.mts.map +1 -0
  118. package/dist/{FunctionBuilder-CrDYgfiI.mjs → FunctionBuilder-BwNF99AB.mjs} +4 -4
  119. package/dist/FunctionBuilder-BwNF99AB.mjs.map +1 -0
  120. package/dist/{FunctionBuilder-CJBzzXL3.d.cts → FunctionBuilder-DCqXIHaq.d.cts} +2 -2
  121. package/dist/FunctionBuilder-DCqXIHaq.d.cts.map +1 -0
  122. package/dist/{FunctionExecutionWrapper-CLDh7Z2_.mjs → FunctionExecutionWrapper-B__HE_B-.mjs} +3 -3
  123. package/dist/FunctionExecutionWrapper-B__HE_B-.mjs.map +1 -0
  124. package/dist/{FunctionExecutionWrapper-DF260Aaj.d.mts → FunctionExecutionWrapper-BclgIztn.d.cts} +5 -5
  125. package/dist/FunctionExecutionWrapper-BclgIztn.d.cts.map +1 -0
  126. package/dist/{FunctionExecutionWrapper-BYI2bGTL.cjs → FunctionExecutionWrapper-BjF6t9Hb.cjs} +3 -3
  127. package/dist/FunctionExecutionWrapper-BjF6t9Hb.cjs.map +1 -0
  128. package/dist/{FunctionExecutionWrapper-Qy8bmgFR.d.cts → FunctionExecutionWrapper-Dq21c6vt.d.mts} +5 -5
  129. package/dist/FunctionExecutionWrapper-Dq21c6vt.d.mts.map +1 -0
  130. package/dist/HonoEndpointAdaptor-C_ym_Sbr.mjs +251 -0
  131. package/dist/HonoEndpointAdaptor-C_ym_Sbr.mjs.map +1 -0
  132. package/dist/HonoEndpointAdaptor-DiQH0eTb.cjs +257 -0
  133. package/dist/HonoEndpointAdaptor-DiQH0eTb.cjs.map +1 -0
  134. package/dist/{HonoEndpointAdaptor-YcRHYALH.d.cts → HonoEndpointAdaptor-Dkkemmbo.d.cts} +10 -5
  135. package/dist/HonoEndpointAdaptor-Dkkemmbo.d.cts.map +1 -0
  136. package/dist/{HonoEndpointAdaptor-BaPlUhz0.d.mts → HonoEndpointAdaptor-HukjdF6M.d.mts} +11 -6
  137. package/dist/HonoEndpointAdaptor-HukjdF6M.d.mts.map +1 -0
  138. package/dist/{Subscriber-COYMSevD.d.cts → Subscriber--zUjZDR6.d.cts} +1 -1
  139. package/dist/Subscriber--zUjZDR6.d.cts.map +1 -0
  140. package/dist/{Subscriber-ikctpU3I.d.mts → Subscriber-0Ac7cXID.d.mts} +2 -2
  141. package/dist/Subscriber-0Ac7cXID.d.mts.map +1 -0
  142. package/dist/{Subscriber-BmPf9GFb.mjs → Subscriber-BgZ8T-O2.mjs} +2 -2
  143. package/dist/Subscriber-BgZ8T-O2.mjs.map +1 -0
  144. package/dist/{Subscriber-BiHjVXtM.cjs → Subscriber-CoFmHMIM.cjs} +2 -2
  145. package/dist/Subscriber-CoFmHMIM.cjs.map +1 -0
  146. package/dist/{SubscriberBuilder-D_9zzllj.d.mts → SubscriberBuilder-D8cmUHee.d.mts} +2 -2
  147. package/dist/SubscriberBuilder-D8cmUHee.d.mts.map +1 -0
  148. package/dist/{SubscriberBuilder-DJPEeYDJ.mjs → SubscriberBuilder-DWXWZBPo.mjs} +2 -2
  149. package/dist/SubscriberBuilder-DWXWZBPo.mjs.map +1 -0
  150. package/dist/{SubscriberBuilder-ivHAGIVi.d.cts → SubscriberBuilder-DciTqb-7.d.cts} +2 -2
  151. package/dist/SubscriberBuilder-DciTqb-7.d.cts.map +1 -0
  152. package/dist/{SubscriberBuilder-Cp1C-xtT.cjs → SubscriberBuilder-JlxhyqGp.cjs} +2 -2
  153. package/dist/SubscriberBuilder-JlxhyqGp.cjs.map +1 -0
  154. package/dist/{TestEndpointAdaptor-DB7bREhS.d.mts → TestEndpointAdaptor-Boijwbmz.d.mts} +4 -4
  155. package/dist/TestEndpointAdaptor-Boijwbmz.d.mts.map +1 -0
  156. package/dist/{TestEndpointAdaptor-C10xBI--.d.cts → TestEndpointAdaptor-DdwpRyNh.d.cts} +3 -3
  157. package/dist/TestEndpointAdaptor-DdwpRyNh.d.cts.map +1 -0
  158. package/dist/TestEndpointAdaptor-Dk75ExxE.cjs +176 -0
  159. package/dist/TestEndpointAdaptor-Dk75ExxE.cjs.map +1 -0
  160. package/dist/TestEndpointAdaptor-OiA2JLDp.mjs +170 -0
  161. package/dist/TestEndpointAdaptor-OiA2JLDp.mjs.map +1 -0
  162. package/dist/adaptors/aws.cjs +12 -12
  163. package/dist/adaptors/aws.d.cts +13 -12
  164. package/dist/adaptors/aws.d.mts +16 -15
  165. package/dist/adaptors/aws.mjs +12 -12
  166. package/dist/adaptors/hono.cjs +10 -9
  167. package/dist/adaptors/hono.d.cts +6 -6
  168. package/dist/adaptors/hono.d.mts +9 -9
  169. package/dist/adaptors/hono.mjs +10 -9
  170. package/dist/adaptors/testing.cjs +8 -7
  171. package/dist/adaptors/testing.d.cts +6 -6
  172. package/dist/adaptors/testing.d.mts +9 -9
  173. package/dist/adaptors/testing.mjs +8 -7
  174. package/dist/crons/Cron.cjs +6 -6
  175. package/dist/crons/Cron.d.cts +4 -4
  176. package/dist/crons/Cron.d.mts +6 -6
  177. package/dist/crons/Cron.mjs +6 -6
  178. package/dist/crons/CronBuilder.cjs +7 -7
  179. package/dist/crons/CronBuilder.d.cts +5 -5
  180. package/dist/crons/CronBuilder.d.mts +7 -7
  181. package/dist/crons/CronBuilder.mjs +7 -7
  182. package/dist/crons/index.cjs +7 -7
  183. package/dist/crons/index.cjs.map +1 -1
  184. package/dist/crons/index.d.cts +9 -9
  185. package/dist/crons/index.d.mts +7 -7
  186. package/dist/crons/index.mjs +7 -7
  187. package/dist/crons/index.mjs.map +1 -1
  188. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +7 -7
  189. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +8 -7
  190. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +11 -10
  191. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +7 -7
  192. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +8 -8
  193. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +8 -7
  194. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +11 -10
  195. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +8 -8
  196. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +8 -8
  197. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +9 -8
  198. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +12 -11
  199. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +8 -8
  200. package/dist/endpoints/Authorizer.cjs +1 -1
  201. package/dist/endpoints/Authorizer.d.cts +1 -1
  202. package/dist/endpoints/Authorizer.d.mts +1 -1
  203. package/dist/endpoints/Authorizer.mjs +1 -1
  204. package/dist/endpoints/Endpoint.cjs +6 -6
  205. package/dist/endpoints/Endpoint.d.cts +5 -5
  206. package/dist/endpoints/Endpoint.d.mts +8 -8
  207. package/dist/endpoints/Endpoint.mjs +6 -6
  208. package/dist/endpoints/EndpointBuilder.cjs +9 -9
  209. package/dist/endpoints/EndpointBuilder.d.cts +6 -6
  210. package/dist/endpoints/EndpointBuilder.d.mts +9 -9
  211. package/dist/endpoints/EndpointBuilder.mjs +9 -9
  212. package/dist/endpoints/EndpointFactory.cjs +10 -10
  213. package/dist/endpoints/EndpointFactory.d.cts +7 -7
  214. package/dist/endpoints/EndpointFactory.d.mts +10 -10
  215. package/dist/endpoints/EndpointFactory.mjs +10 -10
  216. package/dist/endpoints/HonoEndpointAdaptor.cjs +10 -9
  217. package/dist/endpoints/HonoEndpointAdaptor.d.cts +6 -6
  218. package/dist/endpoints/HonoEndpointAdaptor.d.mts +9 -9
  219. package/dist/endpoints/HonoEndpointAdaptor.mjs +10 -9
  220. package/dist/endpoints/TestEndpointAdaptor.cjs +8 -7
  221. package/dist/endpoints/TestEndpointAdaptor.d.cts +6 -6
  222. package/dist/endpoints/TestEndpointAdaptor.d.mts +9 -9
  223. package/dist/endpoints/TestEndpointAdaptor.mjs +8 -7
  224. package/dist/endpoints/audit.d.cts +5 -5
  225. package/dist/endpoints/audit.d.mts +8 -8
  226. package/dist/endpoints/helpers.cjs +7 -7
  227. package/dist/endpoints/helpers.d.cts +5 -5
  228. package/dist/endpoints/helpers.d.cts.map +1 -1
  229. package/dist/endpoints/helpers.d.mts +8 -8
  230. package/dist/endpoints/helpers.d.mts.map +1 -1
  231. package/dist/endpoints/helpers.mjs +7 -7
  232. package/dist/endpoints/index.cjs +20 -10
  233. package/dist/endpoints/index.cjs.map +1 -1
  234. package/dist/endpoints/index.d.cts +12 -10
  235. package/dist/endpoints/index.d.cts.map +1 -1
  236. package/dist/endpoints/index.d.mts +15 -13
  237. package/dist/endpoints/index.d.mts.map +1 -1
  238. package/dist/endpoints/index.mjs +13 -11
  239. package/dist/endpoints/index.mjs.map +1 -1
  240. package/dist/endpoints/lazyAccessors.cjs +10 -0
  241. package/dist/endpoints/lazyAccessors.d.cts +10 -0
  242. package/dist/endpoints/lazyAccessors.d.mts +10 -0
  243. package/dist/endpoints/lazyAccessors.mjs +3 -0
  244. package/dist/endpoints/parseHonoQuery.cjs +1 -1
  245. package/dist/endpoints/parseHonoQuery.mjs +1 -1
  246. package/dist/endpoints/parseQueryParams.d.cts.map +1 -1
  247. package/dist/endpoints/parseQueryParams.d.mts.map +1 -1
  248. package/dist/endpoints/processAudits.d.cts +5 -5
  249. package/dist/endpoints/processAudits.d.cts.map +1 -1
  250. package/dist/endpoints/processAudits.d.mts +8 -8
  251. package/dist/endpoints/processAudits.d.mts.map +1 -1
  252. package/dist/endpoints/rls.cjs +1 -1
  253. package/dist/endpoints/rls.d.cts +5 -5
  254. package/dist/endpoints/rls.d.mts +8 -8
  255. package/dist/endpoints/rls.mjs +1 -1
  256. package/dist/functions/AWSLambdaFunction.cjs +6 -6
  257. package/dist/functions/AWSLambdaFunction.d.cts +3 -3
  258. package/dist/functions/AWSLambdaFunction.d.mts +4 -4
  259. package/dist/functions/AWSLambdaFunction.mjs +6 -6
  260. package/dist/functions/BaseFunctionBuilder.cjs +2 -2
  261. package/dist/functions/BaseFunctionBuilder.d.mts +2 -2
  262. package/dist/functions/BaseFunctionBuilder.mjs +2 -2
  263. package/dist/functions/Function.cjs +2 -2
  264. package/dist/functions/Function.d.cts +1 -1
  265. package/dist/functions/Function.d.mts +2 -2
  266. package/dist/functions/Function.mjs +2 -2
  267. package/dist/functions/FunctionBuilder.cjs +4 -4
  268. package/dist/functions/FunctionBuilder.d.cts +2 -2
  269. package/dist/functions/FunctionBuilder.d.mts +4 -4
  270. package/dist/functions/FunctionBuilder.mjs +4 -4
  271. package/dist/functions/FunctionExecutionWrapper.cjs +5 -5
  272. package/dist/functions/FunctionExecutionWrapper.d.cts +2 -2
  273. package/dist/functions/FunctionExecutionWrapper.d.mts +3 -3
  274. package/dist/functions/FunctionExecutionWrapper.mjs +5 -5
  275. package/dist/functions/TestFunctionAdaptor.cjs +7 -7
  276. package/dist/functions/TestFunctionAdaptor.cjs.map +1 -1
  277. package/dist/functions/TestFunctionAdaptor.d.cts +2 -2
  278. package/dist/functions/TestFunctionAdaptor.d.cts.map +1 -1
  279. package/dist/functions/TestFunctionAdaptor.d.mts +3 -3
  280. package/dist/functions/TestFunctionAdaptor.d.mts.map +1 -1
  281. package/dist/functions/TestFunctionAdaptor.mjs +7 -7
  282. package/dist/functions/TestFunctionAdaptor.mjs.map +1 -1
  283. package/dist/functions/index.cjs +5 -5
  284. package/dist/functions/index.d.cts +3 -3
  285. package/dist/functions/index.d.mts +5 -5
  286. package/dist/functions/index.mjs +5 -5
  287. package/dist/{functions-fTid0RMK.cjs → functions-BkKXVeHm.cjs} +2 -2
  288. package/dist/functions-BkKXVeHm.cjs.map +1 -0
  289. package/dist/functions-C3A1vMRW.mjs +8 -0
  290. package/dist/functions-C3A1vMRW.mjs.map +1 -0
  291. package/dist/{helpers-BcP1tXAi.cjs → helpers-BelEzV4U.cjs} +2 -2
  292. package/dist/helpers-BelEzV4U.cjs.map +1 -0
  293. package/dist/{helpers-ByRTDO_m.mjs → helpers-DgsMFMUV.mjs} +2 -2
  294. package/dist/helpers-DgsMFMUV.mjs.map +1 -0
  295. package/dist/{index-BWzGIj06.d.mts → index-CgAQHr3f.d.mts} +2 -2
  296. package/dist/index-CgAQHr3f.d.mts.map +1 -0
  297. package/dist/index-D0fp_IK1.d.cts +12 -0
  298. package/dist/index-D0fp_IK1.d.cts.map +1 -0
  299. package/dist/index.cjs +1 -1
  300. package/dist/index.d.cts +2 -1
  301. package/dist/index.d.mts +4 -3
  302. package/dist/index.mjs +1 -1
  303. package/dist/lazyAccessors-B-Jgkg2o.mjs +175 -0
  304. package/dist/lazyAccessors-B-Jgkg2o.mjs.map +1 -0
  305. package/dist/lazyAccessors-B2ILzU-j.d.mts +49 -0
  306. package/dist/lazyAccessors-B2ILzU-j.d.mts.map +1 -0
  307. package/dist/lazyAccessors-B8Hhras9.cjs +223 -0
  308. package/dist/lazyAccessors-B8Hhras9.cjs.map +1 -0
  309. package/dist/lazyAccessors-Bcpi06ed.d.cts +49 -0
  310. package/dist/lazyAccessors-Bcpi06ed.d.cts.map +1 -0
  311. package/dist/{parseHonoQuery-CZC5_97v.cjs → parseHonoQuery-D4MhxTRc.cjs} +1 -1
  312. package/dist/parseHonoQuery-D4MhxTRc.cjs.map +1 -0
  313. package/dist/{parseHonoQuery-DDgIkTO4.mjs → parseHonoQuery-DpK3sGPc.mjs} +1 -1
  314. package/dist/parseHonoQuery-DpK3sGPc.mjs.map +1 -0
  315. package/dist/parseQueryParams-BSNkjmZ9.cjs.map +1 -1
  316. package/dist/parseQueryParams-UMTRnRrW.mjs.map +1 -1
  317. package/dist/processAudits-CzHkPokQ.cjs.map +1 -1
  318. package/dist/processAudits-Dj8UGqcW.mjs.map +1 -1
  319. package/dist/publisher-Bw4770Hi.mjs.map +1 -1
  320. package/dist/publisher-C4BhHB5I.d.cts +16 -0
  321. package/dist/publisher-C4BhHB5I.d.cts.map +1 -0
  322. package/dist/publisher-NE-GnXL8.d.mts +16 -0
  323. package/dist/publisher-NE-GnXL8.d.mts.map +1 -0
  324. package/dist/publisher-lFQleddL.cjs.map +1 -1
  325. package/dist/publisher.d.cts +3 -16
  326. package/dist/publisher.d.mts +3 -16
  327. package/dist/{rls-CmJ7bRsz.cjs → rls-BrywnrQb.cjs} +1 -1
  328. package/dist/{rls-CmJ7bRsz.cjs.map → rls-BrywnrQb.cjs.map} +1 -1
  329. package/dist/{rls-Bf3FRwto.mjs → rls-C0cWOnk4.mjs} +1 -1
  330. package/dist/{rls-Bf3FRwto.mjs.map → rls-C0cWOnk4.mjs.map} +1 -1
  331. package/dist/subscribers/AWSLambdaSubscriberAdaptor.cjs +1 -1
  332. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.cts +2 -2
  333. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +3 -3
  334. package/dist/subscribers/AWSLambdaSubscriberAdaptor.mjs +1 -1
  335. package/dist/subscribers/Subscriber.cjs +2 -2
  336. package/dist/subscribers/Subscriber.d.cts +1 -1
  337. package/dist/subscribers/Subscriber.d.mts +2 -2
  338. package/dist/subscribers/Subscriber.mjs +2 -2
  339. package/dist/subscribers/SubscriberBuilder.cjs +3 -3
  340. package/dist/subscribers/SubscriberBuilder.d.cts +2 -2
  341. package/dist/subscribers/SubscriberBuilder.d.mts +3 -3
  342. package/dist/subscribers/SubscriberBuilder.mjs +3 -3
  343. package/dist/subscribers/index.cjs +3 -3
  344. package/dist/subscribers/index.cjs.map +1 -1
  345. package/dist/subscribers/index.d.cts +4 -4
  346. package/dist/subscribers/index.d.cts.map +1 -1
  347. package/dist/subscribers/index.d.mts +3 -3
  348. package/dist/subscribers/index.d.mts.map +1 -1
  349. package/dist/subscribers/index.mjs +3 -3
  350. package/dist/subscribers/index.mjs.map +1 -1
  351. package/dist/telemetry-BTaiRqPo.d.cts +95 -0
  352. package/dist/telemetry-BTaiRqPo.d.cts.map +1 -0
  353. package/dist/telemetry-yAHf5yDs.d.mts +95 -0
  354. package/dist/telemetry-yAHf5yDs.d.mts.map +1 -0
  355. package/dist/telemetry.cjs +0 -0
  356. package/dist/telemetry.d.cts +2 -0
  357. package/dist/telemetry.d.mts +2 -0
  358. package/dist/telemetry.mjs +0 -0
  359. package/dist/types-B5H3piDg.d.cts.map +1 -1
  360. package/dist/{types-DdIlpxAd.d.mts → types-Dw-iLd3Y.d.mts} +1 -1
  361. package/dist/types-Dw-iLd3Y.d.mts.map +1 -0
  362. package/dist/types.d.mts +1 -1
  363. package/package.json +18 -18
  364. package/src/Construct.ts +117 -86
  365. package/src/__benchmarks__/build-time-optimization.bench.ts +274 -0
  366. package/src/__benchmarks__/endpoint.bench.ts +375 -375
  367. package/src/__benchmarks__/fixtures.ts +241 -0
  368. package/src/__benchmarks__/hono-adaptor.bench.ts +533 -0
  369. package/src/__benchmarks__/hono-server.bench.ts +206 -206
  370. package/src/__benchmarks__/response-builder.bench.ts +428 -0
  371. package/src/__benchmarks__/strategies/strategy-a-lazy-services.ts +319 -0
  372. package/src/__benchmarks__/strategies/strategy-c-middleware.ts +530 -0
  373. package/src/__benchmarks__/strategies/strategy-d-opt-in-events.ts +567 -0
  374. package/src/__tests__/Construct.environment.spec.ts +349 -350
  375. package/src/__tests__/publisher.setting.spec.ts +496 -499
  376. package/src/__tests__/publisher.spec.ts +440 -442
  377. package/src/crons/Cron.ts +117 -117
  378. package/src/crons/CronBuilder.ts +237 -238
  379. package/src/crons/__tests__/Cron.spec.ts +448 -448
  380. package/src/crons/__tests__/CronBuilder.state-isolation.spec.ts +214 -214
  381. package/src/crons/index.ts +4 -4
  382. package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +571 -463
  383. package/src/endpoints/AmazonApiGatewayV1EndpointAdaptor.ts +86 -86
  384. package/src/endpoints/AmazonApiGatewayV2EndpointAdaptor.ts +85 -81
  385. package/src/endpoints/Authorizer.ts +100 -100
  386. package/src/endpoints/Endpoint.ts +921 -937
  387. package/src/endpoints/EndpointBuilder.ts +703 -703
  388. package/src/endpoints/EndpointFactory.ts +1054 -1056
  389. package/src/endpoints/HonoEndpointAdaptor.ts +621 -548
  390. package/src/endpoints/TestEndpointAdaptor.ts +372 -353
  391. package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.audits.spec.ts +499 -0
  392. package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.events.spec.ts +541 -542
  393. package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.spec.ts +1172 -1174
  394. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.audits.spec.ts +599 -599
  395. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.events.spec.ts +710 -710
  396. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.factory-publisher.spec.ts +280 -280
  397. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.kysely-audit.integration.spec.ts +924 -730
  398. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.rls.spec.ts +307 -0
  399. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.spec.ts +408 -408
  400. package/src/endpoints/__tests__/Authorizer.spec.ts +286 -0
  401. package/src/endpoints/__tests__/Endpoint.cookies.spec.ts +162 -162
  402. package/src/endpoints/__tests__/Endpoint.headers.spec.ts +182 -182
  403. package/src/endpoints/__tests__/Endpoint.manifest.spec.ts +158 -159
  404. package/src/endpoints/__tests__/Endpoint.spec.ts +819 -822
  405. package/src/endpoints/__tests__/EndpointBuilder.audit.spec.ts +427 -427
  406. package/src/endpoints/__tests__/EndpointBuilder.spec.ts +478 -478
  407. package/src/endpoints/__tests__/EndpointFactory.authorizers.spec.ts +426 -426
  408. package/src/endpoints/__tests__/EndpointFactory.database-auditor.spec.ts +501 -501
  409. package/src/endpoints/__tests__/EndpointFactory.reference-audit.spec.ts +177 -177
  410. package/src/endpoints/__tests__/EndpointFactory.spec.ts +471 -471
  411. package/src/endpoints/__tests__/EndpointFactory.state-isolation.spec.ts +143 -143
  412. package/src/endpoints/__tests__/HonoEndpointAdaptor.audit-transactions.spec.ts +663 -663
  413. package/src/endpoints/__tests__/HonoEndpointAdaptor.audits.spec.ts +608 -608
  414. package/src/endpoints/__tests__/HonoEndpointAdaptor.events.spec.ts +561 -561
  415. package/src/endpoints/__tests__/HonoEndpointAdaptor.kysely-audit.integration.spec.ts +1036 -1036
  416. package/src/endpoints/__tests__/HonoEndpointAdaptor.openapi.spec.ts +278 -278
  417. package/src/endpoints/__tests__/HonoEndpointAdaptor.spec.ts +1093 -1093
  418. package/src/endpoints/__tests__/ResponseBuilder.spec.ts +230 -230
  419. package/src/endpoints/__tests__/TestEndpointAdaptor.audits.spec.ts +569 -569
  420. package/src/endpoints/__tests__/TestEndpointAdaptor.spec.ts +841 -841
  421. package/src/endpoints/__tests__/endpoint-types.test.ts +68 -68
  422. package/src/endpoints/__tests__/helpers.spec.ts +37 -0
  423. package/src/endpoints/__tests__/lazyAccessors.spec.ts +330 -0
  424. package/src/endpoints/__tests__/processAudits.spec.ts +631 -0
  425. package/src/endpoints/audit.ts +51 -51
  426. package/src/endpoints/helpers.ts +34 -35
  427. package/src/endpoints/index.ts +33 -23
  428. package/src/endpoints/lazyAccessors.ts +241 -0
  429. package/src/endpoints/parseHonoQuery.ts +41 -41
  430. package/src/endpoints/parseQueryParams.ts +36 -36
  431. package/src/endpoints/processAudits.ts +269 -269
  432. package/src/endpoints/rls.ts +16 -16
  433. package/src/functions/AWSLambdaFunction.ts +294 -295
  434. package/src/functions/BaseFunctionBuilder.ts +185 -185
  435. package/src/functions/Function.ts +190 -190
  436. package/src/functions/FunctionBuilder.ts +353 -353
  437. package/src/functions/FunctionExecutionWrapper.ts +199 -200
  438. package/src/functions/TestFunctionAdaptor.ts +191 -191
  439. package/src/functions/__tests__/AWSLambdaFunctionAdaptor.spec.ts +424 -424
  440. package/src/functions/__tests__/Function.audits.spec.ts +364 -364
  441. package/src/functions/__tests__/Function.spec.ts +453 -454
  442. package/src/functions/__tests__/FunctionBuilder.state-isolation.spec.ts +179 -179
  443. package/src/functions/__tests__/TestFunctionAdaptor.spec.ts +369 -369
  444. package/src/functions/index.ts +6 -4
  445. package/src/index.ts +13 -9
  446. package/src/publisher.ts +71 -72
  447. package/src/subscribers/AWSLambdaSubscriberAdaptor.ts +244 -248
  448. package/src/subscribers/Subscriber.ts +82 -84
  449. package/src/subscribers/SubscriberBuilder.ts +129 -129
  450. package/src/subscribers/__tests__/AWSLambdaSubscriberAdaptor.spec.ts +589 -589
  451. package/src/subscribers/__tests__/Subscriber.spec.ts +402 -404
  452. package/src/subscribers/index.ts +1 -0
  453. package/src/telemetry.ts +103 -0
  454. package/src/types.ts +7 -7
  455. package/test.ts +58 -59
  456. package/dist/AWSLambdaFunction-BdebRMUh.d.mts.map +0 -1
  457. package/dist/AWSLambdaFunction-C54a1doJ.mjs.map +0 -1
  458. package/dist/AWSLambdaFunction-D0tEOTXQ.d.cts.map +0 -1
  459. package/dist/AWSLambdaFunction-EPGY4s7i.cjs.map +0 -1
  460. package/dist/AWSLambdaSubscriberAdaptor-BLfO612H.mjs.map +0 -1
  461. package/dist/AWSLambdaSubscriberAdaptor-BNcYYZ-P.cjs.map +0 -1
  462. package/dist/AWSLambdaSubscriberAdaptor-DrFAvHOp.d.mts.map +0 -1
  463. package/dist/AWSLambdaSubscriberAdaptor-Dx-Ks1Jp.d.cts.map +0 -1
  464. package/dist/AmazonApiGatewayEndpointAdaptor-BT9JXihC.mjs.map +0 -1
  465. package/dist/AmazonApiGatewayEndpointAdaptor-DLqnYQ4E.d.cts.map +0 -1
  466. package/dist/AmazonApiGatewayEndpointAdaptor-DNFvvdmW.cjs.map +0 -1
  467. package/dist/AmazonApiGatewayEndpointAdaptor-qlKXuZxy.d.mts.map +0 -1
  468. package/dist/AmazonApiGatewayV1EndpointAdaptor-CShQI8Gk.mjs.map +0 -1
  469. package/dist/AmazonApiGatewayV1EndpointAdaptor-Ccl8B8kG.cjs.map +0 -1
  470. package/dist/AmazonApiGatewayV1EndpointAdaptor-DyUaJIhB.d.cts.map +0 -1
  471. package/dist/AmazonApiGatewayV1EndpointAdaptor-MRUxs3Xi.d.mts.map +0 -1
  472. package/dist/AmazonApiGatewayV2EndpointAdaptor-D8-0Aab4.cjs.map +0 -1
  473. package/dist/AmazonApiGatewayV2EndpointAdaptor-M1-w0U5R.d.cts.map +0 -1
  474. package/dist/AmazonApiGatewayV2EndpointAdaptor-fuLM6M9k.d.mts.map +0 -1
  475. package/dist/AmazonApiGatewayV2EndpointAdaptor-lCRzGE4q.mjs.map +0 -1
  476. package/dist/Authorizer-B-btowNd.d.cts.map +0 -1
  477. package/dist/Authorizer-C0ge_tc8.cjs.map +0 -1
  478. package/dist/Authorizer-gWxYsGEp.d.mts.map +0 -1
  479. package/dist/Authorizer-r9U3y_ms.mjs.map +0 -1
  480. package/dist/BaseFunctionBuilder-Czi1Jwza.mjs.map +0 -1
  481. package/dist/BaseFunctionBuilder-DRY419e7.d.mts.map +0 -1
  482. package/dist/BaseFunctionBuilder-MYG3C9ug.cjs.map +0 -1
  483. package/dist/Construct-Ba5cMxib.cjs.map +0 -1
  484. package/dist/Construct-DdyGHuag.mjs.map +0 -1
  485. package/dist/Construct-XrijZFFh.d.mts.map +0 -1
  486. package/dist/Cron-BxhGs5up.mjs.map +0 -1
  487. package/dist/Cron-CGF4YAfM.cjs.map +0 -1
  488. package/dist/Cron-bDLcTvV5.d.cts.map +0 -1
  489. package/dist/Cron-cdjlSKNp.d.mts.map +0 -1
  490. package/dist/CronBuilder-BC4m5-p1.d.mts.map +0 -1
  491. package/dist/CronBuilder-CcxKRtVP.cjs.map +0 -1
  492. package/dist/CronBuilder-DKVXyE0Q.d.cts.map +0 -1
  493. package/dist/CronBuilder-d2jh-IB2.mjs.map +0 -1
  494. package/dist/Endpoint-BPv9_-m_.d.cts.map +0 -1
  495. package/dist/Endpoint-BVGZXFyV.cjs.map +0 -1
  496. package/dist/Endpoint-BdwG75G_.d.mts.map +0 -1
  497. package/dist/Endpoint-CuOEswxJ.mjs.map +0 -1
  498. package/dist/EndpointBuilder-B3az942t.d.mts.map +0 -1
  499. package/dist/EndpointBuilder-Cgj1P_ra.cjs.map +0 -1
  500. package/dist/EndpointBuilder-DIy_m1bu.d.cts.map +0 -1
  501. package/dist/EndpointBuilder-DnCB1h1j.mjs.map +0 -1
  502. package/dist/EndpointFactory-C-0nE6Jg.d.mts.map +0 -1
  503. package/dist/EndpointFactory-CYj6BYok.cjs.map +0 -1
  504. package/dist/EndpointFactory-CbdxPCIH.mjs.map +0 -1
  505. package/dist/EndpointFactory-CyPbm3AD.d.cts.map +0 -1
  506. package/dist/Function-BVHqIDp9.mjs.map +0 -1
  507. package/dist/Function-Cf7f_kCz.d.cts.map +0 -1
  508. package/dist/Function-DDZb1525.cjs.map +0 -1
  509. package/dist/Function-DN2G6OT5.d.mts.map +0 -1
  510. package/dist/FunctionBuilder-CJBzzXL3.d.cts.map +0 -1
  511. package/dist/FunctionBuilder-CrDYgfiI.mjs.map +0 -1
  512. package/dist/FunctionBuilder-Cxx8D2na.d.mts.map +0 -1
  513. package/dist/FunctionBuilder-DswJ-9sD.cjs.map +0 -1
  514. package/dist/FunctionExecutionWrapper-BYI2bGTL.cjs.map +0 -1
  515. package/dist/FunctionExecutionWrapper-CLDh7Z2_.mjs.map +0 -1
  516. package/dist/FunctionExecutionWrapper-DF260Aaj.d.mts.map +0 -1
  517. package/dist/FunctionExecutionWrapper-Qy8bmgFR.d.cts.map +0 -1
  518. package/dist/HonoEndpointAdaptor-BaPlUhz0.d.mts.map +0 -1
  519. package/dist/HonoEndpointAdaptor-CQe2FqMR.cjs +0 -234
  520. package/dist/HonoEndpointAdaptor-CQe2FqMR.cjs.map +0 -1
  521. package/dist/HonoEndpointAdaptor-Ce-2HBxn.mjs +0 -228
  522. package/dist/HonoEndpointAdaptor-Ce-2HBxn.mjs.map +0 -1
  523. package/dist/HonoEndpointAdaptor-YcRHYALH.d.cts.map +0 -1
  524. package/dist/Subscriber-BiHjVXtM.cjs.map +0 -1
  525. package/dist/Subscriber-BmPf9GFb.mjs.map +0 -1
  526. package/dist/Subscriber-COYMSevD.d.cts.map +0 -1
  527. package/dist/Subscriber-ikctpU3I.d.mts.map +0 -1
  528. package/dist/SubscriberBuilder-Cp1C-xtT.cjs.map +0 -1
  529. package/dist/SubscriberBuilder-DJPEeYDJ.mjs.map +0 -1
  530. package/dist/SubscriberBuilder-D_9zzllj.d.mts.map +0 -1
  531. package/dist/SubscriberBuilder-ivHAGIVi.d.cts.map +0 -1
  532. package/dist/TestEndpointAdaptor-C10xBI--.d.cts.map +0 -1
  533. package/dist/TestEndpointAdaptor-DB7bREhS.d.mts.map +0 -1
  534. package/dist/TestEndpointAdaptor-DJgik2Wj.mjs +0 -160
  535. package/dist/TestEndpointAdaptor-DJgik2Wj.mjs.map +0 -1
  536. package/dist/TestEndpointAdaptor-ZbtQiuHE.cjs +0 -166
  537. package/dist/TestEndpointAdaptor-ZbtQiuHE.cjs.map +0 -1
  538. package/dist/functions-C6EK1xL6.mjs +0 -8
  539. package/dist/functions-C6EK1xL6.mjs.map +0 -1
  540. package/dist/functions-fTid0RMK.cjs.map +0 -1
  541. package/dist/helpers-BcP1tXAi.cjs.map +0 -1
  542. package/dist/helpers-ByRTDO_m.mjs.map +0 -1
  543. package/dist/index-BWzGIj06.d.mts.map +0 -1
  544. package/dist/index-DmFozqLd.d.cts +0 -12
  545. package/dist/index-DmFozqLd.d.cts.map +0 -1
  546. package/dist/parseHonoQuery-CZC5_97v.cjs.map +0 -1
  547. package/dist/parseHonoQuery-DDgIkTO4.mjs.map +0 -1
  548. package/dist/publisher.d.cts.map +0 -1
  549. package/dist/publisher.d.mts.map +0 -1
  550. package/dist/types-DdIlpxAd.d.mts.map +0 -1
@@ -1,1196 +1,1194 @@
1
1
  import { EnvironmentParser } from '@geekmidas/envkit';
2
2
  import {
3
- BadRequestError,
4
- ConflictError,
5
- HttpError,
6
- InternalServerError,
7
- NotFoundError,
8
- UnauthorizedError,
3
+ BadRequestError,
4
+ ConflictError,
5
+ HttpError,
6
+ InternalServerError,
7
+ NotFoundError,
8
+ UnauthorizedError,
9
9
  } from '@geekmidas/errors';
10
10
  import type { Logger } from '@geekmidas/logger';
11
- import { beforeEach, describe, expect, it, vi } from 'vitest';
12
- import { z } from 'zod';
13
- import { Endpoint } from '../Endpoint';
14
-
15
11
  import { createMockContext, createMockV1Event } from '@geekmidas/testkit/aws';
16
-
17
12
  import { createMockLogger } from '@geekmidas/testkit/logger';
13
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
14
+ import { z } from 'zod';
18
15
  import { AmazonApiGatewayV1Endpoint } from '../AmazonApiGatewayV1EndpointAdaptor';
16
+ import { Endpoint } from '../Endpoint';
19
17
  /**
20
18
  * Common test event types for AWS adapter testing
21
19
  */
22
20
  export type TestEvent =
23
- | { type: 'user.created'; payload: { userId: string; email: string } }
24
- | { type: 'user.updated'; payload: { userId: string; changes: string[] } }
25
- | { type: 'notification.sent'; payload: { userId: string; type: string } };
21
+ | { type: 'user.created'; payload: { userId: string; email: string } }
22
+ | { type: 'user.updated'; payload: { userId: string; changes: string[] } }
23
+ | { type: 'notification.sent'; payload: { userId: string; type: string } };
26
24
 
27
25
  /**
28
26
  * Mock service for testing
29
27
  */
30
28
  export const TestService = {
31
- serviceName: 'TestService' as const,
29
+ serviceName: 'TestService' as const,
32
30
 
33
- async register() {
34
- return this;
35
- },
31
+ async register() {
32
+ return this;
33
+ },
36
34
 
37
- async cleanup() {},
35
+ async cleanup() {},
38
36
  };
39
37
 
40
38
  describe('AmazonApiGatewayV1Endpoint', () => {
41
- let mockLogger: Logger;
42
- let envParser: EnvironmentParser<{}>;
43
-
44
- beforeEach(() => {
45
- vi.clearAllMocks();
46
- mockLogger = createMockLogger();
47
- envParser = new EnvironmentParser({});
48
- });
49
-
50
- describe('handler', () => {
51
- it('should handle a simple GET request', async () => {
52
- const endpoint = new Endpoint({
53
- route: '/test',
54
- method: 'GET',
55
- fn: async () => ({ message: 'Hello, World!' }),
56
- input: {},
57
- output: z.object({ message: z.string() }),
58
- services: [],
59
- logger: mockLogger,
60
- timeout: undefined,
61
- memorySize: undefined,
62
- status: undefined,
63
- getSession: undefined,
64
- authorize: undefined,
65
- description: 'Test endpoint',
66
- });
67
-
68
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
69
- const handler = adapter.handler;
70
-
71
- const event = createMockV1Event();
72
- const context = createMockContext();
73
- const response = await handler(event, context);
74
-
75
- expect(response.statusCode).toBe(200);
76
- expect(response.body).toBe(JSON.stringify({ message: 'Hello, World!' }));
77
- });
78
-
79
- it('should handle POST request with body', async () => {
80
- const inputSchema = z.object({ name: z.string() });
81
- const outputSchema = z.object({ id: z.string(), name: z.string() });
82
-
83
- const endpoint = new Endpoint({
84
- route: '/users',
85
- method: 'POST',
86
- fn: async ({ body }) => ({ id: '123', name: body.name }),
87
- input: { body: inputSchema },
88
- output: outputSchema,
89
- services: [],
90
- logger: mockLogger,
91
- timeout: undefined,
92
- memorySize: undefined,
93
- status: 201,
94
- getSession: undefined,
95
- authorize: undefined,
96
- description: 'Create user endpoint',
97
- });
98
-
99
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
100
- const handler = adapter.handler;
101
-
102
- const event = createMockV1Event({
103
- httpMethod: 'POST',
104
- body: JSON.stringify({ name: 'John Doe' }),
105
- });
106
- const context = createMockContext();
107
- const response = await handler(event, context);
108
-
109
- expect(response.statusCode).toBe(201);
110
- expect(response.body).toBe(
111
- JSON.stringify({ id: '123', name: 'John Doe' }),
112
- );
113
- });
114
-
115
- it('should handle query parameters', async () => {
116
- const querySchema = z.object({ page: z.string().transform(Number) });
117
- const outputSchema = z.object({
118
- page: z.number(),
119
- items: z.array(z.string()),
120
- });
121
-
122
- const endpoint = new Endpoint({
123
- route: '/items',
124
- method: 'GET',
125
- fn: async ({ query }) => ({
126
- page: query.page,
127
- items: ['item1', 'item2'],
128
- }),
129
- input: { query: querySchema },
130
- output: outputSchema,
131
- services: [],
132
- logger: mockLogger,
133
- timeout: undefined,
134
- memorySize: undefined,
135
- status: undefined,
136
- getSession: undefined,
137
- authorize: undefined,
138
- description: 'List items endpoint',
139
- });
140
-
141
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
142
- const handler = adapter.handler;
143
-
144
- const event = createMockV1Event({
145
- queryStringParameters: { page: '2' },
146
- });
147
- const context = createMockContext();
148
- const response = await handler(event, context);
149
-
150
- expect(response.statusCode).toBe(200);
151
- expect(response.body).toBe(
152
- JSON.stringify({ page: 2, items: ['item1', 'item2'] }),
153
- );
154
- });
155
-
156
- it('should handle path parameters', async () => {
157
- const paramsSchema = z.object({ id: z.string() });
158
- const outputSchema = z.object({ id: z.string(), name: z.string() });
159
-
160
- const endpoint = new Endpoint({
161
- route: '/users/:id',
162
- method: 'GET',
163
- fn: async ({ params }) => ({ id: params.id, name: 'John Doe' }),
164
- input: { params: paramsSchema },
165
- output: outputSchema,
166
- services: [],
167
- logger: mockLogger,
168
- timeout: undefined,
169
- memorySize: undefined,
170
- status: undefined,
171
- getSession: undefined,
172
- authorize: undefined,
173
- description: 'Get user endpoint',
174
- });
175
-
176
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
177
- const handler = adapter.handler;
178
-
179
- const event = createMockV1Event({
180
- pathParameters: { id: '123' },
181
- });
182
- const context = createMockContext();
183
- const response = await handler(event, context);
184
-
185
- expect(response.statusCode).toBe(200);
186
- expect(response.body).toBe(
187
- JSON.stringify({ id: '123', name: 'John Doe' }),
188
- );
189
- });
190
-
191
- it('should handle endpoint without output', async () => {
192
- const endpoint = new Endpoint({
193
- route: '/void',
194
- method: 'POST',
195
- fn: async () => {},
196
- input: {},
197
- output: undefined,
198
- services: [],
199
- logger: mockLogger,
200
- timeout: undefined,
201
- memorySize: undefined,
202
- status: 204,
203
- getSession: undefined,
204
- authorize: undefined,
205
- description: 'Void endpoint',
206
- });
207
-
208
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
209
- const handler = adapter.handler;
210
-
211
- const event = createMockV1Event({ httpMethod: 'POST' });
212
- const context = createMockContext();
213
- const response = await handler(event, context);
214
-
215
- expect(response.statusCode).toBe(204);
216
- expect(response.body).toBeUndefined();
217
- });
218
- });
219
-
220
- describe('middleware', () => {
221
- it('should inject logger with context', async () => {
222
- const endpoint = new Endpoint({
223
- route: '/test',
224
- method: 'GET',
225
- fn: async ({ logger }) => {
226
- logger.info('Test log');
227
- return { success: true };
228
- },
229
- input: {},
230
- output: z.object({ success: z.boolean() }),
231
- services: [],
232
- logger: mockLogger,
233
- timeout: undefined,
234
- memorySize: undefined,
235
- status: undefined,
236
- getSession: undefined,
237
- authorize: undefined,
238
- description: 'Logger test endpoint',
239
- });
240
-
241
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
242
- const handler = adapter.handler;
243
-
244
- const event = createMockV1Event();
245
- const context = createMockContext();
246
- await handler(event, context);
247
-
248
- expect(mockLogger.child).toHaveBeenCalledWith({
249
- route: '/test',
250
- host: 'test.example.com',
251
- method: 'GET',
252
- fn: {
253
- name: 'test-function',
254
- version: '1',
255
- },
256
- req: {
257
- ip: expect.any(String),
258
- awsRequestId: 'test-request-id',
259
- id: 'request-id',
260
- userAgent: 'test-agent',
261
- path: '/test',
262
- },
263
- });
264
- });
265
-
266
- it('should handle errors and wrap them', async () => {
267
- const endpoint = new Endpoint({
268
- route: '/error',
269
- method: 'GET',
270
- fn: async () => {
271
- throw new Error('Test error');
272
- },
273
- input: {},
274
- output: z.object({ message: z.string() }),
275
- services: [],
276
- logger: mockLogger,
277
- timeout: undefined,
278
- memorySize: undefined,
279
- status: undefined,
280
- getSession: undefined,
281
- authorize: undefined,
282
- description: 'Error test endpoint',
283
- });
284
-
285
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
286
- const handler = adapter.handler;
287
-
288
- const event = createMockV1Event();
289
- const context = createMockContext();
290
-
291
- const response = await handler(event, context);
292
-
293
- expect(response.statusCode).toBe(500);
294
- const body = JSON.parse(response.body!);
295
- expect(body).toMatchObject({
296
- message: 'An unknown error occurred',
297
- });
298
-
299
- expect(mockLogger.error).toHaveBeenCalled();
300
- });
301
-
302
- it('should register services', async () => {
303
- const endpoint = new Endpoint({
304
- route: '/with-service',
305
- method: 'GET',
306
- fn: async ({ services }) => {
307
- const testService = await services.TestService;
308
- return { hasService: !!testService };
309
- },
310
- input: {},
311
- output: z.object({ hasService: z.boolean() }),
312
- services: [TestService],
313
- logger: mockLogger,
314
- timeout: undefined,
315
- memorySize: undefined,
316
- status: undefined,
317
- getSession: undefined,
318
- authorize: undefined,
319
- description: 'Service test endpoint',
320
- });
321
-
322
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
323
- const handler = adapter.handler.bind(adapter);
324
-
325
- const event = createMockV1Event();
326
- const context = createMockContext();
327
- const response = await handler(event, context);
328
-
329
- expect(response.statusCode).toBe(200);
330
- expect(response.body).toBe(JSON.stringify({ hasService: true }));
331
- });
332
-
333
- it('should handle session', async () => {
334
- const mockSession = { userId: 'user-123', role: 'admin' };
335
-
336
- const endpoint = new Endpoint({
337
- route: '/with-session',
338
- method: 'GET',
339
- fn: async ({ session }) => ({ session }),
340
- input: {},
341
- output: z.object({ session: z.any() }),
342
- services: [],
343
- logger: mockLogger,
344
- timeout: undefined,
345
- memorySize: undefined,
346
- status: undefined,
347
- getSession: async () => mockSession,
348
- authorize: undefined,
349
- description: 'Session test endpoint',
350
- });
351
-
352
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
353
- const handler = adapter.handler;
354
-
355
- const event = createMockV1Event();
356
- const context = createMockContext();
357
- const response = await handler(event, context);
358
-
359
- expect(response.statusCode).toBe(200);
360
- // Session is currently hardcoded as empty object in the implementation
361
- expect(response.body).toBe(JSON.stringify({ session: mockSession }));
362
- });
363
- });
364
-
365
- describe('error handling', () => {
366
- it('should return correct status code for HttpError', async () => {
367
- const endpoint = new Endpoint({
368
- route: '/http-error',
369
- method: 'GET',
370
- fn: async () => {
371
- throw new HttpError(403, 'Forbidden', { code: 'FORBIDDEN_ACCESS' });
372
- },
373
- input: {},
374
- output: z.object({ message: z.string() }),
375
- services: [],
376
- logger: mockLogger,
377
- timeout: undefined,
378
- memorySize: undefined,
379
- status: undefined,
380
- getSession: undefined,
381
- authorize: undefined,
382
- description: 'HTTP error test endpoint',
383
- });
384
-
385
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
386
- const handler = adapter.handler;
387
-
388
- const event = createMockV1Event();
389
- const context = createMockContext();
390
-
391
- const response = await handler(event, context);
392
-
393
- expect(response.statusCode).toBe(403);
394
- expect(response.body).toBe(
395
- JSON.stringify({
396
- message: 'Forbidden',
397
- code: 'FORBIDDEN_ACCESS',
398
- }),
399
- );
400
- expect(mockLogger.error).toHaveBeenCalled();
401
- });
402
-
403
- it('should return 500 for non-HttpError errors', async () => {
404
- const endpoint = new Endpoint({
405
- route: '/generic-error',
406
- method: 'GET',
407
- fn: async () => {
408
- throw new TypeError('Type mismatch');
409
- },
410
- input: {},
411
- output: z.object({ message: z.string() }),
412
- services: [],
413
- logger: mockLogger,
414
- timeout: undefined,
415
- memorySize: undefined,
416
- status: undefined,
417
- getSession: undefined,
418
- authorize: undefined,
419
- description: 'Generic error test endpoint',
420
- });
421
-
422
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
423
- const handler = adapter.handler;
424
-
425
- const event = createMockV1Event();
426
- const context = createMockContext();
427
-
428
- const response = await handler(event, context);
429
-
430
- expect(response.statusCode).toBe(500);
431
- const body = JSON.parse(response.body!);
432
- expect(body).toMatchObject({
433
- message: 'An unknown error occurred',
434
- });
435
-
436
- expect(mockLogger.error).toHaveBeenCalled();
437
- });
438
-
439
- it('should preserve status codes for various HttpError subclasses', async () => {
440
- const testCases = [
441
- {
442
- ErrorClass: UnauthorizedError,
443
- statusCode: 401,
444
- message: 'Unauthorized',
445
- },
446
- {
447
- ErrorClass: BadRequestError,
448
- statusCode: 400,
449
- message: 'Bad Request',
450
- },
451
- { ErrorClass: NotFoundError, statusCode: 404, message: 'Not Found' },
452
- { ErrorClass: ConflictError, statusCode: 409, message: 'Conflict' },
453
- {
454
- ErrorClass: InternalServerError,
455
- statusCode: 500,
456
- message: 'Internal Server Error',
457
- },
458
- ];
459
-
460
- for (const { ErrorClass, statusCode, message } of testCases) {
461
- const endpoint = new Endpoint({
462
- route: `/error-${statusCode}`,
463
- method: 'GET',
464
- fn: async () => {
465
- throw new ErrorClass(message);
466
- },
467
- input: {},
468
- output: z.object({ message: z.string() }),
469
- services: [],
470
- logger: mockLogger,
471
- timeout: undefined,
472
- memorySize: undefined,
473
- status: undefined,
474
- getSession: undefined,
475
- authorize: undefined,
476
- description: `${statusCode} error test endpoint`,
477
- });
478
-
479
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
480
- const handler = adapter.handler;
481
-
482
- const event = createMockV1Event();
483
- const context = createMockContext();
484
-
485
- const response = await handler(event, context);
486
-
487
- expect(response.statusCode).toBe(statusCode);
488
- expect(response.body).toBe(
489
- JSON.stringify({
490
- message,
491
- code: undefined,
492
- }),
493
- );
494
- }
495
- });
496
-
497
- it('should return 422 for body validation errors', async () => {
498
- const bodySchema = z.object({
499
- name: z.string().min(3),
500
- age: z.number().positive(),
501
- });
502
-
503
- const endpoint = new Endpoint({
504
- route: '/validation',
505
- method: 'POST',
506
- fn: async () => ({ success: true }),
507
- input: { body: bodySchema },
508
- output: z.object({ success: z.boolean() }),
509
- services: [],
510
- logger: mockLogger,
511
- timeout: undefined,
512
- memorySize: undefined,
513
- status: undefined,
514
- getSession: undefined,
515
- authorize: undefined,
516
- description: 'Validation test endpoint',
517
- });
518
-
519
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
520
- const handler = adapter.handler;
521
-
522
- const event = createMockV1Event({
523
- httpMethod: 'POST',
524
- body: JSON.stringify({ name: 'Jo', age: -5 }), // Invalid: name too short, age negative
525
- });
526
- const context = createMockContext();
527
-
528
- const response = await handler(event, context);
529
-
530
- expect(response.statusCode).toBe(422);
531
- const body = JSON.parse(response.body!);
532
- expect(body.message).toBe('Validation failed');
533
- expect(body.code).toBeUndefined();
534
- });
535
-
536
- it('should return 422 for query validation errors', async () => {
537
- const querySchema = z.object({
538
- page: z.string().transform(Number).pipe(z.number().positive()),
539
- limit: z.string().transform(Number).pipe(z.number().max(100)),
540
- });
541
-
542
- const endpoint = new Endpoint({
543
- route: '/items',
544
- method: 'GET',
545
- fn: async () => ({ items: [] }),
546
- input: { query: querySchema },
547
- output: z.object({ items: z.array(z.any()) }),
548
- services: [],
549
- logger: mockLogger,
550
- timeout: undefined,
551
- memorySize: undefined,
552
- status: undefined,
553
- getSession: undefined,
554
- authorize: undefined,
555
- description: 'Query validation test endpoint',
556
- });
557
-
558
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
559
- const handler = adapter.handler;
560
-
561
- const event = createMockV1Event({
562
- queryStringParameters: { page: '0', limit: '200' }, // Invalid: page not positive, limit too high
563
- });
564
- const context = createMockContext();
565
-
566
- const response = await handler(event, context);
567
-
568
- expect(response.statusCode).toBe(422);
569
- const body = JSON.parse(response.body!);
570
- expect(body.message).toBe('Validation failed');
571
- });
572
-
573
- it('should return 422 for params validation errors', async () => {
574
- const paramsSchema = z.object({
575
- id: z.string().uuid(),
576
- });
577
-
578
- const endpoint = new Endpoint({
579
- route: '/users/:id',
580
- method: 'GET',
581
- fn: async ({ params }) => ({ id: params.id }),
582
- input: { params: paramsSchema },
583
- output: z.object({ id: z.string() }),
584
- services: [],
585
- logger: mockLogger,
586
- timeout: undefined,
587
- memorySize: undefined,
588
- status: undefined,
589
- getSession: undefined,
590
- authorize: undefined,
591
- description: 'Params validation test endpoint',
592
- });
593
-
594
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
595
- const handler = adapter.handler;
596
-
597
- const event = createMockV1Event({
598
- pathParameters: { id: 'not-a-uuid' }, // Invalid: not a valid UUID
599
- });
600
- const context = createMockContext();
601
-
602
- const response = await handler(event, context);
603
-
604
- expect(response.statusCode).toBe(422);
605
- const body = JSON.parse(response.body!);
606
- expect(body.message).toBe('Validation failed');
607
- });
608
- });
609
-
610
- describe('header handling', () => {
611
- it('should provide header function to handler', async () => {
612
- const endpoint = new Endpoint({
613
- route: '/headers',
614
- method: 'GET',
615
- fn: async ({ header }) => ({
616
- authorization: header('authorization'),
617
- contentType: header('content-type'),
618
- }),
619
- input: {},
620
- output: z.object({
621
- authorization: z.string().optional(),
622
- contentType: z.string().optional(),
623
- }),
624
- services: [],
625
- logger: mockLogger,
626
- timeout: undefined,
627
- memorySize: undefined,
628
- status: undefined,
629
- getSession: undefined,
630
- authorize: undefined,
631
- description: 'Header test endpoint',
632
- });
633
-
634
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
635
- const handler = adapter.handler;
636
-
637
- const event = createMockV1Event({
638
- headers: {
639
- 'content-type': 'application/json',
640
- authorization: 'Bearer token123',
641
- },
642
- });
643
- const context = createMockContext();
644
- const response = await handler(event, context);
645
-
646
- expect(response.statusCode).toBe(200);
647
- expect(response.body).toBe(
648
- JSON.stringify({
649
- authorization: 'Bearer token123',
650
- contentType: 'application/json',
651
- }),
652
- );
653
- });
654
- });
655
-
656
- describe('authorization', () => {
657
- it('should allow requests when authorize returns true', async () => {
658
- const endpoint = new Endpoint({
659
- route: '/protected',
660
- method: 'GET',
661
- fn: async () => ({ success: true }),
662
- input: {},
663
- output: z.object({ success: z.boolean() }),
664
- services: [],
665
- logger: mockLogger,
666
- timeout: undefined,
667
- memorySize: undefined,
668
- status: undefined,
669
- getSession: undefined,
670
- authorize: undefined,
671
- description: 'Protected endpoint',
672
- });
673
-
674
- // Set authorize function that returns true
675
- endpoint.authorize = async () => true;
676
-
677
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
678
- const handler = adapter.handler;
679
-
680
- const event = createMockV1Event();
681
- const context = createMockContext();
682
- const response = await handler(event, context);
683
-
684
- expect(response.statusCode).toBe(200);
685
- expect(response.body).toBe(JSON.stringify({ success: true }));
686
- });
687
-
688
- it('should reject requests when authorize returns false', async () => {
689
- const endpoint = new Endpoint({
690
- route: '/protected',
691
- method: 'GET',
692
- fn: async () => ({ success: true }),
693
- input: {},
694
- output: z.object({ success: z.boolean() }),
695
- services: [],
696
- logger: mockLogger,
697
- timeout: undefined,
698
- memorySize: undefined,
699
- status: undefined,
700
- getSession: undefined,
701
- authorize: undefined,
702
- description: 'Protected endpoint',
703
- });
704
-
705
- // Set authorize function that returns false
706
- endpoint.authorize = async () => false;
707
-
708
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
709
- const handler = adapter.handler;
710
-
711
- const event = createMockV1Event();
712
- const context = createMockContext();
713
-
714
- const response = await handler(event, context);
715
-
716
- expect(response.statusCode).toBe(401);
717
- const body = JSON.parse(response.body!);
718
- expect(body).toMatchObject({
719
- message: 'Unauthorized access to the endpoint',
720
- });
721
- expect(mockLogger.warn).toHaveBeenCalledWith(
722
- 'Unauthorized access attempt',
723
- );
724
- });
725
-
726
- it('should handle async authorize functions', async () => {
727
- const endpoint = new Endpoint({
728
- route: '/protected',
729
- method: 'GET',
730
- fn: async () => ({ success: true }),
731
- input: {},
732
- output: z.object({ success: z.boolean() }),
733
- services: [],
734
- logger: mockLogger,
735
- timeout: undefined,
736
- memorySize: undefined,
737
- status: undefined,
738
- getSession: undefined,
739
- authorize: undefined,
740
- description: 'Protected endpoint',
741
- });
742
-
743
- // Set async authorize function with delay
744
- endpoint.authorize = async ({ header }) => {
745
- await new Promise((resolve) => setTimeout(resolve, 10));
746
- return header('authorization') === 'Bearer valid-token';
747
- };
748
-
749
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
750
- const handler = adapter.handler;
751
-
752
- // Test with valid token
753
- const validEvent = createMockV1Event({
754
- headers: {
755
- authorization: 'Bearer valid-token',
756
- },
757
- });
758
- const context = createMockContext();
759
- const response = await handler(validEvent, context);
760
-
761
- expect(response.statusCode).toBe(200);
762
- expect(response.body).toBe(JSON.stringify({ success: true }));
763
-
764
- // Test with invalid token
765
- const invalidEvent = createMockV1Event({
766
- headers: {
767
- authorization: 'Bearer invalid-token',
768
- },
769
- });
770
- const invalidResponse = await handler(invalidEvent, context);
771
- const invalidResponseBody = JSON.parse(invalidResponse.body!);
772
- expect(invalidResponse.statusCode).toBe(401);
773
- expect(invalidResponseBody).toMatchObject({
774
- message: 'Unauthorized access to the endpoint',
775
- });
776
- });
777
- });
778
-
779
- describe('combined inputs', () => {
780
- it('should handle array query parameters', async () => {
781
- const querySchema = z.object({
782
- tags: z.array(z.string()),
783
- page: z.coerce.number().default(1),
784
- });
785
- const outputSchema = z.object({
786
- tags: z.array(z.string()),
787
- page: z.number(),
788
- });
789
-
790
- const endpoint = new Endpoint({
791
- route: '/items',
792
- method: 'GET',
793
- fn: async ({ query }) => ({
794
- tags: query.tags,
795
- page: query.page,
796
- }),
797
- input: { query: querySchema },
798
- output: outputSchema,
799
- services: [],
800
- logger: mockLogger,
801
- timeout: undefined,
802
- memorySize: undefined,
803
- authorize: undefined,
804
- description: 'List items with tags',
805
- getSession: () => ({}),
806
- status: 200,
807
- });
808
-
809
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
810
- const handler = adapter.handler;
811
-
812
- const event = createMockV1Event({
813
- queryStringParameters: { tags: 'nodejs', page: '2' },
814
- multiValueQueryStringParameters: {
815
- tags: ['nodejs', 'typescript', 'javascript'],
816
- page: ['2'],
817
- },
818
- });
819
- const context = createMockContext();
820
- const response = await handler(event, context);
821
-
822
- expect(response.statusCode).toBe(200);
823
- const body = JSON.parse(response.body!);
824
- expect(body).toEqual({
825
- tags: ['nodejs', 'typescript', 'javascript'],
826
- page: 2,
827
- });
828
- });
829
-
830
- it('should handle object query parameters with dot notation', async () => {
831
- const querySchema = z.object({
832
- filter: z.object({
833
- name: z.string(),
834
- status: z.string(),
835
- priority: z.coerce.number(),
836
- }),
837
- sort: z.string().default('name'),
838
- });
839
- const outputSchema = z.object({
840
- filter: z.object({
841
- name: z.string(),
842
- status: z.string(),
843
- priority: z.number(),
844
- }),
845
- sort: z.string(),
846
- });
847
-
848
- const endpoint = new Endpoint({
849
- route: '/search',
850
- method: 'GET',
851
- fn: async ({ query }) => ({
852
- filter: query.filter,
853
- sort: query.sort,
854
- }),
855
- input: { query: querySchema },
856
- output: outputSchema,
857
- services: [],
858
- logger: mockLogger,
859
- timeout: undefined,
860
- memorySize: undefined,
861
- authorize: undefined,
862
- description: 'Search with filters',
863
- getSession: () => ({}),
864
- status: 200,
865
- });
866
-
867
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
868
- const handler = adapter.handler;
869
-
870
- const event = createMockV1Event({
871
- queryStringParameters: {
872
- 'filter.name': 'john',
873
- 'filter.status': 'active',
874
- 'filter.priority': '1',
875
- sort: 'priority',
876
- },
877
- });
878
- const context = createMockContext();
879
- const response = await handler(event, context);
880
-
881
- expect(response.statusCode).toBe(200);
882
- const body = JSON.parse(response.body!);
883
- expect(body).toEqual({
884
- filter: {
885
- name: 'john',
886
- status: 'active',
887
- priority: 1,
888
- },
889
- sort: 'priority',
890
- });
891
- });
892
-
893
- it('should handle body, query, and params together', async () => {
894
- const bodySchema = z.object({ name: z.string() });
895
- const querySchema = z.object({ filter: z.string() });
896
- const paramsSchema = z.object({ id: z.string() });
897
- const outputSchema = z.object({
898
- id: z.string(),
899
- name: z.string(),
900
- filter: z.string(),
901
- });
902
-
903
- const endpoint = new Endpoint({
904
- route: '/complex/:id',
905
- method: 'PUT',
906
- fn: async ({ body, query, params }) => ({
907
- id: params.id,
908
- name: body.name,
909
- filter: query.filter,
910
- }),
911
- input: {
912
- body: bodySchema,
913
- query: querySchema,
914
- params: paramsSchema,
915
- },
916
- output: outputSchema,
917
- services: [],
918
- logger: mockLogger,
919
- timeout: undefined,
920
- memorySize: undefined,
921
- status: undefined,
922
- getSession: undefined,
923
- authorize: undefined,
924
- description: 'Complex input endpoint',
925
- });
926
-
927
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
928
- const handler = adapter.handler;
929
-
930
- const event = createMockV1Event({
931
- httpMethod: 'PUT',
932
- body: JSON.stringify({ name: 'Updated Name' }),
933
- queryStringParameters: { filter: 'active' },
934
- pathParameters: { id: '456' },
935
- });
936
- const context = createMockContext();
937
- const response = await handler(event, context);
938
-
939
- expect(response.statusCode).toBe(200);
940
- expect(response.body).toBe(
941
- JSON.stringify({
942
- id: '456',
943
- name: 'Updated Name',
944
- filter: 'active',
945
- }),
946
- );
947
- });
948
- });
949
-
950
- describe('response metadata', () => {
951
- it('should set response cookies', async () => {
952
- const endpoint = new Endpoint({
953
- route: '/test',
954
- method: 'GET',
955
- fn: async (_, response) => {
956
- response.cookie('session', 'abc123', {
957
- httpOnly: true,
958
- secure: true,
959
- });
960
- return { success: true };
961
- },
962
- input: {},
963
- output: z.object({ success: z.boolean() }),
964
- services: [],
965
- logger: mockLogger,
966
- timeout: undefined,
967
- memorySize: undefined,
968
- status: undefined,
969
- getSession: undefined,
970
- authorize: undefined,
971
- description: 'Test endpoint',
972
- });
973
-
974
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
975
- const handler = adapter.handler;
976
-
977
- const event = createMockV1Event();
978
- const context = createMockContext();
979
- const response = await handler(event, context);
980
-
981
- expect(response.multiValueHeaders?.['Set-Cookie']).toEqual([
982
- 'session=abc123; HttpOnly; Secure',
983
- ]);
984
- expect(response.statusCode).toBe(200);
985
- expect(response.body).toBe(JSON.stringify({ success: true }));
986
- });
987
-
988
- it('should set custom headers', async () => {
989
- const endpoint = new Endpoint({
990
- route: '/test',
991
- method: 'GET',
992
- fn: async (_, response) => {
993
- response.header('X-Custom-Header', 'custom-value');
994
- response.header('X-Request-Id', '12345');
995
- return { success: true };
996
- },
997
- input: {},
998
- output: z.object({ success: z.boolean() }),
999
- services: [],
1000
- logger: mockLogger,
1001
- timeout: undefined,
1002
- memorySize: undefined,
1003
- status: undefined,
1004
- getSession: undefined,
1005
- authorize: undefined,
1006
- description: 'Test endpoint',
1007
- });
1008
-
1009
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
1010
- const handler = adapter.handler;
1011
-
1012
- const event = createMockV1Event();
1013
- const context = createMockContext();
1014
- const response = await handler(event, context);
1015
-
1016
- expect(response.headers).toEqual({
1017
- 'X-Custom-Header': 'custom-value',
1018
- 'X-Request-Id': '12345',
1019
- });
1020
- });
1021
-
1022
- it('should set custom status code', async () => {
1023
- const endpoint = new Endpoint({
1024
- route: '/test',
1025
- method: 'POST',
1026
- fn: async (_, response) => {
1027
- response.status(201);
1028
- return { id: '123' };
1029
- },
1030
- input: {},
1031
- output: z.object({ id: z.string() }),
1032
- services: [],
1033
- logger: mockLogger,
1034
- timeout: undefined,
1035
- memorySize: undefined,
1036
- status: undefined,
1037
- getSession: undefined,
1038
- authorize: undefined,
1039
- description: 'Test endpoint',
1040
- });
1041
-
1042
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
1043
- const handler = adapter.handler;
1044
-
1045
- const event = createMockV1Event({ httpMethod: 'POST' });
1046
- const context = createMockContext();
1047
- const response = await handler(event, context);
1048
-
1049
- expect(response.statusCode).toBe(201);
1050
- });
1051
-
1052
- it('should combine cookies, headers, and status', async () => {
1053
- const endpoint = new Endpoint({
1054
- route: '/test',
1055
- method: 'POST',
1056
- fn: async (_, response) => {
1057
- response
1058
- .status(201)
1059
- .header('Location', '/test/123')
1060
- .cookie('session', 'abc123', { httpOnly: true })
1061
- .cookie('theme', 'dark');
1062
- return { id: '123' };
1063
- },
1064
- input: {},
1065
- output: z.object({ id: z.string() }),
1066
- services: [],
1067
- logger: mockLogger,
1068
- timeout: undefined,
1069
- memorySize: undefined,
1070
- status: undefined,
1071
- getSession: undefined,
1072
- authorize: undefined,
1073
- description: 'Test endpoint',
1074
- });
1075
-
1076
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
1077
- const handler = adapter.handler;
1078
-
1079
- const event = createMockV1Event({ httpMethod: 'POST' });
1080
- const context = createMockContext();
1081
- const response = await handler(event, context);
1082
-
1083
- expect(response.statusCode).toBe(201);
1084
- expect(response.headers).toEqual({ Location: '/test/123' });
1085
- expect(response.multiValueHeaders?.['Set-Cookie']).toEqual([
1086
- 'session=abc123; HttpOnly',
1087
- 'theme=dark',
1088
- ]);
1089
- });
1090
-
1091
- it('should delete cookies', async () => {
1092
- const endpoint = new Endpoint({
1093
- route: '/test',
1094
- method: 'GET',
1095
- fn: async (_, response) => {
1096
- response.deleteCookie('session', {
1097
- path: '/',
1098
- domain: '.example.com',
1099
- });
1100
- return { success: true };
1101
- },
1102
- input: {},
1103
- output: z.object({ success: z.boolean() }),
1104
- services: [],
1105
- logger: mockLogger,
1106
- timeout: undefined,
1107
- memorySize: undefined,
1108
- status: undefined,
1109
- getSession: undefined,
1110
- authorize: undefined,
1111
- description: 'Test endpoint',
1112
- });
1113
-
1114
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
1115
- const handler = adapter.handler;
1116
-
1117
- const event = createMockV1Event();
1118
- const context = createMockContext();
1119
- const response = await handler(event, context);
1120
-
1121
- expect(response.multiValueHeaders?.['Set-Cookie']).toEqual([
1122
- 'session=; Domain=.example.com; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Max-Age=0',
1123
- ]);
1124
- });
1125
-
1126
- it('should use send() method with metadata', async () => {
1127
- const endpoint = new Endpoint({
1128
- route: '/test',
1129
- method: 'GET',
1130
- fn: async (_, response) => {
1131
- return response
1132
- .status(201)
1133
- .header('X-Custom', 'value')
1134
- .cookie('session', 'abc123')
1135
- .send({ id: '123' });
1136
- },
1137
- input: {},
1138
- output: z.object({ id: z.string() }),
1139
- services: [],
1140
- logger: mockLogger,
1141
- timeout: undefined,
1142
- memorySize: undefined,
1143
- status: undefined,
1144
- getSession: undefined,
1145
- authorize: undefined,
1146
- description: 'Test endpoint',
1147
- });
1148
-
1149
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
1150
- const handler = adapter.handler;
1151
-
1152
- const event = createMockV1Event();
1153
- const context = createMockContext();
1154
- const response = await handler(event, context);
1155
-
1156
- expect(response.statusCode).toBe(201);
1157
- expect(response.headers).toEqual({ 'X-Custom': 'value' });
1158
- expect(response.multiValueHeaders?.['Set-Cookie']).toEqual([
1159
- 'session=abc123',
1160
- ]);
1161
- expect(response.body).toBe(JSON.stringify({ id: '123' }));
1162
- });
1163
-
1164
- it('should return simple response without metadata when not using response builder', async () => {
1165
- const endpoint = new Endpoint({
1166
- route: '/test',
1167
- method: 'GET',
1168
- fn: async () => ({ success: true }),
1169
- input: {},
1170
- output: z.object({ success: z.boolean() }),
1171
- services: [],
1172
- logger: mockLogger,
1173
- timeout: undefined,
1174
- memorySize: undefined,
1175
- status: undefined,
1176
- getSession: undefined,
1177
- authorize: undefined,
1178
- description: 'Test endpoint',
1179
- });
1180
-
1181
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
1182
- const handler = adapter.handler;
1183
-
1184
- const event = createMockV1Event();
1185
- const context = createMockContext();
1186
- const response = await handler(event, context);
1187
-
1188
- expect(response).toEqual({
1189
- statusCode: 200,
1190
- body: JSON.stringify({ success: true }),
1191
- });
1192
- expect(response.headers).toBeUndefined();
1193
- expect(response.multiValueHeaders).toBeUndefined();
1194
- });
1195
- });
39
+ let mockLogger: Logger;
40
+ let envParser: EnvironmentParser<{}>;
41
+
42
+ beforeEach(() => {
43
+ vi.clearAllMocks();
44
+ mockLogger = createMockLogger();
45
+ envParser = new EnvironmentParser({});
46
+ });
47
+
48
+ describe('handler', () => {
49
+ it('should handle a simple GET request', async () => {
50
+ const endpoint = new Endpoint({
51
+ route: '/test',
52
+ method: 'GET',
53
+ fn: async () => ({ message: 'Hello, World!' }),
54
+ input: {},
55
+ output: z.object({ message: z.string() }),
56
+ services: [],
57
+ logger: mockLogger,
58
+ timeout: undefined,
59
+ memorySize: undefined,
60
+ status: undefined,
61
+ getSession: undefined,
62
+ authorize: undefined,
63
+ description: 'Test endpoint',
64
+ });
65
+
66
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
67
+ const handler = adapter.handler;
68
+
69
+ const event = createMockV1Event();
70
+ const context = createMockContext();
71
+ const response = await handler(event, context);
72
+
73
+ expect(response.statusCode).toBe(200);
74
+ expect(response.body).toBe(JSON.stringify({ message: 'Hello, World!' }));
75
+ });
76
+
77
+ it('should handle POST request with body', async () => {
78
+ const inputSchema = z.object({ name: z.string() });
79
+ const outputSchema = z.object({ id: z.string(), name: z.string() });
80
+
81
+ const endpoint = new Endpoint({
82
+ route: '/users',
83
+ method: 'POST',
84
+ fn: async ({ body }) => ({ id: '123', name: body.name }),
85
+ input: { body: inputSchema },
86
+ output: outputSchema,
87
+ services: [],
88
+ logger: mockLogger,
89
+ timeout: undefined,
90
+ memorySize: undefined,
91
+ status: 201,
92
+ getSession: undefined,
93
+ authorize: undefined,
94
+ description: 'Create user endpoint',
95
+ });
96
+
97
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
98
+ const handler = adapter.handler;
99
+
100
+ const event = createMockV1Event({
101
+ httpMethod: 'POST',
102
+ body: JSON.stringify({ name: 'John Doe' }),
103
+ });
104
+ const context = createMockContext();
105
+ const response = await handler(event, context);
106
+
107
+ expect(response.statusCode).toBe(201);
108
+ expect(response.body).toBe(
109
+ JSON.stringify({ id: '123', name: 'John Doe' }),
110
+ );
111
+ });
112
+
113
+ it('should handle query parameters', async () => {
114
+ const querySchema = z.object({ page: z.string().transform(Number) });
115
+ const outputSchema = z.object({
116
+ page: z.number(),
117
+ items: z.array(z.string()),
118
+ });
119
+
120
+ const endpoint = new Endpoint({
121
+ route: '/items',
122
+ method: 'GET',
123
+ fn: async ({ query }) => ({
124
+ page: query.page,
125
+ items: ['item1', 'item2'],
126
+ }),
127
+ input: { query: querySchema },
128
+ output: outputSchema,
129
+ services: [],
130
+ logger: mockLogger,
131
+ timeout: undefined,
132
+ memorySize: undefined,
133
+ status: undefined,
134
+ getSession: undefined,
135
+ authorize: undefined,
136
+ description: 'List items endpoint',
137
+ });
138
+
139
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
140
+ const handler = adapter.handler;
141
+
142
+ const event = createMockV1Event({
143
+ queryStringParameters: { page: '2' },
144
+ });
145
+ const context = createMockContext();
146
+ const response = await handler(event, context);
147
+
148
+ expect(response.statusCode).toBe(200);
149
+ expect(response.body).toBe(
150
+ JSON.stringify({ page: 2, items: ['item1', 'item2'] }),
151
+ );
152
+ });
153
+
154
+ it('should handle path parameters', async () => {
155
+ const paramsSchema = z.object({ id: z.string() });
156
+ const outputSchema = z.object({ id: z.string(), name: z.string() });
157
+
158
+ const endpoint = new Endpoint({
159
+ route: '/users/:id',
160
+ method: 'GET',
161
+ fn: async ({ params }) => ({ id: params.id, name: 'John Doe' }),
162
+ input: { params: paramsSchema },
163
+ output: outputSchema,
164
+ services: [],
165
+ logger: mockLogger,
166
+ timeout: undefined,
167
+ memorySize: undefined,
168
+ status: undefined,
169
+ getSession: undefined,
170
+ authorize: undefined,
171
+ description: 'Get user endpoint',
172
+ });
173
+
174
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
175
+ const handler = adapter.handler;
176
+
177
+ const event = createMockV1Event({
178
+ pathParameters: { id: '123' },
179
+ });
180
+ const context = createMockContext();
181
+ const response = await handler(event, context);
182
+
183
+ expect(response.statusCode).toBe(200);
184
+ expect(response.body).toBe(
185
+ JSON.stringify({ id: '123', name: 'John Doe' }),
186
+ );
187
+ });
188
+
189
+ it('should handle endpoint without output', async () => {
190
+ const endpoint = new Endpoint({
191
+ route: '/void',
192
+ method: 'POST',
193
+ fn: async () => {},
194
+ input: {},
195
+ output: undefined,
196
+ services: [],
197
+ logger: mockLogger,
198
+ timeout: undefined,
199
+ memorySize: undefined,
200
+ status: 204,
201
+ getSession: undefined,
202
+ authorize: undefined,
203
+ description: 'Void endpoint',
204
+ });
205
+
206
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
207
+ const handler = adapter.handler;
208
+
209
+ const event = createMockV1Event({ httpMethod: 'POST' });
210
+ const context = createMockContext();
211
+ const response = await handler(event, context);
212
+
213
+ expect(response.statusCode).toBe(204);
214
+ expect(response.body).toBeUndefined();
215
+ });
216
+ });
217
+
218
+ describe('middleware', () => {
219
+ it('should inject logger with context', async () => {
220
+ const endpoint = new Endpoint({
221
+ route: '/test',
222
+ method: 'GET',
223
+ fn: async ({ logger }) => {
224
+ logger.info('Test log');
225
+ return { success: true };
226
+ },
227
+ input: {},
228
+ output: z.object({ success: z.boolean() }),
229
+ services: [],
230
+ logger: mockLogger,
231
+ timeout: undefined,
232
+ memorySize: undefined,
233
+ status: undefined,
234
+ getSession: undefined,
235
+ authorize: undefined,
236
+ description: 'Logger test endpoint',
237
+ });
238
+
239
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
240
+ const handler = adapter.handler;
241
+
242
+ const event = createMockV1Event();
243
+ const context = createMockContext();
244
+ await handler(event, context);
245
+
246
+ expect(mockLogger.child).toHaveBeenCalledWith({
247
+ route: '/test',
248
+ host: 'test.example.com',
249
+ method: 'GET',
250
+ fn: {
251
+ name: 'test-function',
252
+ version: '1',
253
+ },
254
+ req: {
255
+ ip: expect.any(String),
256
+ awsRequestId: 'test-request-id',
257
+ id: 'request-id',
258
+ userAgent: 'test-agent',
259
+ path: '/test',
260
+ },
261
+ });
262
+ });
263
+
264
+ it('should handle errors and wrap them', async () => {
265
+ const endpoint = new Endpoint({
266
+ route: '/error',
267
+ method: 'GET',
268
+ fn: async () => {
269
+ throw new Error('Test error');
270
+ },
271
+ input: {},
272
+ output: z.object({ message: z.string() }),
273
+ services: [],
274
+ logger: mockLogger,
275
+ timeout: undefined,
276
+ memorySize: undefined,
277
+ status: undefined,
278
+ getSession: undefined,
279
+ authorize: undefined,
280
+ description: 'Error test endpoint',
281
+ });
282
+
283
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
284
+ const handler = adapter.handler;
285
+
286
+ const event = createMockV1Event();
287
+ const context = createMockContext();
288
+
289
+ const response = await handler(event, context);
290
+
291
+ expect(response.statusCode).toBe(500);
292
+ const body = JSON.parse(response.body!);
293
+ expect(body).toMatchObject({
294
+ message: 'An unknown error occurred',
295
+ });
296
+
297
+ expect(mockLogger.error).toHaveBeenCalled();
298
+ });
299
+
300
+ it('should register services', async () => {
301
+ const endpoint = new Endpoint({
302
+ route: '/with-service',
303
+ method: 'GET',
304
+ fn: async ({ services }) => {
305
+ const testService = await services.TestService;
306
+ return { hasService: !!testService };
307
+ },
308
+ input: {},
309
+ output: z.object({ hasService: z.boolean() }),
310
+ services: [TestService],
311
+ logger: mockLogger,
312
+ timeout: undefined,
313
+ memorySize: undefined,
314
+ status: undefined,
315
+ getSession: undefined,
316
+ authorize: undefined,
317
+ description: 'Service test endpoint',
318
+ });
319
+
320
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
321
+ const handler = adapter.handler.bind(adapter);
322
+
323
+ const event = createMockV1Event();
324
+ const context = createMockContext();
325
+ const response = await handler(event, context);
326
+
327
+ expect(response.statusCode).toBe(200);
328
+ expect(response.body).toBe(JSON.stringify({ hasService: true }));
329
+ });
330
+
331
+ it('should handle session', async () => {
332
+ const mockSession = { userId: 'user-123', role: 'admin' };
333
+
334
+ const endpoint = new Endpoint({
335
+ route: '/with-session',
336
+ method: 'GET',
337
+ fn: async ({ session }) => ({ session }),
338
+ input: {},
339
+ output: z.object({ session: z.any() }),
340
+ services: [],
341
+ logger: mockLogger,
342
+ timeout: undefined,
343
+ memorySize: undefined,
344
+ status: undefined,
345
+ getSession: async () => mockSession,
346
+ authorize: undefined,
347
+ description: 'Session test endpoint',
348
+ });
349
+
350
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
351
+ const handler = adapter.handler;
352
+
353
+ const event = createMockV1Event();
354
+ const context = createMockContext();
355
+ const response = await handler(event, context);
356
+
357
+ expect(response.statusCode).toBe(200);
358
+ // Session is currently hardcoded as empty object in the implementation
359
+ expect(response.body).toBe(JSON.stringify({ session: mockSession }));
360
+ });
361
+ });
362
+
363
+ describe('error handling', () => {
364
+ it('should return correct status code for HttpError', async () => {
365
+ const endpoint = new Endpoint({
366
+ route: '/http-error',
367
+ method: 'GET',
368
+ fn: async () => {
369
+ throw new HttpError(403, 'Forbidden', { code: 'FORBIDDEN_ACCESS' });
370
+ },
371
+ input: {},
372
+ output: z.object({ message: z.string() }),
373
+ services: [],
374
+ logger: mockLogger,
375
+ timeout: undefined,
376
+ memorySize: undefined,
377
+ status: undefined,
378
+ getSession: undefined,
379
+ authorize: undefined,
380
+ description: 'HTTP error test endpoint',
381
+ });
382
+
383
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
384
+ const handler = adapter.handler;
385
+
386
+ const event = createMockV1Event();
387
+ const context = createMockContext();
388
+
389
+ const response = await handler(event, context);
390
+
391
+ expect(response.statusCode).toBe(403);
392
+ expect(response.body).toBe(
393
+ JSON.stringify({
394
+ message: 'Forbidden',
395
+ code: 'FORBIDDEN_ACCESS',
396
+ }),
397
+ );
398
+ expect(mockLogger.error).toHaveBeenCalled();
399
+ });
400
+
401
+ it('should return 500 for non-HttpError errors', async () => {
402
+ const endpoint = new Endpoint({
403
+ route: '/generic-error',
404
+ method: 'GET',
405
+ fn: async () => {
406
+ throw new TypeError('Type mismatch');
407
+ },
408
+ input: {},
409
+ output: z.object({ message: z.string() }),
410
+ services: [],
411
+ logger: mockLogger,
412
+ timeout: undefined,
413
+ memorySize: undefined,
414
+ status: undefined,
415
+ getSession: undefined,
416
+ authorize: undefined,
417
+ description: 'Generic error test endpoint',
418
+ });
419
+
420
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
421
+ const handler = adapter.handler;
422
+
423
+ const event = createMockV1Event();
424
+ const context = createMockContext();
425
+
426
+ const response = await handler(event, context);
427
+
428
+ expect(response.statusCode).toBe(500);
429
+ const body = JSON.parse(response.body!);
430
+ expect(body).toMatchObject({
431
+ message: 'An unknown error occurred',
432
+ });
433
+
434
+ expect(mockLogger.error).toHaveBeenCalled();
435
+ });
436
+
437
+ it('should preserve status codes for various HttpError subclasses', async () => {
438
+ const testCases = [
439
+ {
440
+ ErrorClass: UnauthorizedError,
441
+ statusCode: 401,
442
+ message: 'Unauthorized',
443
+ },
444
+ {
445
+ ErrorClass: BadRequestError,
446
+ statusCode: 400,
447
+ message: 'Bad Request',
448
+ },
449
+ { ErrorClass: NotFoundError, statusCode: 404, message: 'Not Found' },
450
+ { ErrorClass: ConflictError, statusCode: 409, message: 'Conflict' },
451
+ {
452
+ ErrorClass: InternalServerError,
453
+ statusCode: 500,
454
+ message: 'Internal Server Error',
455
+ },
456
+ ];
457
+
458
+ for (const { ErrorClass, statusCode, message } of testCases) {
459
+ const endpoint = new Endpoint({
460
+ route: `/error-${statusCode}`,
461
+ method: 'GET',
462
+ fn: async () => {
463
+ throw new ErrorClass(message);
464
+ },
465
+ input: {},
466
+ output: z.object({ message: z.string() }),
467
+ services: [],
468
+ logger: mockLogger,
469
+ timeout: undefined,
470
+ memorySize: undefined,
471
+ status: undefined,
472
+ getSession: undefined,
473
+ authorize: undefined,
474
+ description: `${statusCode} error test endpoint`,
475
+ });
476
+
477
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
478
+ const handler = adapter.handler;
479
+
480
+ const event = createMockV1Event();
481
+ const context = createMockContext();
482
+
483
+ const response = await handler(event, context);
484
+
485
+ expect(response.statusCode).toBe(statusCode);
486
+ expect(response.body).toBe(
487
+ JSON.stringify({
488
+ message,
489
+ code: undefined,
490
+ }),
491
+ );
492
+ }
493
+ });
494
+
495
+ it('should return 422 for body validation errors', async () => {
496
+ const bodySchema = z.object({
497
+ name: z.string().min(3),
498
+ age: z.number().positive(),
499
+ });
500
+
501
+ const endpoint = new Endpoint({
502
+ route: '/validation',
503
+ method: 'POST',
504
+ fn: async () => ({ success: true }),
505
+ input: { body: bodySchema },
506
+ output: z.object({ success: z.boolean() }),
507
+ services: [],
508
+ logger: mockLogger,
509
+ timeout: undefined,
510
+ memorySize: undefined,
511
+ status: undefined,
512
+ getSession: undefined,
513
+ authorize: undefined,
514
+ description: 'Validation test endpoint',
515
+ });
516
+
517
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
518
+ const handler = adapter.handler;
519
+
520
+ const event = createMockV1Event({
521
+ httpMethod: 'POST',
522
+ body: JSON.stringify({ name: 'Jo', age: -5 }), // Invalid: name too short, age negative
523
+ });
524
+ const context = createMockContext();
525
+
526
+ const response = await handler(event, context);
527
+
528
+ expect(response.statusCode).toBe(422);
529
+ const body = JSON.parse(response.body!);
530
+ expect(body.message).toBe('Validation failed');
531
+ expect(body.code).toBeUndefined();
532
+ });
533
+
534
+ it('should return 422 for query validation errors', async () => {
535
+ const querySchema = z.object({
536
+ page: z.string().transform(Number).pipe(z.number().positive()),
537
+ limit: z.string().transform(Number).pipe(z.number().max(100)),
538
+ });
539
+
540
+ const endpoint = new Endpoint({
541
+ route: '/items',
542
+ method: 'GET',
543
+ fn: async () => ({ items: [] }),
544
+ input: { query: querySchema },
545
+ output: z.object({ items: z.array(z.any()) }),
546
+ services: [],
547
+ logger: mockLogger,
548
+ timeout: undefined,
549
+ memorySize: undefined,
550
+ status: undefined,
551
+ getSession: undefined,
552
+ authorize: undefined,
553
+ description: 'Query validation test endpoint',
554
+ });
555
+
556
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
557
+ const handler = adapter.handler;
558
+
559
+ const event = createMockV1Event({
560
+ queryStringParameters: { page: '0', limit: '200' }, // Invalid: page not positive, limit too high
561
+ });
562
+ const context = createMockContext();
563
+
564
+ const response = await handler(event, context);
565
+
566
+ expect(response.statusCode).toBe(422);
567
+ const body = JSON.parse(response.body!);
568
+ expect(body.message).toBe('Validation failed');
569
+ });
570
+
571
+ it('should return 422 for params validation errors', async () => {
572
+ const paramsSchema = z.object({
573
+ id: z.string().uuid(),
574
+ });
575
+
576
+ const endpoint = new Endpoint({
577
+ route: '/users/:id',
578
+ method: 'GET',
579
+ fn: async ({ params }) => ({ id: params.id }),
580
+ input: { params: paramsSchema },
581
+ output: z.object({ id: z.string() }),
582
+ services: [],
583
+ logger: mockLogger,
584
+ timeout: undefined,
585
+ memorySize: undefined,
586
+ status: undefined,
587
+ getSession: undefined,
588
+ authorize: undefined,
589
+ description: 'Params validation test endpoint',
590
+ });
591
+
592
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
593
+ const handler = adapter.handler;
594
+
595
+ const event = createMockV1Event({
596
+ pathParameters: { id: 'not-a-uuid' }, // Invalid: not a valid UUID
597
+ });
598
+ const context = createMockContext();
599
+
600
+ const response = await handler(event, context);
601
+
602
+ expect(response.statusCode).toBe(422);
603
+ const body = JSON.parse(response.body!);
604
+ expect(body.message).toBe('Validation failed');
605
+ });
606
+ });
607
+
608
+ describe('header handling', () => {
609
+ it('should provide header function to handler', async () => {
610
+ const endpoint = new Endpoint({
611
+ route: '/headers',
612
+ method: 'GET',
613
+ fn: async ({ header }) => ({
614
+ authorization: header('authorization'),
615
+ contentType: header('content-type'),
616
+ }),
617
+ input: {},
618
+ output: z.object({
619
+ authorization: z.string().optional(),
620
+ contentType: z.string().optional(),
621
+ }),
622
+ services: [],
623
+ logger: mockLogger,
624
+ timeout: undefined,
625
+ memorySize: undefined,
626
+ status: undefined,
627
+ getSession: undefined,
628
+ authorize: undefined,
629
+ description: 'Header test endpoint',
630
+ });
631
+
632
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
633
+ const handler = adapter.handler;
634
+
635
+ const event = createMockV1Event({
636
+ headers: {
637
+ 'content-type': 'application/json',
638
+ authorization: 'Bearer token123',
639
+ },
640
+ });
641
+ const context = createMockContext();
642
+ const response = await handler(event, context);
643
+
644
+ expect(response.statusCode).toBe(200);
645
+ expect(response.body).toBe(
646
+ JSON.stringify({
647
+ authorization: 'Bearer token123',
648
+ contentType: 'application/json',
649
+ }),
650
+ );
651
+ });
652
+ });
653
+
654
+ describe('authorization', () => {
655
+ it('should allow requests when authorize returns true', async () => {
656
+ const endpoint = new Endpoint({
657
+ route: '/protected',
658
+ method: 'GET',
659
+ fn: async () => ({ success: true }),
660
+ input: {},
661
+ output: z.object({ success: z.boolean() }),
662
+ services: [],
663
+ logger: mockLogger,
664
+ timeout: undefined,
665
+ memorySize: undefined,
666
+ status: undefined,
667
+ getSession: undefined,
668
+ authorize: undefined,
669
+ description: 'Protected endpoint',
670
+ });
671
+
672
+ // Set authorize function that returns true
673
+ endpoint.authorize = async () => true;
674
+
675
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
676
+ const handler = adapter.handler;
677
+
678
+ const event = createMockV1Event();
679
+ const context = createMockContext();
680
+ const response = await handler(event, context);
681
+
682
+ expect(response.statusCode).toBe(200);
683
+ expect(response.body).toBe(JSON.stringify({ success: true }));
684
+ });
685
+
686
+ it('should reject requests when authorize returns false', async () => {
687
+ const endpoint = new Endpoint({
688
+ route: '/protected',
689
+ method: 'GET',
690
+ fn: async () => ({ success: true }),
691
+ input: {},
692
+ output: z.object({ success: z.boolean() }),
693
+ services: [],
694
+ logger: mockLogger,
695
+ timeout: undefined,
696
+ memorySize: undefined,
697
+ status: undefined,
698
+ getSession: undefined,
699
+ authorize: undefined,
700
+ description: 'Protected endpoint',
701
+ });
702
+
703
+ // Set authorize function that returns false
704
+ endpoint.authorize = async () => false;
705
+
706
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
707
+ const handler = adapter.handler;
708
+
709
+ const event = createMockV1Event();
710
+ const context = createMockContext();
711
+
712
+ const response = await handler(event, context);
713
+
714
+ expect(response.statusCode).toBe(401);
715
+ const body = JSON.parse(response.body!);
716
+ expect(body).toMatchObject({
717
+ message: 'Unauthorized access to the endpoint',
718
+ });
719
+ expect(mockLogger.warn).toHaveBeenCalledWith(
720
+ 'Unauthorized access attempt',
721
+ );
722
+ });
723
+
724
+ it('should handle async authorize functions', async () => {
725
+ const endpoint = new Endpoint({
726
+ route: '/protected',
727
+ method: 'GET',
728
+ fn: async () => ({ success: true }),
729
+ input: {},
730
+ output: z.object({ success: z.boolean() }),
731
+ services: [],
732
+ logger: mockLogger,
733
+ timeout: undefined,
734
+ memorySize: undefined,
735
+ status: undefined,
736
+ getSession: undefined,
737
+ authorize: undefined,
738
+ description: 'Protected endpoint',
739
+ });
740
+
741
+ // Set async authorize function with delay
742
+ endpoint.authorize = async ({ header }) => {
743
+ await new Promise((resolve) => setTimeout(resolve, 10));
744
+ return header('authorization') === 'Bearer valid-token';
745
+ };
746
+
747
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
748
+ const handler = adapter.handler;
749
+
750
+ // Test with valid token
751
+ const validEvent = createMockV1Event({
752
+ headers: {
753
+ authorization: 'Bearer valid-token',
754
+ },
755
+ });
756
+ const context = createMockContext();
757
+ const response = await handler(validEvent, context);
758
+
759
+ expect(response.statusCode).toBe(200);
760
+ expect(response.body).toBe(JSON.stringify({ success: true }));
761
+
762
+ // Test with invalid token
763
+ const invalidEvent = createMockV1Event({
764
+ headers: {
765
+ authorization: 'Bearer invalid-token',
766
+ },
767
+ });
768
+ const invalidResponse = await handler(invalidEvent, context);
769
+ const invalidResponseBody = JSON.parse(invalidResponse.body!);
770
+ expect(invalidResponse.statusCode).toBe(401);
771
+ expect(invalidResponseBody).toMatchObject({
772
+ message: 'Unauthorized access to the endpoint',
773
+ });
774
+ });
775
+ });
776
+
777
+ describe('combined inputs', () => {
778
+ it('should handle array query parameters', async () => {
779
+ const querySchema = z.object({
780
+ tags: z.array(z.string()),
781
+ page: z.coerce.number().default(1),
782
+ });
783
+ const outputSchema = z.object({
784
+ tags: z.array(z.string()),
785
+ page: z.number(),
786
+ });
787
+
788
+ const endpoint = new Endpoint({
789
+ route: '/items',
790
+ method: 'GET',
791
+ fn: async ({ query }) => ({
792
+ tags: query.tags,
793
+ page: query.page,
794
+ }),
795
+ input: { query: querySchema },
796
+ output: outputSchema,
797
+ services: [],
798
+ logger: mockLogger,
799
+ timeout: undefined,
800
+ memorySize: undefined,
801
+ authorize: undefined,
802
+ description: 'List items with tags',
803
+ getSession: () => ({}),
804
+ status: 200,
805
+ });
806
+
807
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
808
+ const handler = adapter.handler;
809
+
810
+ const event = createMockV1Event({
811
+ queryStringParameters: { tags: 'nodejs', page: '2' },
812
+ multiValueQueryStringParameters: {
813
+ tags: ['nodejs', 'typescript', 'javascript'],
814
+ page: ['2'],
815
+ },
816
+ });
817
+ const context = createMockContext();
818
+ const response = await handler(event, context);
819
+
820
+ expect(response.statusCode).toBe(200);
821
+ const body = JSON.parse(response.body!);
822
+ expect(body).toEqual({
823
+ tags: ['nodejs', 'typescript', 'javascript'],
824
+ page: 2,
825
+ });
826
+ });
827
+
828
+ it('should handle object query parameters with dot notation', async () => {
829
+ const querySchema = z.object({
830
+ filter: z.object({
831
+ name: z.string(),
832
+ status: z.string(),
833
+ priority: z.coerce.number(),
834
+ }),
835
+ sort: z.string().default('name'),
836
+ });
837
+ const outputSchema = z.object({
838
+ filter: z.object({
839
+ name: z.string(),
840
+ status: z.string(),
841
+ priority: z.number(),
842
+ }),
843
+ sort: z.string(),
844
+ });
845
+
846
+ const endpoint = new Endpoint({
847
+ route: '/search',
848
+ method: 'GET',
849
+ fn: async ({ query }) => ({
850
+ filter: query.filter,
851
+ sort: query.sort,
852
+ }),
853
+ input: { query: querySchema },
854
+ output: outputSchema,
855
+ services: [],
856
+ logger: mockLogger,
857
+ timeout: undefined,
858
+ memorySize: undefined,
859
+ authorize: undefined,
860
+ description: 'Search with filters',
861
+ getSession: () => ({}),
862
+ status: 200,
863
+ });
864
+
865
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
866
+ const handler = adapter.handler;
867
+
868
+ const event = createMockV1Event({
869
+ queryStringParameters: {
870
+ 'filter.name': 'john',
871
+ 'filter.status': 'active',
872
+ 'filter.priority': '1',
873
+ sort: 'priority',
874
+ },
875
+ });
876
+ const context = createMockContext();
877
+ const response = await handler(event, context);
878
+
879
+ expect(response.statusCode).toBe(200);
880
+ const body = JSON.parse(response.body!);
881
+ expect(body).toEqual({
882
+ filter: {
883
+ name: 'john',
884
+ status: 'active',
885
+ priority: 1,
886
+ },
887
+ sort: 'priority',
888
+ });
889
+ });
890
+
891
+ it('should handle body, query, and params together', async () => {
892
+ const bodySchema = z.object({ name: z.string() });
893
+ const querySchema = z.object({ filter: z.string() });
894
+ const paramsSchema = z.object({ id: z.string() });
895
+ const outputSchema = z.object({
896
+ id: z.string(),
897
+ name: z.string(),
898
+ filter: z.string(),
899
+ });
900
+
901
+ const endpoint = new Endpoint({
902
+ route: '/complex/:id',
903
+ method: 'PUT',
904
+ fn: async ({ body, query, params }) => ({
905
+ id: params.id,
906
+ name: body.name,
907
+ filter: query.filter,
908
+ }),
909
+ input: {
910
+ body: bodySchema,
911
+ query: querySchema,
912
+ params: paramsSchema,
913
+ },
914
+ output: outputSchema,
915
+ services: [],
916
+ logger: mockLogger,
917
+ timeout: undefined,
918
+ memorySize: undefined,
919
+ status: undefined,
920
+ getSession: undefined,
921
+ authorize: undefined,
922
+ description: 'Complex input endpoint',
923
+ });
924
+
925
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
926
+ const handler = adapter.handler;
927
+
928
+ const event = createMockV1Event({
929
+ httpMethod: 'PUT',
930
+ body: JSON.stringify({ name: 'Updated Name' }),
931
+ queryStringParameters: { filter: 'active' },
932
+ pathParameters: { id: '456' },
933
+ });
934
+ const context = createMockContext();
935
+ const response = await handler(event, context);
936
+
937
+ expect(response.statusCode).toBe(200);
938
+ expect(response.body).toBe(
939
+ JSON.stringify({
940
+ id: '456',
941
+ name: 'Updated Name',
942
+ filter: 'active',
943
+ }),
944
+ );
945
+ });
946
+ });
947
+
948
+ describe('response metadata', () => {
949
+ it('should set response cookies', async () => {
950
+ const endpoint = new Endpoint({
951
+ route: '/test',
952
+ method: 'GET',
953
+ fn: async (_, response) => {
954
+ response.cookie('session', 'abc123', {
955
+ httpOnly: true,
956
+ secure: true,
957
+ });
958
+ return { success: true };
959
+ },
960
+ input: {},
961
+ output: z.object({ success: z.boolean() }),
962
+ services: [],
963
+ logger: mockLogger,
964
+ timeout: undefined,
965
+ memorySize: undefined,
966
+ status: undefined,
967
+ getSession: undefined,
968
+ authorize: undefined,
969
+ description: 'Test endpoint',
970
+ });
971
+
972
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
973
+ const handler = adapter.handler;
974
+
975
+ const event = createMockV1Event();
976
+ const context = createMockContext();
977
+ const response = await handler(event, context);
978
+
979
+ expect(response.multiValueHeaders?.['Set-Cookie']).toEqual([
980
+ 'session=abc123; HttpOnly; Secure',
981
+ ]);
982
+ expect(response.statusCode).toBe(200);
983
+ expect(response.body).toBe(JSON.stringify({ success: true }));
984
+ });
985
+
986
+ it('should set custom headers', async () => {
987
+ const endpoint = new Endpoint({
988
+ route: '/test',
989
+ method: 'GET',
990
+ fn: async (_, response) => {
991
+ response.header('X-Custom-Header', 'custom-value');
992
+ response.header('X-Request-Id', '12345');
993
+ return { success: true };
994
+ },
995
+ input: {},
996
+ output: z.object({ success: z.boolean() }),
997
+ services: [],
998
+ logger: mockLogger,
999
+ timeout: undefined,
1000
+ memorySize: undefined,
1001
+ status: undefined,
1002
+ getSession: undefined,
1003
+ authorize: undefined,
1004
+ description: 'Test endpoint',
1005
+ });
1006
+
1007
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
1008
+ const handler = adapter.handler;
1009
+
1010
+ const event = createMockV1Event();
1011
+ const context = createMockContext();
1012
+ const response = await handler(event, context);
1013
+
1014
+ expect(response.headers).toEqual({
1015
+ 'X-Custom-Header': 'custom-value',
1016
+ 'X-Request-Id': '12345',
1017
+ });
1018
+ });
1019
+
1020
+ it('should set custom status code', async () => {
1021
+ const endpoint = new Endpoint({
1022
+ route: '/test',
1023
+ method: 'POST',
1024
+ fn: async (_, response) => {
1025
+ response.status(201);
1026
+ return { id: '123' };
1027
+ },
1028
+ input: {},
1029
+ output: z.object({ id: z.string() }),
1030
+ services: [],
1031
+ logger: mockLogger,
1032
+ timeout: undefined,
1033
+ memorySize: undefined,
1034
+ status: undefined,
1035
+ getSession: undefined,
1036
+ authorize: undefined,
1037
+ description: 'Test endpoint',
1038
+ });
1039
+
1040
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
1041
+ const handler = adapter.handler;
1042
+
1043
+ const event = createMockV1Event({ httpMethod: 'POST' });
1044
+ const context = createMockContext();
1045
+ const response = await handler(event, context);
1046
+
1047
+ expect(response.statusCode).toBe(201);
1048
+ });
1049
+
1050
+ it('should combine cookies, headers, and status', async () => {
1051
+ const endpoint = new Endpoint({
1052
+ route: '/test',
1053
+ method: 'POST',
1054
+ fn: async (_, response) => {
1055
+ response
1056
+ .status(201)
1057
+ .header('Location', '/test/123')
1058
+ .cookie('session', 'abc123', { httpOnly: true })
1059
+ .cookie('theme', 'dark');
1060
+ return { id: '123' };
1061
+ },
1062
+ input: {},
1063
+ output: z.object({ id: z.string() }),
1064
+ services: [],
1065
+ logger: mockLogger,
1066
+ timeout: undefined,
1067
+ memorySize: undefined,
1068
+ status: undefined,
1069
+ getSession: undefined,
1070
+ authorize: undefined,
1071
+ description: 'Test endpoint',
1072
+ });
1073
+
1074
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
1075
+ const handler = adapter.handler;
1076
+
1077
+ const event = createMockV1Event({ httpMethod: 'POST' });
1078
+ const context = createMockContext();
1079
+ const response = await handler(event, context);
1080
+
1081
+ expect(response.statusCode).toBe(201);
1082
+ expect(response.headers).toEqual({ Location: '/test/123' });
1083
+ expect(response.multiValueHeaders?.['Set-Cookie']).toEqual([
1084
+ 'session=abc123; HttpOnly',
1085
+ 'theme=dark',
1086
+ ]);
1087
+ });
1088
+
1089
+ it('should delete cookies', async () => {
1090
+ const endpoint = new Endpoint({
1091
+ route: '/test',
1092
+ method: 'GET',
1093
+ fn: async (_, response) => {
1094
+ response.deleteCookie('session', {
1095
+ path: '/',
1096
+ domain: '.example.com',
1097
+ });
1098
+ return { success: true };
1099
+ },
1100
+ input: {},
1101
+ output: z.object({ success: z.boolean() }),
1102
+ services: [],
1103
+ logger: mockLogger,
1104
+ timeout: undefined,
1105
+ memorySize: undefined,
1106
+ status: undefined,
1107
+ getSession: undefined,
1108
+ authorize: undefined,
1109
+ description: 'Test endpoint',
1110
+ });
1111
+
1112
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
1113
+ const handler = adapter.handler;
1114
+
1115
+ const event = createMockV1Event();
1116
+ const context = createMockContext();
1117
+ const response = await handler(event, context);
1118
+
1119
+ expect(response.multiValueHeaders?.['Set-Cookie']).toEqual([
1120
+ 'session=; Domain=.example.com; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Max-Age=0',
1121
+ ]);
1122
+ });
1123
+
1124
+ it('should use send() method with metadata', async () => {
1125
+ const endpoint = new Endpoint({
1126
+ route: '/test',
1127
+ method: 'GET',
1128
+ fn: async (_, response) => {
1129
+ return response
1130
+ .status(201)
1131
+ .header('X-Custom', 'value')
1132
+ .cookie('session', 'abc123')
1133
+ .send({ id: '123' });
1134
+ },
1135
+ input: {},
1136
+ output: z.object({ id: z.string() }),
1137
+ services: [],
1138
+ logger: mockLogger,
1139
+ timeout: undefined,
1140
+ memorySize: undefined,
1141
+ status: undefined,
1142
+ getSession: undefined,
1143
+ authorize: undefined,
1144
+ description: 'Test endpoint',
1145
+ });
1146
+
1147
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
1148
+ const handler = adapter.handler;
1149
+
1150
+ const event = createMockV1Event();
1151
+ const context = createMockContext();
1152
+ const response = await handler(event, context);
1153
+
1154
+ expect(response.statusCode).toBe(201);
1155
+ expect(response.headers).toEqual({ 'X-Custom': 'value' });
1156
+ expect(response.multiValueHeaders?.['Set-Cookie']).toEqual([
1157
+ 'session=abc123',
1158
+ ]);
1159
+ expect(response.body).toBe(JSON.stringify({ id: '123' }));
1160
+ });
1161
+
1162
+ it('should return simple response without metadata when not using response builder', async () => {
1163
+ const endpoint = new Endpoint({
1164
+ route: '/test',
1165
+ method: 'GET',
1166
+ fn: async () => ({ success: true }),
1167
+ input: {},
1168
+ output: z.object({ success: z.boolean() }),
1169
+ services: [],
1170
+ logger: mockLogger,
1171
+ timeout: undefined,
1172
+ memorySize: undefined,
1173
+ status: undefined,
1174
+ getSession: undefined,
1175
+ authorize: undefined,
1176
+ description: 'Test endpoint',
1177
+ });
1178
+
1179
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, endpoint);
1180
+ const handler = adapter.handler;
1181
+
1182
+ const event = createMockV1Event();
1183
+ const context = createMockContext();
1184
+ const response = await handler(event, context);
1185
+
1186
+ expect(response).toEqual({
1187
+ statusCode: 200,
1188
+ body: JSON.stringify({ success: true }),
1189
+ });
1190
+ expect(response.headers).toBeUndefined();
1191
+ expect(response.multiValueHeaders).toBeUndefined();
1192
+ });
1193
+ });
1196
1194
  });