@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
@@ -8,1097 +8,1097 @@ import { Endpoint, type EndpointContext } from '../Endpoint';
8
8
  import { HonoEndpoint } from '../HonoEndpointAdaptor';
9
9
 
10
10
  describe('HonoEndpointAdaptor', () => {
11
- const mockLogger: Logger = {
12
- debug: vi.fn(),
13
- info: vi.fn(),
14
- warn: vi.fn(),
15
- error: vi.fn(),
16
- fatal: vi.fn(),
17
- trace: vi.fn(),
18
- child: vi.fn(() => mockLogger),
19
- };
20
- const envParser = new EnvironmentParser({});
21
- const serviceDiscovery = ServiceDiscovery.getInstance(mockLogger, envParser);
22
-
23
- describe('addRoute', () => {
24
- it('should register a GET endpoint', async () => {
25
- const endpoint = new Endpoint({
26
- route: '/users',
27
- method: 'GET',
28
- fn: async () => ({ users: [] }),
29
- input: undefined,
30
- output: z.object({ users: z.array(z.any()) }),
31
- services: [],
32
- logger: mockLogger,
33
- timeout: undefined,
34
- memorySize: undefined,
35
- status: undefined,
36
- getSession: undefined,
37
- authorize: undefined,
38
- description: undefined,
39
- });
40
-
41
- const adaptor = new HonoEndpoint(endpoint);
42
- const app = new Hono();
43
-
44
- adaptor.addRoute(serviceDiscovery, app);
45
-
46
- const response = await app.request('/users');
47
- expect(response.status).toBe(200);
48
- expect(await response.json()).toEqual({ users: [] });
49
- });
50
-
51
- it('should register a POST endpoint with body validation', async () => {
52
- const bodySchema = z.object({
53
- name: z.string(),
54
- email: z.string().email(),
55
- });
56
-
57
- const endpoint = new Endpoint({
58
- route: '/users',
59
- method: 'POST',
60
- fn: async ({ body }) => ({ id: '123', ...body }),
61
- input: {
62
- body: bodySchema,
63
- },
64
- output: z.object({
65
- id: z.string(),
66
- name: z.string(),
67
- email: z.string(),
68
- }),
69
- services: [],
70
- logger: mockLogger,
71
- timeout: undefined,
72
- memorySize: undefined,
73
- status: undefined,
74
- getSession: undefined,
75
- authorize: undefined,
76
- description: undefined,
77
- });
78
-
79
- const adaptor = new HonoEndpoint(endpoint);
80
- const app = new Hono();
81
-
82
- adaptor.addRoute(serviceDiscovery, app);
83
-
84
- const response = await app.request('/users', {
85
- method: 'POST',
86
- body: JSON.stringify({ name: 'John', email: 'john@example.com' }),
87
- headers: { 'Content-Type': 'application/json' },
88
- });
89
-
90
- expect(response.status).toBe(200);
91
- expect(await response.json()).toEqual({
92
- id: '123',
93
- name: 'John',
94
- email: 'john@example.com',
95
- });
96
- });
97
-
98
- it('should validate query parameters', async () => {
99
- const querySchema = z.object({
100
- page: z.string().transform(Number),
101
- limit: z.string().transform(Number),
102
- });
103
-
104
- const endpoint = new Endpoint({
105
- route: '/users',
106
- method: 'GET',
107
- fn: async ({ query }) => ({
108
- page: query.page,
109
- limit: query.limit,
110
- users: [],
111
- }),
112
- input: {
113
- query: querySchema,
114
- },
115
- output: z.object({
116
- page: z.number(),
117
- limit: z.number(),
118
- users: z.array(z.any()),
119
- }),
120
- services: [],
121
- logger: mockLogger,
122
- timeout: undefined,
123
- memorySize: undefined,
124
- status: undefined,
125
- getSession: undefined,
126
- authorize: undefined,
127
- description: undefined,
128
- });
129
-
130
- const adaptor = new HonoEndpoint(endpoint);
131
- const app = new Hono();
132
-
133
- adaptor.addRoute(serviceDiscovery, app);
134
-
135
- const response = await app.request('/users?page=1&limit=10');
136
- expect(response.status).toBe(200);
137
- expect(await response.json()).toEqual({
138
- page: 1,
139
- limit: 10,
140
- users: [],
141
- });
142
- });
143
-
144
- it('should validate path parameters', async () => {
145
- const paramsSchema = z.object({
146
- id: z.string().uuid(),
147
- });
148
-
149
- const endpoint = new Endpoint({
150
- route: '/users/:id',
151
- method: 'GET',
152
- fn: async ({ params }) => ({
153
- id: params.id,
154
- name: 'John Doe',
155
- }),
156
- input: {
157
- params: paramsSchema,
158
- },
159
- output: z.object({ id: z.string(), name: z.string() }),
160
- services: [],
161
- logger: mockLogger,
162
- timeout: undefined,
163
- memorySize: undefined,
164
- status: undefined,
165
- getSession: undefined,
166
- authorize: undefined,
167
- description: undefined,
168
- });
169
-
170
- const adaptor = new HonoEndpoint(endpoint);
171
- const app = new Hono();
172
-
173
- adaptor.addRoute(serviceDiscovery, app);
174
-
175
- const response = await app.request(
176
- '/users/550e8400-e29b-41d4-a716-446655440000',
177
- );
178
- expect(response.status).toBe(200);
179
- expect(await response.json()).toEqual({
180
- id: '550e8400-e29b-41d4-a716-446655440000',
181
- name: 'John Doe',
182
- });
183
- });
184
-
185
- it('should return 422 for invalid body', async () => {
186
- const bodySchema = z.object({
187
- name: z.string().min(3),
188
- age: z.number().min(18),
189
- });
190
-
191
- const endpoint = new Endpoint({
192
- route: '/users',
193
- method: 'POST',
194
- fn: async ({ body }) => ({ id: '123', ...body }),
195
- input: {
196
- body: bodySchema,
197
- },
198
- output: undefined,
199
- services: [],
200
- logger: mockLogger,
201
- timeout: undefined,
202
- memorySize: undefined,
203
- status: undefined,
204
- getSession: undefined,
205
- authorize: undefined,
206
- description: undefined,
207
- });
208
-
209
- const adaptor = new HonoEndpoint(endpoint);
210
- const app = new Hono();
211
-
212
- adaptor.addRoute(serviceDiscovery, app);
213
-
214
- const response = await app.request('/users', {
215
- method: 'POST',
216
- body: JSON.stringify({ name: 'Jo', age: 'not a number' }),
217
- headers: { 'Content-Type': 'application/json' },
218
- });
219
-
220
- expect(response.status).toBe(422);
221
- const error = await response.json();
222
- expect(error).toMatchSnapshot();
223
- });
224
-
225
- it('should return 422 for invalid query parameters', async () => {
226
- const querySchema = z.object({
227
- page: z.string().regex(/^\d+$/).transform(Number),
228
- });
229
-
230
- const endpoint = new Endpoint({
231
- route: '/users',
232
- method: 'GET',
233
- fn: async ({ query }) => ({ page: query.page }),
234
- input: {
235
- query: querySchema,
236
- },
237
- output: undefined,
238
- services: [],
239
- logger: mockLogger,
240
- timeout: undefined,
241
- memorySize: undefined,
242
- status: undefined,
243
- getSession: undefined,
244
- authorize: undefined,
245
- description: undefined,
246
- });
247
-
248
- const adaptor = new HonoEndpoint(endpoint);
249
- const app = new Hono();
250
-
251
- adaptor.addRoute(serviceDiscovery, app);
252
-
253
- const response = await app.request('/users?page=abc');
254
- expect(response.status).toBe(422);
255
- const error = await response.json();
256
- expect(error).toMatchSnapshot();
257
- });
258
-
259
- it('should return 422 for invalid path parameters', async () => {
260
- const paramsSchema = z.object({
261
- id: z.string().uuid(),
262
- });
263
-
264
- const endpoint = new Endpoint({
265
- route: '/users/:id',
266
- method: 'GET',
267
- fn: async ({ params }) => ({ id: params.id }),
268
- input: {
269
- params: paramsSchema,
270
- },
271
- output: undefined,
272
- services: [],
273
- logger: mockLogger,
274
- timeout: undefined,
275
- memorySize: undefined,
276
- status: undefined,
277
- getSession: undefined,
278
- authorize: undefined,
279
- description: undefined,
280
- });
281
-
282
- const adaptor = new HonoEndpoint(endpoint);
283
- const app = new Hono();
284
-
285
- adaptor.addRoute(serviceDiscovery, app);
286
-
287
- const response = await app.request('/users/not-a-uuid');
288
-
289
- expect(response.status).toBe(422);
290
- const error = await response.json();
291
-
292
- expect(error).toMatchSnapshot();
293
- });
294
-
295
- it('should handle PUT method', async () => {
296
- const bodySchema = z.object({
297
- name: z.string(),
298
- });
299
- const paramsSchema = z.object({
300
- id: z.string(),
301
- });
302
-
303
- const endpoint = new Endpoint({
304
- route: '/users/:id',
305
- method: 'PUT',
306
- fn: async ({ params, body }) => ({ id: params.id, ...body }),
307
- input: {
308
- body: bodySchema,
309
- params: paramsSchema,
310
- },
311
- output: z.object({ id: z.string(), name: z.string() }),
312
- services: [],
313
- logger: mockLogger,
314
- timeout: undefined,
315
- memorySize: undefined,
316
- status: undefined,
317
- getSession: undefined,
318
- authorize: undefined,
319
- description: undefined,
320
- });
321
-
322
- const adaptor = new HonoEndpoint(endpoint);
323
- const app = new Hono();
324
-
325
- adaptor.addRoute(serviceDiscovery, app);
326
-
327
- const response = await app.request('/users/123', {
328
- method: 'PUT',
329
- body: JSON.stringify({ name: 'Updated Name' }),
330
- headers: { 'Content-Type': 'application/json' },
331
- });
332
-
333
- expect(response.status).toBe(200);
334
- expect(await response.json()).toEqual({
335
- id: '123',
336
- name: 'Updated Name',
337
- });
338
- });
339
-
340
- it('should handle DELETE method', async () => {
341
- const paramsSchema = z.object({
342
- id: z.string(),
343
- });
344
-
345
- const endpoint = new Endpoint({
346
- route: '/users/:id',
347
- method: 'DELETE',
348
- fn: async ({ params }) => ({ deleted: true, id: params.id }),
349
- input: {
350
- params: paramsSchema,
351
- },
352
- output: z.object({ deleted: z.boolean(), id: z.string() }),
353
- services: [],
354
- logger: mockLogger,
355
- timeout: undefined,
356
- memorySize: undefined,
357
- status: undefined,
358
- getSession: undefined,
359
- authorize: undefined,
360
- description: undefined,
361
- });
362
-
363
- const adaptor = new HonoEndpoint(endpoint);
364
- const app = new Hono();
365
-
366
- adaptor.addRoute(serviceDiscovery, app);
367
-
368
- const response = await app.request('/users/123', {
369
- method: 'DELETE',
370
- });
371
-
372
- expect(response.status).toBe(200);
373
- expect(await response.json()).toEqual({
374
- deleted: true,
375
- id: '123',
376
- });
377
- });
378
-
379
- it('should handle PATCH method', async () => {
380
- const bodySchema = z.object({
381
- name: z.string().optional(),
382
- email: z.string().email().optional(),
383
- });
384
- const paramsSchema = z.object({
385
- id: z.string(),
386
- });
387
-
388
- const endpoint = new Endpoint({
389
- route: '/users/:id',
390
- method: 'PATCH',
391
- fn: async ({ params, body }) => ({
392
- id: params.id,
393
- updated: true,
394
- ...body,
395
- }),
396
- input: {
397
- body: bodySchema,
398
- params: paramsSchema,
399
- },
400
- output: z.object({
401
- id: z.string(),
402
- updated: z.boolean(),
403
- name: z.string().optional(),
404
- email: z.string().optional(),
405
- }),
406
- services: [],
407
- logger: mockLogger,
408
- timeout: undefined,
409
- memorySize: undefined,
410
- status: undefined,
411
- getSession: undefined,
412
- authorize: undefined,
413
- description: undefined,
414
- });
415
-
416
- const adaptor = new HonoEndpoint(endpoint);
417
- const app = new Hono();
418
-
419
- adaptor.addRoute(serviceDiscovery, app);
420
-
421
- const response = await app.request('/users/123', {
422
- method: 'PATCH',
423
- body: JSON.stringify({ email: 'new@example.com' }),
424
- headers: { 'Content-Type': 'application/json' },
425
- });
426
-
427
- expect(response.status).toBe(200);
428
- expect(await response.json()).toEqual({
429
- id: '123',
430
- updated: true,
431
- email: 'new@example.com',
432
- });
433
- });
434
-
435
- it('should pass headers to endpoint handler', async () => {
436
- const endpoint = new Endpoint({
437
- route: '/auth/check',
438
- method: 'GET',
439
- fn: async ({ header }) => ({
440
- authorized: header('authorization') === 'Bearer valid-token',
441
- }),
442
- input: undefined,
443
- output: z.object({ authorized: z.boolean() }),
444
- services: [],
445
- logger: mockLogger,
446
- timeout: undefined,
447
- memorySize: undefined,
448
- status: undefined,
449
- getSession: undefined,
450
- authorize: undefined,
451
- description: undefined,
452
- });
453
-
454
- const adaptor = new HonoEndpoint(endpoint);
455
- const app = new Hono();
456
-
457
- adaptor.addRoute(serviceDiscovery, app);
458
-
459
- const response = await app.request('/auth/check', {
460
- headers: { Authorization: 'Bearer valid-token' },
461
- });
462
-
463
- expect(response.status).toBe(200);
464
- expect(await response.json()).toEqual({ authorized: true });
465
- });
466
-
467
- it('should provide services to endpoint handler', async () => {
468
- const service = {
469
- getMessage: () => 'Hello from service',
470
- };
471
- const TestService = {
472
- serviceName: 'test' as const,
473
-
474
- async register() {
475
- return service;
476
- },
477
- };
478
-
479
- await serviceDiscovery.register([TestService]);
480
-
481
- const endpoint = new Endpoint({
482
- route: '/service-test',
483
- method: 'GET',
484
- fn: async ({
485
- services,
486
- }: EndpointContext<{}, [typeof TestService], Logger>) => {
487
- return {
488
- message: await services.test.getMessage(),
489
- };
490
- },
491
- input: undefined,
492
- output: z.object({ message: z.string() }),
493
- services: [TestService],
494
- logger: mockLogger,
495
- timeout: undefined,
496
- memorySize: undefined,
497
- status: undefined,
498
- getSession: undefined,
499
- authorize: undefined,
500
- description: undefined,
501
- publisherService: undefined,
502
- });
503
-
504
- const adaptor = new HonoEndpoint(endpoint);
505
- const app = new Hono();
506
-
507
- adaptor.addRoute(serviceDiscovery, app);
508
-
509
- const response = await app.request('/service-test');
510
- expect(response.status).toBe(200);
511
- expect(await response.json()).toEqual({
512
- message: 'Hello from service',
513
- });
514
- });
515
-
516
- it('should provide logger to endpoint handler', async () => {
517
- let loggedMessage: string | undefined;
518
-
519
- const customLogger: Logger = {
520
- ...mockLogger,
521
- info: vi.fn((obj: any, msg?: string) => {
522
- loggedMessage = msg || obj.message;
523
- }),
524
- };
525
-
526
- const endpoint = new Endpoint({
527
- route: '/log-test',
528
- method: 'GET',
529
- fn: async ({ logger }) => {
530
- logger.info({ action: 'test' }, 'Test log message');
531
- return { logged: true };
532
- },
533
- input: undefined,
534
- output: z.object({ logged: z.boolean() }),
535
- services: [],
536
- logger: customLogger as Logger,
537
- timeout: undefined,
538
- memorySize: undefined,
539
- status: undefined,
540
- getSession: undefined,
541
- authorize: undefined,
542
- description: undefined,
543
- publisherService: undefined,
544
- });
545
-
546
- const adaptor = new HonoEndpoint(endpoint);
547
- const app = new Hono();
548
-
549
- adaptor.addRoute(serviceDiscovery, app);
550
-
551
- const response = await app.request('/log-test');
552
- expect(response.status).toBe(200);
553
- expect(await response.json()).toEqual({ logged: true });
554
- });
555
-
556
- it('should handle endpoints with all input types combined', async () => {
557
- const bodySchema = z.object({
558
- content: z.string(),
559
- });
560
- const querySchema = z.object({
561
- format: z.enum(['json', 'xml']),
562
- });
563
- const paramsSchema = z.object({
564
- userId: z.string(),
565
- postId: z.string(),
566
- });
567
-
568
- const endpoint = new Endpoint({
569
- route: '/users/:userId/posts/:postId',
570
- method: 'PUT',
571
- fn: async ({ params, query, body, ...rest }) => {
572
- return {
573
- userId: params.userId,
574
- postId: params.postId,
575
- format: query.format,
576
- content: body.content,
577
- updated: true,
578
- };
579
- },
580
- input: {
581
- body: bodySchema,
582
- query: querySchema,
583
- params: paramsSchema,
584
- },
585
- output: z.object({
586
- userId: z.string(),
587
- postId: z.string(),
588
- format: z.enum(['json', 'xml']),
589
- content: z.string(),
590
- updated: z.boolean(),
591
- }),
592
- services: [],
593
- logger: mockLogger,
594
- timeout: undefined,
595
- memorySize: undefined,
596
- status: undefined,
597
- getSession: undefined,
598
- authorize: undefined,
599
- publisherService: undefined,
600
- description: undefined,
601
- });
602
-
603
- const adaptor = new HonoEndpoint(endpoint);
604
- const app = new Hono();
605
-
606
- adaptor.addRoute(serviceDiscovery, app);
607
-
608
- const response = await app.request(
609
- '/users/user123/posts/post456?format=json',
610
- {
611
- method: 'PUT',
612
- body: JSON.stringify({ content: 'Updated content' }),
613
- headers: { 'Content-Type': 'application/json' },
614
- },
615
- );
616
-
617
- expect(response.status).toBe(200);
618
- expect(await response.json()).toEqual({
619
- userId: 'user123',
620
- postId: 'post456',
621
- format: 'json',
622
- content: 'Updated content',
623
- updated: true,
624
- });
625
- });
626
- });
627
-
628
- describe('query parameter handling', () => {
629
- it('should handle array query parameters', async () => {
630
- const querySchema = z.object({
631
- tags: z.array(z.string()),
632
- limit: z.coerce.number().default(10),
633
- });
634
- const outputSchema = z.object({
635
- tags: z.array(z.string()),
636
- limit: z.number(),
637
- });
638
-
639
- const endpoint = new Endpoint({
640
- route: '/search',
641
- method: 'GET',
642
- fn: async ({ query }) => ({
643
- tags: query.tags,
644
- limit: query.limit,
645
- }),
646
- input: {
647
- query: querySchema,
648
- },
649
- output: outputSchema,
650
- services: [],
651
- logger: mockLogger,
652
- timeout: undefined,
653
- memorySize: undefined,
654
- authorize: undefined,
655
- status: 200,
656
- getSession: undefined,
657
- description: undefined,
658
- });
659
-
660
- const adaptor = new HonoEndpoint(endpoint);
661
- const app = new Hono();
662
-
663
- adaptor.addRoute(serviceDiscovery, app);
664
-
665
- const response = await app.request(
666
- '/search?tags=nodejs&tags=typescript&tags=javascript&limit=20',
667
- );
668
-
669
- expect(response.status).toBe(200);
670
- expect(await response.json()).toEqual({
671
- tags: ['nodejs', 'typescript', 'javascript'],
672
- limit: 20,
673
- });
674
- });
675
-
676
- it('should handle object query parameters with dot notation', async () => {
677
- const querySchema = z.object({
678
- filter: z.object({
679
- category: z.string(),
680
- active: z.coerce.boolean(),
681
- minPrice: z.coerce.number(),
682
- }),
683
- sort: z.string().default('name'),
684
- });
685
- const outputSchema = z.object({
686
- filter: z.object({
687
- category: z.string(),
688
- active: z.boolean(),
689
- minPrice: z.number(),
690
- }),
691
- sort: z.string(),
692
- });
693
-
694
- const endpoint = new Endpoint({
695
- route: '/products',
696
- method: 'GET',
697
- fn: async ({ query }) => ({
698
- filter: query.filter,
699
- sort: query.sort,
700
- }),
701
- input: {
702
- query: querySchema,
703
- },
704
- output: outputSchema,
705
- services: [],
706
- logger: mockLogger,
707
- timeout: undefined,
708
- memorySize: undefined,
709
- authorize: undefined,
710
- status: 200,
711
- getSession: undefined,
712
- description: undefined,
713
- });
714
-
715
- const adaptor = new HonoEndpoint(endpoint);
716
- const app = new Hono();
717
-
718
- adaptor.addRoute(serviceDiscovery, app);
719
-
720
- const response = await app.request(
721
- '/products?filter.category=electronics&filter.active=true&filter.minPrice=100&sort=price',
722
- );
723
-
724
- expect(response.status).toBe(200);
725
- expect(await response.json()).toEqual({
726
- filter: {
727
- category: 'electronics',
728
- active: true,
729
- minPrice: 100,
730
- },
731
- sort: 'price',
732
- });
733
- });
734
- });
735
-
736
- describe('validate', () => {
737
- it('should return undefined when no schema is provided', async () => {
738
- const mockContext: any = {
739
- json: vi.fn(),
740
- };
741
-
742
- const result = await HonoEndpoint.validate(
743
- mockContext,
744
- { any: 'data' },
745
- undefined,
746
- );
747
-
748
- expect(result).toBeUndefined();
749
- expect(mockContext.json).not.toHaveBeenCalled();
750
- });
751
-
752
- it('should validate data against schema and return parsed value', async () => {
753
- const mockContext: any = {
754
- json: vi.fn(),
755
- };
756
-
757
- const schema = z.object({
758
- name: z.string(),
759
- age: z.number(),
760
- });
761
-
762
- const result = await HonoEndpoint.validate(
763
- mockContext,
764
- { name: 'John', age: 30 },
765
- schema,
766
- );
767
-
768
- expect(result).toEqual({ name: 'John', age: 30 });
769
- expect(mockContext.json).not.toHaveBeenCalled();
770
- });
771
- });
772
-
773
- describe('authorization', () => {
774
- it('should allow requests when authorize returns true', async () => {
775
- const endpoint = new Endpoint({
776
- route: '/protected',
777
- method: 'GET',
778
- fn: async () => ({ success: true }),
779
- input: undefined,
780
- output: z.object({ success: z.boolean() }),
781
- services: [],
782
- logger: mockLogger,
783
- timeout: undefined,
784
- memorySize: undefined,
785
- status: undefined,
786
- getSession: undefined,
787
- authorize: undefined,
788
- description: undefined,
789
- });
790
-
791
- // Set authorize function that returns true
792
- endpoint.authorize = async () => true;
793
-
794
- const adaptor = new HonoEndpoint(endpoint);
795
- const app = new Hono();
796
-
797
- adaptor.addRoute(serviceDiscovery, app);
798
-
799
- const response = await app.request('/protected');
800
- expect(response.status).toBe(200);
801
- expect(await response.json()).toEqual({ success: true });
802
- });
803
-
804
- it('should return 401 when authorize returns false', async () => {
805
- const endpoint = new Endpoint({
806
- route: '/protected',
807
- method: 'GET',
808
- fn: async () => ({ success: true }),
809
- input: undefined,
810
- output: z.object({ success: z.boolean() }),
811
- services: [],
812
- logger: mockLogger,
813
- timeout: undefined,
814
- memorySize: undefined,
815
- status: undefined,
816
- getSession: undefined,
817
- authorize: undefined,
818
- description: undefined,
819
- });
820
-
821
- // Set authorize function that returns false
822
- endpoint.authorize = async () => false;
823
-
824
- const adaptor = new HonoEndpoint(endpoint);
825
- const app = new Hono();
826
-
827
- adaptor.addRoute(serviceDiscovery, app);
828
-
829
- const response = await app.request('/protected');
830
- expect(response.status).toBe(401);
831
- expect(await response.json()).toEqual({ error: 'Unauthorized' });
832
- expect(mockLogger.warn).toHaveBeenCalledWith(
833
- 'Unauthorized access attempt',
834
- );
835
- });
836
-
837
- it('should handle async authorize functions with headers', async () => {
838
- const endpoint = new Endpoint({
839
- route: '/protected',
840
- method: 'GET',
841
- fn: async () => ({ success: true }),
842
- input: undefined,
843
- output: z.object({ success: z.boolean() }),
844
- services: [],
845
- logger: mockLogger,
846
- timeout: undefined,
847
- memorySize: undefined,
848
- status: undefined,
849
- getSession: undefined,
850
- authorize: undefined,
851
- description: undefined,
852
- });
853
-
854
- // Set async authorize function that checks bearer token
855
- endpoint.authorize = async ({ header }) => {
856
- await new Promise((resolve) => setTimeout(resolve, 10));
857
- return header('authorization') === 'Bearer valid-token';
858
- };
859
-
860
- const adaptor = new HonoEndpoint(endpoint);
861
- const app = new Hono();
862
-
863
- adaptor.addRoute(serviceDiscovery, app);
864
-
865
- // Test with valid token
866
- const validResponse = await app.request('/protected', {
867
- headers: { Authorization: 'Bearer valid-token' },
868
- });
869
- expect(validResponse.status).toBe(200);
870
- expect(await validResponse.json()).toEqual({ success: true });
871
-
872
- // Test with invalid token
873
- const invalidResponse = await app.request('/protected', {
874
- headers: { Authorization: 'Bearer invalid-token' },
875
- });
876
- expect(invalidResponse.status).toBe(401);
877
- expect(await invalidResponse.json()).toEqual({ error: 'Unauthorized' });
878
- });
879
-
880
- it('should authorize with services available', async () => {
881
- const service = {
882
- isValidToken: (token: string) => token === 'valid-token',
883
- };
884
- const AuthService = {
885
- serviceName: 'authService' as const,
886
-
887
- async register() {
888
- return service;
889
- },
890
- };
891
-
892
- const endpoint = new Endpoint({
893
- route: '/protected',
894
- method: 'GET',
895
- fn: async () => ({ success: true }),
896
- input: undefined,
897
- output: z.object({ success: z.boolean() }),
898
- services: [AuthService],
899
- logger: mockLogger,
900
- authorize: async ({ header, services }) => {
901
- const token = header('authorization')?.replace('Bearer ', '') || '';
902
- return services.authService.isValidToken(token);
903
- },
904
- timeout: undefined,
905
- memorySize: undefined,
906
- status: undefined,
907
- getSession: undefined,
908
- description: undefined,
909
- });
910
-
911
- const adaptor = new HonoEndpoint(endpoint);
912
- const app = new Hono();
913
-
914
- adaptor.addRoute(serviceDiscovery, app);
915
-
916
- // Test with valid token
917
- const validResponse = await app.request('/protected', {
918
- headers: { Authorization: 'Bearer valid-token' },
919
- });
920
-
921
- expect(validResponse.status).toBe(200);
922
-
923
- // Test with invalid token
924
- const invalidResponse = await app.request('/protected', {
925
- headers: { Authorization: 'Bearer invalid-token' },
926
- });
927
- expect(invalidResponse.status).toBe(401);
928
- });
929
-
930
- it('should authorize with session', async () => {
931
- const endpoint = new Endpoint({
932
- route: '/protected',
933
- method: 'GET',
934
- fn: async () => ({ success: true }),
935
- input: undefined,
936
- output: z.object({ success: z.boolean() }),
937
- services: [],
938
- logger: mockLogger,
939
- timeout: undefined,
940
- memorySize: undefined,
941
- status: undefined,
942
- getSession: async ({ header }) => {
943
- const token = header('authorization');
944
- return token === 'Bearer user-token'
945
- ? { userId: 'user-123', role: 'user' }
946
- : null;
947
- },
948
- authorize: undefined,
949
- description: undefined,
950
- });
951
-
952
- endpoint.authorize = async ({ session }) => {
953
- return session?.role === 'user' || session?.role === 'admin';
954
- };
955
-
956
- const adaptor = new HonoEndpoint(endpoint as any);
957
- const app = new Hono();
958
-
959
- adaptor.addRoute(serviceDiscovery, app);
960
-
961
- // Test with valid user token
962
- const validResponse = await app.request('/protected', {
963
- headers: { Authorization: 'Bearer user-token' },
964
- });
965
- expect(validResponse.status).toBe(200);
966
-
967
- // Test with no token (no session)
968
- const noTokenResponse = await app.request('/protected');
969
- expect(noTokenResponse.status).toBe(401);
970
- });
971
-
972
- it('should handle authorization errors', async () => {
973
- const endpoint = new Endpoint({
974
- route: '/protected',
975
- method: 'GET',
976
- fn: async () => ({ success: true }),
977
- input: undefined,
978
- output: z.object({ success: z.boolean() }),
979
- services: [],
980
- logger: mockLogger,
981
- timeout: undefined,
982
- memorySize: undefined,
983
- status: undefined,
984
- getSession: undefined,
985
- authorize: async () => {
986
- throw new Error('Authorization service unavailable');
987
- },
988
- description: undefined,
989
- });
990
-
991
- const adaptor = new HonoEndpoint(endpoint);
992
- const app = new Hono();
993
-
994
- adaptor.addRoute(serviceDiscovery, app);
995
-
996
- const response = await app.request('/protected');
997
- expect(response.status).toBe(500);
998
- });
999
- });
1000
-
1001
- describe('output validation', () => {
1002
- it('should validate output against schema and return validated response', async () => {
1003
- const outputSchema = z.object({
1004
- id: z.string(),
1005
- name: z.string(),
1006
- age: z.number(),
1007
- });
1008
-
1009
- const endpoint = new Endpoint({
1010
- route: '/users/validated',
1011
- method: 'GET',
1012
- fn: async () => ({ id: '123', name: 'John', age: 30 }),
1013
- input: undefined,
1014
- output: outputSchema,
1015
- services: [],
1016
- logger: mockLogger,
1017
- timeout: undefined,
1018
- memorySize: undefined,
1019
- status: 200,
1020
- getSession: undefined,
1021
- authorize: undefined,
1022
- description: undefined,
1023
- });
1024
-
1025
- const adaptor = new HonoEndpoint(endpoint);
1026
- const app = new Hono();
1027
-
1028
- adaptor.addRoute(serviceDiscovery, app);
1029
-
1030
- const response = await app.request('/users/validated');
1031
- expect(response.status).toBe(200);
1032
- expect(await response.json()).toEqual({
1033
- id: '123',
1034
- name: 'John',
1035
- age: 30,
1036
- });
1037
- });
1038
-
1039
- it('should return 422 when output validation fails', async () => {
1040
- const outputSchema = z.object({
1041
- id: z.string(),
1042
- name: z.string(),
1043
- age: z.number(),
1044
- });
1045
-
1046
- const endpoint = new Endpoint({
1047
- route: '/users/invalid-output',
1048
- method: 'GET',
1049
- // @ts-ignore
1050
- fn: async () => ({ id: 123, name: 'John', age: 'not-a-number' }), // Invalid output
1051
- input: undefined,
1052
- output: outputSchema,
1053
- services: [],
1054
- logger: mockLogger,
1055
- timeout: undefined,
1056
- memorySize: undefined,
1057
- status: 200,
1058
- getSession: undefined,
1059
- authorize: undefined,
1060
- description: undefined,
1061
- });
1062
-
1063
- const adaptor = new HonoEndpoint(endpoint);
1064
- const app = new Hono();
1065
-
1066
- adaptor.addRoute(serviceDiscovery, app);
1067
-
1068
- const response = await app.request('/users/invalid-output');
1069
- expect(response.status).toBe(422);
1070
-
1071
- const error = await response.json();
1072
- expect(error).toHaveProperty('statusCode', 422);
1073
- expect(error).toHaveProperty('message', 'Validation failed');
1074
- });
1075
-
1076
- it('should return empty response when no output schema is defined', async () => {
1077
- const endpoint = new Endpoint({
1078
- route: '/users/no-schema',
1079
- method: 'GET',
1080
- fn: async () => ({ anything: 'goes', here: true, number: 42 }),
1081
- input: undefined,
1082
- output: undefined, // No output schema
1083
- services: [],
1084
- logger: mockLogger,
1085
- timeout: undefined,
1086
- memorySize: undefined,
1087
- status: 200,
1088
- getSession: undefined,
1089
- authorize: undefined,
1090
- description: undefined,
1091
- });
1092
-
1093
- const adaptor = new HonoEndpoint(endpoint);
1094
- const app = new Hono();
1095
-
1096
- adaptor.addRoute(serviceDiscovery, app);
1097
-
1098
- const response = await app.request('/users/no-schema');
1099
- expect(response.status).toBe(200);
1100
- // When no output schema is defined, response body is empty
1101
- expect(await response.text()).toBe('');
1102
- });
1103
- });
11
+ const mockLogger: Logger = {
12
+ debug: vi.fn(),
13
+ info: vi.fn(),
14
+ warn: vi.fn(),
15
+ error: vi.fn(),
16
+ fatal: vi.fn(),
17
+ trace: vi.fn(),
18
+ child: vi.fn(() => mockLogger),
19
+ };
20
+ const envParser = new EnvironmentParser({});
21
+ const serviceDiscovery = ServiceDiscovery.getInstance(envParser);
22
+
23
+ describe('addRoute', () => {
24
+ it('should register a GET endpoint', async () => {
25
+ const endpoint = new Endpoint({
26
+ route: '/users',
27
+ method: 'GET',
28
+ fn: async () => ({ users: [] }),
29
+ input: undefined,
30
+ output: z.object({ users: z.array(z.any()) }),
31
+ services: [],
32
+ logger: mockLogger,
33
+ timeout: undefined,
34
+ memorySize: undefined,
35
+ status: undefined,
36
+ getSession: undefined,
37
+ authorize: undefined,
38
+ description: undefined,
39
+ });
40
+
41
+ const adaptor = new HonoEndpoint(endpoint);
42
+ const app = new Hono();
43
+
44
+ adaptor.addRoute(serviceDiscovery, app);
45
+
46
+ const response = await app.request('/users');
47
+ expect(response.status).toBe(200);
48
+ expect(await response.json()).toEqual({ users: [] });
49
+ });
50
+
51
+ it('should register a POST endpoint with body validation', async () => {
52
+ const bodySchema = z.object({
53
+ name: z.string(),
54
+ email: z.string().email(),
55
+ });
56
+
57
+ const endpoint = new Endpoint({
58
+ route: '/users',
59
+ method: 'POST',
60
+ fn: async ({ body }) => ({ id: '123', ...body }),
61
+ input: {
62
+ body: bodySchema,
63
+ },
64
+ output: z.object({
65
+ id: z.string(),
66
+ name: z.string(),
67
+ email: z.string(),
68
+ }),
69
+ services: [],
70
+ logger: mockLogger,
71
+ timeout: undefined,
72
+ memorySize: undefined,
73
+ status: undefined,
74
+ getSession: undefined,
75
+ authorize: undefined,
76
+ description: undefined,
77
+ });
78
+
79
+ const adaptor = new HonoEndpoint(endpoint);
80
+ const app = new Hono();
81
+
82
+ adaptor.addRoute(serviceDiscovery, app);
83
+
84
+ const response = await app.request('/users', {
85
+ method: 'POST',
86
+ body: JSON.stringify({ name: 'John', email: 'john@example.com' }),
87
+ headers: { 'Content-Type': 'application/json' },
88
+ });
89
+
90
+ expect(response.status).toBe(200);
91
+ expect(await response.json()).toEqual({
92
+ id: '123',
93
+ name: 'John',
94
+ email: 'john@example.com',
95
+ });
96
+ });
97
+
98
+ it('should validate query parameters', async () => {
99
+ const querySchema = z.object({
100
+ page: z.string().transform(Number),
101
+ limit: z.string().transform(Number),
102
+ });
103
+
104
+ const endpoint = new Endpoint({
105
+ route: '/users',
106
+ method: 'GET',
107
+ fn: async ({ query }) => ({
108
+ page: query.page,
109
+ limit: query.limit,
110
+ users: [],
111
+ }),
112
+ input: {
113
+ query: querySchema,
114
+ },
115
+ output: z.object({
116
+ page: z.number(),
117
+ limit: z.number(),
118
+ users: z.array(z.any()),
119
+ }),
120
+ services: [],
121
+ logger: mockLogger,
122
+ timeout: undefined,
123
+ memorySize: undefined,
124
+ status: undefined,
125
+ getSession: undefined,
126
+ authorize: undefined,
127
+ description: undefined,
128
+ });
129
+
130
+ const adaptor = new HonoEndpoint(endpoint);
131
+ const app = new Hono();
132
+
133
+ adaptor.addRoute(serviceDiscovery, app);
134
+
135
+ const response = await app.request('/users?page=1&limit=10');
136
+ expect(response.status).toBe(200);
137
+ expect(await response.json()).toEqual({
138
+ page: 1,
139
+ limit: 10,
140
+ users: [],
141
+ });
142
+ });
143
+
144
+ it('should validate path parameters', async () => {
145
+ const paramsSchema = z.object({
146
+ id: z.string().uuid(),
147
+ });
148
+
149
+ const endpoint = new Endpoint({
150
+ route: '/users/:id',
151
+ method: 'GET',
152
+ fn: async ({ params }) => ({
153
+ id: params.id,
154
+ name: 'John Doe',
155
+ }),
156
+ input: {
157
+ params: paramsSchema,
158
+ },
159
+ output: z.object({ id: z.string(), name: z.string() }),
160
+ services: [],
161
+ logger: mockLogger,
162
+ timeout: undefined,
163
+ memorySize: undefined,
164
+ status: undefined,
165
+ getSession: undefined,
166
+ authorize: undefined,
167
+ description: undefined,
168
+ });
169
+
170
+ const adaptor = new HonoEndpoint(endpoint);
171
+ const app = new Hono();
172
+
173
+ adaptor.addRoute(serviceDiscovery, app);
174
+
175
+ const response = await app.request(
176
+ '/users/550e8400-e29b-41d4-a716-446655440000',
177
+ );
178
+ expect(response.status).toBe(200);
179
+ expect(await response.json()).toEqual({
180
+ id: '550e8400-e29b-41d4-a716-446655440000',
181
+ name: 'John Doe',
182
+ });
183
+ });
184
+
185
+ it('should return 422 for invalid body', async () => {
186
+ const bodySchema = z.object({
187
+ name: z.string().min(3),
188
+ age: z.number().min(18),
189
+ });
190
+
191
+ const endpoint = new Endpoint({
192
+ route: '/users',
193
+ method: 'POST',
194
+ fn: async ({ body }) => ({ id: '123', ...body }),
195
+ input: {
196
+ body: bodySchema,
197
+ },
198
+ output: undefined,
199
+ services: [],
200
+ logger: mockLogger,
201
+ timeout: undefined,
202
+ memorySize: undefined,
203
+ status: undefined,
204
+ getSession: undefined,
205
+ authorize: undefined,
206
+ description: undefined,
207
+ });
208
+
209
+ const adaptor = new HonoEndpoint(endpoint);
210
+ const app = new Hono();
211
+
212
+ adaptor.addRoute(serviceDiscovery, app);
213
+
214
+ const response = await app.request('/users', {
215
+ method: 'POST',
216
+ body: JSON.stringify({ name: 'Jo', age: 'not a number' }),
217
+ headers: { 'Content-Type': 'application/json' },
218
+ });
219
+
220
+ expect(response.status).toBe(422);
221
+ const error = await response.json();
222
+ expect(error).toMatchSnapshot();
223
+ });
224
+
225
+ it('should return 422 for invalid query parameters', async () => {
226
+ const querySchema = z.object({
227
+ page: z.string().regex(/^\d+$/).transform(Number),
228
+ });
229
+
230
+ const endpoint = new Endpoint({
231
+ route: '/users',
232
+ method: 'GET',
233
+ fn: async ({ query }) => ({ page: query.page }),
234
+ input: {
235
+ query: querySchema,
236
+ },
237
+ output: undefined,
238
+ services: [],
239
+ logger: mockLogger,
240
+ timeout: undefined,
241
+ memorySize: undefined,
242
+ status: undefined,
243
+ getSession: undefined,
244
+ authorize: undefined,
245
+ description: undefined,
246
+ });
247
+
248
+ const adaptor = new HonoEndpoint(endpoint);
249
+ const app = new Hono();
250
+
251
+ adaptor.addRoute(serviceDiscovery, app);
252
+
253
+ const response = await app.request('/users?page=abc');
254
+ expect(response.status).toBe(422);
255
+ const error = await response.json();
256
+ expect(error).toMatchSnapshot();
257
+ });
258
+
259
+ it('should return 422 for invalid path parameters', async () => {
260
+ const paramsSchema = z.object({
261
+ id: z.string().uuid(),
262
+ });
263
+
264
+ const endpoint = new Endpoint({
265
+ route: '/users/:id',
266
+ method: 'GET',
267
+ fn: async ({ params }) => ({ id: params.id }),
268
+ input: {
269
+ params: paramsSchema,
270
+ },
271
+ output: undefined,
272
+ services: [],
273
+ logger: mockLogger,
274
+ timeout: undefined,
275
+ memorySize: undefined,
276
+ status: undefined,
277
+ getSession: undefined,
278
+ authorize: undefined,
279
+ description: undefined,
280
+ });
281
+
282
+ const adaptor = new HonoEndpoint(endpoint);
283
+ const app = new Hono();
284
+
285
+ adaptor.addRoute(serviceDiscovery, app);
286
+
287
+ const response = await app.request('/users/not-a-uuid');
288
+
289
+ expect(response.status).toBe(422);
290
+ const error = await response.json();
291
+
292
+ expect(error).toMatchSnapshot();
293
+ });
294
+
295
+ it('should handle PUT method', async () => {
296
+ const bodySchema = z.object({
297
+ name: z.string(),
298
+ });
299
+ const paramsSchema = z.object({
300
+ id: z.string(),
301
+ });
302
+
303
+ const endpoint = new Endpoint({
304
+ route: '/users/:id',
305
+ method: 'PUT',
306
+ fn: async ({ params, body }) => ({ id: params.id, ...body }),
307
+ input: {
308
+ body: bodySchema,
309
+ params: paramsSchema,
310
+ },
311
+ output: z.object({ id: z.string(), name: z.string() }),
312
+ services: [],
313
+ logger: mockLogger,
314
+ timeout: undefined,
315
+ memorySize: undefined,
316
+ status: undefined,
317
+ getSession: undefined,
318
+ authorize: undefined,
319
+ description: undefined,
320
+ });
321
+
322
+ const adaptor = new HonoEndpoint(endpoint);
323
+ const app = new Hono();
324
+
325
+ adaptor.addRoute(serviceDiscovery, app);
326
+
327
+ const response = await app.request('/users/123', {
328
+ method: 'PUT',
329
+ body: JSON.stringify({ name: 'Updated Name' }),
330
+ headers: { 'Content-Type': 'application/json' },
331
+ });
332
+
333
+ expect(response.status).toBe(200);
334
+ expect(await response.json()).toEqual({
335
+ id: '123',
336
+ name: 'Updated Name',
337
+ });
338
+ });
339
+
340
+ it('should handle DELETE method', async () => {
341
+ const paramsSchema = z.object({
342
+ id: z.string(),
343
+ });
344
+
345
+ const endpoint = new Endpoint({
346
+ route: '/users/:id',
347
+ method: 'DELETE',
348
+ fn: async ({ params }) => ({ deleted: true, id: params.id }),
349
+ input: {
350
+ params: paramsSchema,
351
+ },
352
+ output: z.object({ deleted: z.boolean(), id: z.string() }),
353
+ services: [],
354
+ logger: mockLogger,
355
+ timeout: undefined,
356
+ memorySize: undefined,
357
+ status: undefined,
358
+ getSession: undefined,
359
+ authorize: undefined,
360
+ description: undefined,
361
+ });
362
+
363
+ const adaptor = new HonoEndpoint(endpoint);
364
+ const app = new Hono();
365
+
366
+ adaptor.addRoute(serviceDiscovery, app);
367
+
368
+ const response = await app.request('/users/123', {
369
+ method: 'DELETE',
370
+ });
371
+
372
+ expect(response.status).toBe(200);
373
+ expect(await response.json()).toEqual({
374
+ deleted: true,
375
+ id: '123',
376
+ });
377
+ });
378
+
379
+ it('should handle PATCH method', async () => {
380
+ const bodySchema = z.object({
381
+ name: z.string().optional(),
382
+ email: z.string().email().optional(),
383
+ });
384
+ const paramsSchema = z.object({
385
+ id: z.string(),
386
+ });
387
+
388
+ const endpoint = new Endpoint({
389
+ route: '/users/:id',
390
+ method: 'PATCH',
391
+ fn: async ({ params, body }) => ({
392
+ id: params.id,
393
+ updated: true,
394
+ ...body,
395
+ }),
396
+ input: {
397
+ body: bodySchema,
398
+ params: paramsSchema,
399
+ },
400
+ output: z.object({
401
+ id: z.string(),
402
+ updated: z.boolean(),
403
+ name: z.string().optional(),
404
+ email: z.string().optional(),
405
+ }),
406
+ services: [],
407
+ logger: mockLogger,
408
+ timeout: undefined,
409
+ memorySize: undefined,
410
+ status: undefined,
411
+ getSession: undefined,
412
+ authorize: undefined,
413
+ description: undefined,
414
+ });
415
+
416
+ const adaptor = new HonoEndpoint(endpoint);
417
+ const app = new Hono();
418
+
419
+ adaptor.addRoute(serviceDiscovery, app);
420
+
421
+ const response = await app.request('/users/123', {
422
+ method: 'PATCH',
423
+ body: JSON.stringify({ email: 'new@example.com' }),
424
+ headers: { 'Content-Type': 'application/json' },
425
+ });
426
+
427
+ expect(response.status).toBe(200);
428
+ expect(await response.json()).toEqual({
429
+ id: '123',
430
+ updated: true,
431
+ email: 'new@example.com',
432
+ });
433
+ });
434
+
435
+ it('should pass headers to endpoint handler', async () => {
436
+ const endpoint = new Endpoint({
437
+ route: '/auth/check',
438
+ method: 'GET',
439
+ fn: async ({ header }) => ({
440
+ authorized: header('authorization') === 'Bearer valid-token',
441
+ }),
442
+ input: undefined,
443
+ output: z.object({ authorized: z.boolean() }),
444
+ services: [],
445
+ logger: mockLogger,
446
+ timeout: undefined,
447
+ memorySize: undefined,
448
+ status: undefined,
449
+ getSession: undefined,
450
+ authorize: undefined,
451
+ description: undefined,
452
+ });
453
+
454
+ const adaptor = new HonoEndpoint(endpoint);
455
+ const app = new Hono();
456
+
457
+ adaptor.addRoute(serviceDiscovery, app);
458
+
459
+ const response = await app.request('/auth/check', {
460
+ headers: { Authorization: 'Bearer valid-token' },
461
+ });
462
+
463
+ expect(response.status).toBe(200);
464
+ expect(await response.json()).toEqual({ authorized: true });
465
+ });
466
+
467
+ it('should provide services to endpoint handler', async () => {
468
+ const service = {
469
+ getMessage: () => 'Hello from service',
470
+ };
471
+ const TestService = {
472
+ serviceName: 'test' as const,
473
+
474
+ async register() {
475
+ return service;
476
+ },
477
+ };
478
+
479
+ await serviceDiscovery.register([TestService]);
480
+
481
+ const endpoint = new Endpoint({
482
+ route: '/service-test',
483
+ method: 'GET',
484
+ fn: async ({
485
+ services,
486
+ }: EndpointContext<{}, [typeof TestService], Logger>) => {
487
+ return {
488
+ message: await services.test.getMessage(),
489
+ };
490
+ },
491
+ input: undefined,
492
+ output: z.object({ message: z.string() }),
493
+ services: [TestService],
494
+ logger: mockLogger,
495
+ timeout: undefined,
496
+ memorySize: undefined,
497
+ status: undefined,
498
+ getSession: undefined,
499
+ authorize: undefined,
500
+ description: undefined,
501
+ publisherService: undefined,
502
+ });
503
+
504
+ const adaptor = new HonoEndpoint(endpoint);
505
+ const app = new Hono();
506
+
507
+ adaptor.addRoute(serviceDiscovery, app);
508
+
509
+ const response = await app.request('/service-test');
510
+ expect(response.status).toBe(200);
511
+ expect(await response.json()).toEqual({
512
+ message: 'Hello from service',
513
+ });
514
+ });
515
+
516
+ it('should provide logger to endpoint handler', async () => {
517
+ let _loggedMessage: string | undefined;
518
+
519
+ const customLogger: Logger = {
520
+ ...mockLogger,
521
+ info: vi.fn((obj: any, msg?: string) => {
522
+ _loggedMessage = msg || obj.message;
523
+ }),
524
+ };
525
+
526
+ const endpoint = new Endpoint({
527
+ route: '/log-test',
528
+ method: 'GET',
529
+ fn: async ({ logger }) => {
530
+ logger.info({ action: 'test' }, 'Test log message');
531
+ return { logged: true };
532
+ },
533
+ input: undefined,
534
+ output: z.object({ logged: z.boolean() }),
535
+ services: [],
536
+ logger: customLogger as Logger,
537
+ timeout: undefined,
538
+ memorySize: undefined,
539
+ status: undefined,
540
+ getSession: undefined,
541
+ authorize: undefined,
542
+ description: undefined,
543
+ publisherService: undefined,
544
+ });
545
+
546
+ const adaptor = new HonoEndpoint(endpoint);
547
+ const app = new Hono();
548
+
549
+ adaptor.addRoute(serviceDiscovery, app);
550
+
551
+ const response = await app.request('/log-test');
552
+ expect(response.status).toBe(200);
553
+ expect(await response.json()).toEqual({ logged: true });
554
+ });
555
+
556
+ it('should handle endpoints with all input types combined', async () => {
557
+ const bodySchema = z.object({
558
+ content: z.string(),
559
+ });
560
+ const querySchema = z.object({
561
+ format: z.enum(['json', 'xml']),
562
+ });
563
+ const paramsSchema = z.object({
564
+ userId: z.string(),
565
+ postId: z.string(),
566
+ });
567
+
568
+ const endpoint = new Endpoint({
569
+ route: '/users/:userId/posts/:postId',
570
+ method: 'PUT',
571
+ fn: async ({ params, query, body, ...rest }) => {
572
+ return {
573
+ userId: params.userId,
574
+ postId: params.postId,
575
+ format: query.format,
576
+ content: body.content,
577
+ updated: true,
578
+ };
579
+ },
580
+ input: {
581
+ body: bodySchema,
582
+ query: querySchema,
583
+ params: paramsSchema,
584
+ },
585
+ output: z.object({
586
+ userId: z.string(),
587
+ postId: z.string(),
588
+ format: z.enum(['json', 'xml']),
589
+ content: z.string(),
590
+ updated: z.boolean(),
591
+ }),
592
+ services: [],
593
+ logger: mockLogger,
594
+ timeout: undefined,
595
+ memorySize: undefined,
596
+ status: undefined,
597
+ getSession: undefined,
598
+ authorize: undefined,
599
+ publisherService: undefined,
600
+ description: undefined,
601
+ });
602
+
603
+ const adaptor = new HonoEndpoint(endpoint);
604
+ const app = new Hono();
605
+
606
+ adaptor.addRoute(serviceDiscovery, app);
607
+
608
+ const response = await app.request(
609
+ '/users/user123/posts/post456?format=json',
610
+ {
611
+ method: 'PUT',
612
+ body: JSON.stringify({ content: 'Updated content' }),
613
+ headers: { 'Content-Type': 'application/json' },
614
+ },
615
+ );
616
+
617
+ expect(response.status).toBe(200);
618
+ expect(await response.json()).toEqual({
619
+ userId: 'user123',
620
+ postId: 'post456',
621
+ format: 'json',
622
+ content: 'Updated content',
623
+ updated: true,
624
+ });
625
+ });
626
+ });
627
+
628
+ describe('query parameter handling', () => {
629
+ it('should handle array query parameters', async () => {
630
+ const querySchema = z.object({
631
+ tags: z.array(z.string()),
632
+ limit: z.coerce.number().default(10),
633
+ });
634
+ const outputSchema = z.object({
635
+ tags: z.array(z.string()),
636
+ limit: z.number(),
637
+ });
638
+
639
+ const endpoint = new Endpoint({
640
+ route: '/search',
641
+ method: 'GET',
642
+ fn: async ({ query }) => ({
643
+ tags: query.tags,
644
+ limit: query.limit,
645
+ }),
646
+ input: {
647
+ query: querySchema,
648
+ },
649
+ output: outputSchema,
650
+ services: [],
651
+ logger: mockLogger,
652
+ timeout: undefined,
653
+ memorySize: undefined,
654
+ authorize: undefined,
655
+ status: 200,
656
+ getSession: undefined,
657
+ description: undefined,
658
+ });
659
+
660
+ const adaptor = new HonoEndpoint(endpoint);
661
+ const app = new Hono();
662
+
663
+ adaptor.addRoute(serviceDiscovery, app);
664
+
665
+ const response = await app.request(
666
+ '/search?tags=nodejs&tags=typescript&tags=javascript&limit=20',
667
+ );
668
+
669
+ expect(response.status).toBe(200);
670
+ expect(await response.json()).toEqual({
671
+ tags: ['nodejs', 'typescript', 'javascript'],
672
+ limit: 20,
673
+ });
674
+ });
675
+
676
+ it('should handle object query parameters with dot notation', async () => {
677
+ const querySchema = z.object({
678
+ filter: z.object({
679
+ category: z.string(),
680
+ active: z.coerce.boolean(),
681
+ minPrice: z.coerce.number(),
682
+ }),
683
+ sort: z.string().default('name'),
684
+ });
685
+ const outputSchema = z.object({
686
+ filter: z.object({
687
+ category: z.string(),
688
+ active: z.boolean(),
689
+ minPrice: z.number(),
690
+ }),
691
+ sort: z.string(),
692
+ });
693
+
694
+ const endpoint = new Endpoint({
695
+ route: '/products',
696
+ method: 'GET',
697
+ fn: async ({ query }) => ({
698
+ filter: query.filter,
699
+ sort: query.sort,
700
+ }),
701
+ input: {
702
+ query: querySchema,
703
+ },
704
+ output: outputSchema,
705
+ services: [],
706
+ logger: mockLogger,
707
+ timeout: undefined,
708
+ memorySize: undefined,
709
+ authorize: undefined,
710
+ status: 200,
711
+ getSession: undefined,
712
+ description: undefined,
713
+ });
714
+
715
+ const adaptor = new HonoEndpoint(endpoint);
716
+ const app = new Hono();
717
+
718
+ adaptor.addRoute(serviceDiscovery, app);
719
+
720
+ const response = await app.request(
721
+ '/products?filter.category=electronics&filter.active=true&filter.minPrice=100&sort=price',
722
+ );
723
+
724
+ expect(response.status).toBe(200);
725
+ expect(await response.json()).toEqual({
726
+ filter: {
727
+ category: 'electronics',
728
+ active: true,
729
+ minPrice: 100,
730
+ },
731
+ sort: 'price',
732
+ });
733
+ });
734
+ });
735
+
736
+ describe('validate', () => {
737
+ it('should return undefined when no schema is provided', async () => {
738
+ const mockContext: any = {
739
+ json: vi.fn(),
740
+ };
741
+
742
+ const result = await HonoEndpoint.validate(
743
+ mockContext,
744
+ { any: 'data' },
745
+ undefined,
746
+ );
747
+
748
+ expect(result).toBeUndefined();
749
+ expect(mockContext.json).not.toHaveBeenCalled();
750
+ });
751
+
752
+ it('should validate data against schema and return parsed value', async () => {
753
+ const mockContext: any = {
754
+ json: vi.fn(),
755
+ };
756
+
757
+ const schema = z.object({
758
+ name: z.string(),
759
+ age: z.number(),
760
+ });
761
+
762
+ const result = await HonoEndpoint.validate(
763
+ mockContext,
764
+ { name: 'John', age: 30 },
765
+ schema,
766
+ );
767
+
768
+ expect(result).toEqual({ name: 'John', age: 30 });
769
+ expect(mockContext.json).not.toHaveBeenCalled();
770
+ });
771
+ });
772
+
773
+ describe('authorization', () => {
774
+ it('should allow requests when authorize returns true', async () => {
775
+ const endpoint = new Endpoint({
776
+ route: '/protected',
777
+ method: 'GET',
778
+ fn: async () => ({ success: true }),
779
+ input: undefined,
780
+ output: z.object({ success: z.boolean() }),
781
+ services: [],
782
+ logger: mockLogger,
783
+ timeout: undefined,
784
+ memorySize: undefined,
785
+ status: undefined,
786
+ getSession: undefined,
787
+ authorize: undefined,
788
+ description: undefined,
789
+ });
790
+
791
+ // Set authorize function that returns true
792
+ endpoint.authorize = async () => true;
793
+
794
+ const adaptor = new HonoEndpoint(endpoint);
795
+ const app = new Hono();
796
+
797
+ adaptor.addRoute(serviceDiscovery, app);
798
+
799
+ const response = await app.request('/protected');
800
+ expect(response.status).toBe(200);
801
+ expect(await response.json()).toEqual({ success: true });
802
+ });
803
+
804
+ it('should return 401 when authorize returns false', async () => {
805
+ const endpoint = new Endpoint({
806
+ route: '/protected',
807
+ method: 'GET',
808
+ fn: async () => ({ success: true }),
809
+ input: undefined,
810
+ output: z.object({ success: z.boolean() }),
811
+ services: [],
812
+ logger: mockLogger,
813
+ timeout: undefined,
814
+ memorySize: undefined,
815
+ status: undefined,
816
+ getSession: undefined,
817
+ authorize: undefined,
818
+ description: undefined,
819
+ });
820
+
821
+ // Set authorize function that returns false
822
+ endpoint.authorize = async () => false;
823
+
824
+ const adaptor = new HonoEndpoint(endpoint);
825
+ const app = new Hono();
826
+
827
+ adaptor.addRoute(serviceDiscovery, app);
828
+
829
+ const response = await app.request('/protected');
830
+ expect(response.status).toBe(401);
831
+ expect(await response.json()).toEqual({ error: 'Unauthorized' });
832
+ expect(mockLogger.warn).toHaveBeenCalledWith(
833
+ 'Unauthorized access attempt',
834
+ );
835
+ });
836
+
837
+ it('should handle async authorize functions with headers', async () => {
838
+ const endpoint = new Endpoint({
839
+ route: '/protected',
840
+ method: 'GET',
841
+ fn: async () => ({ success: true }),
842
+ input: undefined,
843
+ output: z.object({ success: z.boolean() }),
844
+ services: [],
845
+ logger: mockLogger,
846
+ timeout: undefined,
847
+ memorySize: undefined,
848
+ status: undefined,
849
+ getSession: undefined,
850
+ authorize: undefined,
851
+ description: undefined,
852
+ });
853
+
854
+ // Set async authorize function that checks bearer token
855
+ endpoint.authorize = async ({ header }) => {
856
+ await new Promise((resolve) => setTimeout(resolve, 10));
857
+ return header('authorization') === 'Bearer valid-token';
858
+ };
859
+
860
+ const adaptor = new HonoEndpoint(endpoint);
861
+ const app = new Hono();
862
+
863
+ adaptor.addRoute(serviceDiscovery, app);
864
+
865
+ // Test with valid token
866
+ const validResponse = await app.request('/protected', {
867
+ headers: { Authorization: 'Bearer valid-token' },
868
+ });
869
+ expect(validResponse.status).toBe(200);
870
+ expect(await validResponse.json()).toEqual({ success: true });
871
+
872
+ // Test with invalid token
873
+ const invalidResponse = await app.request('/protected', {
874
+ headers: { Authorization: 'Bearer invalid-token' },
875
+ });
876
+ expect(invalidResponse.status).toBe(401);
877
+ expect(await invalidResponse.json()).toEqual({ error: 'Unauthorized' });
878
+ });
879
+
880
+ it('should authorize with services available', async () => {
881
+ const service = {
882
+ isValidToken: (token: string) => token === 'valid-token',
883
+ };
884
+ const AuthService = {
885
+ serviceName: 'authService' as const,
886
+
887
+ async register() {
888
+ return service;
889
+ },
890
+ };
891
+
892
+ const endpoint = new Endpoint({
893
+ route: '/protected',
894
+ method: 'GET',
895
+ fn: async () => ({ success: true }),
896
+ input: undefined,
897
+ output: z.object({ success: z.boolean() }),
898
+ services: [AuthService],
899
+ logger: mockLogger,
900
+ authorize: async ({ header, services }) => {
901
+ const token = header('authorization')?.replace('Bearer ', '') || '';
902
+ return services.authService.isValidToken(token);
903
+ },
904
+ timeout: undefined,
905
+ memorySize: undefined,
906
+ status: undefined,
907
+ getSession: undefined,
908
+ description: undefined,
909
+ });
910
+
911
+ const adaptor = new HonoEndpoint(endpoint);
912
+ const app = new Hono();
913
+
914
+ adaptor.addRoute(serviceDiscovery, app);
915
+
916
+ // Test with valid token
917
+ const validResponse = await app.request('/protected', {
918
+ headers: { Authorization: 'Bearer valid-token' },
919
+ });
920
+
921
+ expect(validResponse.status).toBe(200);
922
+
923
+ // Test with invalid token
924
+ const invalidResponse = await app.request('/protected', {
925
+ headers: { Authorization: 'Bearer invalid-token' },
926
+ });
927
+ expect(invalidResponse.status).toBe(401);
928
+ });
929
+
930
+ it('should authorize with session', async () => {
931
+ const endpoint = new Endpoint({
932
+ route: '/protected',
933
+ method: 'GET',
934
+ fn: async () => ({ success: true }),
935
+ input: undefined,
936
+ output: z.object({ success: z.boolean() }),
937
+ services: [],
938
+ logger: mockLogger,
939
+ timeout: undefined,
940
+ memorySize: undefined,
941
+ status: undefined,
942
+ getSession: async ({ header }) => {
943
+ const token = header('authorization');
944
+ return token === 'Bearer user-token'
945
+ ? { userId: 'user-123', role: 'user' }
946
+ : null;
947
+ },
948
+ authorize: undefined,
949
+ description: undefined,
950
+ });
951
+
952
+ endpoint.authorize = async ({ session }) => {
953
+ return session?.role === 'user' || session?.role === 'admin';
954
+ };
955
+
956
+ const adaptor = new HonoEndpoint(endpoint as any);
957
+ const app = new Hono();
958
+
959
+ adaptor.addRoute(serviceDiscovery, app);
960
+
961
+ // Test with valid user token
962
+ const validResponse = await app.request('/protected', {
963
+ headers: { Authorization: 'Bearer user-token' },
964
+ });
965
+ expect(validResponse.status).toBe(200);
966
+
967
+ // Test with no token (no session)
968
+ const noTokenResponse = await app.request('/protected');
969
+ expect(noTokenResponse.status).toBe(401);
970
+ });
971
+
972
+ it('should handle authorization errors', async () => {
973
+ const endpoint = new Endpoint({
974
+ route: '/protected',
975
+ method: 'GET',
976
+ fn: async () => ({ success: true }),
977
+ input: undefined,
978
+ output: z.object({ success: z.boolean() }),
979
+ services: [],
980
+ logger: mockLogger,
981
+ timeout: undefined,
982
+ memorySize: undefined,
983
+ status: undefined,
984
+ getSession: undefined,
985
+ authorize: async () => {
986
+ throw new Error('Authorization service unavailable');
987
+ },
988
+ description: undefined,
989
+ });
990
+
991
+ const adaptor = new HonoEndpoint(endpoint);
992
+ const app = new Hono();
993
+
994
+ adaptor.addRoute(serviceDiscovery, app);
995
+
996
+ const response = await app.request('/protected');
997
+ expect(response.status).toBe(500);
998
+ });
999
+ });
1000
+
1001
+ describe('output validation', () => {
1002
+ it('should validate output against schema and return validated response', async () => {
1003
+ const outputSchema = z.object({
1004
+ id: z.string(),
1005
+ name: z.string(),
1006
+ age: z.number(),
1007
+ });
1008
+
1009
+ const endpoint = new Endpoint({
1010
+ route: '/users/validated',
1011
+ method: 'GET',
1012
+ fn: async () => ({ id: '123', name: 'John', age: 30 }),
1013
+ input: undefined,
1014
+ output: outputSchema,
1015
+ services: [],
1016
+ logger: mockLogger,
1017
+ timeout: undefined,
1018
+ memorySize: undefined,
1019
+ status: 200,
1020
+ getSession: undefined,
1021
+ authorize: undefined,
1022
+ description: undefined,
1023
+ });
1024
+
1025
+ const adaptor = new HonoEndpoint(endpoint);
1026
+ const app = new Hono();
1027
+
1028
+ adaptor.addRoute(serviceDiscovery, app);
1029
+
1030
+ const response = await app.request('/users/validated');
1031
+ expect(response.status).toBe(200);
1032
+ expect(await response.json()).toEqual({
1033
+ id: '123',
1034
+ name: 'John',
1035
+ age: 30,
1036
+ });
1037
+ });
1038
+
1039
+ it('should return 422 when output validation fails', async () => {
1040
+ const outputSchema = z.object({
1041
+ id: z.string(),
1042
+ name: z.string(),
1043
+ age: z.number(),
1044
+ });
1045
+
1046
+ const endpoint = new Endpoint({
1047
+ route: '/users/invalid-output',
1048
+ method: 'GET',
1049
+ // @ts-expect-error
1050
+ fn: async () => ({ id: 123, name: 'John', age: 'not-a-number' }), // Invalid output
1051
+ input: undefined,
1052
+ output: outputSchema,
1053
+ services: [],
1054
+ logger: mockLogger,
1055
+ timeout: undefined,
1056
+ memorySize: undefined,
1057
+ status: 200,
1058
+ getSession: undefined,
1059
+ authorize: undefined,
1060
+ description: undefined,
1061
+ });
1062
+
1063
+ const adaptor = new HonoEndpoint(endpoint);
1064
+ const app = new Hono();
1065
+
1066
+ adaptor.addRoute(serviceDiscovery, app);
1067
+
1068
+ const response = await app.request('/users/invalid-output');
1069
+ expect(response.status).toBe(422);
1070
+
1071
+ const error = await response.json();
1072
+ expect(error).toHaveProperty('statusCode', 422);
1073
+ expect(error).toHaveProperty('message', 'Validation failed');
1074
+ });
1075
+
1076
+ it('should return empty response when no output schema is defined', async () => {
1077
+ const endpoint = new Endpoint({
1078
+ route: '/users/no-schema',
1079
+ method: 'GET',
1080
+ fn: async () => ({ anything: 'goes', here: true, number: 42 }),
1081
+ input: undefined,
1082
+ output: undefined, // No output schema
1083
+ services: [],
1084
+ logger: mockLogger,
1085
+ timeout: undefined,
1086
+ memorySize: undefined,
1087
+ status: 200,
1088
+ getSession: undefined,
1089
+ authorize: undefined,
1090
+ description: undefined,
1091
+ });
1092
+
1093
+ const adaptor = new HonoEndpoint(endpoint);
1094
+ const app = new Hono();
1095
+
1096
+ adaptor.addRoute(serviceDiscovery, app);
1097
+
1098
+ const response = await app.request('/users/no-schema');
1099
+ expect(response.status).toBe(200);
1100
+ // When no output schema is defined, response body is empty
1101
+ expect(await response.text()).toBe('');
1102
+ });
1103
+ });
1104
1104
  });