@geekmidas/constructs 3.0.7 → 3.0.9

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 (467) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/{Construct-BXG8cFSm.cjs → Construct-B14miJ6P.cjs} +95 -10
  3. package/dist/Construct-B14miJ6P.cjs.map +1 -0
  4. package/dist/{Construct-BjpXFNxy.d.mts → Construct-CXqvzglu.d.cts} +11 -6
  5. package/dist/{Construct-BjpXFNxy.d.mts.map → Construct-CXqvzglu.d.cts.map} +1 -1
  6. package/dist/{Construct-CQ9zV58W.mjs → Construct-CdJY2DJS.mjs} +83 -9
  7. package/dist/Construct-CdJY2DJS.mjs.map +1 -0
  8. package/dist/{Construct-CX7HyFfT.d.cts → Construct-D0n7QTaI.d.mts} +13 -8
  9. package/dist/Construct-D0n7QTaI.d.mts.map +1 -0
  10. package/dist/{Endpoint-CGdCGJkC.d.cts → Endpoint-CE7qHX5S.d.cts} +143 -28
  11. package/dist/Endpoint-CE7qHX5S.d.cts.map +1 -0
  12. package/dist/{Endpoint-BET0JSZK.d.mts → Endpoint-NvjIednd.d.mts} +143 -28
  13. package/dist/Endpoint-NvjIednd.d.mts.map +1 -0
  14. package/dist/{HonoEndpointAdaptor-B5fKdLi7.cjs → HonoEndpointAdaptor-Dl8BW_9u.cjs} +91 -25
  15. package/dist/HonoEndpointAdaptor-Dl8BW_9u.cjs.map +1 -0
  16. package/dist/{HonoEndpointAdaptor-DOUODM7n.mjs → HonoEndpointAdaptor-nHYMdbBi.mjs} +74 -8
  17. package/dist/HonoEndpointAdaptor-nHYMdbBi.mjs.map +1 -0
  18. package/dist/{Subscriber-1rDE7HuM.d.cts → Subscriber-D8WkA8np.d.cts} +3 -3
  19. package/dist/{Subscriber-1rDE7HuM.d.cts.map → Subscriber-D8WkA8np.d.cts.map} +1 -1
  20. package/dist/{Subscriber-9ObcUdcC.d.mts → Subscriber-Tft61-YG.d.mts} +5 -5
  21. package/dist/Subscriber-Tft61-YG.d.mts.map +1 -0
  22. package/dist/adaptors/aws.cjs +742 -21
  23. package/dist/adaptors/aws.cjs.map +1 -0
  24. package/dist/adaptors/aws.d.cts +221 -17
  25. package/dist/adaptors/aws.d.cts.map +1 -0
  26. package/dist/adaptors/aws.d.mts +221 -17
  27. package/dist/adaptors/aws.d.mts.map +1 -0
  28. package/dist/adaptors/aws.mjs +739 -18
  29. package/dist/adaptors/aws.mjs.map +1 -0
  30. package/dist/adaptors/hono.cjs +5 -12
  31. package/dist/adaptors/hono.d.cts +52 -10
  32. package/dist/adaptors/hono.d.cts.map +1 -0
  33. package/dist/adaptors/hono.d.mts +52 -10
  34. package/dist/adaptors/hono.d.mts.map +1 -0
  35. package/dist/adaptors/hono.mjs +5 -12
  36. package/dist/adaptors/testing.cjs +392 -21
  37. package/dist/adaptors/testing.cjs.map +1 -0
  38. package/dist/adaptors/testing.d.cts +177 -14
  39. package/dist/adaptors/testing.d.cts.map +1 -0
  40. package/dist/adaptors/testing.d.mts +177 -14
  41. package/dist/adaptors/testing.d.mts.map +1 -0
  42. package/dist/adaptors/testing.mjs +388 -17
  43. package/dist/adaptors/testing.mjs.map +1 -0
  44. package/dist/crons/index.cjs +82 -10
  45. package/dist/crons/index.cjs.map +1 -1
  46. package/dist/crons/index.d.cts +44 -7
  47. package/dist/crons/index.d.cts.map +1 -1
  48. package/dist/crons/index.d.mts +45 -11
  49. package/dist/crons/index.d.mts.map +1 -1
  50. package/dist/crons/index.mjs +79 -7
  51. package/dist/crons/index.mjs.map +1 -1
  52. package/dist/endpoints/index.cjs +741 -23
  53. package/dist/endpoints/index.cjs.map +1 -1
  54. package/dist/endpoints/index.d.cts +336 -14
  55. package/dist/endpoints/index.d.cts.map +1 -1
  56. package/dist/endpoints/index.d.mts +335 -14
  57. package/dist/endpoints/index.d.mts.map +1 -1
  58. package/dist/endpoints/index.mjs +730 -12
  59. package/dist/endpoints/index.mjs.map +1 -1
  60. package/dist/functions/index.cjs +5 -8
  61. package/dist/functions/index.d.cts +2 -5
  62. package/dist/functions/index.d.mts +2 -5
  63. package/dist/functions/index.mjs +2 -5
  64. package/dist/functions-DiaRAdfp.cjs +2893 -0
  65. package/dist/functions-DiaRAdfp.cjs.map +1 -0
  66. package/dist/functions-GmSHFbpr.mjs +2864 -0
  67. package/dist/functions-GmSHFbpr.mjs.map +1 -0
  68. package/dist/index-Cq4fz8uM.d.mts +132 -0
  69. package/dist/index-Cq4fz8uM.d.mts.map +1 -0
  70. package/dist/index-CzIMpK-e.d.cts +135 -0
  71. package/dist/index-CzIMpK-e.d.cts.map +1 -0
  72. package/dist/index.cjs +1 -1
  73. package/dist/index.d.cts +3 -3
  74. package/dist/index.d.mts +3 -3
  75. package/dist/index.mjs +1 -1
  76. package/dist/lazyAccessors-5h-aWohM.mjs +1894 -0
  77. package/dist/lazyAccessors-5h-aWohM.mjs.map +1 -0
  78. package/dist/lazyAccessors-Bc1u42WC.cjs +1971 -0
  79. package/dist/lazyAccessors-Bc1u42WC.cjs.map +1 -0
  80. package/dist/processAudits-B0PbJf1Z.mjs +80 -0
  81. package/dist/processAudits-B0PbJf1Z.mjs.map +1 -0
  82. package/dist/processAudits-CUko08pi.cjs +92 -0
  83. package/dist/processAudits-CUko08pi.cjs.map +1 -0
  84. package/dist/subscribers/index.cjs +77 -6
  85. package/dist/subscribers/index.cjs.map +1 -1
  86. package/dist/subscribers/index.d.cts +27 -5
  87. package/dist/subscribers/index.d.cts.map +1 -1
  88. package/dist/subscribers/index.d.mts +26 -5
  89. package/dist/subscribers/index.d.mts.map +1 -1
  90. package/dist/subscribers/index.mjs +74 -3
  91. package/dist/subscribers/index.mjs.map +1 -1
  92. package/dist/{telemetry-BTaiRqPo.d.cts → telemetry-Bt0vK4ma.d.cts} +1 -1
  93. package/dist/{telemetry-BJo1gcV1.d.mts.map → telemetry-Bt0vK4ma.d.cts.map} +1 -1
  94. package/dist/{telemetry-BJo1gcV1.d.mts → telemetry-COvVBKBM.d.mts} +1 -1
  95. package/dist/{telemetry-BTaiRqPo.d.cts.map → telemetry-COvVBKBM.d.mts.map} +1 -1
  96. package/dist/{types-B5H3piDg.d.cts → types-B8YlI4cx.d.cts} +1 -1
  97. package/dist/{types-B5H3piDg.d.cts.map → types-B8YlI4cx.d.cts.map} +1 -1
  98. package/dist/{types-BqPOdHEm.d.mts → types-BA3eK4xj.d.mts} +1 -1
  99. package/dist/{types-BqPOdHEm.d.mts.map → types-BA3eK4xj.d.mts.map} +1 -1
  100. package/dist/types.d.cts +1 -1
  101. package/dist/types.d.mts +1 -1
  102. package/package.json +12 -12
  103. package/src/Construct.ts +26 -8
  104. package/src/__tests__/Construct.environment.spec.ts +123 -0
  105. package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +23 -4
  106. package/src/endpoints/Endpoint.ts +14 -1
  107. package/src/endpoints/EndpointBuilder.ts +25 -0
  108. package/src/endpoints/HonoEndpointAdaptor.ts +24 -1
  109. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.responseType.spec.ts +111 -0
  110. package/src/endpoints/__tests__/Endpoint.spec.ts +29 -0
  111. package/src/endpoints/__tests__/EndpointBuilder.responseType.spec.ts +47 -0
  112. package/src/endpoints/__tests__/HonoEndpointAdaptor.responseType.spec.ts +128 -0
  113. package/src/endpoints/__tests__/MswEndpointAdaptor.spec.ts +1 -9
  114. package/tsdown.config.ts +30 -1
  115. package/dist/AWSLambdaFunction-CC8gMZhz.d.mts +0 -32
  116. package/dist/AWSLambdaFunction-CC8gMZhz.d.mts.map +0 -1
  117. package/dist/AWSLambdaFunction-CPEAl5nZ.cjs +0 -120
  118. package/dist/AWSLambdaFunction-CPEAl5nZ.cjs.map +0 -1
  119. package/dist/AWSLambdaFunction-DJiCAPAf.mjs +0 -114
  120. package/dist/AWSLambdaFunction-DJiCAPAf.mjs.map +0 -1
  121. package/dist/AWSLambdaFunction-tzqv5XU6.d.cts +0 -32
  122. package/dist/AWSLambdaFunction-tzqv5XU6.d.cts.map +0 -1
  123. package/dist/AWSLambdaSubscriberAdaptor-Cj1wjkUP.d.cts +0 -36
  124. package/dist/AWSLambdaSubscriberAdaptor-Cj1wjkUP.d.cts.map +0 -1
  125. package/dist/AWSLambdaSubscriberAdaptor-Cmx9OQGG.d.mts +0 -36
  126. package/dist/AWSLambdaSubscriberAdaptor-Cmx9OQGG.d.mts.map +0 -1
  127. package/dist/AWSLambdaSubscriberAdaptor-RKwKYLl1.mjs +0 -172
  128. package/dist/AWSLambdaSubscriberAdaptor-RKwKYLl1.mjs.map +0 -1
  129. package/dist/AWSLambdaSubscriberAdaptor-eZ3qoKvK.cjs +0 -178
  130. package/dist/AWSLambdaSubscriberAdaptor-eZ3qoKvK.cjs.map +0 -1
  131. package/dist/AmazonApiGatewayEndpointAdaptor-BIltcbAc.cjs +0 -277
  132. package/dist/AmazonApiGatewayEndpointAdaptor-BIltcbAc.cjs.map +0 -1
  133. package/dist/AmazonApiGatewayEndpointAdaptor-BpYtYCeW.mjs +0 -271
  134. package/dist/AmazonApiGatewayEndpointAdaptor-BpYtYCeW.mjs.map +0 -1
  135. package/dist/AmazonApiGatewayEndpointAdaptor-DA0rS_1Y.d.mts +0 -124
  136. package/dist/AmazonApiGatewayEndpointAdaptor-DA0rS_1Y.d.mts.map +0 -1
  137. package/dist/AmazonApiGatewayEndpointAdaptor-DqNcQGMf.d.cts +0 -124
  138. package/dist/AmazonApiGatewayEndpointAdaptor-DqNcQGMf.d.cts.map +0 -1
  139. package/dist/AmazonApiGatewayV1EndpointAdaptor-C7rJzNvG.d.mts +0 -23
  140. package/dist/AmazonApiGatewayV1EndpointAdaptor-C7rJzNvG.d.mts.map +0 -1
  141. package/dist/AmazonApiGatewayV1EndpointAdaptor-CRwyWT6t.mjs +0 -42
  142. package/dist/AmazonApiGatewayV1EndpointAdaptor-CRwyWT6t.mjs.map +0 -1
  143. package/dist/AmazonApiGatewayV1EndpointAdaptor-DEETT6Wj.cjs +0 -47
  144. package/dist/AmazonApiGatewayV1EndpointAdaptor-DEETT6Wj.cjs.map +0 -1
  145. package/dist/AmazonApiGatewayV1EndpointAdaptor-DcN2fYsv.d.cts +0 -23
  146. package/dist/AmazonApiGatewayV1EndpointAdaptor-DcN2fYsv.d.cts.map +0 -1
  147. package/dist/AmazonApiGatewayV2EndpointAdaptor-C2qO8FN6.cjs +0 -48
  148. package/dist/AmazonApiGatewayV2EndpointAdaptor-C2qO8FN6.cjs.map +0 -1
  149. package/dist/AmazonApiGatewayV2EndpointAdaptor-Cn9UoRgB.d.cts +0 -22
  150. package/dist/AmazonApiGatewayV2EndpointAdaptor-Cn9UoRgB.d.cts.map +0 -1
  151. package/dist/AmazonApiGatewayV2EndpointAdaptor-d7NP-bZX.d.mts +0 -22
  152. package/dist/AmazonApiGatewayV2EndpointAdaptor-d7NP-bZX.d.mts.map +0 -1
  153. package/dist/AmazonApiGatewayV2EndpointAdaptor-m9YKI294.mjs +0 -42
  154. package/dist/AmazonApiGatewayV2EndpointAdaptor-m9YKI294.mjs.map +0 -1
  155. package/dist/Authorizer-BZ1LcZFt.cjs +0 -92
  156. package/dist/Authorizer-BZ1LcZFt.cjs.map +0 -1
  157. package/dist/Authorizer-C5_FC_Rq.d.mts +0 -126
  158. package/dist/Authorizer-C5_FC_Rq.d.mts.map +0 -1
  159. package/dist/Authorizer-CZpg1Jqk.mjs +0 -68
  160. package/dist/Authorizer-CZpg1Jqk.mjs.map +0 -1
  161. package/dist/Authorizer-DWtwC8we.d.cts +0 -126
  162. package/dist/Authorizer-DWtwC8we.d.cts.map +0 -1
  163. package/dist/BaseFunctionBuilder-C-4hYTfj.d.cts +0 -42
  164. package/dist/BaseFunctionBuilder-C-4hYTfj.d.cts.map +0 -1
  165. package/dist/BaseFunctionBuilder-C3rQMoWb.mjs +0 -70
  166. package/dist/BaseFunctionBuilder-C3rQMoWb.mjs.map +0 -1
  167. package/dist/BaseFunctionBuilder-DXf6HK-N.cjs +0 -76
  168. package/dist/BaseFunctionBuilder-DXf6HK-N.cjs.map +0 -1
  169. package/dist/BaseFunctionBuilder-Q5qIlF-F.d.mts +0 -42
  170. package/dist/BaseFunctionBuilder-Q5qIlF-F.d.mts.map +0 -1
  171. package/dist/Construct-BXG8cFSm.cjs.map +0 -1
  172. package/dist/Construct-CQ9zV58W.mjs.map +0 -1
  173. package/dist/Construct-CX7HyFfT.d.cts.map +0 -1
  174. package/dist/Construct.cjs +0 -6
  175. package/dist/Construct.d.cts +0 -2
  176. package/dist/Construct.d.mts +0 -2
  177. package/dist/Construct.mjs +0 -3
  178. package/dist/Cron-BljK1gsV.d.mts +0 -26
  179. package/dist/Cron-BljK1gsV.d.mts.map +0 -1
  180. package/dist/Cron-C1vyfJ8B.cjs +0 -25
  181. package/dist/Cron-C1vyfJ8B.cjs.map +0 -1
  182. package/dist/Cron-CjWQEad0.mjs +0 -20
  183. package/dist/Cron-CjWQEad0.mjs.map +0 -1
  184. package/dist/Cron-CllHkk3z.d.cts +0 -26
  185. package/dist/Cron-CllHkk3z.d.cts.map +0 -1
  186. package/dist/CronBuilder-CAJFtnmZ.mjs +0 -68
  187. package/dist/CronBuilder-CAJFtnmZ.mjs.map +0 -1
  188. package/dist/CronBuilder-CG54f9LM.d.mts +0 -32
  189. package/dist/CronBuilder-CG54f9LM.d.mts.map +0 -1
  190. package/dist/CronBuilder-CSMd02lu.cjs +0 -74
  191. package/dist/CronBuilder-CSMd02lu.cjs.map +0 -1
  192. package/dist/CronBuilder-i23l40xs.d.cts +0 -32
  193. package/dist/CronBuilder-i23l40xs.d.cts.map +0 -1
  194. package/dist/Endpoint-BET0JSZK.d.mts.map +0 -1
  195. package/dist/Endpoint-BcxvF4F3.cjs +0 -440
  196. package/dist/Endpoint-BcxvF4F3.cjs.map +0 -1
  197. package/dist/Endpoint-CGdCGJkC.d.cts.map +0 -1
  198. package/dist/Endpoint-DvY3aqAy.mjs +0 -422
  199. package/dist/Endpoint-DvY3aqAy.mjs.map +0 -1
  200. package/dist/EndpointBuilder-6kdrQyIh.d.mts +0 -146
  201. package/dist/EndpointBuilder-6kdrQyIh.d.mts.map +0 -1
  202. package/dist/EndpointBuilder-CSwIguiR.d.cts +0 -146
  203. package/dist/EndpointBuilder-CSwIguiR.d.cts.map +0 -1
  204. package/dist/EndpointBuilder-EptJojG9.cjs +0 -268
  205. package/dist/EndpointBuilder-EptJojG9.cjs.map +0 -1
  206. package/dist/EndpointBuilder-iDpnACRb.mjs +0 -262
  207. package/dist/EndpointBuilder-iDpnACRb.mjs.map +0 -1
  208. package/dist/EndpointFactory-CBagQW5j.d.mts +0 -142
  209. package/dist/EndpointFactory-CBagQW5j.d.mts.map +0 -1
  210. package/dist/EndpointFactory-D2QxeaAh.cjs +0 -393
  211. package/dist/EndpointFactory-D2QxeaAh.cjs.map +0 -1
  212. package/dist/EndpointFactory-DQYSH8XK.d.cts +0 -142
  213. package/dist/EndpointFactory-DQYSH8XK.d.cts.map +0 -1
  214. package/dist/EndpointFactory-wgcqWod-.mjs +0 -381
  215. package/dist/EndpointFactory-wgcqWod-.mjs.map +0 -1
  216. package/dist/Function-CwlB89lS.d.cts +0 -76
  217. package/dist/Function-CwlB89lS.d.cts.map +0 -1
  218. package/dist/Function-D74HrBnX.d.mts +0 -76
  219. package/dist/Function-D74HrBnX.d.mts.map +0 -1
  220. package/dist/Function-DgQ_no6B.cjs +0 -84
  221. package/dist/Function-DgQ_no6B.cjs.map +0 -1
  222. package/dist/Function-xfQbftdE.mjs +0 -72
  223. package/dist/Function-xfQbftdE.mjs.map +0 -1
  224. package/dist/FunctionBuilder-CBeqX18X.mjs +0 -80
  225. package/dist/FunctionBuilder-CBeqX18X.mjs.map +0 -1
  226. package/dist/FunctionBuilder-C_qPxC8g.d.mts +0 -40
  227. package/dist/FunctionBuilder-C_qPxC8g.d.mts.map +0 -1
  228. package/dist/FunctionBuilder-C_xG9As7.cjs +0 -86
  229. package/dist/FunctionBuilder-C_xG9As7.cjs.map +0 -1
  230. package/dist/FunctionBuilder-D_7f5MfS.d.cts +0 -40
  231. package/dist/FunctionBuilder-D_7f5MfS.d.cts.map +0 -1
  232. package/dist/FunctionExecutionWrapper-B0ZAssiy.mjs +0 -101
  233. package/dist/FunctionExecutionWrapper-B0ZAssiy.mjs.map +0 -1
  234. package/dist/FunctionExecutionWrapper-Cg8HjuHL.d.cts +0 -50
  235. package/dist/FunctionExecutionWrapper-Cg8HjuHL.d.cts.map +0 -1
  236. package/dist/FunctionExecutionWrapper-KKHP6fDY.cjs +0 -107
  237. package/dist/FunctionExecutionWrapper-KKHP6fDY.cjs.map +0 -1
  238. package/dist/FunctionExecutionWrapper-xbTmBARx.d.mts +0 -50
  239. package/dist/FunctionExecutionWrapper-xbTmBARx.d.mts.map +0 -1
  240. package/dist/HonoEndpointAdaptor-B5fKdLi7.cjs.map +0 -1
  241. package/dist/HonoEndpointAdaptor-C2deTEwW.d.mts +0 -50
  242. package/dist/HonoEndpointAdaptor-C2deTEwW.d.mts.map +0 -1
  243. package/dist/HonoEndpointAdaptor-D3IgM-0B.d.cts +0 -50
  244. package/dist/HonoEndpointAdaptor-D3IgM-0B.d.cts.map +0 -1
  245. package/dist/HonoEndpointAdaptor-DOUODM7n.mjs.map +0 -1
  246. package/dist/MswEndpointAdaptor-B41INCc7.mjs +0 -108
  247. package/dist/MswEndpointAdaptor-B41INCc7.mjs.map +0 -1
  248. package/dist/MswEndpointAdaptor-CA_fu6Wx.cjs +0 -120
  249. package/dist/MswEndpointAdaptor-CA_fu6Wx.cjs.map +0 -1
  250. package/dist/MswEndpointAdaptor-CXgYbOxw.d.mts +0 -101
  251. package/dist/MswEndpointAdaptor-CXgYbOxw.d.mts.map +0 -1
  252. package/dist/MswEndpointAdaptor-CsYvrQeB.d.cts +0 -101
  253. package/dist/MswEndpointAdaptor-CsYvrQeB.d.cts.map +0 -1
  254. package/dist/Subscriber-9ObcUdcC.d.mts.map +0 -1
  255. package/dist/Subscriber-BH76wgkL.mjs +0 -28
  256. package/dist/Subscriber-BH76wgkL.mjs.map +0 -1
  257. package/dist/Subscriber-BgspJeS4.cjs +0 -34
  258. package/dist/Subscriber-BgspJeS4.cjs.map +0 -1
  259. package/dist/SubscriberBuilder-B4md5wzs.mjs +0 -54
  260. package/dist/SubscriberBuilder-B4md5wzs.mjs.map +0 -1
  261. package/dist/SubscriberBuilder-Be7WBbCL.d.cts +0 -28
  262. package/dist/SubscriberBuilder-Be7WBbCL.d.cts.map +0 -1
  263. package/dist/SubscriberBuilder-BtL22ZJ9.cjs +0 -60
  264. package/dist/SubscriberBuilder-BtL22ZJ9.cjs.map +0 -1
  265. package/dist/SubscriberBuilder-DsfIkgTF.d.mts +0 -28
  266. package/dist/SubscriberBuilder-DsfIkgTF.d.mts.map +0 -1
  267. package/dist/TestEndpointAdaptor-BFmgf7Fn.mjs +0 -174
  268. package/dist/TestEndpointAdaptor-BFmgf7Fn.mjs.map +0 -1
  269. package/dist/TestEndpointAdaptor-C79Z-QS4.d.mts +0 -45
  270. package/dist/TestEndpointAdaptor-C79Z-QS4.d.mts.map +0 -1
  271. package/dist/TestEndpointAdaptor-DYLDyAAC.cjs +0 -180
  272. package/dist/TestEndpointAdaptor-DYLDyAAC.cjs.map +0 -1
  273. package/dist/TestEndpointAdaptor-pM8yskbb.d.cts +0 -45
  274. package/dist/TestEndpointAdaptor-pM8yskbb.d.cts.map +0 -1
  275. package/dist/TestFunctionAdaptor-B859kIeb.cjs +0 -81
  276. package/dist/TestFunctionAdaptor-B859kIeb.cjs.map +0 -1
  277. package/dist/TestFunctionAdaptor-C0A-VqnM.d.mts +0 -30
  278. package/dist/TestFunctionAdaptor-C0A-VqnM.d.mts.map +0 -1
  279. package/dist/TestFunctionAdaptor-CqdSlhx1.mjs +0 -75
  280. package/dist/TestFunctionAdaptor-CqdSlhx1.mjs.map +0 -1
  281. package/dist/TestFunctionAdaptor-Dbq55dKP.d.cts +0 -30
  282. package/dist/TestFunctionAdaptor-Dbq55dKP.d.cts.map +0 -1
  283. package/dist/TestSubscriberAdaptor-BEyCFP9G.d.mts +0 -26
  284. package/dist/TestSubscriberAdaptor-BEyCFP9G.d.mts.map +0 -1
  285. package/dist/TestSubscriberAdaptor-BknOLRQw.d.cts +0 -26
  286. package/dist/TestSubscriberAdaptor-BknOLRQw.d.cts.map +0 -1
  287. package/dist/TestSubscriberAdaptor-CCcviuKa.mjs +0 -51
  288. package/dist/TestSubscriberAdaptor-CCcviuKa.mjs.map +0 -1
  289. package/dist/TestSubscriberAdaptor-_69o1d0f.cjs +0 -57
  290. package/dist/TestSubscriberAdaptor-_69o1d0f.cjs.map +0 -1
  291. package/dist/chunk-CUT6urMc.cjs +0 -30
  292. package/dist/crons/Cron.cjs +0 -8
  293. package/dist/crons/Cron.d.cts +0 -7
  294. package/dist/crons/Cron.d.mts +0 -7
  295. package/dist/crons/Cron.mjs +0 -8
  296. package/dist/crons/CronBuilder.cjs +0 -9
  297. package/dist/crons/CronBuilder.d.cts +0 -8
  298. package/dist/crons/CronBuilder.d.mts +0 -8
  299. package/dist/crons/CronBuilder.mjs +0 -9
  300. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +0 -11
  301. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +0 -11
  302. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +0 -11
  303. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +0 -11
  304. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +0 -13
  305. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +0 -12
  306. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +0 -12
  307. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +0 -13
  308. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +0 -13
  309. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +0 -12
  310. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +0 -12
  311. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +0 -13
  312. package/dist/endpoints/Authorizer.cjs +0 -6
  313. package/dist/endpoints/Authorizer.d.cts +0 -2
  314. package/dist/endpoints/Authorizer.d.mts +0 -2
  315. package/dist/endpoints/Authorizer.mjs +0 -3
  316. package/dist/endpoints/Endpoint.cjs +0 -10
  317. package/dist/endpoints/Endpoint.d.cts +0 -9
  318. package/dist/endpoints/Endpoint.d.mts +0 -9
  319. package/dist/endpoints/Endpoint.mjs +0 -8
  320. package/dist/endpoints/EndpointBuilder.cjs +0 -11
  321. package/dist/endpoints/EndpointBuilder.d.cts +0 -10
  322. package/dist/endpoints/EndpointBuilder.d.mts +0 -10
  323. package/dist/endpoints/EndpointBuilder.mjs +0 -11
  324. package/dist/endpoints/EndpointFactory.cjs +0 -13
  325. package/dist/endpoints/EndpointFactory.d.cts +0 -11
  326. package/dist/endpoints/EndpointFactory.d.mts +0 -11
  327. package/dist/endpoints/EndpointFactory.mjs +0 -12
  328. package/dist/endpoints/HonoEndpointAdaptor.cjs +0 -14
  329. package/dist/endpoints/HonoEndpointAdaptor.d.cts +0 -10
  330. package/dist/endpoints/HonoEndpointAdaptor.d.mts +0 -10
  331. package/dist/endpoints/HonoEndpointAdaptor.mjs +0 -14
  332. package/dist/endpoints/MswEndpointAdaptor.cjs +0 -16
  333. package/dist/endpoints/MswEndpointAdaptor.d.cts +0 -10
  334. package/dist/endpoints/MswEndpointAdaptor.d.mts +0 -10
  335. package/dist/endpoints/MswEndpointAdaptor.mjs +0 -15
  336. package/dist/endpoints/TestEndpointAdaptor.cjs +0 -12
  337. package/dist/endpoints/TestEndpointAdaptor.d.cts +0 -10
  338. package/dist/endpoints/TestEndpointAdaptor.d.mts +0 -10
  339. package/dist/endpoints/TestEndpointAdaptor.mjs +0 -12
  340. package/dist/endpoints/audit.cjs +0 -0
  341. package/dist/endpoints/audit.d.cts +0 -9
  342. package/dist/endpoints/audit.d.mts +0 -9
  343. package/dist/endpoints/audit.mjs +0 -0
  344. package/dist/endpoints/helpers.cjs +0 -10
  345. package/dist/endpoints/helpers.d.cts +0 -60
  346. package/dist/endpoints/helpers.d.cts.map +0 -1
  347. package/dist/endpoints/helpers.d.mts +0 -60
  348. package/dist/endpoints/helpers.d.mts.map +0 -1
  349. package/dist/endpoints/helpers.mjs +0 -9
  350. package/dist/endpoints/lazyAccessors.cjs +0 -10
  351. package/dist/endpoints/lazyAccessors.d.cts +0 -10
  352. package/dist/endpoints/lazyAccessors.d.mts +0 -10
  353. package/dist/endpoints/lazyAccessors.mjs +0 -3
  354. package/dist/endpoints/parseHonoQuery.cjs +0 -3
  355. package/dist/endpoints/parseHonoQuery.d.cts +0 -14
  356. package/dist/endpoints/parseHonoQuery.d.cts.map +0 -1
  357. package/dist/endpoints/parseHonoQuery.d.mts +0 -14
  358. package/dist/endpoints/parseHonoQuery.d.mts.map +0 -1
  359. package/dist/endpoints/parseHonoQuery.mjs +0 -3
  360. package/dist/endpoints/parseQueryParams.cjs +0 -3
  361. package/dist/endpoints/parseQueryParams.d.cts +0 -14
  362. package/dist/endpoints/parseQueryParams.d.cts.map +0 -1
  363. package/dist/endpoints/parseQueryParams.d.mts +0 -14
  364. package/dist/endpoints/parseQueryParams.d.mts.map +0 -1
  365. package/dist/endpoints/parseQueryParams.mjs +0 -3
  366. package/dist/endpoints/processAudits.cjs +0 -5
  367. package/dist/endpoints/processAudits.d.cts +0 -95
  368. package/dist/endpoints/processAudits.d.cts.map +0 -1
  369. package/dist/endpoints/processAudits.d.mts +0 -95
  370. package/dist/endpoints/processAudits.d.mts.map +0 -1
  371. package/dist/endpoints/processAudits.mjs +0 -3
  372. package/dist/endpoints/rls.cjs +0 -3
  373. package/dist/endpoints/rls.d.cts +0 -9
  374. package/dist/endpoints/rls.d.mts +0 -9
  375. package/dist/endpoints/rls.mjs +0 -3
  376. package/dist/functions/AWSLambdaFunction.cjs +0 -9
  377. package/dist/functions/AWSLambdaFunction.d.cts +0 -5
  378. package/dist/functions/AWSLambdaFunction.d.mts +0 -5
  379. package/dist/functions/AWSLambdaFunction.mjs +0 -9
  380. package/dist/functions/BaseFunctionBuilder.cjs +0 -4
  381. package/dist/functions/BaseFunctionBuilder.d.cts +0 -3
  382. package/dist/functions/BaseFunctionBuilder.d.mts +0 -3
  383. package/dist/functions/BaseFunctionBuilder.mjs +0 -4
  384. package/dist/functions/Function.cjs +0 -5
  385. package/dist/functions/Function.d.cts +0 -3
  386. package/dist/functions/Function.d.mts +0 -3
  387. package/dist/functions/Function.mjs +0 -4
  388. package/dist/functions/FunctionBuilder.cjs +0 -6
  389. package/dist/functions/FunctionBuilder.d.cts +0 -5
  390. package/dist/functions/FunctionBuilder.d.mts +0 -5
  391. package/dist/functions/FunctionBuilder.mjs +0 -6
  392. package/dist/functions/FunctionExecutionWrapper.cjs +0 -8
  393. package/dist/functions/FunctionExecutionWrapper.d.cts +0 -4
  394. package/dist/functions/FunctionExecutionWrapper.d.mts +0 -4
  395. package/dist/functions/FunctionExecutionWrapper.mjs +0 -8
  396. package/dist/functions/TestFunctionAdaptor.cjs +0 -8
  397. package/dist/functions/TestFunctionAdaptor.d.cts +0 -4
  398. package/dist/functions/TestFunctionAdaptor.d.mts +0 -4
  399. package/dist/functions/TestFunctionAdaptor.mjs +0 -8
  400. package/dist/functions-B1mrMoUH.mjs +0 -8
  401. package/dist/functions-B1mrMoUH.mjs.map +0 -1
  402. package/dist/functions-rOD3pXQd.cjs +0 -13
  403. package/dist/functions-rOD3pXQd.cjs.map +0 -1
  404. package/dist/helpers-BYyX0qTA.cjs +0 -95
  405. package/dist/helpers-BYyX0qTA.cjs.map +0 -1
  406. package/dist/helpers-BtwC2IW8.mjs +0 -83
  407. package/dist/helpers-BtwC2IW8.mjs.map +0 -1
  408. package/dist/index-BfeupgMl.d.cts +0 -12
  409. package/dist/index-BfeupgMl.d.cts.map +0 -1
  410. package/dist/index-Cg2UDz1r.d.mts +0 -12
  411. package/dist/index-Cg2UDz1r.d.mts.map +0 -1
  412. package/dist/lazyAccessors-BVEtB9lU.cjs +0 -223
  413. package/dist/lazyAccessors-BVEtB9lU.cjs.map +0 -1
  414. package/dist/lazyAccessors-Bxy5DBp4.d.cts +0 -49
  415. package/dist/lazyAccessors-Bxy5DBp4.d.cts.map +0 -1
  416. package/dist/lazyAccessors-CWFdtzSR.d.mts +0 -49
  417. package/dist/lazyAccessors-CWFdtzSR.d.mts.map +0 -1
  418. package/dist/lazyAccessors-DM6HcXQk.mjs +0 -175
  419. package/dist/lazyAccessors-DM6HcXQk.mjs.map +0 -1
  420. package/dist/parseHonoQuery-BBs8CX-H.cjs +0 -24
  421. package/dist/parseHonoQuery-BBs8CX-H.cjs.map +0 -1
  422. package/dist/parseHonoQuery-Cp8CII0P.mjs +0 -18
  423. package/dist/parseHonoQuery-Cp8CII0P.mjs.map +0 -1
  424. package/dist/parseQueryParams-B4RK1za3.cjs +0 -31
  425. package/dist/parseQueryParams-B4RK1za3.cjs.map +0 -1
  426. package/dist/parseQueryParams-DS3Qmrbd.mjs +0 -25
  427. package/dist/parseQueryParams-DS3Qmrbd.mjs.map +0 -1
  428. package/dist/processAudits-CzHkPokQ.cjs +0 -180
  429. package/dist/processAudits-CzHkPokQ.cjs.map +0 -1
  430. package/dist/processAudits-Dj8UGqcW.mjs +0 -162
  431. package/dist/processAudits-Dj8UGqcW.mjs.map +0 -1
  432. package/dist/publisher-BUDHcaz3.d.cts +0 -16
  433. package/dist/publisher-BUDHcaz3.d.cts.map +0 -1
  434. package/dist/publisher-Bw4770Hi.mjs +0 -41
  435. package/dist/publisher-Bw4770Hi.mjs.map +0 -1
  436. package/dist/publisher-DXglijK_.d.mts +0 -16
  437. package/dist/publisher-DXglijK_.d.mts.map +0 -1
  438. package/dist/publisher-lFQleddL.cjs +0 -53
  439. package/dist/publisher-lFQleddL.cjs.map +0 -1
  440. package/dist/publisher.cjs +0 -4
  441. package/dist/publisher.d.cts +0 -3
  442. package/dist/publisher.d.mts +0 -3
  443. package/dist/publisher.mjs +0 -3
  444. package/dist/rls-C0r4UKVm.mjs +0 -9
  445. package/dist/rls-C0r4UKVm.mjs.map +0 -1
  446. package/dist/rls-Cfb6w-tQ.cjs +0 -15
  447. package/dist/rls-Cfb6w-tQ.cjs.map +0 -1
  448. package/dist/subscribers/AWSLambdaSubscriberAdaptor.cjs +0 -3
  449. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.cts +0 -4
  450. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +0 -4
  451. package/dist/subscribers/AWSLambdaSubscriberAdaptor.mjs +0 -3
  452. package/dist/subscribers/Subscriber.cjs +0 -4
  453. package/dist/subscribers/Subscriber.d.cts +0 -3
  454. package/dist/subscribers/Subscriber.d.mts +0 -3
  455. package/dist/subscribers/Subscriber.mjs +0 -4
  456. package/dist/subscribers/SubscriberBuilder.cjs +0 -5
  457. package/dist/subscribers/SubscriberBuilder.d.cts +0 -4
  458. package/dist/subscribers/SubscriberBuilder.d.mts +0 -4
  459. package/dist/subscribers/SubscriberBuilder.mjs +0 -5
  460. package/dist/subscribers/TestSubscriberAdaptor.cjs +0 -4
  461. package/dist/subscribers/TestSubscriberAdaptor.d.cts +0 -4
  462. package/dist/subscribers/TestSubscriberAdaptor.d.mts +0 -4
  463. package/dist/subscribers/TestSubscriberAdaptor.mjs +0 -4
  464. package/dist/telemetry.cjs +0 -0
  465. package/dist/telemetry.d.cts +0 -2
  466. package/dist/telemetry.d.mts +0 -2
  467. package/dist/telemetry.mjs +0 -0
