@geekmidas/constructs 0.3.2 → 0.6.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 (557) hide show
  1. package/dist/{AWSLambdaFunction-C54a1doJ.mjs → AWSLambdaFunction-BMTaCrG9.mjs} +6 -6
  2. package/dist/AWSLambdaFunction-BMTaCrG9.mjs.map +1 -0
  3. package/dist/{AWSLambdaFunction-BdebRMUh.d.mts → AWSLambdaFunction-BfLF5vNa.d.cts} +6 -6
  4. package/dist/AWSLambdaFunction-BfLF5vNa.d.cts.map +1 -0
  5. package/dist/{AWSLambdaFunction-EPGY4s7i.cjs → AWSLambdaFunction-C1gRqLO7.cjs} +6 -6
  6. package/dist/AWSLambdaFunction-C1gRqLO7.cjs.map +1 -0
  7. package/dist/{AWSLambdaFunction-D0tEOTXQ.d.cts → AWSLambdaFunction-K94K8JU2.d.mts} +6 -6
  8. package/dist/AWSLambdaFunction-K94K8JU2.d.mts.map +1 -0
  9. package/dist/{AWSLambdaSubscriberAdaptor-Dx-Ks1Jp.d.cts → AWSLambdaSubscriberAdaptor-B2Gk3fgx.d.cts} +2 -2
  10. package/dist/AWSLambdaSubscriberAdaptor-B2Gk3fgx.d.cts.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-BNcYYZ-P.cjs → AWSLambdaSubscriberAdaptor-DQDnt1Xk.cjs} +3 -3
  14. package/dist/AWSLambdaSubscriberAdaptor-DQDnt1Xk.cjs.map +1 -0
  15. package/dist/{AWSLambdaSubscriberAdaptor-DrFAvHOp.d.mts → AWSLambdaSubscriberAdaptor-QuMFwltJ.d.mts} +2 -2
  16. package/dist/AWSLambdaSubscriberAdaptor-QuMFwltJ.d.mts.map +1 -0
  17. package/dist/{AmazonApiGatewayEndpointAdaptor-BT9JXihC.mjs → AmazonApiGatewayEndpointAdaptor-B4gLJ2dx.mjs} +56 -14
  18. package/dist/AmazonApiGatewayEndpointAdaptor-B4gLJ2dx.mjs.map +1 -0
  19. package/dist/{AmazonApiGatewayEndpointAdaptor-DLqnYQ4E.d.cts → AmazonApiGatewayEndpointAdaptor-C987ZCsM.d.cts} +51 -5
  20. package/dist/AmazonApiGatewayEndpointAdaptor-C987ZCsM.d.cts.map +1 -0
  21. package/dist/{AmazonApiGatewayEndpointAdaptor-DNFvvdmW.cjs → AmazonApiGatewayEndpointAdaptor-CwRKMRr_.cjs} +55 -13
  22. package/dist/AmazonApiGatewayEndpointAdaptor-CwRKMRr_.cjs.map +1 -0
  23. package/dist/{AmazonApiGatewayEndpointAdaptor-qlKXuZxy.d.mts → AmazonApiGatewayEndpointAdaptor-DpPfO6Vj.d.mts} +52 -6
  24. package/dist/AmazonApiGatewayEndpointAdaptor-DpPfO6Vj.d.mts.map +1 -0
  25. package/dist/{AmazonApiGatewayV1EndpointAdaptor-Ccl8B8kG.cjs → AmazonApiGatewayV1EndpointAdaptor-BeZMu5DZ.cjs} +4 -4
  26. package/dist/AmazonApiGatewayV1EndpointAdaptor-BeZMu5DZ.cjs.map +1 -0
  27. package/dist/{AmazonApiGatewayV1EndpointAdaptor-MRUxs3Xi.d.mts → AmazonApiGatewayV1EndpointAdaptor-DI_5kdqw.d.mts} +5 -5
  28. package/dist/AmazonApiGatewayV1EndpointAdaptor-DI_5kdqw.d.mts.map +1 -0
  29. package/dist/{AmazonApiGatewayV1EndpointAdaptor-DyUaJIhB.d.cts → AmazonApiGatewayV1EndpointAdaptor-DkGMOpoB.d.cts} +4 -4
  30. package/dist/AmazonApiGatewayV1EndpointAdaptor-DkGMOpoB.d.cts.map +1 -0
  31. package/dist/{AmazonApiGatewayV1EndpointAdaptor-CShQI8Gk.mjs → AmazonApiGatewayV1EndpointAdaptor-VccB6FKp.mjs} +4 -4
  32. package/dist/AmazonApiGatewayV1EndpointAdaptor-VccB6FKp.mjs.map +1 -0
  33. package/dist/{AmazonApiGatewayV2EndpointAdaptor-M1-w0U5R.d.cts → AmazonApiGatewayV2EndpointAdaptor-BtBnMJS_.d.cts} +4 -6
  34. package/dist/AmazonApiGatewayV2EndpointAdaptor-BtBnMJS_.d.cts.map +1 -0
  35. package/dist/{AmazonApiGatewayV2EndpointAdaptor-D8-0Aab4.cjs → AmazonApiGatewayV2EndpointAdaptor-BwsL9Gia.cjs} +4 -4
  36. package/dist/AmazonApiGatewayV2EndpointAdaptor-BwsL9Gia.cjs.map +1 -0
  37. package/dist/{AmazonApiGatewayV2EndpointAdaptor-lCRzGE4q.mjs → AmazonApiGatewayV2EndpointAdaptor-CljxmUfz.mjs} +4 -4
  38. package/dist/AmazonApiGatewayV2EndpointAdaptor-CljxmUfz.mjs.map +1 -0
  39. package/dist/{AmazonApiGatewayV2EndpointAdaptor-fuLM6M9k.d.mts → AmazonApiGatewayV2EndpointAdaptor-DnCoqlvw.d.mts} +5 -7
  40. package/dist/AmazonApiGatewayV2EndpointAdaptor-DnCoqlvw.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-BAtutR6q.d.cts → BaseFunctionBuilder-BqZCqIeU.d.mts} +3 -3
  50. package/dist/BaseFunctionBuilder-BqZCqIeU.d.mts.map +1 -0
  51. package/dist/{BaseFunctionBuilder-DRY419e7.d.mts → BaseFunctionBuilder-CcK691ni.d.cts} +3 -3
  52. package/dist/BaseFunctionBuilder-CcK691ni.d.cts.map +1 -0
  53. package/dist/{BaseFunctionBuilder-Czi1Jwza.mjs → BaseFunctionBuilder-Dsqe6pnn.mjs} +2 -2
  54. package/dist/BaseFunctionBuilder-Dsqe6pnn.mjs.map +1 -0
  55. package/dist/{BaseFunctionBuilder-MYG3C9ug.cjs → BaseFunctionBuilder-Z0XwrKB5.cjs} +2 -2
  56. package/dist/BaseFunctionBuilder-Z0XwrKB5.cjs.map +1 -0
  57. package/dist/Construct-BNDLJJfD.mjs +150 -0
  58. package/dist/Construct-BNDLJJfD.mjs.map +1 -0
  59. package/dist/{Construct-Ba5cMxib.cjs → Construct-CPrCF8NK.cjs} +93 -9
  60. package/dist/Construct-CPrCF8NK.cjs.map +1 -0
  61. package/dist/{Construct-C4rPE67v.d.cts → Construct-Dl0l2d8d.d.cts} +30 -4
  62. package/dist/Construct-Dl0l2d8d.d.cts.map +1 -0
  63. package/dist/{Construct-XrijZFFh.d.mts → Construct-E8QPyHh4.d.mts} +30 -4
  64. package/dist/Construct-E8QPyHh4.d.mts.map +1 -0
  65. package/dist/Construct.cjs +4 -2
  66. package/dist/Construct.d.cts +2 -2
  67. package/dist/Construct.d.mts +2 -2
  68. package/dist/Construct.mjs +2 -2
  69. package/dist/{Cron-CGF4YAfM.cjs → Cron-BmPNTLla.cjs} +3 -3
  70. package/dist/Cron-BmPNTLla.cjs.map +1 -0
  71. package/dist/{Cron-BxhGs5up.mjs → Cron-BpJONaFv.mjs} +3 -3
  72. package/dist/Cron-BpJONaFv.mjs.map +1 -0
  73. package/dist/{Cron-bDLcTvV5.d.cts → Cron-CnmLLh3E.d.mts} +3 -3
  74. package/dist/Cron-CnmLLh3E.d.mts.map +1 -0
  75. package/dist/{Cron-cdjlSKNp.d.mts → Cron-DufAeHry.d.cts} +3 -3
  76. package/dist/Cron-DufAeHry.d.cts.map +1 -0
  77. package/dist/{CronBuilder-d2jh-IB2.mjs → CronBuilder-02HSIHJr.mjs} +4 -4
  78. package/dist/CronBuilder-02HSIHJr.mjs.map +1 -0
  79. package/dist/{CronBuilder-CcxKRtVP.cjs → CronBuilder-DC2zUS8a.cjs} +4 -4
  80. package/dist/CronBuilder-DC2zUS8a.cjs.map +1 -0
  81. package/dist/{CronBuilder-BC4m5-p1.d.mts → CronBuilder-anUSbMxb.d.mts} +4 -4
  82. package/dist/CronBuilder-anUSbMxb.d.mts.map +1 -0
  83. package/dist/{CronBuilder-DKVXyE0Q.d.cts → CronBuilder-fyqf_X8n.d.cts} +4 -4
  84. package/dist/CronBuilder-fyqf_X8n.d.cts.map +1 -0
  85. package/dist/{Endpoint-BVGZXFyV.cjs → Endpoint-BCWVbi8l.cjs} +6 -6
  86. package/dist/Endpoint-BCWVbi8l.cjs.map +1 -0
  87. package/dist/{Endpoint-BPv9_-m_.d.cts → Endpoint-BlcHiGNx.d.cts} +3 -3
  88. package/dist/Endpoint-BlcHiGNx.d.cts.map +1 -0
  89. package/dist/{Endpoint-BdwG75G_.d.mts → Endpoint-DEHuy46S.d.mts} +4 -4
  90. package/dist/Endpoint-DEHuy46S.d.mts.map +1 -0
  91. package/dist/{Endpoint-CuOEswxJ.mjs → Endpoint-ygxv2Ia6.mjs} +6 -6
  92. package/dist/Endpoint-ygxv2Ia6.mjs.map +1 -0
  93. package/dist/{EndpointBuilder-DIy_m1bu.d.cts → EndpointBuilder-DPLAUHqg.d.cts} +4 -4
  94. package/dist/EndpointBuilder-DPLAUHqg.d.cts.map +1 -0
  95. package/dist/{EndpointBuilder-B3az942t.d.mts → EndpointBuilder-DaeCeneF.d.mts} +5 -5
  96. package/dist/EndpointBuilder-DaeCeneF.d.mts.map +1 -0
  97. package/dist/{EndpointBuilder-Cgj1P_ra.cjs → EndpointBuilder-J5D67Y6a.cjs} +6 -6
  98. package/dist/EndpointBuilder-J5D67Y6a.cjs.map +1 -0
  99. package/dist/{EndpointBuilder-DnCB1h1j.mjs → EndpointBuilder-tn4zqoyw.mjs} +6 -6
  100. package/dist/EndpointBuilder-tn4zqoyw.mjs.map +1 -0
  101. package/dist/{EndpointFactory-CbdxPCIH.mjs → EndpointFactory-CIUZTTAF.mjs} +7 -7
  102. package/dist/EndpointFactory-CIUZTTAF.mjs.map +1 -0
  103. package/dist/{EndpointFactory-CyPbm3AD.d.cts → EndpointFactory-CiKcb5PX.d.cts} +4 -4
  104. package/dist/EndpointFactory-CiKcb5PX.d.cts.map +1 -0
  105. package/dist/{EndpointFactory-C-0nE6Jg.d.mts → EndpointFactory-DufM0t2z.d.mts} +4 -4
  106. package/dist/EndpointFactory-DufM0t2z.d.mts.map +1 -0
  107. package/dist/{EndpointFactory-CYj6BYok.cjs → EndpointFactory-d5uwWFkK.cjs} +7 -7
  108. package/dist/EndpointFactory-d5uwWFkK.cjs.map +1 -0
  109. package/dist/{Function-DDZb1525.cjs → Function-2qWSZqYB.cjs} +3 -3
  110. package/dist/Function-2qWSZqYB.cjs.map +1 -0
  111. package/dist/{Function-Cf7f_kCz.d.cts → Function-CbEohg13.d.cts} +3 -3
  112. package/dist/Function-CbEohg13.d.cts.map +1 -0
  113. package/dist/{Function-BVHqIDp9.mjs → Function-CdF1HmFu.mjs} +3 -3
  114. package/dist/Function-CdF1HmFu.mjs.map +1 -0
  115. package/dist/{Function-DN2G6OT5.d.mts → Function-EjIOLxlh.d.mts} +3 -3
  116. package/dist/Function-EjIOLxlh.d.mts.map +1 -0
  117. package/dist/{FunctionBuilder-DswJ-9sD.cjs → FunctionBuilder-B-pbgm09.cjs} +4 -4
  118. package/dist/FunctionBuilder-B-pbgm09.cjs.map +1 -0
  119. package/dist/{FunctionBuilder-CJBzzXL3.d.cts → FunctionBuilder-CX3ooNdq.d.cts} +4 -4
  120. package/dist/FunctionBuilder-CX3ooNdq.d.cts.map +1 -0
  121. package/dist/{FunctionBuilder-Cxx8D2na.d.mts → FunctionBuilder-D11ytDyy.d.mts} +4 -4
  122. package/dist/FunctionBuilder-D11ytDyy.d.mts.map +1 -0
  123. package/dist/{FunctionBuilder-CrDYgfiI.mjs → FunctionBuilder-DaWVthAJ.mjs} +4 -4
  124. package/dist/FunctionBuilder-DaWVthAJ.mjs.map +1 -0
  125. package/dist/{FunctionExecutionWrapper-DF260Aaj.d.mts → FunctionExecutionWrapper-BJcRjH9Z.d.cts} +5 -5
  126. package/dist/FunctionExecutionWrapper-BJcRjH9Z.d.cts.map +1 -0
  127. package/dist/{FunctionExecutionWrapper-BYI2bGTL.cjs → FunctionExecutionWrapper-C6ChBNHs.cjs} +3 -3
  128. package/dist/FunctionExecutionWrapper-C6ChBNHs.cjs.map +1 -0
  129. package/dist/{FunctionExecutionWrapper-Qy8bmgFR.d.cts → FunctionExecutionWrapper-D3RNjGIR.d.mts} +5 -5
  130. package/dist/FunctionExecutionWrapper-D3RNjGIR.d.mts.map +1 -0
  131. package/dist/{FunctionExecutionWrapper-CLDh7Z2_.mjs → FunctionExecutionWrapper-Dj3pmXaN.mjs} +3 -3
  132. package/dist/FunctionExecutionWrapper-Dj3pmXaN.mjs.map +1 -0
  133. package/dist/{HonoEndpointAdaptor-BaPlUhz0.d.mts → HonoEndpointAdaptor-CKP6nrG2.d.mts} +11 -6
  134. package/dist/HonoEndpointAdaptor-CKP6nrG2.d.mts.map +1 -0
  135. package/dist/HonoEndpointAdaptor-Cc8Rnp9G.mjs +251 -0
  136. package/dist/HonoEndpointAdaptor-Cc8Rnp9G.mjs.map +1 -0
  137. package/dist/{HonoEndpointAdaptor-YcRHYALH.d.cts → HonoEndpointAdaptor-hrrvyfw9.d.cts} +10 -5
  138. package/dist/HonoEndpointAdaptor-hrrvyfw9.d.cts.map +1 -0
  139. package/dist/HonoEndpointAdaptor-xGnDZa3a.cjs +257 -0
  140. package/dist/HonoEndpointAdaptor-xGnDZa3a.cjs.map +1 -0
  141. package/dist/{Subscriber-COYMSevD.d.cts → Subscriber-BBcIOkhW.d.cts} +2 -2
  142. package/dist/Subscriber-BBcIOkhW.d.cts.map +1 -0
  143. package/dist/{Subscriber-ikctpU3I.d.mts → Subscriber-BpTAXvbM.d.mts} +2 -2
  144. package/dist/Subscriber-BpTAXvbM.d.mts.map +1 -0
  145. package/dist/{Subscriber-BiHjVXtM.cjs → Subscriber-CL4iYm01.cjs} +2 -2
  146. package/dist/Subscriber-CL4iYm01.cjs.map +1 -0
  147. package/dist/{Subscriber-BmPf9GFb.mjs → Subscriber-CZ8Smwd2.mjs} +2 -2
  148. package/dist/Subscriber-CZ8Smwd2.mjs.map +1 -0
  149. package/dist/{SubscriberBuilder-DJPEeYDJ.mjs → SubscriberBuilder-CxQg3TTm.mjs} +2 -2
  150. package/dist/SubscriberBuilder-CxQg3TTm.mjs.map +1 -0
  151. package/dist/{SubscriberBuilder-Cp1C-xtT.cjs → SubscriberBuilder-D0OS3hd7.cjs} +2 -2
  152. package/dist/SubscriberBuilder-D0OS3hd7.cjs.map +1 -0
  153. package/dist/{SubscriberBuilder-D_9zzllj.d.mts → SubscriberBuilder-D7IgufwB.d.cts} +3 -3
  154. package/dist/SubscriberBuilder-D7IgufwB.d.cts.map +1 -0
  155. package/dist/{SubscriberBuilder-ivHAGIVi.d.cts → SubscriberBuilder-DOFBbWLt.d.mts} +3 -3
  156. package/dist/SubscriberBuilder-DOFBbWLt.d.mts.map +1 -0
  157. package/dist/{TestEndpointAdaptor-DB7bREhS.d.mts → TestEndpointAdaptor-BnJusjf7.d.mts} +4 -4
  158. package/dist/TestEndpointAdaptor-BnJusjf7.d.mts.map +1 -0
  159. package/dist/TestEndpointAdaptor-CPL8ru6q.mjs +170 -0
  160. package/dist/TestEndpointAdaptor-CPL8ru6q.mjs.map +1 -0
  161. package/dist/TestEndpointAdaptor-Ca4K26_d.cjs +176 -0
  162. package/dist/TestEndpointAdaptor-Ca4K26_d.cjs.map +1 -0
  163. package/dist/{TestEndpointAdaptor-C10xBI--.d.cts → TestEndpointAdaptor-EPPTjntv.d.cts} +3 -3
  164. package/dist/TestEndpointAdaptor-EPPTjntv.d.cts.map +1 -0
  165. package/dist/adaptors/aws.cjs +12 -12
  166. package/dist/adaptors/aws.d.cts +15 -14
  167. package/dist/adaptors/aws.d.mts +16 -15
  168. package/dist/adaptors/aws.mjs +12 -12
  169. package/dist/adaptors/hono.cjs +10 -9
  170. package/dist/adaptors/hono.d.cts +8 -8
  171. package/dist/adaptors/hono.d.mts +9 -9
  172. package/dist/adaptors/hono.mjs +10 -9
  173. package/dist/adaptors/testing.cjs +8 -7
  174. package/dist/adaptors/testing.d.cts +8 -8
  175. package/dist/adaptors/testing.d.mts +9 -9
  176. package/dist/adaptors/testing.mjs +8 -7
  177. package/dist/crons/Cron.cjs +6 -6
  178. package/dist/crons/Cron.d.cts +6 -6
  179. package/dist/crons/Cron.d.mts +6 -6
  180. package/dist/crons/Cron.mjs +6 -6
  181. package/dist/crons/CronBuilder.cjs +7 -7
  182. package/dist/crons/CronBuilder.d.cts +7 -7
  183. package/dist/crons/CronBuilder.d.mts +7 -7
  184. package/dist/crons/CronBuilder.mjs +7 -7
  185. package/dist/crons/index.cjs +7 -7
  186. package/dist/crons/index.cjs.map +1 -1
  187. package/dist/crons/index.d.cts +11 -11
  188. package/dist/crons/index.d.mts +7 -7
  189. package/dist/crons/index.mjs +7 -7
  190. package/dist/crons/index.mjs.map +1 -1
  191. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +7 -7
  192. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +10 -9
  193. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +11 -10
  194. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +7 -7
  195. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +8 -8
  196. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +10 -9
  197. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +11 -10
  198. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +8 -8
  199. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +8 -8
  200. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +11 -10
  201. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +12 -11
  202. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +8 -8
  203. package/dist/endpoints/Authorizer.cjs +1 -1
  204. package/dist/endpoints/Authorizer.d.cts +1 -1
  205. package/dist/endpoints/Authorizer.d.mts +1 -1
  206. package/dist/endpoints/Authorizer.mjs +1 -1
  207. package/dist/endpoints/Endpoint.cjs +6 -6
  208. package/dist/endpoints/Endpoint.d.cts +7 -7
  209. package/dist/endpoints/Endpoint.d.mts +8 -8
  210. package/dist/endpoints/Endpoint.mjs +6 -6
  211. package/dist/endpoints/EndpointBuilder.cjs +9 -9
  212. package/dist/endpoints/EndpointBuilder.d.cts +8 -8
  213. package/dist/endpoints/EndpointBuilder.d.mts +9 -9
  214. package/dist/endpoints/EndpointBuilder.mjs +9 -9
  215. package/dist/endpoints/EndpointFactory.cjs +10 -10
  216. package/dist/endpoints/EndpointFactory.d.cts +9 -9
  217. package/dist/endpoints/EndpointFactory.d.mts +10 -10
  218. package/dist/endpoints/EndpointFactory.mjs +10 -10
  219. package/dist/endpoints/HonoEndpointAdaptor.cjs +10 -9
  220. package/dist/endpoints/HonoEndpointAdaptor.d.cts +8 -8
  221. package/dist/endpoints/HonoEndpointAdaptor.d.mts +9 -9
  222. package/dist/endpoints/HonoEndpointAdaptor.mjs +10 -9
  223. package/dist/endpoints/TestEndpointAdaptor.cjs +8 -7
  224. package/dist/endpoints/TestEndpointAdaptor.d.cts +8 -8
  225. package/dist/endpoints/TestEndpointAdaptor.d.mts +9 -9
  226. package/dist/endpoints/TestEndpointAdaptor.mjs +8 -7
  227. package/dist/endpoints/audit.d.cts +7 -7
  228. package/dist/endpoints/audit.d.mts +8 -8
  229. package/dist/endpoints/helpers.cjs +7 -7
  230. package/dist/endpoints/helpers.d.cts +7 -7
  231. package/dist/endpoints/helpers.d.cts.map +1 -1
  232. package/dist/endpoints/helpers.d.mts +8 -8
  233. package/dist/endpoints/helpers.d.mts.map +1 -1
  234. package/dist/endpoints/helpers.mjs +7 -7
  235. package/dist/endpoints/index.cjs +20 -10
  236. package/dist/endpoints/index.cjs.map +1 -1
  237. package/dist/endpoints/index.d.cts +14 -12
  238. package/dist/endpoints/index.d.cts.map +1 -1
  239. package/dist/endpoints/index.d.mts +15 -13
  240. package/dist/endpoints/index.d.mts.map +1 -1
  241. package/dist/endpoints/index.mjs +13 -11
  242. package/dist/endpoints/index.mjs.map +1 -1
  243. package/dist/endpoints/lazyAccessors.cjs +10 -0
  244. package/dist/endpoints/lazyAccessors.d.cts +10 -0
  245. package/dist/endpoints/lazyAccessors.d.mts +10 -0
  246. package/dist/endpoints/lazyAccessors.mjs +3 -0
  247. package/dist/endpoints/parseHonoQuery.cjs +1 -1
  248. package/dist/endpoints/parseHonoQuery.mjs +1 -1
  249. package/dist/endpoints/parseQueryParams.d.cts.map +1 -1
  250. package/dist/endpoints/parseQueryParams.d.mts.map +1 -1
  251. package/dist/endpoints/processAudits.d.cts +7 -7
  252. package/dist/endpoints/processAudits.d.cts.map +1 -1
  253. package/dist/endpoints/processAudits.d.mts +8 -8
  254. package/dist/endpoints/processAudits.d.mts.map +1 -1
  255. package/dist/endpoints/rls.cjs +1 -1
  256. package/dist/endpoints/rls.d.cts +7 -7
  257. package/dist/endpoints/rls.d.mts +8 -8
  258. package/dist/endpoints/rls.mjs +1 -1
  259. package/dist/functions/AWSLambdaFunction.cjs +6 -6
  260. package/dist/functions/AWSLambdaFunction.d.cts +4 -4
  261. package/dist/functions/AWSLambdaFunction.d.mts +4 -4
  262. package/dist/functions/AWSLambdaFunction.mjs +6 -6
  263. package/dist/functions/BaseFunctionBuilder.cjs +2 -2
  264. package/dist/functions/BaseFunctionBuilder.d.cts +2 -2
  265. package/dist/functions/BaseFunctionBuilder.d.mts +2 -2
  266. package/dist/functions/BaseFunctionBuilder.mjs +2 -2
  267. package/dist/functions/Function.cjs +2 -2
  268. package/dist/functions/Function.d.cts +2 -2
  269. package/dist/functions/Function.d.mts +2 -2
  270. package/dist/functions/Function.mjs +2 -2
  271. package/dist/functions/FunctionBuilder.cjs +4 -4
  272. package/dist/functions/FunctionBuilder.d.cts +4 -4
  273. package/dist/functions/FunctionBuilder.d.mts +4 -4
  274. package/dist/functions/FunctionBuilder.mjs +4 -4
  275. package/dist/functions/FunctionExecutionWrapper.cjs +5 -5
  276. package/dist/functions/FunctionExecutionWrapper.d.cts +3 -3
  277. package/dist/functions/FunctionExecutionWrapper.d.mts +3 -3
  278. package/dist/functions/FunctionExecutionWrapper.mjs +5 -5
  279. package/dist/functions/TestFunctionAdaptor.cjs +7 -7
  280. package/dist/functions/TestFunctionAdaptor.cjs.map +1 -1
  281. package/dist/functions/TestFunctionAdaptor.d.cts +3 -3
  282. package/dist/functions/TestFunctionAdaptor.d.cts.map +1 -1
  283. package/dist/functions/TestFunctionAdaptor.d.mts +3 -3
  284. package/dist/functions/TestFunctionAdaptor.d.mts.map +1 -1
  285. package/dist/functions/TestFunctionAdaptor.mjs +7 -7
  286. package/dist/functions/TestFunctionAdaptor.mjs.map +1 -1
  287. package/dist/functions/index.cjs +5 -5
  288. package/dist/functions/index.d.cts +5 -5
  289. package/dist/functions/index.d.mts +5 -5
  290. package/dist/functions/index.mjs +5 -5
  291. package/dist/{functions-fTid0RMK.cjs → functions-CUEv5NC3.cjs} +2 -2
  292. package/dist/functions-CUEv5NC3.cjs.map +1 -0
  293. package/dist/functions-DOYBrb7n.mjs +8 -0
  294. package/dist/functions-DOYBrb7n.mjs.map +1 -0
  295. package/dist/{helpers-ByRTDO_m.mjs → helpers-Dl1eszfi.mjs} +2 -2
  296. package/dist/helpers-Dl1eszfi.mjs.map +1 -0
  297. package/dist/{helpers-BcP1tXAi.cjs → helpers-QMdfdnvU.cjs} +2 -2
  298. package/dist/helpers-QMdfdnvU.cjs.map +1 -0
  299. package/dist/{index-BWzGIj06.d.mts → index-BrGtMlpJ.d.cts} +2 -2
  300. package/dist/index-BrGtMlpJ.d.cts.map +1 -0
  301. package/dist/index-Dn4py3Db.d.mts +12 -0
  302. package/dist/index-Dn4py3Db.d.mts.map +1 -0
  303. package/dist/index.cjs +4 -2
  304. package/dist/index.d.cts +3 -2
  305. package/dist/index.d.mts +4 -3
  306. package/dist/index.mjs +2 -2
  307. package/dist/lazyAccessors-B-Jgkg2o.mjs +175 -0
  308. package/dist/lazyAccessors-B-Jgkg2o.mjs.map +1 -0
  309. package/dist/lazyAccessors-B8Hhras9.cjs +223 -0
  310. package/dist/lazyAccessors-B8Hhras9.cjs.map +1 -0
  311. package/dist/lazyAccessors-BFAj2-S4.d.mts +49 -0
  312. package/dist/lazyAccessors-BFAj2-S4.d.mts.map +1 -0
  313. package/dist/lazyAccessors-knaNZuTN.d.cts +49 -0
  314. package/dist/lazyAccessors-knaNZuTN.d.cts.map +1 -0
  315. package/dist/{parseHonoQuery-CZC5_97v.cjs → parseHonoQuery-D4MhxTRc.cjs} +1 -1
  316. package/dist/parseHonoQuery-D4MhxTRc.cjs.map +1 -0
  317. package/dist/{parseHonoQuery-DDgIkTO4.mjs → parseHonoQuery-DpK3sGPc.mjs} +1 -1
  318. package/dist/parseHonoQuery-DpK3sGPc.mjs.map +1 -0
  319. package/dist/parseQueryParams-BSNkjmZ9.cjs.map +1 -1
  320. package/dist/parseQueryParams-UMTRnRrW.mjs.map +1 -1
  321. package/dist/processAudits-CzHkPokQ.cjs.map +1 -1
  322. package/dist/processAudits-Dj8UGqcW.mjs.map +1 -1
  323. package/dist/publisher-BXG9YiRi.d.mts +16 -0
  324. package/dist/publisher-BXG9YiRi.d.mts.map +1 -0
  325. package/dist/publisher-Bw4770Hi.mjs.map +1 -1
  326. package/dist/publisher-D9ngDXg3.d.cts +16 -0
  327. package/dist/publisher-D9ngDXg3.d.cts.map +1 -0
  328. package/dist/publisher-lFQleddL.cjs.map +1 -1
  329. package/dist/publisher.d.cts +3 -16
  330. package/dist/publisher.d.mts +3 -16
  331. package/dist/{rls-CmJ7bRsz.cjs → rls-BrywnrQb.cjs} +1 -1
  332. package/dist/{rls-CmJ7bRsz.cjs.map → rls-BrywnrQb.cjs.map} +1 -1
  333. package/dist/{rls-Bf3FRwto.mjs → rls-C0cWOnk4.mjs} +1 -1
  334. package/dist/{rls-Bf3FRwto.mjs.map → rls-C0cWOnk4.mjs.map} +1 -1
  335. package/dist/subscribers/AWSLambdaSubscriberAdaptor.cjs +1 -1
  336. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.cts +3 -3
  337. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +3 -3
  338. package/dist/subscribers/AWSLambdaSubscriberAdaptor.mjs +1 -1
  339. package/dist/subscribers/Subscriber.cjs +2 -2
  340. package/dist/subscribers/Subscriber.d.cts +2 -2
  341. package/dist/subscribers/Subscriber.d.mts +2 -2
  342. package/dist/subscribers/Subscriber.mjs +2 -2
  343. package/dist/subscribers/SubscriberBuilder.cjs +3 -3
  344. package/dist/subscribers/SubscriberBuilder.d.cts +3 -3
  345. package/dist/subscribers/SubscriberBuilder.d.mts +3 -3
  346. package/dist/subscribers/SubscriberBuilder.mjs +3 -3
  347. package/dist/subscribers/index.cjs +3 -3
  348. package/dist/subscribers/index.cjs.map +1 -1
  349. package/dist/subscribers/index.d.cts +5 -5
  350. package/dist/subscribers/index.d.cts.map +1 -1
  351. package/dist/subscribers/index.d.mts +5 -5
  352. package/dist/subscribers/index.d.mts.map +1 -1
  353. package/dist/subscribers/index.mjs +3 -3
  354. package/dist/subscribers/index.mjs.map +1 -1
  355. package/dist/telemetry-BTaiRqPo.d.cts +95 -0
  356. package/dist/telemetry-BTaiRqPo.d.cts.map +1 -0
  357. package/dist/telemetry-yAHf5yDs.d.mts +95 -0
  358. package/dist/telemetry-yAHf5yDs.d.mts.map +1 -0
  359. package/dist/telemetry.cjs +0 -0
  360. package/dist/telemetry.d.cts +2 -0
  361. package/dist/telemetry.d.mts +2 -0
  362. package/dist/telemetry.mjs +0 -0
  363. package/dist/types-B5H3piDg.d.cts.map +1 -1
  364. package/dist/{types-DdIlpxAd.d.mts → types-Dw-iLd3Y.d.mts} +1 -1
  365. package/dist/types-Dw-iLd3Y.d.mts.map +1 -0
  366. package/dist/types.d.mts +1 -1
  367. package/package.json +19 -18
  368. package/src/Construct.ts +189 -94
  369. package/src/__benchmarks__/build-time-optimization.bench.ts +274 -0
  370. package/src/__benchmarks__/endpoint.bench.ts +375 -375
  371. package/src/__benchmarks__/fixtures.ts +241 -0
  372. package/src/__benchmarks__/hono-adaptor.bench.ts +533 -0
  373. package/src/__benchmarks__/hono-server.bench.ts +206 -206
  374. package/src/__benchmarks__/response-builder.bench.ts +428 -0
  375. package/src/__benchmarks__/strategies/strategy-a-lazy-services.ts +319 -0
  376. package/src/__benchmarks__/strategies/strategy-c-middleware.ts +530 -0
  377. package/src/__benchmarks__/strategies/strategy-d-opt-in-events.ts +567 -0
  378. package/src/__tests__/Construct.environment.spec.ts +572 -351
  379. package/src/__tests__/publisher.setting.spec.ts +496 -499
  380. package/src/__tests__/publisher.spec.ts +440 -442
  381. package/src/crons/Cron.ts +117 -117
  382. package/src/crons/CronBuilder.ts +237 -238
  383. package/src/crons/__tests__/Cron.spec.ts +448 -448
  384. package/src/crons/__tests__/CronBuilder.state-isolation.spec.ts +214 -214
  385. package/src/crons/index.ts +4 -4
  386. package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +571 -463
  387. package/src/endpoints/AmazonApiGatewayV1EndpointAdaptor.ts +86 -86
  388. package/src/endpoints/AmazonApiGatewayV2EndpointAdaptor.ts +85 -81
  389. package/src/endpoints/Authorizer.ts +100 -100
  390. package/src/endpoints/Endpoint.ts +921 -937
  391. package/src/endpoints/EndpointBuilder.ts +703 -703
  392. package/src/endpoints/EndpointFactory.ts +1054 -1056
  393. package/src/endpoints/HonoEndpointAdaptor.ts +621 -548
  394. package/src/endpoints/TestEndpointAdaptor.ts +372 -353
  395. package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.audits.spec.ts +499 -0
  396. package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.events.spec.ts +541 -542
  397. package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.spec.ts +1172 -1174
  398. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.audits.spec.ts +599 -599
  399. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.events.spec.ts +710 -710
  400. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.factory-publisher.spec.ts +280 -280
  401. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.kysely-audit.integration.spec.ts +924 -730
  402. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.rls.spec.ts +307 -0
  403. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.spec.ts +408 -408
  404. package/src/endpoints/__tests__/Authorizer.spec.ts +286 -0
  405. package/src/endpoints/__tests__/Endpoint.cookies.spec.ts +162 -162
  406. package/src/endpoints/__tests__/Endpoint.headers.spec.ts +182 -182
  407. package/src/endpoints/__tests__/Endpoint.manifest.spec.ts +158 -159
  408. package/src/endpoints/__tests__/Endpoint.spec.ts +819 -822
  409. package/src/endpoints/__tests__/EndpointBuilder.audit.spec.ts +427 -427
  410. package/src/endpoints/__tests__/EndpointBuilder.spec.ts +478 -478
  411. package/src/endpoints/__tests__/EndpointFactory.authorizers.spec.ts +426 -426
  412. package/src/endpoints/__tests__/EndpointFactory.database-auditor.spec.ts +501 -501
  413. package/src/endpoints/__tests__/EndpointFactory.reference-audit.spec.ts +177 -177
  414. package/src/endpoints/__tests__/EndpointFactory.spec.ts +471 -471
  415. package/src/endpoints/__tests__/EndpointFactory.state-isolation.spec.ts +143 -143
  416. package/src/endpoints/__tests__/HonoEndpointAdaptor.audit-transactions.spec.ts +663 -663
  417. package/src/endpoints/__tests__/HonoEndpointAdaptor.audits.spec.ts +608 -608
  418. package/src/endpoints/__tests__/HonoEndpointAdaptor.events.spec.ts +561 -561
  419. package/src/endpoints/__tests__/HonoEndpointAdaptor.kysely-audit.integration.spec.ts +1036 -1036
  420. package/src/endpoints/__tests__/HonoEndpointAdaptor.openapi.spec.ts +278 -278
  421. package/src/endpoints/__tests__/HonoEndpointAdaptor.spec.ts +1093 -1093
  422. package/src/endpoints/__tests__/ResponseBuilder.spec.ts +230 -230
  423. package/src/endpoints/__tests__/TestEndpointAdaptor.audits.spec.ts +569 -569
  424. package/src/endpoints/__tests__/TestEndpointAdaptor.spec.ts +841 -841
  425. package/src/endpoints/__tests__/endpoint-types.test.ts +68 -68
  426. package/src/endpoints/__tests__/helpers.spec.ts +37 -0
  427. package/src/endpoints/__tests__/lazyAccessors.spec.ts +330 -0
  428. package/src/endpoints/__tests__/processAudits.spec.ts +631 -0
  429. package/src/endpoints/audit.ts +51 -51
  430. package/src/endpoints/helpers.ts +34 -35
  431. package/src/endpoints/index.ts +33 -23
  432. package/src/endpoints/lazyAccessors.ts +241 -0
  433. package/src/endpoints/parseHonoQuery.ts +41 -41
  434. package/src/endpoints/parseQueryParams.ts +36 -36
  435. package/src/endpoints/processAudits.ts +269 -269
  436. package/src/endpoints/rls.ts +16 -16
  437. package/src/functions/AWSLambdaFunction.ts +294 -295
  438. package/src/functions/BaseFunctionBuilder.ts +185 -185
  439. package/src/functions/Function.ts +190 -190
  440. package/src/functions/FunctionBuilder.ts +353 -353
  441. package/src/functions/FunctionExecutionWrapper.ts +199 -200
  442. package/src/functions/TestFunctionAdaptor.ts +191 -191
  443. package/src/functions/__tests__/AWSLambdaFunctionAdaptor.spec.ts +424 -424
  444. package/src/functions/__tests__/Function.audits.spec.ts +364 -364
  445. package/src/functions/__tests__/Function.spec.ts +453 -454
  446. package/src/functions/__tests__/FunctionBuilder.state-isolation.spec.ts +179 -179
  447. package/src/functions/__tests__/TestFunctionAdaptor.spec.ts +369 -369
  448. package/src/functions/index.ts +6 -4
  449. package/src/index.ts +18 -9
  450. package/src/publisher.ts +71 -72
  451. package/src/subscribers/AWSLambdaSubscriberAdaptor.ts +244 -248
  452. package/src/subscribers/Subscriber.ts +82 -84
  453. package/src/subscribers/SubscriberBuilder.ts +129 -129
  454. package/src/subscribers/__tests__/AWSLambdaSubscriberAdaptor.spec.ts +589 -589
  455. package/src/subscribers/__tests__/Subscriber.spec.ts +402 -404
  456. package/src/subscribers/index.ts +1 -0
  457. package/src/telemetry.ts +103 -0
  458. package/src/types.ts +7 -7
  459. package/test.ts +58 -59
  460. package/dist/AWSLambdaFunction-BdebRMUh.d.mts.map +0 -1
  461. package/dist/AWSLambdaFunction-C54a1doJ.mjs.map +0 -1
  462. package/dist/AWSLambdaFunction-D0tEOTXQ.d.cts.map +0 -1
  463. package/dist/AWSLambdaFunction-EPGY4s7i.cjs.map +0 -1
  464. package/dist/AWSLambdaSubscriberAdaptor-BLfO612H.mjs.map +0 -1
  465. package/dist/AWSLambdaSubscriberAdaptor-BNcYYZ-P.cjs.map +0 -1
  466. package/dist/AWSLambdaSubscriberAdaptor-DrFAvHOp.d.mts.map +0 -1
  467. package/dist/AWSLambdaSubscriberAdaptor-Dx-Ks1Jp.d.cts.map +0 -1
  468. package/dist/AmazonApiGatewayEndpointAdaptor-BT9JXihC.mjs.map +0 -1
  469. package/dist/AmazonApiGatewayEndpointAdaptor-DLqnYQ4E.d.cts.map +0 -1
  470. package/dist/AmazonApiGatewayEndpointAdaptor-DNFvvdmW.cjs.map +0 -1
  471. package/dist/AmazonApiGatewayEndpointAdaptor-qlKXuZxy.d.mts.map +0 -1
  472. package/dist/AmazonApiGatewayV1EndpointAdaptor-CShQI8Gk.mjs.map +0 -1
  473. package/dist/AmazonApiGatewayV1EndpointAdaptor-Ccl8B8kG.cjs.map +0 -1
  474. package/dist/AmazonApiGatewayV1EndpointAdaptor-DyUaJIhB.d.cts.map +0 -1
  475. package/dist/AmazonApiGatewayV1EndpointAdaptor-MRUxs3Xi.d.mts.map +0 -1
  476. package/dist/AmazonApiGatewayV2EndpointAdaptor-D8-0Aab4.cjs.map +0 -1
  477. package/dist/AmazonApiGatewayV2EndpointAdaptor-M1-w0U5R.d.cts.map +0 -1
  478. package/dist/AmazonApiGatewayV2EndpointAdaptor-fuLM6M9k.d.mts.map +0 -1
  479. package/dist/AmazonApiGatewayV2EndpointAdaptor-lCRzGE4q.mjs.map +0 -1
  480. package/dist/Authorizer-B-btowNd.d.cts.map +0 -1
  481. package/dist/Authorizer-C0ge_tc8.cjs.map +0 -1
  482. package/dist/Authorizer-gWxYsGEp.d.mts.map +0 -1
  483. package/dist/Authorizer-r9U3y_ms.mjs.map +0 -1
  484. package/dist/BaseFunctionBuilder-BAtutR6q.d.cts.map +0 -1
  485. package/dist/BaseFunctionBuilder-Czi1Jwza.mjs.map +0 -1
  486. package/dist/BaseFunctionBuilder-DRY419e7.d.mts.map +0 -1
  487. package/dist/BaseFunctionBuilder-MYG3C9ug.cjs.map +0 -1
  488. package/dist/Construct-Ba5cMxib.cjs.map +0 -1
  489. package/dist/Construct-C4rPE67v.d.cts.map +0 -1
  490. package/dist/Construct-DdyGHuag.mjs +0 -78
  491. package/dist/Construct-DdyGHuag.mjs.map +0 -1
  492. package/dist/Construct-XrijZFFh.d.mts.map +0 -1
  493. package/dist/Cron-BxhGs5up.mjs.map +0 -1
  494. package/dist/Cron-CGF4YAfM.cjs.map +0 -1
  495. package/dist/Cron-bDLcTvV5.d.cts.map +0 -1
  496. package/dist/Cron-cdjlSKNp.d.mts.map +0 -1
  497. package/dist/CronBuilder-BC4m5-p1.d.mts.map +0 -1
  498. package/dist/CronBuilder-CcxKRtVP.cjs.map +0 -1
  499. package/dist/CronBuilder-DKVXyE0Q.d.cts.map +0 -1
  500. package/dist/CronBuilder-d2jh-IB2.mjs.map +0 -1
  501. package/dist/Endpoint-BPv9_-m_.d.cts.map +0 -1
  502. package/dist/Endpoint-BVGZXFyV.cjs.map +0 -1
  503. package/dist/Endpoint-BdwG75G_.d.mts.map +0 -1
  504. package/dist/Endpoint-CuOEswxJ.mjs.map +0 -1
  505. package/dist/EndpointBuilder-B3az942t.d.mts.map +0 -1
  506. package/dist/EndpointBuilder-Cgj1P_ra.cjs.map +0 -1
  507. package/dist/EndpointBuilder-DIy_m1bu.d.cts.map +0 -1
  508. package/dist/EndpointBuilder-DnCB1h1j.mjs.map +0 -1
  509. package/dist/EndpointFactory-C-0nE6Jg.d.mts.map +0 -1
  510. package/dist/EndpointFactory-CYj6BYok.cjs.map +0 -1
  511. package/dist/EndpointFactory-CbdxPCIH.mjs.map +0 -1
  512. package/dist/EndpointFactory-CyPbm3AD.d.cts.map +0 -1
  513. package/dist/Function-BVHqIDp9.mjs.map +0 -1
  514. package/dist/Function-Cf7f_kCz.d.cts.map +0 -1
  515. package/dist/Function-DDZb1525.cjs.map +0 -1
  516. package/dist/Function-DN2G6OT5.d.mts.map +0 -1
  517. package/dist/FunctionBuilder-CJBzzXL3.d.cts.map +0 -1
  518. package/dist/FunctionBuilder-CrDYgfiI.mjs.map +0 -1
  519. package/dist/FunctionBuilder-Cxx8D2na.d.mts.map +0 -1
  520. package/dist/FunctionBuilder-DswJ-9sD.cjs.map +0 -1
  521. package/dist/FunctionExecutionWrapper-BYI2bGTL.cjs.map +0 -1
  522. package/dist/FunctionExecutionWrapper-CLDh7Z2_.mjs.map +0 -1
  523. package/dist/FunctionExecutionWrapper-DF260Aaj.d.mts.map +0 -1
  524. package/dist/FunctionExecutionWrapper-Qy8bmgFR.d.cts.map +0 -1
  525. package/dist/HonoEndpointAdaptor-BaPlUhz0.d.mts.map +0 -1
  526. package/dist/HonoEndpointAdaptor-CQe2FqMR.cjs +0 -234
  527. package/dist/HonoEndpointAdaptor-CQe2FqMR.cjs.map +0 -1
  528. package/dist/HonoEndpointAdaptor-Ce-2HBxn.mjs +0 -228
  529. package/dist/HonoEndpointAdaptor-Ce-2HBxn.mjs.map +0 -1
  530. package/dist/HonoEndpointAdaptor-YcRHYALH.d.cts.map +0 -1
  531. package/dist/Subscriber-BiHjVXtM.cjs.map +0 -1
  532. package/dist/Subscriber-BmPf9GFb.mjs.map +0 -1
  533. package/dist/Subscriber-COYMSevD.d.cts.map +0 -1
  534. package/dist/Subscriber-ikctpU3I.d.mts.map +0 -1
  535. package/dist/SubscriberBuilder-Cp1C-xtT.cjs.map +0 -1
  536. package/dist/SubscriberBuilder-DJPEeYDJ.mjs.map +0 -1
  537. package/dist/SubscriberBuilder-D_9zzllj.d.mts.map +0 -1
  538. package/dist/SubscriberBuilder-ivHAGIVi.d.cts.map +0 -1
  539. package/dist/TestEndpointAdaptor-C10xBI--.d.cts.map +0 -1
  540. package/dist/TestEndpointAdaptor-DB7bREhS.d.mts.map +0 -1
  541. package/dist/TestEndpointAdaptor-DJgik2Wj.mjs +0 -160
  542. package/dist/TestEndpointAdaptor-DJgik2Wj.mjs.map +0 -1
  543. package/dist/TestEndpointAdaptor-ZbtQiuHE.cjs +0 -166
  544. package/dist/TestEndpointAdaptor-ZbtQiuHE.cjs.map +0 -1
  545. package/dist/functions-C6EK1xL6.mjs +0 -8
  546. package/dist/functions-C6EK1xL6.mjs.map +0 -1
  547. package/dist/functions-fTid0RMK.cjs.map +0 -1
  548. package/dist/helpers-BcP1tXAi.cjs.map +0 -1
  549. package/dist/helpers-ByRTDO_m.mjs.map +0 -1
  550. package/dist/index-BWzGIj06.d.mts.map +0 -1
  551. package/dist/index-DmFozqLd.d.cts +0 -12
  552. package/dist/index-DmFozqLd.d.cts.map +0 -1
  553. package/dist/parseHonoQuery-CZC5_97v.cjs.map +0 -1
  554. package/dist/parseHonoQuery-DDgIkTO4.mjs.map +0 -1
  555. package/dist/publisher.d.cts.map +0 -1
  556. package/dist/publisher.d.mts.map +0 -1
  557. 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
  });