@geekmidas/constructs 0.3.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (549) hide show
  1. package/dist/{AWSLambdaFunction-EPGY4s7i.cjs → AWSLambdaFunction-Ba1DcsW2.cjs} +6 -6
  2. package/dist/AWSLambdaFunction-Ba1DcsW2.cjs.map +1 -0
  3. package/dist/{AWSLambdaFunction-BdebRMUh.d.mts → AWSLambdaFunction-CKe73Qr0.d.cts} +6 -6
  4. package/dist/AWSLambdaFunction-CKe73Qr0.d.cts.map +1 -0
  5. package/dist/{AWSLambdaFunction-D0tEOTXQ.d.cts → AWSLambdaFunction-CuG3HNZx.d.mts} +6 -6
  6. package/dist/AWSLambdaFunction-CuG3HNZx.d.mts.map +1 -0
  7. package/dist/{AWSLambdaFunction-C54a1doJ.mjs → AWSLambdaFunction-DnMm4xvz.mjs} +6 -6
  8. package/dist/AWSLambdaFunction-DnMm4xvz.mjs.map +1 -0
  9. package/dist/{AWSLambdaSubscriberAdaptor-Dx-Ks1Jp.d.cts → AWSLambdaSubscriberAdaptor-B4HH-WuQ.d.mts} +4 -4
  10. package/dist/AWSLambdaSubscriberAdaptor-B4HH-WuQ.d.mts.map +1 -0
  11. package/dist/{AWSLambdaSubscriberAdaptor-BLfO612H.mjs → AWSLambdaSubscriberAdaptor-BD3FwGUb.mjs} +3 -3
  12. package/dist/AWSLambdaSubscriberAdaptor-BD3FwGUb.mjs.map +1 -0
  13. package/dist/{AWSLambdaSubscriberAdaptor-DrFAvHOp.d.mts → AWSLambdaSubscriberAdaptor-BEqQ96VJ.d.cts} +4 -4
  14. package/dist/AWSLambdaSubscriberAdaptor-BEqQ96VJ.d.cts.map +1 -0
  15. package/dist/{AWSLambdaSubscriberAdaptor-BNcYYZ-P.cjs → AWSLambdaSubscriberAdaptor-DQDnt1Xk.cjs} +3 -3
  16. package/dist/AWSLambdaSubscriberAdaptor-DQDnt1Xk.cjs.map +1 -0
  17. package/dist/{AmazonApiGatewayEndpointAdaptor-BT9JXihC.mjs → AmazonApiGatewayEndpointAdaptor-Bvy-Hgjf.mjs} +56 -14
  18. package/dist/AmazonApiGatewayEndpointAdaptor-Bvy-Hgjf.mjs.map +1 -0
  19. package/dist/{AmazonApiGatewayEndpointAdaptor-DNFvvdmW.cjs → AmazonApiGatewayEndpointAdaptor-Cpxluhfg.cjs} +55 -13
  20. package/dist/AmazonApiGatewayEndpointAdaptor-Cpxluhfg.cjs.map +1 -0
  21. package/dist/{AmazonApiGatewayEndpointAdaptor-qlKXuZxy.d.mts → AmazonApiGatewayEndpointAdaptor-DTgdZ8I1.d.mts} +52 -6
  22. package/dist/AmazonApiGatewayEndpointAdaptor-DTgdZ8I1.d.mts.map +1 -0
  23. package/dist/{AmazonApiGatewayEndpointAdaptor-DLqnYQ4E.d.cts → AmazonApiGatewayEndpointAdaptor-DsWnO6x9.d.cts} +51 -5
  24. package/dist/AmazonApiGatewayEndpointAdaptor-DsWnO6x9.d.cts.map +1 -0
  25. package/dist/{AmazonApiGatewayV1EndpointAdaptor-DyUaJIhB.d.cts → AmazonApiGatewayV1EndpointAdaptor-7ELXUBFK.d.cts} +4 -4
  26. package/dist/AmazonApiGatewayV1EndpointAdaptor-7ELXUBFK.d.cts.map +1 -0
  27. package/dist/{AmazonApiGatewayV1EndpointAdaptor-Ccl8B8kG.cjs → AmazonApiGatewayV1EndpointAdaptor-B8vIYYNh.cjs} +4 -4
  28. package/dist/AmazonApiGatewayV1EndpointAdaptor-B8vIYYNh.cjs.map +1 -0
  29. package/dist/{AmazonApiGatewayV1EndpointAdaptor-CShQI8Gk.mjs → AmazonApiGatewayV1EndpointAdaptor-ByXGIju8.mjs} +4 -4
  30. package/dist/AmazonApiGatewayV1EndpointAdaptor-ByXGIju8.mjs.map +1 -0
  31. package/dist/{AmazonApiGatewayV1EndpointAdaptor-MRUxs3Xi.d.mts → AmazonApiGatewayV1EndpointAdaptor-RWRmFPrN.d.mts} +5 -5
  32. package/dist/AmazonApiGatewayV1EndpointAdaptor-RWRmFPrN.d.mts.map +1 -0
  33. package/dist/{AmazonApiGatewayV2EndpointAdaptor-D8-0Aab4.cjs → AmazonApiGatewayV2EndpointAdaptor-DIetspUm.cjs} +4 -4
  34. package/dist/AmazonApiGatewayV2EndpointAdaptor-DIetspUm.cjs.map +1 -0
  35. package/dist/{AmazonApiGatewayV2EndpointAdaptor-lCRzGE4q.mjs → AmazonApiGatewayV2EndpointAdaptor-DWemCZvl.mjs} +4 -4
  36. package/dist/AmazonApiGatewayV2EndpointAdaptor-DWemCZvl.mjs.map +1 -0
  37. package/dist/{AmazonApiGatewayV2EndpointAdaptor-M1-w0U5R.d.cts → AmazonApiGatewayV2EndpointAdaptor-D_uMTmuJ.d.cts} +4 -6
  38. package/dist/AmazonApiGatewayV2EndpointAdaptor-D_uMTmuJ.d.cts.map +1 -0
  39. package/dist/{AmazonApiGatewayV2EndpointAdaptor-fuLM6M9k.d.mts → AmazonApiGatewayV2EndpointAdaptor-wnOMDv6o.d.mts} +5 -7
  40. package/dist/AmazonApiGatewayV2EndpointAdaptor-wnOMDv6o.d.mts.map +1 -0
  41. package/dist/{Authorizer-C0ge_tc8.cjs → Authorizer-BXxBee2P.cjs} +1 -1
  42. package/dist/Authorizer-BXxBee2P.cjs.map +1 -0
  43. package/dist/{Authorizer-r9U3y_ms.mjs → Authorizer-BgjU8-z6.mjs} +1 -1
  44. package/dist/Authorizer-BgjU8-z6.mjs.map +1 -0
  45. package/dist/{Authorizer-gWxYsGEp.d.mts → Authorizer-DCcYOx3h.d.mts} +1 -1
  46. package/dist/Authorizer-DCcYOx3h.d.mts.map +1 -0
  47. package/dist/{Authorizer-B-btowNd.d.cts → Authorizer-DWtwC8we.d.cts} +1 -1
  48. package/dist/Authorizer-DWtwC8we.d.cts.map +1 -0
  49. package/dist/{BaseFunctionBuilder-Czi1Jwza.mjs → BaseFunctionBuilder-0qlenb9z.mjs} +2 -2
  50. package/dist/BaseFunctionBuilder-0qlenb9z.mjs.map +1 -0
  51. package/dist/BaseFunctionBuilder-BAtutR6q.d.cts.map +1 -1
  52. package/dist/{BaseFunctionBuilder-DRY419e7.d.mts → BaseFunctionBuilder-CDfDWWAQ.d.mts} +2 -2
  53. package/dist/BaseFunctionBuilder-CDfDWWAQ.d.mts.map +1 -0
  54. package/dist/{BaseFunctionBuilder-MYG3C9ug.cjs → BaseFunctionBuilder-D7o93EGv.cjs} +2 -2
  55. package/dist/BaseFunctionBuilder-D7o93EGv.cjs.map +1 -0
  56. package/dist/{Construct-Ba5cMxib.cjs → Construct-BlnyYtJC.cjs} +31 -2
  57. package/dist/Construct-BlnyYtJC.cjs.map +1 -0
  58. package/dist/Construct-C4rPE67v.d.cts.map +1 -1
  59. package/dist/{Construct-DdyGHuag.mjs → Construct-D5dCvxZ3.mjs} +31 -2
  60. package/dist/Construct-D5dCvxZ3.mjs.map +1 -0
  61. package/dist/{Construct-XrijZFFh.d.mts → Construct-dZiwVo0q.d.mts} +1 -1
  62. package/dist/Construct-dZiwVo0q.d.mts.map +1 -0
  63. package/dist/Construct.cjs +1 -1
  64. package/dist/Construct.d.mts +1 -1
  65. package/dist/Construct.mjs +1 -1
  66. package/dist/{Cron-bDLcTvV5.d.cts → Cron-B6FnTu7k.d.cts} +2 -2
  67. package/dist/Cron-B6FnTu7k.d.cts.map +1 -0
  68. package/dist/{Cron-CGF4YAfM.cjs → Cron-BAPQetlC.cjs} +3 -3
  69. package/dist/Cron-BAPQetlC.cjs.map +1 -0
  70. package/dist/{Cron-BxhGs5up.mjs → Cron-CAk_ddH8.mjs} +3 -3
  71. package/dist/Cron-CAk_ddH8.mjs.map +1 -0
  72. package/dist/{Cron-cdjlSKNp.d.mts → Cron-D3bEljxQ.d.mts} +2 -2
  73. package/dist/Cron-D3bEljxQ.d.mts.map +1 -0
  74. package/dist/{CronBuilder-DKVXyE0Q.d.cts → CronBuilder-CA8euP0z.d.cts} +4 -4
  75. package/dist/CronBuilder-CA8euP0z.d.cts.map +1 -0
  76. package/dist/{CronBuilder-BC4m5-p1.d.mts → CronBuilder-DvdiKzhq.d.mts} +4 -4
  77. package/dist/CronBuilder-DvdiKzhq.d.mts.map +1 -0
  78. package/dist/{CronBuilder-CcxKRtVP.cjs → CronBuilder-DxXA5ymv.cjs} +4 -4
  79. package/dist/CronBuilder-DxXA5ymv.cjs.map +1 -0
  80. package/dist/{CronBuilder-d2jh-IB2.mjs → CronBuilder-e8TaHPYm.mjs} +4 -4
  81. package/dist/CronBuilder-e8TaHPYm.mjs.map +1 -0
  82. package/dist/{Endpoint-BPv9_-m_.d.cts → Endpoint-BOlbY5iq.d.cts} +3 -3
  83. package/dist/Endpoint-BOlbY5iq.d.cts.map +1 -0
  84. package/dist/{Endpoint-CuOEswxJ.mjs → Endpoint-BbdNmtlM.mjs} +6 -6
  85. package/dist/Endpoint-BbdNmtlM.mjs.map +1 -0
  86. package/dist/{Endpoint-BdwG75G_.d.mts → Endpoint-Dlv7nxgj.d.mts} +4 -4
  87. package/dist/Endpoint-Dlv7nxgj.d.mts.map +1 -0
  88. package/dist/{Endpoint-BVGZXFyV.cjs → Endpoint-DxvnlfXg.cjs} +6 -6
  89. package/dist/Endpoint-DxvnlfXg.cjs.map +1 -0
  90. package/dist/{EndpointBuilder-Cgj1P_ra.cjs → EndpointBuilder-40Iz5CjY.cjs} +6 -6
  91. package/dist/EndpointBuilder-40Iz5CjY.cjs.map +1 -0
  92. package/dist/{EndpointBuilder-DnCB1h1j.mjs → EndpointBuilder-BaVvhW9m.mjs} +6 -6
  93. package/dist/EndpointBuilder-BaVvhW9m.mjs.map +1 -0
  94. package/dist/{EndpointBuilder-DIy_m1bu.d.cts → EndpointBuilder-CFfWWjUa.d.cts} +3 -3
  95. package/dist/EndpointBuilder-CFfWWjUa.d.cts.map +1 -0
  96. package/dist/{EndpointBuilder-B3az942t.d.mts → EndpointBuilder-T_K2NLWw.d.mts} +5 -5
  97. package/dist/EndpointBuilder-T_K2NLWw.d.mts.map +1 -0
  98. package/dist/{EndpointFactory-CyPbm3AD.d.cts → EndpointFactory-ChzBVEM9.d.cts} +4 -4
  99. package/dist/EndpointFactory-ChzBVEM9.d.cts.map +1 -0
  100. package/dist/{EndpointFactory-CbdxPCIH.mjs → EndpointFactory-DfNjSgVG.mjs} +7 -7
  101. package/dist/EndpointFactory-DfNjSgVG.mjs.map +1 -0
  102. package/dist/{EndpointFactory-C-0nE6Jg.d.mts → EndpointFactory-GAL_tuPf.d.mts} +4 -4
  103. package/dist/EndpointFactory-GAL_tuPf.d.mts.map +1 -0
  104. package/dist/{EndpointFactory-CYj6BYok.cjs → EndpointFactory-r6jxPvQ8.cjs} +7 -7
  105. package/dist/EndpointFactory-r6jxPvQ8.cjs.map +1 -0
  106. package/dist/{Function-BVHqIDp9.mjs → Function-D8tBamM3.mjs} +3 -3
  107. package/dist/Function-D8tBamM3.mjs.map +1 -0
  108. package/dist/{Function-DN2G6OT5.d.mts → Function-DBmU3uGI.d.mts} +3 -3
  109. package/dist/Function-DBmU3uGI.d.mts.map +1 -0
  110. package/dist/{Function-Cf7f_kCz.d.cts → Function-PNW4HdNE.d.cts} +2 -2
  111. package/dist/Function-PNW4HdNE.d.cts.map +1 -0
  112. package/dist/{Function-DDZb1525.cjs → Function-iLKrUXuw.cjs} +3 -3
  113. package/dist/Function-iLKrUXuw.cjs.map +1 -0
  114. package/dist/{FunctionBuilder-DswJ-9sD.cjs → FunctionBuilder-BEpPgeho.cjs} +4 -4
  115. package/dist/FunctionBuilder-BEpPgeho.cjs.map +1 -0
  116. package/dist/{FunctionBuilder-Cxx8D2na.d.mts → FunctionBuilder-Bv4H2I1a.d.mts} +4 -4
  117. package/dist/FunctionBuilder-Bv4H2I1a.d.mts.map +1 -0
  118. package/dist/{FunctionBuilder-CrDYgfiI.mjs → FunctionBuilder-BwNF99AB.mjs} +4 -4
  119. package/dist/FunctionBuilder-BwNF99AB.mjs.map +1 -0
  120. package/dist/{FunctionBuilder-CJBzzXL3.d.cts → FunctionBuilder-DCqXIHaq.d.cts} +2 -2
  121. package/dist/FunctionBuilder-DCqXIHaq.d.cts.map +1 -0
  122. package/dist/{FunctionExecutionWrapper-CLDh7Z2_.mjs → FunctionExecutionWrapper-B__HE_B-.mjs} +3 -3
  123. package/dist/FunctionExecutionWrapper-B__HE_B-.mjs.map +1 -0
  124. package/dist/{FunctionExecutionWrapper-DF260Aaj.d.mts → FunctionExecutionWrapper-BclgIztn.d.cts} +5 -5
  125. package/dist/FunctionExecutionWrapper-BclgIztn.d.cts.map +1 -0
  126. package/dist/{FunctionExecutionWrapper-BYI2bGTL.cjs → FunctionExecutionWrapper-BjF6t9Hb.cjs} +3 -3
  127. package/dist/FunctionExecutionWrapper-BjF6t9Hb.cjs.map +1 -0
  128. package/dist/{FunctionExecutionWrapper-Qy8bmgFR.d.cts → FunctionExecutionWrapper-Dq21c6vt.d.mts} +5 -5
  129. package/dist/FunctionExecutionWrapper-Dq21c6vt.d.mts.map +1 -0
  130. package/dist/HonoEndpointAdaptor-C_ym_Sbr.mjs +251 -0
  131. package/dist/HonoEndpointAdaptor-C_ym_Sbr.mjs.map +1 -0
  132. package/dist/HonoEndpointAdaptor-DiQH0eTb.cjs +257 -0
  133. package/dist/HonoEndpointAdaptor-DiQH0eTb.cjs.map +1 -0
  134. package/dist/{HonoEndpointAdaptor-Bqm6SEuP.d.cts → HonoEndpointAdaptor-Dkkemmbo.d.cts} +9 -4
  135. package/dist/HonoEndpointAdaptor-Dkkemmbo.d.cts.map +1 -0
  136. package/dist/{HonoEndpointAdaptor-CRe-ij5f.d.mts → HonoEndpointAdaptor-HukjdF6M.d.mts} +10 -5
  137. package/dist/HonoEndpointAdaptor-HukjdF6M.d.mts.map +1 -0
  138. package/dist/{Subscriber-COYMSevD.d.cts → Subscriber--zUjZDR6.d.cts} +1 -1
  139. package/dist/Subscriber--zUjZDR6.d.cts.map +1 -0
  140. package/dist/{Subscriber-ikctpU3I.d.mts → Subscriber-0Ac7cXID.d.mts} +2 -2
  141. package/dist/Subscriber-0Ac7cXID.d.mts.map +1 -0
  142. package/dist/{Subscriber-BmPf9GFb.mjs → Subscriber-BgZ8T-O2.mjs} +2 -2
  143. package/dist/Subscriber-BgZ8T-O2.mjs.map +1 -0
  144. package/dist/{Subscriber-BiHjVXtM.cjs → Subscriber-CoFmHMIM.cjs} +2 -2
  145. package/dist/Subscriber-CoFmHMIM.cjs.map +1 -0
  146. package/dist/{SubscriberBuilder-D_9zzllj.d.mts → SubscriberBuilder-D8cmUHee.d.mts} +2 -2
  147. package/dist/SubscriberBuilder-D8cmUHee.d.mts.map +1 -0
  148. package/dist/{SubscriberBuilder-DJPEeYDJ.mjs → SubscriberBuilder-DWXWZBPo.mjs} +2 -2
  149. package/dist/SubscriberBuilder-DWXWZBPo.mjs.map +1 -0
  150. package/dist/{SubscriberBuilder-ivHAGIVi.d.cts → SubscriberBuilder-DciTqb-7.d.cts} +2 -2
  151. package/dist/SubscriberBuilder-DciTqb-7.d.cts.map +1 -0
  152. package/dist/{SubscriberBuilder-Cp1C-xtT.cjs → SubscriberBuilder-JlxhyqGp.cjs} +2 -2
  153. package/dist/SubscriberBuilder-JlxhyqGp.cjs.map +1 -0
  154. package/dist/{TestEndpointAdaptor-DB7bREhS.d.mts → TestEndpointAdaptor-Boijwbmz.d.mts} +4 -4
  155. package/dist/TestEndpointAdaptor-Boijwbmz.d.mts.map +1 -0
  156. package/dist/{TestEndpointAdaptor-C10xBI--.d.cts → TestEndpointAdaptor-DdwpRyNh.d.cts} +3 -3
  157. package/dist/TestEndpointAdaptor-DdwpRyNh.d.cts.map +1 -0
  158. package/dist/TestEndpointAdaptor-Dk75ExxE.cjs +176 -0
  159. package/dist/TestEndpointAdaptor-Dk75ExxE.cjs.map +1 -0
  160. package/dist/TestEndpointAdaptor-OiA2JLDp.mjs +170 -0
  161. package/dist/TestEndpointAdaptor-OiA2JLDp.mjs.map +1 -0
  162. package/dist/adaptors/aws.cjs +12 -12
  163. package/dist/adaptors/aws.d.cts +13 -12
  164. package/dist/adaptors/aws.d.mts +16 -15
  165. package/dist/adaptors/aws.mjs +12 -12
  166. package/dist/adaptors/hono.cjs +10 -9
  167. package/dist/adaptors/hono.d.cts +6 -6
  168. package/dist/adaptors/hono.d.mts +9 -9
  169. package/dist/adaptors/hono.mjs +10 -9
  170. package/dist/adaptors/testing.cjs +8 -7
  171. package/dist/adaptors/testing.d.cts +6 -6
  172. package/dist/adaptors/testing.d.mts +9 -9
  173. package/dist/adaptors/testing.mjs +8 -7
  174. package/dist/crons/Cron.cjs +6 -6
  175. package/dist/crons/Cron.d.cts +4 -4
  176. package/dist/crons/Cron.d.mts +6 -6
  177. package/dist/crons/Cron.mjs +6 -6
  178. package/dist/crons/CronBuilder.cjs +7 -7
  179. package/dist/crons/CronBuilder.d.cts +5 -5
  180. package/dist/crons/CronBuilder.d.mts +7 -7
  181. package/dist/crons/CronBuilder.mjs +7 -7
  182. package/dist/crons/index.cjs +7 -7
  183. package/dist/crons/index.cjs.map +1 -1
  184. package/dist/crons/index.d.cts +5 -5
  185. package/dist/crons/index.d.mts +7 -7
  186. package/dist/crons/index.mjs +7 -7
  187. package/dist/crons/index.mjs.map +1 -1
  188. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +7 -7
  189. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +8 -7
  190. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +11 -10
  191. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +7 -7
  192. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +8 -8
  193. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +8 -7
  194. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +11 -10
  195. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +8 -8
  196. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +8 -8
  197. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +9 -8
  198. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +12 -11
  199. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +8 -8
  200. package/dist/endpoints/Authorizer.cjs +1 -1
  201. package/dist/endpoints/Authorizer.d.cts +1 -1
  202. package/dist/endpoints/Authorizer.d.mts +1 -1
  203. package/dist/endpoints/Authorizer.mjs +1 -1
  204. package/dist/endpoints/Endpoint.cjs +6 -6
  205. package/dist/endpoints/Endpoint.d.cts +5 -5
  206. package/dist/endpoints/Endpoint.d.mts +8 -8
  207. package/dist/endpoints/Endpoint.mjs +6 -6
  208. package/dist/endpoints/EndpointBuilder.cjs +9 -9
  209. package/dist/endpoints/EndpointBuilder.d.cts +6 -6
  210. package/dist/endpoints/EndpointBuilder.d.mts +9 -9
  211. package/dist/endpoints/EndpointBuilder.mjs +9 -9
  212. package/dist/endpoints/EndpointFactory.cjs +10 -10
  213. package/dist/endpoints/EndpointFactory.d.cts +7 -7
  214. package/dist/endpoints/EndpointFactory.d.mts +10 -10
  215. package/dist/endpoints/EndpointFactory.mjs +10 -10
  216. package/dist/endpoints/HonoEndpointAdaptor.cjs +10 -9
  217. package/dist/endpoints/HonoEndpointAdaptor.d.cts +6 -6
  218. package/dist/endpoints/HonoEndpointAdaptor.d.mts +9 -9
  219. package/dist/endpoints/HonoEndpointAdaptor.mjs +10 -9
  220. package/dist/endpoints/TestEndpointAdaptor.cjs +8 -7
  221. package/dist/endpoints/TestEndpointAdaptor.d.cts +6 -6
  222. package/dist/endpoints/TestEndpointAdaptor.d.mts +9 -9
  223. package/dist/endpoints/TestEndpointAdaptor.mjs +8 -7
  224. package/dist/endpoints/audit.d.cts +5 -5
  225. package/dist/endpoints/audit.d.mts +8 -8
  226. package/dist/endpoints/helpers.cjs +7 -7
  227. package/dist/endpoints/helpers.d.cts +5 -5
  228. package/dist/endpoints/helpers.d.cts.map +1 -1
  229. package/dist/endpoints/helpers.d.mts +8 -8
  230. package/dist/endpoints/helpers.d.mts.map +1 -1
  231. package/dist/endpoints/helpers.mjs +7 -7
  232. package/dist/endpoints/index.cjs +20 -10
  233. package/dist/endpoints/index.cjs.map +1 -1
  234. package/dist/endpoints/index.d.cts +10 -8
  235. package/dist/endpoints/index.d.cts.map +1 -1
  236. package/dist/endpoints/index.d.mts +13 -11
  237. package/dist/endpoints/index.d.mts.map +1 -1
  238. package/dist/endpoints/index.mjs +13 -11
  239. package/dist/endpoints/index.mjs.map +1 -1
  240. package/dist/endpoints/lazyAccessors.cjs +10 -0
  241. package/dist/endpoints/lazyAccessors.d.cts +10 -0
  242. package/dist/endpoints/lazyAccessors.d.mts +10 -0
  243. package/dist/endpoints/lazyAccessors.mjs +3 -0
  244. package/dist/endpoints/parseHonoQuery.cjs +1 -1
  245. package/dist/endpoints/parseHonoQuery.mjs +1 -1
  246. package/dist/endpoints/parseQueryParams.d.cts.map +1 -1
  247. package/dist/endpoints/parseQueryParams.d.mts.map +1 -1
  248. package/dist/endpoints/processAudits.d.cts +5 -5
  249. package/dist/endpoints/processAudits.d.cts.map +1 -1
  250. package/dist/endpoints/processAudits.d.mts +8 -8
  251. package/dist/endpoints/processAudits.d.mts.map +1 -1
  252. package/dist/endpoints/rls.cjs +1 -1
  253. package/dist/endpoints/rls.d.cts +5 -5
  254. package/dist/endpoints/rls.d.mts +8 -8
  255. package/dist/endpoints/rls.mjs +1 -1
  256. package/dist/functions/AWSLambdaFunction.cjs +6 -6
  257. package/dist/functions/AWSLambdaFunction.d.cts +3 -3
  258. package/dist/functions/AWSLambdaFunction.d.mts +4 -4
  259. package/dist/functions/AWSLambdaFunction.mjs +6 -6
  260. package/dist/functions/BaseFunctionBuilder.cjs +2 -2
  261. package/dist/functions/BaseFunctionBuilder.d.mts +2 -2
  262. package/dist/functions/BaseFunctionBuilder.mjs +2 -2
  263. package/dist/functions/Function.cjs +2 -2
  264. package/dist/functions/Function.d.cts +1 -1
  265. package/dist/functions/Function.d.mts +2 -2
  266. package/dist/functions/Function.mjs +2 -2
  267. package/dist/functions/FunctionBuilder.cjs +4 -4
  268. package/dist/functions/FunctionBuilder.d.cts +2 -2
  269. package/dist/functions/FunctionBuilder.d.mts +4 -4
  270. package/dist/functions/FunctionBuilder.mjs +4 -4
  271. package/dist/functions/FunctionExecutionWrapper.cjs +5 -5
  272. package/dist/functions/FunctionExecutionWrapper.d.cts +2 -2
  273. package/dist/functions/FunctionExecutionWrapper.d.mts +3 -3
  274. package/dist/functions/FunctionExecutionWrapper.mjs +5 -5
  275. package/dist/functions/TestFunctionAdaptor.cjs +7 -7
  276. package/dist/functions/TestFunctionAdaptor.cjs.map +1 -1
  277. package/dist/functions/TestFunctionAdaptor.d.cts +2 -2
  278. package/dist/functions/TestFunctionAdaptor.d.cts.map +1 -1
  279. package/dist/functions/TestFunctionAdaptor.d.mts +3 -3
  280. package/dist/functions/TestFunctionAdaptor.d.mts.map +1 -1
  281. package/dist/functions/TestFunctionAdaptor.mjs +7 -7
  282. package/dist/functions/TestFunctionAdaptor.mjs.map +1 -1
  283. package/dist/functions/index.cjs +5 -5
  284. package/dist/functions/index.d.cts +3 -3
  285. package/dist/functions/index.d.mts +5 -5
  286. package/dist/functions/index.mjs +5 -5
  287. package/dist/{functions-fTid0RMK.cjs → functions-BkKXVeHm.cjs} +2 -2
  288. package/dist/functions-BkKXVeHm.cjs.map +1 -0
  289. package/dist/functions-C3A1vMRW.mjs +8 -0
  290. package/dist/functions-C3A1vMRW.mjs.map +1 -0
  291. package/dist/{helpers-BcP1tXAi.cjs → helpers-BelEzV4U.cjs} +2 -2
  292. package/dist/helpers-BelEzV4U.cjs.map +1 -0
  293. package/dist/{helpers-ByRTDO_m.mjs → helpers-DgsMFMUV.mjs} +2 -2
  294. package/dist/helpers-DgsMFMUV.mjs.map +1 -0
  295. package/dist/{index-SI4V0XwK.d.cts → index-CgAQHr3f.d.mts} +2 -2
  296. package/dist/index-CgAQHr3f.d.mts.map +1 -0
  297. package/dist/{index-BWzGIj06.d.mts → index-D0fp_IK1.d.cts} +2 -2
  298. package/dist/index-D0fp_IK1.d.cts.map +1 -0
  299. package/dist/index.cjs +1 -1
  300. package/dist/index.d.cts +2 -1
  301. package/dist/index.d.mts +4 -3
  302. package/dist/index.mjs +1 -1
  303. package/dist/lazyAccessors-B-Jgkg2o.mjs +175 -0
  304. package/dist/lazyAccessors-B-Jgkg2o.mjs.map +1 -0
  305. package/dist/lazyAccessors-B2ILzU-j.d.mts +49 -0
  306. package/dist/lazyAccessors-B2ILzU-j.d.mts.map +1 -0
  307. package/dist/lazyAccessors-B8Hhras9.cjs +223 -0
  308. package/dist/lazyAccessors-B8Hhras9.cjs.map +1 -0
  309. package/dist/lazyAccessors-Bcpi06ed.d.cts +49 -0
  310. package/dist/lazyAccessors-Bcpi06ed.d.cts.map +1 -0
  311. package/dist/{parseHonoQuery-CZC5_97v.cjs → parseHonoQuery-D4MhxTRc.cjs} +1 -1
  312. package/dist/parseHonoQuery-D4MhxTRc.cjs.map +1 -0
  313. package/dist/{parseHonoQuery-DDgIkTO4.mjs → parseHonoQuery-DpK3sGPc.mjs} +1 -1
  314. package/dist/parseHonoQuery-DpK3sGPc.mjs.map +1 -0
  315. package/dist/parseQueryParams-BSNkjmZ9.cjs.map +1 -1
  316. package/dist/parseQueryParams-UMTRnRrW.mjs.map +1 -1
  317. package/dist/processAudits-CzHkPokQ.cjs.map +1 -1
  318. package/dist/processAudits-Dj8UGqcW.mjs.map +1 -1
  319. package/dist/publisher-Bw4770Hi.mjs.map +1 -1
  320. package/dist/publisher-C4BhHB5I.d.cts +16 -0
  321. package/dist/publisher-C4BhHB5I.d.cts.map +1 -0
  322. package/dist/publisher-NE-GnXL8.d.mts +16 -0
  323. package/dist/publisher-NE-GnXL8.d.mts.map +1 -0
  324. package/dist/publisher-lFQleddL.cjs.map +1 -1
  325. package/dist/publisher.d.cts +3 -16
  326. package/dist/publisher.d.mts +3 -16
  327. package/dist/{rls-CmJ7bRsz.cjs → rls-BrywnrQb.cjs} +1 -1
  328. package/dist/{rls-CmJ7bRsz.cjs.map → rls-BrywnrQb.cjs.map} +1 -1
  329. package/dist/{rls-Bf3FRwto.mjs → rls-C0cWOnk4.mjs} +1 -1
  330. package/dist/{rls-Bf3FRwto.mjs.map → rls-C0cWOnk4.mjs.map} +1 -1
  331. package/dist/subscribers/AWSLambdaSubscriberAdaptor.cjs +1 -1
  332. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.cts +2 -2
  333. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +3 -3
  334. package/dist/subscribers/AWSLambdaSubscriberAdaptor.mjs +1 -1
  335. package/dist/subscribers/Subscriber.cjs +2 -2
  336. package/dist/subscribers/Subscriber.d.cts +1 -1
  337. package/dist/subscribers/Subscriber.d.mts +2 -2
  338. package/dist/subscribers/Subscriber.mjs +2 -2
  339. package/dist/subscribers/SubscriberBuilder.cjs +3 -3
  340. package/dist/subscribers/SubscriberBuilder.d.cts +2 -2
  341. package/dist/subscribers/SubscriberBuilder.d.mts +3 -3
  342. package/dist/subscribers/SubscriberBuilder.mjs +3 -3
  343. package/dist/subscribers/index.cjs +3 -3
  344. package/dist/subscribers/index.cjs.map +1 -1
  345. package/dist/subscribers/index.d.cts +2 -2
  346. package/dist/subscribers/index.d.cts.map +1 -1
  347. package/dist/subscribers/index.d.mts +3 -3
  348. package/dist/subscribers/index.d.mts.map +1 -1
  349. package/dist/subscribers/index.mjs +3 -3
  350. package/dist/subscribers/index.mjs.map +1 -1
  351. package/dist/telemetry-BTaiRqPo.d.cts +95 -0
  352. package/dist/telemetry-BTaiRqPo.d.cts.map +1 -0
  353. package/dist/telemetry-yAHf5yDs.d.mts +95 -0
  354. package/dist/telemetry-yAHf5yDs.d.mts.map +1 -0
  355. package/dist/telemetry.cjs +0 -0
  356. package/dist/telemetry.d.cts +2 -0
  357. package/dist/telemetry.d.mts +2 -0
  358. package/dist/telemetry.mjs +0 -0
  359. package/dist/types-B5H3piDg.d.cts.map +1 -1
  360. package/dist/{types-DdIlpxAd.d.mts → types-Dw-iLd3Y.d.mts} +1 -1
  361. package/dist/types-Dw-iLd3Y.d.mts.map +1 -0
  362. package/dist/types.d.mts +1 -1
  363. package/package.json +18 -18
  364. package/src/Construct.ts +117 -86
  365. package/src/__benchmarks__/build-time-optimization.bench.ts +274 -0
  366. package/src/__benchmarks__/endpoint.bench.ts +375 -375
  367. package/src/__benchmarks__/fixtures.ts +241 -0
  368. package/src/__benchmarks__/hono-adaptor.bench.ts +533 -0
  369. package/src/__benchmarks__/hono-server.bench.ts +206 -206
  370. package/src/__benchmarks__/response-builder.bench.ts +428 -0
  371. package/src/__benchmarks__/strategies/strategy-a-lazy-services.ts +319 -0
  372. package/src/__benchmarks__/strategies/strategy-c-middleware.ts +530 -0
  373. package/src/__benchmarks__/strategies/strategy-d-opt-in-events.ts +567 -0
  374. package/src/__tests__/Construct.environment.spec.ts +349 -350
  375. package/src/__tests__/publisher.setting.spec.ts +496 -499
  376. package/src/__tests__/publisher.spec.ts +440 -442
  377. package/src/crons/Cron.ts +117 -117
  378. package/src/crons/CronBuilder.ts +237 -238
  379. package/src/crons/__tests__/Cron.spec.ts +448 -448
  380. package/src/crons/__tests__/CronBuilder.state-isolation.spec.ts +214 -214
  381. package/src/crons/index.ts +4 -4
  382. package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +571 -463
  383. package/src/endpoints/AmazonApiGatewayV1EndpointAdaptor.ts +86 -86
  384. package/src/endpoints/AmazonApiGatewayV2EndpointAdaptor.ts +85 -81
  385. package/src/endpoints/Authorizer.ts +100 -100
  386. package/src/endpoints/Endpoint.ts +921 -937
  387. package/src/endpoints/EndpointBuilder.ts +703 -703
  388. package/src/endpoints/EndpointFactory.ts +1054 -1056
  389. package/src/endpoints/HonoEndpointAdaptor.ts +621 -548
  390. package/src/endpoints/TestEndpointAdaptor.ts +373 -354
  391. package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.audits.spec.ts +499 -0
  392. package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.events.spec.ts +541 -542
  393. package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.spec.ts +1172 -1174
  394. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.audits.spec.ts +599 -599
  395. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.events.spec.ts +710 -710
  396. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.factory-publisher.spec.ts +280 -280
  397. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.kysely-audit.integration.spec.ts +924 -730
  398. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.rls.spec.ts +307 -0
  399. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.spec.ts +408 -408
  400. package/src/endpoints/__tests__/Authorizer.spec.ts +286 -0
  401. package/src/endpoints/__tests__/Endpoint.cookies.spec.ts +162 -162
  402. package/src/endpoints/__tests__/Endpoint.headers.spec.ts +182 -182
  403. package/src/endpoints/__tests__/Endpoint.manifest.spec.ts +158 -159
  404. package/src/endpoints/__tests__/Endpoint.spec.ts +819 -822
  405. package/src/endpoints/__tests__/EndpointBuilder.audit.spec.ts +427 -427
  406. package/src/endpoints/__tests__/EndpointBuilder.spec.ts +478 -478
  407. package/src/endpoints/__tests__/EndpointFactory.authorizers.spec.ts +426 -426
  408. package/src/endpoints/__tests__/EndpointFactory.database-auditor.spec.ts +501 -501
  409. package/src/endpoints/__tests__/EndpointFactory.reference-audit.spec.ts +177 -177
  410. package/src/endpoints/__tests__/EndpointFactory.spec.ts +471 -471
  411. package/src/endpoints/__tests__/EndpointFactory.state-isolation.spec.ts +143 -143
  412. package/src/endpoints/__tests__/HonoEndpointAdaptor.audit-transactions.spec.ts +663 -663
  413. package/src/endpoints/__tests__/HonoEndpointAdaptor.audits.spec.ts +608 -608
  414. package/src/endpoints/__tests__/HonoEndpointAdaptor.events.spec.ts +561 -561
  415. package/src/endpoints/__tests__/HonoEndpointAdaptor.kysely-audit.integration.spec.ts +1036 -1036
  416. package/src/endpoints/__tests__/HonoEndpointAdaptor.openapi.spec.ts +278 -278
  417. package/src/endpoints/__tests__/HonoEndpointAdaptor.spec.ts +1093 -1093
  418. package/src/endpoints/__tests__/ResponseBuilder.spec.ts +230 -230
  419. package/src/endpoints/__tests__/TestEndpointAdaptor.audits.spec.ts +569 -569
  420. package/src/endpoints/__tests__/TestEndpointAdaptor.spec.ts +841 -841
  421. package/src/endpoints/__tests__/endpoint-types.test.ts +68 -68
  422. package/src/endpoints/__tests__/helpers.spec.ts +37 -0
  423. package/src/endpoints/__tests__/lazyAccessors.spec.ts +330 -0
  424. package/src/endpoints/__tests__/processAudits.spec.ts +631 -0
  425. package/src/endpoints/audit.ts +51 -51
  426. package/src/endpoints/helpers.ts +34 -35
  427. package/src/endpoints/index.ts +33 -23
  428. package/src/endpoints/lazyAccessors.ts +241 -0
  429. package/src/endpoints/parseHonoQuery.ts +41 -41
  430. package/src/endpoints/parseQueryParams.ts +36 -36
  431. package/src/endpoints/processAudits.ts +269 -269
  432. package/src/endpoints/rls.ts +16 -16
  433. package/src/functions/AWSLambdaFunction.ts +294 -295
  434. package/src/functions/BaseFunctionBuilder.ts +185 -185
  435. package/src/functions/Function.ts +190 -190
  436. package/src/functions/FunctionBuilder.ts +353 -353
  437. package/src/functions/FunctionExecutionWrapper.ts +199 -200
  438. package/src/functions/TestFunctionAdaptor.ts +191 -191
  439. package/src/functions/__tests__/AWSLambdaFunctionAdaptor.spec.ts +424 -424
  440. package/src/functions/__tests__/Function.audits.spec.ts +364 -364
  441. package/src/functions/__tests__/Function.spec.ts +453 -454
  442. package/src/functions/__tests__/FunctionBuilder.state-isolation.spec.ts +179 -179
  443. package/src/functions/__tests__/TestFunctionAdaptor.spec.ts +369 -369
  444. package/src/functions/index.ts +6 -4
  445. package/src/index.ts +13 -9
  446. package/src/publisher.ts +71 -72
  447. package/src/subscribers/AWSLambdaSubscriberAdaptor.ts +244 -248
  448. package/src/subscribers/Subscriber.ts +82 -84
  449. package/src/subscribers/SubscriberBuilder.ts +129 -129
  450. package/src/subscribers/__tests__/AWSLambdaSubscriberAdaptor.spec.ts +589 -589
  451. package/src/subscribers/__tests__/Subscriber.spec.ts +402 -404
  452. package/src/subscribers/index.ts +1 -0
  453. package/src/telemetry.ts +103 -0
  454. package/src/types.ts +7 -7
  455. package/test.ts +58 -59
  456. package/dist/AWSLambdaFunction-BdebRMUh.d.mts.map +0 -1
  457. package/dist/AWSLambdaFunction-C54a1doJ.mjs.map +0 -1
  458. package/dist/AWSLambdaFunction-D0tEOTXQ.d.cts.map +0 -1
  459. package/dist/AWSLambdaFunction-EPGY4s7i.cjs.map +0 -1
  460. package/dist/AWSLambdaSubscriberAdaptor-BLfO612H.mjs.map +0 -1
  461. package/dist/AWSLambdaSubscriberAdaptor-BNcYYZ-P.cjs.map +0 -1
  462. package/dist/AWSLambdaSubscriberAdaptor-DrFAvHOp.d.mts.map +0 -1
  463. package/dist/AWSLambdaSubscriberAdaptor-Dx-Ks1Jp.d.cts.map +0 -1
  464. package/dist/AmazonApiGatewayEndpointAdaptor-BT9JXihC.mjs.map +0 -1
  465. package/dist/AmazonApiGatewayEndpointAdaptor-DLqnYQ4E.d.cts.map +0 -1
  466. package/dist/AmazonApiGatewayEndpointAdaptor-DNFvvdmW.cjs.map +0 -1
  467. package/dist/AmazonApiGatewayEndpointAdaptor-qlKXuZxy.d.mts.map +0 -1
  468. package/dist/AmazonApiGatewayV1EndpointAdaptor-CShQI8Gk.mjs.map +0 -1
  469. package/dist/AmazonApiGatewayV1EndpointAdaptor-Ccl8B8kG.cjs.map +0 -1
  470. package/dist/AmazonApiGatewayV1EndpointAdaptor-DyUaJIhB.d.cts.map +0 -1
  471. package/dist/AmazonApiGatewayV1EndpointAdaptor-MRUxs3Xi.d.mts.map +0 -1
  472. package/dist/AmazonApiGatewayV2EndpointAdaptor-D8-0Aab4.cjs.map +0 -1
  473. package/dist/AmazonApiGatewayV2EndpointAdaptor-M1-w0U5R.d.cts.map +0 -1
  474. package/dist/AmazonApiGatewayV2EndpointAdaptor-fuLM6M9k.d.mts.map +0 -1
  475. package/dist/AmazonApiGatewayV2EndpointAdaptor-lCRzGE4q.mjs.map +0 -1
  476. package/dist/Authorizer-B-btowNd.d.cts.map +0 -1
  477. package/dist/Authorizer-C0ge_tc8.cjs.map +0 -1
  478. package/dist/Authorizer-gWxYsGEp.d.mts.map +0 -1
  479. package/dist/Authorizer-r9U3y_ms.mjs.map +0 -1
  480. package/dist/BaseFunctionBuilder-Czi1Jwza.mjs.map +0 -1
  481. package/dist/BaseFunctionBuilder-DRY419e7.d.mts.map +0 -1
  482. package/dist/BaseFunctionBuilder-MYG3C9ug.cjs.map +0 -1
  483. package/dist/Construct-Ba5cMxib.cjs.map +0 -1
  484. package/dist/Construct-DdyGHuag.mjs.map +0 -1
  485. package/dist/Construct-XrijZFFh.d.mts.map +0 -1
  486. package/dist/Cron-BxhGs5up.mjs.map +0 -1
  487. package/dist/Cron-CGF4YAfM.cjs.map +0 -1
  488. package/dist/Cron-bDLcTvV5.d.cts.map +0 -1
  489. package/dist/Cron-cdjlSKNp.d.mts.map +0 -1
  490. package/dist/CronBuilder-BC4m5-p1.d.mts.map +0 -1
  491. package/dist/CronBuilder-CcxKRtVP.cjs.map +0 -1
  492. package/dist/CronBuilder-DKVXyE0Q.d.cts.map +0 -1
  493. package/dist/CronBuilder-d2jh-IB2.mjs.map +0 -1
  494. package/dist/Endpoint-BPv9_-m_.d.cts.map +0 -1
  495. package/dist/Endpoint-BVGZXFyV.cjs.map +0 -1
  496. package/dist/Endpoint-BdwG75G_.d.mts.map +0 -1
  497. package/dist/Endpoint-CuOEswxJ.mjs.map +0 -1
  498. package/dist/EndpointBuilder-B3az942t.d.mts.map +0 -1
  499. package/dist/EndpointBuilder-Cgj1P_ra.cjs.map +0 -1
  500. package/dist/EndpointBuilder-DIy_m1bu.d.cts.map +0 -1
  501. package/dist/EndpointBuilder-DnCB1h1j.mjs.map +0 -1
  502. package/dist/EndpointFactory-C-0nE6Jg.d.mts.map +0 -1
  503. package/dist/EndpointFactory-CYj6BYok.cjs.map +0 -1
  504. package/dist/EndpointFactory-CbdxPCIH.mjs.map +0 -1
  505. package/dist/EndpointFactory-CyPbm3AD.d.cts.map +0 -1
  506. package/dist/Function-BVHqIDp9.mjs.map +0 -1
  507. package/dist/Function-Cf7f_kCz.d.cts.map +0 -1
  508. package/dist/Function-DDZb1525.cjs.map +0 -1
  509. package/dist/Function-DN2G6OT5.d.mts.map +0 -1
  510. package/dist/FunctionBuilder-CJBzzXL3.d.cts.map +0 -1
  511. package/dist/FunctionBuilder-CrDYgfiI.mjs.map +0 -1
  512. package/dist/FunctionBuilder-Cxx8D2na.d.mts.map +0 -1
  513. package/dist/FunctionBuilder-DswJ-9sD.cjs.map +0 -1
  514. package/dist/FunctionExecutionWrapper-BYI2bGTL.cjs.map +0 -1
  515. package/dist/FunctionExecutionWrapper-CLDh7Z2_.mjs.map +0 -1
  516. package/dist/FunctionExecutionWrapper-DF260Aaj.d.mts.map +0 -1
  517. package/dist/FunctionExecutionWrapper-Qy8bmgFR.d.cts.map +0 -1
  518. package/dist/HonoEndpointAdaptor-Bqm6SEuP.d.cts.map +0 -1
  519. package/dist/HonoEndpointAdaptor-CQe2FqMR.cjs +0 -234
  520. package/dist/HonoEndpointAdaptor-CQe2FqMR.cjs.map +0 -1
  521. package/dist/HonoEndpointAdaptor-CRe-ij5f.d.mts.map +0 -1
  522. package/dist/HonoEndpointAdaptor-Ce-2HBxn.mjs +0 -228
  523. package/dist/HonoEndpointAdaptor-Ce-2HBxn.mjs.map +0 -1
  524. package/dist/Subscriber-BiHjVXtM.cjs.map +0 -1
  525. package/dist/Subscriber-BmPf9GFb.mjs.map +0 -1
  526. package/dist/Subscriber-COYMSevD.d.cts.map +0 -1
  527. package/dist/Subscriber-ikctpU3I.d.mts.map +0 -1
  528. package/dist/SubscriberBuilder-Cp1C-xtT.cjs.map +0 -1
  529. package/dist/SubscriberBuilder-DJPEeYDJ.mjs.map +0 -1
  530. package/dist/SubscriberBuilder-D_9zzllj.d.mts.map +0 -1
  531. package/dist/SubscriberBuilder-ivHAGIVi.d.cts.map +0 -1
  532. package/dist/TestEndpointAdaptor-BXTofAKc.mjs +0 -163
  533. package/dist/TestEndpointAdaptor-BXTofAKc.mjs.map +0 -1
  534. package/dist/TestEndpointAdaptor-C10xBI--.d.cts.map +0 -1
  535. package/dist/TestEndpointAdaptor-D9IwhIYg.cjs +0 -169
  536. package/dist/TestEndpointAdaptor-D9IwhIYg.cjs.map +0 -1
  537. package/dist/TestEndpointAdaptor-DB7bREhS.d.mts.map +0 -1
  538. package/dist/functions-C6EK1xL6.mjs +0 -8
  539. package/dist/functions-C6EK1xL6.mjs.map +0 -1
  540. package/dist/functions-fTid0RMK.cjs.map +0 -1
  541. package/dist/helpers-BcP1tXAi.cjs.map +0 -1
  542. package/dist/helpers-ByRTDO_m.mjs.map +0 -1
  543. package/dist/index-BWzGIj06.d.mts.map +0 -1
  544. package/dist/index-SI4V0XwK.d.cts.map +0 -1
  545. package/dist/parseHonoQuery-CZC5_97v.cjs.map +0 -1
  546. package/dist/parseHonoQuery-DDgIkTO4.mjs.map +0 -1
  547. package/dist/publisher.d.cts.map +0 -1
  548. package/dist/publisher.d.mts.map +0 -1
  549. 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
  });