@@ -61,6 +61,7 @@ export class EndpointBuilder<
61
61
  protected _status?: SuccessStatus;
62
62
  protected _tags?: string[];
63
63
  protected _memorySize?: number;
64
+ protected _responseType: string = 'application/json';
64
65
  _getSession: SessionFn<TServices, TLogger, TSession, TDatabase> = () =>
65
66
  ({}) as TSession;
66
67
  _authorize: AuthorizeFn<TServices, TLogger, TSession, TInput, TDatabase> =
@@ -127,6 +128,29 @@ export class EndpointBuilder<
127
128
  return this;
128
129
  }
129
130
 
131
+ /**
132
+ * Set the response content type for this endpoint.
133
+ *
134
+ * Defaults to `'application/json'`. When set to any other value
135
+ * (e.g. `'text/html'`, `'text/plain'`), the response body is emitted
136
+ * as-is rather than JSON-serialized, and the `Content-Type` header
137
+ * reflects the declared value. Runtime overrides via `r.header()` still win.
138
+ *
139
+ * @param type - The MIME type to return (e.g. `'text/html'`)
140
+ *
141
+ * @example
142
+ * ```typescript
143
+ * e.get('/checkout-page')
144
+ * .output(z.string())
145
+ * .responseType('text/html')
146
+ * .handle(async () => '<html>...</html>');
147
+ * ```
148
+ */
149
+ responseType(type: string): this {
150
+ this._responseType = type;
151
+ return this;
152
+ }
153
+
130
154
  override publisher<T extends EventPublisher<any>, TName extends string>(
131
155
  publisher: Service<TName, T>,
132
156
  ): EndpointBuilder<
@@ -728,6 +752,7 @@ export class EndpointBuilder<
728
752
  databaseService: this._databaseService,
729
753
  rlsConfig: this._rlsConfig,
730
754
  rlsBypass: this._rlsBypass,
755
+ responseType: this._responseType,
731
756
  });
732
757
  }
733
758
  }
@@ -68,6 +68,16 @@ interface EndpointFeatures {
68
68
  hasRls: boolean;
69
69
  }
70
70
 
71
+ /**
72
+ * Case-insensitive check for a `content-type` header in a metadata headers map.
73
+ */
74
+ function hasContentTypeHeader(headers: Record<string, string>): boolean {
75
+ for (const key of Object.keys(headers)) {
76
+ if (key.toLowerCase() === 'content-type') return true;
77
+ }
78
+ return false;
79
+ }
80
+
71
81
  /**
72
82
  * Analyze endpoint features at registration time (not per-request)
73
83
  */
@@ -591,8 +601,21 @@ export class HonoEndpoint<
591
601
  logger.info({ status, body: output }, 'Outgoing response');
592
602
  }
593
603
 
604
+ // Respect the endpoint's declared responseType. For JSON (default)
605
+ // we use c.json() which sets Content-Type and serializes. For any
606
+ // other type, emit the body as-is and set the header explicitly —
607
+ // metadata.headers (from r.header()) applied above still wins.
608
+ if (endpoint.responseType === 'application/json') {
609
+ // @ts-expect-error
610
+ return c.json(output, status);
611
+ }
612
+ if (
613
+ !(metadata.headers && hasContentTypeHeader(metadata.headers))
614
+ ) {
615
+ c.header('content-type', endpoint.responseType);
616
+ }
594
617
  // @ts-expect-error
595
- return c.json(output, status);
618
+ return c.body(output as any, status);
596
619
  } catch (validationError: any) {
597
620
  logger.error(validationError, 'Output validation failed');
598
621
  const error = wrapError(
@@ -0,0 +1,111 @@
1
+ import { EnvironmentParser } from '@geekmidas/envkit';
2
+ import { createMockContext, createMockV2Event } from '@geekmidas/testkit/aws';
3
+ import type { Context } from 'aws-lambda';
4
+ import { beforeEach, describe, expect, it } from 'vitest';
5
+ import { z } from 'zod';
6
+ import { AmazonApiGatewayV2Endpoint } from '../AmazonApiGatewayV2EndpointAdaptor';
7
+ import { e } from '../EndpointFactory';
8
+
9
+ describe('AmazonApiGatewayV2Endpoint — responseType', () => {
10
+ let envParser: EnvironmentParser<{}>;
11
+ let mockContext: Context;
12
+
13
+ beforeEach(() => {
14
+ envParser = new EnvironmentParser({});
15
+ mockContext = createMockContext();
16
+ });
17
+
18
+ it('JSON-stringifies body with no content-type header when responseType is default', async () => {
19
+ const endpoint = e
20
+ .get('/users/:id')
21
+ .params(z.object({ id: z.string() }))
22
+ .output(z.object({ id: z.string() }))
23
+ .handle(async ({ params }) => ({ id: params.id }));
24
+
25
+ const adapter = new AmazonApiGatewayV2Endpoint(envParser, endpoint);
26
+
27
+ const event = createMockV2Event({
28
+ routeKey: 'GET /users/{id}',
29
+ rawPath: '/users/123',
30
+ pathParameters: { id: '123' },
31
+ });
32
+
33
+ const response = await adapter.handler(event, mockContext);
34
+
35
+ expect(response.statusCode).toBe(200);
36
+ expect(response.body).toBe(JSON.stringify({ id: '123' }));
37
+ // Default JSON responseType should not inject a default content-type
38
+ expect(response.headers?.['content-type']).toBeUndefined();
39
+ });
40
+
41
+ it('emits raw string body and text/html header when responseType is text/html', async () => {
42
+ const html = '<html><body>Checkout</body></html>';
43
+ const endpoint = e
44
+ .get('/checkout-page')
45
+ .output(z.string())
46
+ .responseType('text/html')
47
+ .handle(async () => html);
48
+
49
+ const adapter = new AmazonApiGatewayV2Endpoint(envParser, endpoint);
50
+
51
+ const event = createMockV2Event({
52
+ routeKey: 'GET /checkout-page',
53
+ rawPath: '/checkout-page',
54
+ });
55
+
56
+ const response = await adapter.handler(event, mockContext);
57
+
58
+ expect(response.statusCode).toBe(200);
59
+ // Body emitted as-is, NOT JSON-encoded (would be `"<html>..."`)
60
+ expect(response.body).toBe(html);
61
+ expect(response.body?.startsWith('"')).toBe(false);
62
+ expect(response.headers?.['content-type']).toBe('text/html');
63
+ });
64
+
65
+ it('emits raw plain text for text/plain', async () => {
66
+ const endpoint = e
67
+ .get('/robots.txt')
68
+ .output(z.string())
69
+ .responseType('text/plain')
70
+ .handle(async () => 'User-agent: *');
71
+
72
+ const adapter = new AmazonApiGatewayV2Endpoint(envParser, endpoint);
73
+
74
+ const event = createMockV2Event({
75
+ routeKey: 'GET /robots.txt',
76
+ rawPath: '/robots.txt',
77
+ });
78
+
79
+ const response = await adapter.handler(event, mockContext);
80
+
81
+ expect(response.statusCode).toBe(200);
82
+ expect(response.body).toBe('User-agent: *');
83
+ expect(response.headers?.['content-type']).toBe('text/plain');
84
+ });
85
+
86
+ it('lets r.header() runtime override win over endpoint.responseType', async () => {
87
+ const endpoint = e
88
+ .get('/dynamic')
89
+ .output(z.string())
90
+ .responseType('text/html')
91
+ .handle(async (_ctx, r) => {
92
+ r.header('content-type', 'text/xml');
93
+ return r.send('<xml></xml>');
94
+ });
95
+
96
+ const adapter = new AmazonApiGatewayV2Endpoint(envParser, endpoint);
97
+
98
+ const event = createMockV2Event({
99
+ routeKey: 'GET /dynamic',
100
+ rawPath: '/dynamic',
101
+ });
102
+
103
+ const response = await adapter.handler(event, mockContext);
104
+
105
+ expect(response.statusCode).toBe(200);
106
+ // Body still emitted raw because responseType is not JSON
107
+ expect(response.body).toBe('<xml></xml>');
108
+ // Runtime r.header() wins over the declared responseType default
109
+ expect(response.headers?.['content-type']).toBe('text/xml');
110
+ });
111
+ });
@@ -77,6 +77,35 @@ describe('Endpoint', () => {
77
77
  });
78
78
  });
79
79
 
80
+ it('should use the endpoint responseType as the OpenAPI content key', async () => {
81
+ const endpoint = new Endpoint({
82
+ route: '/checkout-page',
83
+ method: 'GET',
84
+ description: 'Hosted checkout page',
85
+ fn: async () => '<html></html>',
86
+ input: undefined,
87
+ output: z.string(),
88
+ authorize: undefined,
89
+ services: [],
90
+ status: undefined,
91
+ getSession: undefined,
92
+ logger: {} as any,
93
+ timeout: undefined,
94
+ memorySize: undefined,
95
+ responseType: 'text/html',
96
+ });
97
+
98
+ const spec = await endpoint.toOpenApi3Route();
99
+ const response200 = (spec['/checkout-page'].get.responses?.['200'] ??
100
+ {}) as any;
101
+
102
+ expect(response200.content).toHaveProperty('text/html');
103
+ expect(response200.content).not.toHaveProperty('application/json');
104
+ expect(response200.content['text/html'].schema).toMatchObject({
105
+ type: 'string',
106
+ });
107
+ });
108
+
80
109
  it('should include request body for POST endpoint', async () => {
81
110
  const bodySchema = z.object({
82
111
  name: z.string(),
@@ -0,0 +1,47 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { z } from 'zod';
3
+ import { EndpointBuilder } from '../EndpointBuilder';
4
+
5
+ describe('EndpointBuilder.responseType', () => {
6
+ it("defaults to 'application/json' when not set", () => {
7
+ const endpoint = new EndpointBuilder('/users', 'GET')
8
+ .output(z.object({ id: z.string() }))
9
+ .handle(async () => ({ id: '1' }));
10
+
11
+ expect(endpoint.responseType).toBe('application/json');
12
+ });
13
+
14
+ it('stores a custom response type on the built Endpoint', () => {
15
+ const endpoint = new EndpointBuilder('/checkout-page', 'GET')
16
+ .output(z.string())
17
+ .responseType('text/html')
18
+ .handle(async () => '<html></html>');
19
+
20
+ expect(endpoint.responseType).toBe('text/html');
21
+ });
22
+
23
+ it('returns the builder for chaining', () => {
24
+ const builder = new EndpointBuilder('/users', 'GET');
25
+ const result = builder.responseType('text/plain');
26
+
27
+ expect(result).toBe(builder);
28
+ });
29
+
30
+ it('supports any arbitrary MIME type', () => {
31
+ const endpoint = new EndpointBuilder('/export.csv', 'GET')
32
+ .output(z.string())
33
+ .responseType('text/csv')
34
+ .handle(async () => 'a,b,c\n1,2,3');
35
+
36
+ expect(endpoint.responseType).toBe('text/csv');
37
+ });
38
+
39
+ it('last call wins when chained multiple times', () => {
40
+ const endpoint = new EndpointBuilder('/pdf', 'GET')
41
+ .responseType('text/html')
42
+ .responseType('application/pdf')
43
+ .handle(async () => 'pdf-bytes');
44
+
45
+ expect(endpoint.responseType).toBe('application/pdf');
46
+ });
47
+ });
@@ -0,0 +1,128 @@
1
+ import { EnvironmentParser } from '@geekmidas/envkit';
2
+ import type { Logger } from '@geekmidas/logger';
3
+ import { ServiceDiscovery } from '@geekmidas/services';
4
+ import { Hono } from 'hono';
5
+ import { describe, expect, it, vi } from 'vitest';
6
+ import { z } from 'zod';
7
+ import { Endpoint } from '../Endpoint';
8
+ import { HonoEndpoint } from '../HonoEndpointAdaptor';
9
+
10
+ const mockLogger: Logger = {
11
+ debug: vi.fn(),
12
+ info: vi.fn(),
13
+ warn: vi.fn(),
14
+ error: vi.fn(),
15
+ fatal: vi.fn(),
16
+ trace: vi.fn(),
17
+ child: vi.fn(() => mockLogger),
18
+ };
19
+
20
+ function makeEndpoint<T>(overrides: {
21
+ route: string;
22
+ method: 'GET';
23
+ output: any;
24
+ fn: () => Promise<T> | T;
25
+ responseType?: string;
26
+ }) {
27
+ return new Endpoint({
28
+ route: overrides.route,
29
+ method: overrides.method,
30
+ fn: overrides.fn as any,
31
+ input: undefined,
32
+ output: overrides.output,
33
+ services: [],
34
+ logger: mockLogger,
35
+ timeout: undefined,
36
+ memorySize: undefined,
37
+ status: undefined,
38
+ getSession: undefined,
39
+ authorize: undefined,
40
+ description: undefined,
41
+ responseType: overrides.responseType,
42
+ });
43
+ }
44
+
45
+ describe('HonoEndpointAdaptor — responseType', () => {
46
+ const envParser = new EnvironmentParser({});
47
+ const serviceDiscovery = ServiceDiscovery.getInstance(envParser);
48
+
49
+ it('defaults to application/json and JSON-encodes the output', async () => {
50
+ const endpoint = makeEndpoint({
51
+ route: '/users/:id',
52
+ method: 'GET',
53
+ output: z.object({ id: z.string() }),
54
+ fn: async () => ({ id: '123' }),
55
+ });
56
+
57
+ const app = new Hono();
58
+ new HonoEndpoint(endpoint).addRoute(serviceDiscovery, app);
59
+
60
+ const response = await app.request('/users/123');
61
+ expect(response.status).toBe(200);
62
+ expect(response.headers.get('content-type')).toMatch(/application\/json/);
63
+ expect(await response.json()).toEqual({ id: '123' });
64
+ });
65
+
66
+ it('emits raw HTML body when responseType is text/html', async () => {
67
+ const html = '<html><body><h1>Checkout</h1></body></html>';
68
+ const endpoint = makeEndpoint({
69
+ route: '/checkout-page',
70
+ method: 'GET',
71
+ output: z.string(),
72
+ fn: async () => html,
73
+ responseType: 'text/html',
74
+ });
75
+
76
+ const app = new Hono();
77
+ new HonoEndpoint(endpoint).addRoute(serviceDiscovery, app);
78
+
79
+ const response = await app.request('/checkout-page');
80
+ expect(response.status).toBe(200);
81
+ expect(response.headers.get('content-type')).toMatch(/text\/html/);
82
+
83
+ const body = await response.text();
84
+ // The body is emitted as-is, NOT JSON-encoded (would be `"<html>..."`)
85
+ expect(body).toBe(html);
86
+ expect(body.startsWith('"')).toBe(false);
87
+ });
88
+
89
+ it('emits raw plain text when responseType is text/plain', async () => {
90
+ const endpoint = makeEndpoint({
91
+ route: '/robots.txt',
92
+ method: 'GET',
93
+ output: z.string(),
94
+ fn: async () => 'User-agent: *\nDisallow:',
95
+ responseType: 'text/plain',
96
+ });
97
+
98
+ const app = new Hono();
99
+ new HonoEndpoint(endpoint).addRoute(serviceDiscovery, app);
100
+
101
+ const response = await app.request('/robots.txt');
102
+ expect(response.status).toBe(200);
103
+ expect(response.headers.get('content-type')).toMatch(/text\/plain/);
104
+ expect(await response.text()).toBe('User-agent: *\nDisallow:');
105
+ });
106
+
107
+ it('lets r.header() runtime override win over the declared responseType header', async () => {
108
+ const endpoint = makeEndpoint({
109
+ route: '/dynamic',
110
+ method: 'GET',
111
+ output: z.string(),
112
+ fn: async (_ctx: any, r: any) => {
113
+ r.header('content-type', 'text/xml; charset=utf-8');
114
+ return r.send('<xml></xml>');
115
+ },
116
+ responseType: 'text/html',
117
+ });
118
+
119
+ const app = new Hono();
120
+ new HonoEndpoint(endpoint).addRoute(serviceDiscovery, app);
121
+
122
+ const response = await app.request('/dynamic');
123
+ expect(response.status).toBe(200);
124
+ // Runtime header via r.header() takes precedence over endpoint.responseType
125
+ expect(response.headers.get('content-type')).toMatch(/text\/xml/);
126
+ expect(await response.text()).toBe('<xml></xml>');
127
+ });
128
+ });
@@ -1,13 +1,5 @@
1
1
  import { setupServer } from 'msw/node';
2
- import {
3
- afterAll,
4
- afterEach,
5
- beforeAll,
6
- describe,
7
- expect,
8
- it,
9
- vi,
10
- } from 'vitest';
2
+ import { afterAll, afterEach, beforeAll, describe, expect, it } from 'vitest';
11
3
  import { z } from 'zod';
12
4
  import { e } from '../EndpointFactory';
13
5
  import { createMswHandlers, TEST_CONTEXT_HEADER } from '../MswEndpointAdaptor';
package/tsdown.config.ts CHANGED
@@ -1,3 +1,32 @@
1
1
  import { defineConfig } from 'tsdown';
2
2
 
3
- export default defineConfig({});
3
+ export default defineConfig({
4
+ entry: [
5
+ 'src/index.ts',
6
+ 'src/types.ts',
7
+ 'src/endpoints/index.ts',
8
+ 'src/functions/index.ts',
9
+ 'src/crons/index.ts',
10
+ 'src/subscribers/index.ts',
11
+ 'src/adaptors/hono.ts',
12
+ 'src/adaptors/aws.ts',
13
+ 'src/adaptors/testing.ts',
14
+ ],
15
+ clean: true,
16
+ outDir: 'dist',
17
+ format: ['cjs', 'esm'],
18
+ sourcemap: true,
19
+ dts: true,
20
+ outExtensions: (ctx) => ({
21
+ js: ctx.format === 'es' ? '.mjs' : '.cjs',
22
+ }),
23
+ // Bundle lodash utilities — they are not hoisted to the workspace root
24
+ // and would fail to resolve when consumers load the dist from the root context.
25
+ noExternal: [
26
+ 'lodash.compact',
27
+ 'lodash.get',
28
+ 'lodash.pick',
29
+ 'lodash.set',
30
+ 'lodash.uniqby',
31
+ ],
32
+ });
@@ -1,32 +0,0 @@
1
- import { Function, FunctionHandler } from "./Function-D74HrBnX.mjs";
2
- import { FunctionExecutionWrapper } from "./FunctionExecutionWrapper-xbTmBARx.mjs";
3
- import { Service } from "@geekmidas/services";
4
- import { AuditStorage, AuditableAction } from "@geekmidas/audit";
5
- import { EnvironmentParser } from "@geekmidas/envkit";
6
- import { EventPublisher } from "@geekmidas/events";
7
- import { Logger } from "@geekmidas/logger";
8
- import { StandardSchemaV1 } from "@standard-schema/spec";
9
- import { Handler } from "aws-lambda";
10
- import { ComposableStandardSchema } from "@geekmidas/schema";
11
-
12
- //#region src/functions/AWSLambdaFunction.d.ts
13
- type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<TEvent, TResult>;
14
- declare class AWSLambdaFunction<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> extends FunctionExecutionWrapper<TInput, TOutSchema, TServices, TLogger, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction> {
15
- readonly fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>;
16
- constructor(envParser: EnvironmentParser<{}>, fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>);
17
- private error;
18
- private baseInput;
19
- private input;
20
- private loggerMiddleware;
21
- private services;
22
- private database;
23
- private auditor;
24
- private events;
25
- private _handler;
26
- get handler(): AWSLambdaHandler;
27
- }
28
- //# sourceMappingURL=AWSLambdaFunction.d.ts.map
29
-
30
- //#endregion
31
- export { AWSLambdaFunction, AWSLambdaHandler };
32
- //# sourceMappingURL=AWSLambdaFunction-CC8gMZhz.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AWSLambdaFunction-CC8gMZhz.d.mts","names":[],"sources":["../src/functions/AWSLambdaFunction.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;KAmBY,gDAAgD,QAC3D,QACA;cAuCY,iCACG,qEACI,4DACD,gCACF,SAAS,gCACD,uHAEF,kLAID,mCAAmC,0CAI/C,yBACT,QACA,YACA,WACA,SACA,iBACA,4BACA,eACA,0BACA,WACA,sBACA;EAnEW,SAAA,EAAA,EAuEY,QAvEI,CAwEzB,MAxEyB,EAyEzB,SAzEyB,EA0EzB,OA1EyB,EA2EzB,UA3EyB,EA4EzB,eA5EyB,EA6EzB,0BA7EyB,EA8EzB,aA9EyB,EA+EzB,wBA/EyB,EAgFzB,SAhFyB,EAiFzB,oBAjFyB,EAkFzB,YAlFyB,EAmFzB,eAnFyB,CAoFxB,MApFwB,EAqFxB,SArFwB,EAsFxB,OAtFwB,EAuFxB,UAvFwB,EAwFxB,SAxFwB,EAyFxB,aAzFwB,EA0FxB,YA1FwB,CAAA,CAAA;EAAA,WAAA,CAAA,SAAA,EAsEf,iBAtEe,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,EAuEJ,QAvEI,CAwEzB,MAxEyB,EAyEzB,SAzEyB,EA0EzB,OA1EyB,EA2EzB,UA3EyB,EA4EzB,eA5EyB,EA6EzB,0BA7EyB,EA8EzB,aA9EyB,EA+EzB,wBA/EyB,EAgFzB,SAhFyB,EAiFzB,oBAjFyB,EAkFzB,YAlFyB,EAmFzB,eAnFyB,CAoFxB,MApFwB,EAqFxB,SArFwB,EAsFxB,OAtFwB,EAuFxB,UAvFwB,EAwFxB,SAxFwB,EAyFxB,aAzFwB,EA0FxB,YA1FwB,CAAA,CAAA;EAAA,QAC3B,KAAA;EAAM,QACN,SAAA;EAAO,QAFoD,KAAA;EAAO,QAAA,gBAAA;EAyCtD,QAAA,QAAA;EAAiB,QAAA,QAAA;EAAA,QACd,OAAA;EAAwB,QACpB,MAAA;EAAgB,QACjB,QAAA;EAAO,IACT,OAAA,CAAA,CAAA,EAgQD,gBAhQC"}
@@ -1,120 +0,0 @@
1
- const require_chunk = require('./chunk-CUT6urMc.cjs');
2
- const require_FunctionBuilder = require('./FunctionBuilder-C_xG9As7.cjs');
3
- const require_FunctionExecutionWrapper = require('./FunctionExecutionWrapper-KKHP6fDY.cjs');
4
- const __middy_core = require_chunk.__toESM(require("@middy/core"));
5
- const __geekmidas_errors = require_chunk.__toESM(require("@geekmidas/errors"));
6
- const __geekmidas_services = require_chunk.__toESM(require("@geekmidas/services"));
7
-
8
- //#region src/functions/AWSLambdaFunction.ts
9
- var AWSLambdaFunction = class extends require_FunctionExecutionWrapper.FunctionExecutionWrapper {
10
- constructor(envParser, fn) {
11
- super(envParser, fn);
12
- this.fn = fn;
13
- }
14
- error() {
15
- return { onError: (req) => {
16
- const logger = req.event?.logger || this.fn.logger;
17
- logger.error(req.error || {}, "Error processing function");
18
- throw (0, __geekmidas_errors.wrapError)(req.error);
19
- } };
20
- }
21
- baseInput() {
22
- return { before: (_req) => {} };
23
- }
24
- input() {
25
- return { before: async (req) => {
26
- try {
27
- if (this.fn.input) {
28
- const parsedInput = await require_FunctionBuilder.FunctionBuilder.parseComposableStandardSchema(req.event, this.fn.input);
29
- req.event.parsedInput = parsedInput;
30
- } else req.event.parsedInput = req.event;
31
- } catch (error) {
32
- this.logger.error({
33
- error,
34
- event: req.event
35
- }, "Failed to parse input");
36
- throw error;
37
- }
38
- } };
39
- }
40
- loggerMiddleware() {
41
- return { before: (req) => {
42
- this._logger = this.fn.logger.child({
43
- fn: {
44
- name: req.context.functionName,
45
- version: req.context.functionVersion,
46
- memory: req.context.memoryLimitInMB
47
- },
48
- req: { id: req.context.awsRequestId }
49
- });
50
- req.event.logger = this._logger;
51
- } };
52
- }
53
- services() {
54
- return { before: async (req) => {
55
- req.event.services = await this.getServices();
56
- } };
57
- }
58
- database() {
59
- return { before: async (req) => {
60
- req.event.db = await this.getDatabase();
61
- } };
62
- }
63
- auditor() {
64
- return {
65
- before: async (req) => {
66
- req.event.auditor = await this.createAuditor();
67
- },
68
- after: async (req) => {
69
- if (req.event.auditor) {
70
- const records = req.event.auditor.getRecords();
71
- if (records.length > 0) {
72
- this.logger.debug({ auditCount: records.length }, "Flushing function audits");
73
- await req.event.auditor.flush();
74
- }
75
- }
76
- }
77
- };
78
- }
79
- events() {
80
- return { after: async (req) => {
81
- const response = req.response || void 0;
82
- await this.publishEvents(response);
83
- } };
84
- }
85
- async _handler(event) {
86
- const result = await this.fn.fn({
87
- input: event.parsedInput,
88
- services: event.services,
89
- logger: event.logger,
90
- db: event.db,
91
- auditor: event.auditor
92
- });
93
- const output = await this.fn.parseOutput(result);
94
- return output;
95
- }
96
- get handler() {
97
- const handler = this._handler.bind(this);
98
- const chain = (0, __middy_core.default)(handler).use(this.loggerMiddleware()).use(this.baseInput()).use(this.error()).use(this.services()).use(this.database()).use(this.auditor()).use(this.input()).use(this.events());
99
- const wrappedHandler = async (event, context) => {
100
- const startTime = Date.now();
101
- const requestId = context.awsRequestId;
102
- const logger = this.fn.logger.child({ requestId });
103
- return (0, __geekmidas_services.runWithRequestContext)({
104
- logger,
105
- requestId,
106
- startTime
107
- }, () => chain(event, context));
108
- };
109
- return wrappedHandler;
110
- }
111
- };
112
-
113
- //#endregion
114
- Object.defineProperty(exports, 'AWSLambdaFunction', {
115
- enumerable: true,
116
- get: function () {
117
- return AWSLambdaFunction;
118
- }
119
- });
120
- //# sourceMappingURL=AWSLambdaFunction-CPEAl5nZ.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AWSLambdaFunction-CPEAl5nZ.cjs","names":["FunctionExecutionWrapper","envParser: EnvironmentParser<{}>","fn: Function<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTAuditAction,\n\t\t\tFunctionHandler<\n\t\t\t\tTInput,\n\t\t\t\tTServices,\n\t\t\t\tTLogger,\n\t\t\t\tTOutSchema,\n\t\t\t\tTDatabase,\n\t\t\t\tTAuditStorage,\n\t\t\t\tTAuditAction\n\t\t\t>\n\t\t>","event: FunctionEvent<\n\t\t\tTEvent,\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTDatabase,\n\t\t\tTAuditAction\n\t\t>","event: unknown","context: Context"],"sources":["../src/functions/AWSLambdaFunction.ts"],"sourcesContent":["import type { AuditableAction, Auditor, AuditStorage } from '@geekmidas/audit';\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type {\n\tComposableStandardSchema,\n\tInferComposableStandardSchema,\n\tInferStandardSchema,\n} from '@geekmidas/schema';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport { runWithRequestContext } from '@geekmidas/services';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { Context, Handler } from 'aws-lambda';\nimport type { Function, FunctionHandler } from './Function';\nimport { FunctionBuilder } from './FunctionBuilder';\nimport { FunctionExecutionWrapper } from './FunctionExecutionWrapper';\n\nexport type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<\n\tTEvent,\n\tTResult\n>;\n\ntype FunctionEvent<\n\tTEvent,\n\tTInput extends ComposableStandardSchema | undefined,\n\tTServices extends Service[],\n\tTLogger extends Logger,\n\tTDatabase = undefined,\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n> = TEvent & {\n\tparsedInput: InferComposableStandardSchema<TInput>;\n\tservices: ServiceRecord<TServices>;\n\tlogger: TLogger;\n\tdb: TDatabase | undefined;\n\tauditor: Auditor<TAuditAction> | undefined;\n};\n\ntype Middleware<\n\tTEvent,\n\tTInput extends ComposableStandardSchema | undefined,\n\tTServices extends Service[],\n\tTLogger extends Logger,\n\tTOutSchema extends StandardSchemaV1 | undefined,\n\tTDatabase = undefined,\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n> = MiddlewareObj<\n\tFunctionEvent<TEvent, TInput, TServices, TLogger, TDatabase, TAuditAction>,\n\tInferComposableStandardSchema<TOutSchema>,\n\tError,\n\tContext\n>;\n\nexport class AWSLambdaFunction<\n\tTInput extends ComposableStandardSchema | undefined = undefined,\n\tTOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTAuditStorage extends AuditStorage | undefined = undefined,\n\tTAuditStorageServiceName extends string = string,\n\tTDatabase = undefined,\n\tTDatabaseServiceName extends string = string,\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n> extends FunctionExecutionWrapper<\n\tTInput,\n\tTOutSchema,\n\tTServices,\n\tTLogger,\n\tTEventPublisher,\n\tTEventPublisherServiceName,\n\tTAuditStorage,\n\tTAuditStorageServiceName,\n\tTDatabase,\n\tTDatabaseServiceName,\n\tTAuditAction\n> {\n\tconstructor(\n\t\tenvParser: EnvironmentParser<{}>,\n\t\toverride readonly fn: Function<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTAuditAction,\n\t\t\tFunctionHandler<\n\t\t\t\tTInput,\n\t\t\t\tTServices,\n\t\t\t\tTLogger,\n\t\t\t\tTOutSchema,\n\t\t\t\tTDatabase,\n\t\t\t\tTAuditStorage,\n\t\t\t\tTAuditAction\n\t\t\t>\n\t\t>,\n\t) {\n\t\tsuper(envParser, fn);\n\t}\n\n\tprivate error<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tonError: (req) => {\n\t\t\t\tconst logger = req.event?.logger || this.fn.logger;\n\t\t\t\tlogger.error(req.error || {}, 'Error processing function');\n\n\t\t\t\t// Re-throw the wrapped error to let Lambda handle it\n\t\t\t\tthrow wrapError(req.error);\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate baseInput<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tbefore: (_req) => {},\n\t\t};\n\t}\n\n\tprivate input<\n\t\tTEvent extends { input: InferComposableStandardSchema<TInput> },\n\t>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\ttry {\n\t\t\t\t\t// Parse input if schema is provided\n\t\t\t\t\tif (this.fn.input) {\n\t\t\t\t\t\tconst parsedInput =\n\t\t\t\t\t\t\tawait FunctionBuilder.parseComposableStandardSchema(\n\t\t\t\t\t\t\t\treq.event,\n\t\t\t\t\t\t\t\tthis.fn.input,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\treq.event.parsedInput =\n\t\t\t\t\t\t\tparsedInput as InferComposableStandardSchema<TInput>;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// If no schema, pass the event as-is\n\t\t\t\t\t\treq.event.parsedInput = req.event as any;\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t{ error, event: req.event },\n\t\t\t\t\t\t'Failed to parse input',\n\t\t\t\t\t);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate loggerMiddleware<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tbefore: (req) => {\n\t\t\t\tthis._logger = this.fn.logger.child({\n\t\t\t\t\tfn: {\n\t\t\t\t\t\tname: req.context.functionName,\n\t\t\t\t\t\tversion: req.context.functionVersion,\n\t\t\t\t\t\tmemory: req.context.memoryLimitInMB,\n\t\t\t\t\t},\n\t\t\t\t\treq: {\n\t\t\t\t\t\tid: req.context.awsRequestId,\n\t\t\t\t\t},\n\t\t\t\t}) as TLogger;\n\n\t\t\t\treq.event.logger = this._logger;\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate services<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\treq.event.services = await this.getServices();\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate database<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\treq.event.db = await this.getDatabase();\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate auditor<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\treq.event.auditor = await this.createAuditor();\n\t\t\t},\n\t\t\tafter: async (req) => {\n\t\t\t\t// Flush any pending audits after successful execution\n\t\t\t\tif (req.event.auditor) {\n\t\t\t\t\tconst records = req.event.auditor.getRecords();\n\t\t\t\t\tif (records.length > 0) {\n\t\t\t\t\t\tthis.logger.debug(\n\t\t\t\t\t\t\t{ auditCount: records.length },\n\t\t\t\t\t\t\t'Flushing function audits',\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait req.event.auditor.flush();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate events<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tafter: async (req) => {\n\t\t\t\tconst response = (req.response ||\n\t\t\t\t\tundefined) as InferStandardSchema<TOutSchema>;\n\t\t\t\tawait this.publishEvents(response);\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate async _handler<TEvent>(\n\t\tevent: FunctionEvent<\n\t\t\tTEvent,\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTDatabase,\n\t\t\tTAuditAction\n\t\t>,\n\t) {\n\t\t// Execute the function with the parsed context\n\t\tconst result = await this.fn.fn({\n\t\t\tinput: event.parsedInput,\n\t\t\tservices: event.services,\n\t\t\tlogger: event.logger,\n\t\t\tdb: event.db,\n\t\t\tauditor: event.auditor,\n\t\t} as any);\n\n\t\t// Parse output if schema is provided\n\t\tconst output = await this.fn.parseOutput(result);\n\n\t\treturn output;\n\t}\n\n\tget handler(): AWSLambdaHandler {\n\t\tconst handler = this._handler.bind(this);\n\n\t\t// Apply middleware in order\n\t\tconst chain = middy(handler)\n\t\t\t.use(this.loggerMiddleware())\n\t\t\t.use(this.baseInput())\n\t\t\t.use(this.error())\n\t\t\t.use(this.services())\n\t\t\t.use(this.database())\n\t\t\t.use(this.auditor())\n\t\t\t.use(this.input())\n\t\t\t.use(this.events());\n\n\t\t// Wrap entire Middy chain in request context for service access\n\t\tconst wrappedHandler = async (event: unknown, context: Context) => {\n\t\t\tconst startTime = Date.now();\n\t\t\tconst requestId = context.awsRequestId;\n\t\t\tconst logger = this.fn.logger.child({ requestId }) as TLogger;\n\n\t\t\treturn runWithRequestContext({ logger, requestId, startTime }, () =>\n\t\t\t\tchain(event as Parameters<typeof chain>[0], context),\n\t\t\t);\n\t\t};\n\n\t\treturn wrappedHandler as unknown as AWSLambdaHandler;\n\t}\n}\n"],"mappings":";;;;;;;;AA4DA,IAAa,oBAAb,cAeUA,0DAYR;CACD,YACCC,WACkBC,IAsBjB;AACD,QAAM,WAAW,GAAG;EAvBF;CAwBlB;CAED,AAAQ,QAQN;AACD,SAAO,EACN,SAAS,CAAC,QAAQ;GACjB,MAAM,SAAS,IAAI,OAAO,UAAU,KAAK,GAAG;AAC5C,UAAO,MAAM,IAAI,SAAS,CAAE,GAAE,4BAA4B;AAG1D,SAAM,kCAAU,IAAI,MAAM;EAC1B,EACD;CACD;CAED,AAAQ,YAQN;AACD,SAAO,EACN,QAAQ,CAAC,SAAS,CAAE,EACpB;CACD;CAED,AAAQ,QAUN;AACD,SAAO,EACN,QAAQ,OAAO,QAAQ;AACtB,OAAI;AAEH,QAAI,KAAK,GAAG,OAAO;KAClB,MAAM,cACL,MAAM,wCAAgB,8BACrB,IAAI,OACJ,KAAK,GAAG,MACR;AAEF,SAAI,MAAM,cACT;IACD,MAEA,KAAI,MAAM,cAAc,IAAI;GAE7B,SAAQ,OAAO;AACf,SAAK,OAAO,MACX;KAAE;KAAO,OAAO,IAAI;IAAO,GAC3B,wBACA;AACD,UAAM;GACN;EACD,EACD;CACD;CAED,AAAQ,mBAQN;AACD,SAAO,EACN,QAAQ,CAAC,QAAQ;AAChB,QAAK,UAAU,KAAK,GAAG,OAAO,MAAM;IACnC,IAAI;KACH,MAAM,IAAI,QAAQ;KAClB,SAAS,IAAI,QAAQ;KACrB,QAAQ,IAAI,QAAQ;IACpB;IACD,KAAK,EACJ,IAAI,IAAI,QAAQ,aAChB;GACD,EAAC;AAEF,OAAI,MAAM,SAAS,KAAK;EACxB,EACD;CACD;CAED,AAAQ,WAQN;AACD,SAAO,EACN,QAAQ,OAAO,QAAQ;AACtB,OAAI,MAAM,WAAW,MAAM,KAAK,aAAa;EAC7C,EACD;CACD;CAED,AAAQ,WAQN;AACD,SAAO,EACN,QAAQ,OAAO,QAAQ;AACtB,OAAI,MAAM,KAAK,MAAM,KAAK,aAAa;EACvC,EACD;CACD;CAED,AAAQ,UAQN;AACD,SAAO;GACN,QAAQ,OAAO,QAAQ;AACtB,QAAI,MAAM,UAAU,MAAM,KAAK,eAAe;GAC9C;GACD,OAAO,OAAO,QAAQ;AAErB,QAAI,IAAI,MAAM,SAAS;KACtB,MAAM,UAAU,IAAI,MAAM,QAAQ,YAAY;AAC9C,SAAI,QAAQ,SAAS,GAAG;AACvB,WAAK,OAAO,MACX,EAAE,YAAY,QAAQ,OAAQ,GAC9B,2BACA;AACD,YAAM,IAAI,MAAM,QAAQ,OAAO;KAC/B;IACD;GACD;EACD;CACD;CAED,AAAQ,SAQN;AACD,SAAO,EACN,OAAO,OAAO,QAAQ;GACrB,MAAM,WAAY,IAAI;AAEtB,SAAM,KAAK,cAAc,SAAS;EAClC,EACD;CACD;CAED,MAAc,SACbC,OAQC;EAED,MAAM,SAAS,MAAM,KAAK,GAAG,GAAG;GAC/B,OAAO,MAAM;GACb,UAAU,MAAM;GAChB,QAAQ,MAAM;GACd,IAAI,MAAM;GACV,SAAS,MAAM;EACf,EAAQ;EAGT,MAAM,SAAS,MAAM,KAAK,GAAG,YAAY,OAAO;AAEhD,SAAO;CACP;CAED,IAAI,UAA4B;EAC/B,MAAM,UAAU,KAAK,SAAS,KAAK,KAAK;EAGxC,MAAM,QAAQ,0BAAM,QAAQ,CAC1B,IAAI,KAAK,kBAAkB,CAAC,CAC5B,IAAI,KAAK,WAAW,CAAC,CACrB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,SAAS,CAAC,CACnB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,QAAQ,CAAC;EAGpB,MAAM,iBAAiB,OAAOC,OAAgBC,YAAqB;GAClE,MAAM,YAAY,KAAK,KAAK;GAC5B,MAAM,YAAY,QAAQ;GAC1B,MAAM,SAAS,KAAK,GAAG,OAAO,MAAM,EAAE,UAAW,EAAC;AAElD,UAAO,gDAAsB;IAAE;IAAQ;IAAW;GAAW,GAAE,MAC9D,MAAM,OAAsC,QAAQ,CACpD;EACD;AAED,SAAO;CACP;AACD"}