@geekmidas/constructs 10.0.0-alpha.12 → 10.0.0-alpha.14

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 (317) hide show
  1. package/dist/{Construct-BD5neF7w.mjs → Construct-BeYVu_QF.mjs} +30 -28
  2. package/dist/Construct-BeYVu_QF.mjs.map +1 -0
  3. package/dist/{Construct-Ct8nalEi.d.mts → Construct-DfbwIntp.d.cts} +10 -12
  4. package/dist/Construct-DfbwIntp.d.cts.map +1 -0
  5. package/dist/{Construct-CyS3RpTL.cjs → Construct-DqdlARxq.cjs} +50 -42
  6. package/dist/{Construct-BD5neF7w.mjs.map → Construct-DqdlARxq.cjs.map} +1 -1
  7. package/dist/{Construct-C0ijr2qp.d.cts → Construct-l5aOn_jv.d.mts} +9 -11
  8. package/dist/Construct-l5aOn_jv.d.mts.map +1 -0
  9. package/dist/{Cron-DmQ8vQ4b.d.cts → Cron-DKqnnTdH.d.cts} +4 -5
  10. package/dist/Cron-DKqnnTdH.d.cts.map +1 -0
  11. package/dist/{Cron-dh4rUgib.d.mts → Cron-SyqS5oWJ.d.mts} +5 -6
  12. package/dist/Cron-SyqS5oWJ.d.mts.map +1 -0
  13. package/dist/{CronBuilder-Da0C0edR.cjs → CronBuilder-BdnI6lxF.cjs} +24 -25
  14. package/dist/CronBuilder-BdnI6lxF.cjs.map +1 -0
  15. package/dist/{CronBuilder-BquXDbDI.d.cts → CronBuilder-CRGnDfTq.d.mts} +7 -10
  16. package/dist/CronBuilder-CRGnDfTq.d.mts.map +1 -0
  17. package/dist/{CronBuilder-CYKT5RiO.mjs → CronBuilder-D_0HNBTr.mjs} +14 -15
  18. package/dist/CronBuilder-D_0HNBTr.mjs.map +1 -0
  19. package/dist/{CronBuilder-CGgY2080.d.mts → CronBuilder-Df1q9PNy.d.cts} +7 -10
  20. package/dist/CronBuilder-Df1q9PNy.d.cts.map +1 -0
  21. package/dist/{Endpoint-DcWXE-SZ.cjs → Endpoint-BpZHtJ2W.cjs} +109 -130
  22. package/dist/Endpoint-BpZHtJ2W.cjs.map +1 -0
  23. package/dist/{Endpoint-BjWKinFA.d.mts → Endpoint-C6yyHpRS.d.cts} +14 -65
  24. package/dist/Endpoint-C6yyHpRS.d.cts.map +1 -0
  25. package/dist/{Endpoint-dav89W6-.d.cts → Endpoint-DuT4TEEq.d.mts} +14 -65
  26. package/dist/Endpoint-DuT4TEEq.d.mts.map +1 -0
  27. package/dist/{Endpoint-DCQPMdUX.mjs → Endpoint-ONsly_dq.mjs} +87 -108
  28. package/dist/Endpoint-ONsly_dq.mjs.map +1 -0
  29. package/dist/{EndpointFactory-CjV8F_lJ.mjs → EndpointFactory-Bm3aKRdV.mjs} +20 -29
  30. package/dist/EndpointFactory-Bm3aKRdV.mjs.map +1 -0
  31. package/dist/{EndpointFactory-CdWB7wPw.cjs → EndpointFactory-CLvWuHyt.cjs} +57 -66
  32. package/dist/EndpointFactory-CLvWuHyt.cjs.map +1 -0
  33. package/dist/{HonoEndpointAdaptor-DtL9j19R.cjs → HonoEndpointAdaptor-92zavCsV.cjs} +48 -52
  34. package/dist/HonoEndpointAdaptor-92zavCsV.cjs.map +1 -0
  35. package/dist/{HonoEndpointAdaptor-P1ahhZHu.mjs → HonoEndpointAdaptor-yYaU7jVJ.mjs} +40 -47
  36. package/dist/{HonoEndpointAdaptor-DtL9j19R.cjs.map → HonoEndpointAdaptor-yYaU7jVJ.mjs.map} +1 -1
  37. package/dist/{Queue-D7ZuwBhy.d.cts → Queue-D9X6OoON.d.mts} +10 -11
  38. package/dist/Queue-D9X6OoON.d.mts.map +1 -0
  39. package/dist/{Queue-gVGfi2Yk.d.mts → Queue-DYPB2KWL.d.cts} +10 -11
  40. package/dist/Queue-DYPB2KWL.d.cts.map +1 -0
  41. package/dist/{Subscriber-2mEi0ImH.d.cts → Subscriber-C4heaAyO.d.mts} +7 -8
  42. package/dist/Subscriber-C4heaAyO.d.mts.map +1 -0
  43. package/dist/{Subscriber-xTJ9ayPN.d.mts → Subscriber-CotDUELC.d.cts} +7 -8
  44. package/dist/Subscriber-CotDUELC.d.cts.map +1 -0
  45. package/dist/{SubscriberBuilder-Dptmo-1A.d.mts → SubscriberBuilder-BEv0eoHy.d.cts} +8 -11
  46. package/dist/SubscriberBuilder-BEv0eoHy.d.cts.map +1 -0
  47. package/dist/{SubscriberBuilder-4OPehf2R.cjs → SubscriberBuilder-C0ZEtGDI.cjs} +28 -23
  48. package/dist/SubscriberBuilder-C0ZEtGDI.cjs.map +1 -0
  49. package/dist/{SubscriberBuilder-BjkbeT9l.mjs → SubscriberBuilder-h7B_cHMr.mjs} +16 -10
  50. package/dist/SubscriberBuilder-h7B_cHMr.mjs.map +1 -0
  51. package/dist/{SubscriberBuilder-waNhzjSM.d.cts → SubscriberBuilder-tyH5yTk5.d.mts} +8 -11
  52. package/dist/SubscriberBuilder-tyH5yTk5.d.mts.map +1 -0
  53. package/dist/{Topic-19QeHBIR.d.cts → Topic-DEVGo0Dm.d.cts} +5 -7
  54. package/dist/Topic-DEVGo0Dm.d.cts.map +1 -0
  55. package/dist/{Topic-DuFeqkBh.d.mts → Topic-zk_6Gthr.d.mts} +6 -8
  56. package/dist/Topic-zk_6Gthr.d.mts.map +1 -0
  57. package/dist/adaptors/aws.cjs +87 -106
  58. package/dist/adaptors/aws.cjs.map +1 -1
  59. package/dist/adaptors/aws.d.cts +14 -27
  60. package/dist/adaptors/aws.d.cts.map +1 -1
  61. package/dist/adaptors/aws.d.mts +16 -29
  62. package/dist/adaptors/aws.d.mts.map +1 -1
  63. package/dist/adaptors/aws.mjs +60 -81
  64. package/dist/adaptors/aws.mjs.map +1 -1
  65. package/dist/adaptors/hono.cjs +3 -10
  66. package/dist/adaptors/hono.d.cts +5 -13
  67. package/dist/adaptors/hono.d.cts.map +1 -1
  68. package/dist/adaptors/hono.d.mts +7 -15
  69. package/dist/adaptors/hono.d.mts.map +1 -1
  70. package/dist/adaptors/hono.mjs +2 -10
  71. package/dist/adaptors/testing.cjs +60 -73
  72. package/dist/adaptors/testing.cjs.map +1 -1
  73. package/dist/adaptors/testing.d.cts +17 -28
  74. package/dist/adaptors/testing.d.cts.map +1 -1
  75. package/dist/adaptors/testing.d.mts +18 -29
  76. package/dist/adaptors/testing.d.mts.map +1 -1
  77. package/dist/adaptors/testing.mjs +42 -55
  78. package/dist/adaptors/testing.mjs.map +1 -1
  79. package/dist/auth.cjs +39 -14
  80. package/dist/auth.cjs.map +1 -1
  81. package/dist/auth.d.cts +5 -9
  82. package/dist/auth.d.cts.map +1 -1
  83. package/dist/auth.d.mts +5 -9
  84. package/dist/auth.d.mts.map +1 -1
  85. package/dist/auth.mjs +30 -5
  86. package/dist/auth.mjs.map +1 -1
  87. package/dist/cache.cjs +68 -2
  88. package/dist/cache.cjs.map +1 -0
  89. package/dist/cache.d.cts +43 -3
  90. package/dist/cache.d.cts.map +1 -0
  91. package/dist/cache.d.mts +43 -3
  92. package/dist/cache.d.mts.map +1 -0
  93. package/dist/cache.mjs +67 -2
  94. package/dist/cache.mjs.map +1 -0
  95. package/dist/{clone-DblgEZZa.mjs → clone-EKNovYHu.mjs} +3 -3
  96. package/dist/clone-EKNovYHu.mjs.map +1 -0
  97. package/dist/{clone-Dy0cR2SZ.cjs → clone-UGJpvQnL.cjs} +7 -8
  98. package/dist/clone-UGJpvQnL.cjs.map +1 -0
  99. package/dist/{construct-interface-g5GM5pwR.d.mts → construct-interface-DPlxfpoS.d.mts} +3 -6
  100. package/dist/construct-interface-DPlxfpoS.d.mts.map +1 -0
  101. package/dist/{construct-interface-D9d4Gm4p.d.cts → construct-interface-DgXTJcOD.d.cts} +3 -6
  102. package/dist/construct-interface-DgXTJcOD.d.cts.map +1 -0
  103. package/dist/construct-interface.cjs +87 -7
  104. package/dist/construct-interface.cjs.map +1 -0
  105. package/dist/construct-interface.d.cts +1 -1
  106. package/dist/construct-interface.d.mts +1 -1
  107. package/dist/construct-interface.mjs +81 -2
  108. package/dist/construct-interface.mjs.map +1 -0
  109. package/dist/credential.cjs +43 -9
  110. package/dist/credential.cjs.map +1 -1
  111. package/dist/credential.d.cts +5 -8
  112. package/dist/credential.d.cts.map +1 -1
  113. package/dist/credential.d.mts +5 -8
  114. package/dist/credential.d.mts.map +1 -1
  115. package/dist/credential.mjs +36 -2
  116. package/dist/credential.mjs.map +1 -1
  117. package/dist/crons/index.cjs +4 -7
  118. package/dist/crons/index.cjs.map +1 -1
  119. package/dist/crons/index.d.cts +5 -11
  120. package/dist/crons/index.d.cts.map +1 -1
  121. package/dist/crons/index.d.mts +5 -11
  122. package/dist/crons/index.d.mts.map +1 -1
  123. package/dist/crons/index.mjs +3 -7
  124. package/dist/crons/index.mjs.map +1 -1
  125. package/dist/database/kysely.cjs +28 -14
  126. package/dist/database/kysely.cjs.map +1 -1
  127. package/dist/database/kysely.d.cts +5 -8
  128. package/dist/database/kysely.d.cts.map +1 -1
  129. package/dist/database/kysely.d.mts +6 -9
  130. package/dist/database/kysely.d.mts.map +1 -1
  131. package/dist/database/kysely.mjs +16 -4
  132. package/dist/database/kysely.mjs.map +1 -1
  133. package/dist/email.cjs +25 -12
  134. package/dist/email.cjs.map +1 -1
  135. package/dist/email.d.cts +3 -7
  136. package/dist/email.d.cts.map +1 -1
  137. package/dist/email.d.mts +3 -7
  138. package/dist/email.d.mts.map +1 -1
  139. package/dist/email.mjs +16 -3
  140. package/dist/email.mjs.map +1 -1
  141. package/dist/endpoints/index.cjs +6 -10
  142. package/dist/endpoints/index.d.cts +3 -7
  143. package/dist/endpoints/index.d.mts +3 -7
  144. package/dist/endpoints/index.mjs +5 -10
  145. package/dist/file-server.cjs +42 -10
  146. package/dist/file-server.cjs.map +1 -1
  147. package/dist/file-server.d.cts +6 -10
  148. package/dist/file-server.d.cts.map +1 -1
  149. package/dist/file-server.d.mts +6 -10
  150. package/dist/file-server.d.mts.map +1 -1
  151. package/dist/file-server.mjs +34 -2
  152. package/dist/file-server.mjs.map +1 -1
  153. package/dist/functions/index.cjs +3 -6
  154. package/dist/functions/index.d.cts +2 -4
  155. package/dist/functions/index.d.mts +2 -4
  156. package/dist/functions/index.mjs +2 -6
  157. package/dist/{functions-i_la-N5r.cjs → functions-B6qCvfmy.cjs} +298 -252
  158. package/dist/functions-B6qCvfmy.cjs.map +1 -0
  159. package/dist/{functions-14lpEFL4.mjs → functions-C53GW2eQ.mjs} +272 -229
  160. package/dist/functions-C53GW2eQ.mjs.map +1 -0
  161. package/dist/{index-BknhM6Ux.d.mts → index-B2urf3YI.d.cts} +4 -9
  162. package/dist/index-B2urf3YI.d.cts.map +1 -0
  163. package/dist/{index-Bd5FqCoe.d.cts → index-BPSZ_Lp_.d.cts} +9 -38
  164. package/dist/index-BPSZ_Lp_.d.cts.map +1 -0
  165. package/dist/{index-lAO9egTb.d.mts → index-BoZ-iisU.d.mts} +12 -41
  166. package/dist/index-BoZ-iisU.d.mts.map +1 -0
  167. package/dist/{index-_ajboYxK.d.mts → index-CdaU--_B.d.cts} +10 -16
  168. package/dist/index-CdaU--_B.d.cts.map +1 -0
  169. package/dist/index-CeEtxDmK.d.cts +79 -0
  170. package/dist/index-CeEtxDmK.d.cts.map +1 -0
  171. package/dist/index-CeEtxDmK.d.mts +79 -0
  172. package/dist/index-CeEtxDmK.d.mts.map +1 -0
  173. package/dist/{index-CBSfrowv.d.cts → index-DMCDvnsM.d.mts} +4 -9
  174. package/dist/index-DMCDvnsM.d.mts.map +1 -0
  175. package/dist/{index-D24Xm79M.d.cts → index-PQRWOQj4.d.mts} +10 -16
  176. package/dist/index-PQRWOQj4.d.mts.map +1 -0
  177. package/dist/index.cjs +3 -3
  178. package/dist/index.d.cts +4 -4
  179. package/dist/index.d.mts +4 -4
  180. package/dist/index.mjs +2 -3
  181. package/dist/{lazyAccessors-BoJN3SMd.mjs → lazyAccessors-BHtcqgz2.mjs} +22 -25
  182. package/dist/lazyAccessors-BHtcqgz2.mjs.map +1 -0
  183. package/dist/{lazyAccessors-e3j2oE2m.cjs → lazyAccessors-Dx9NLwJZ.cjs} +72 -76
  184. package/dist/lazyAccessors-Dx9NLwJZ.cjs.map +1 -0
  185. package/dist/object-storage.cjs +18 -10
  186. package/dist/object-storage.cjs.map +1 -1
  187. package/dist/object-storage.d.cts +3 -7
  188. package/dist/object-storage.d.cts.map +1 -1
  189. package/dist/object-storage.d.mts +3 -7
  190. package/dist/object-storage.d.mts.map +1 -1
  191. package/dist/object-storage.mjs +11 -3
  192. package/dist/object-storage.mjs.map +1 -1
  193. package/dist/{processAudits-Dmts9H_b.mjs → processAudits-BpRlPQMW.mjs} +16 -19
  194. package/dist/processAudits-BpRlPQMW.mjs.map +1 -0
  195. package/dist/{processAudits-CGqttuXm.cjs → processAudits-D_2W5x8k.cjs} +26 -30
  196. package/dist/processAudits-D_2W5x8k.cjs.map +1 -0
  197. package/dist/queue/index.cjs +25 -21
  198. package/dist/queue/index.cjs.map +1 -1
  199. package/dist/queue/index.d.cts +8 -15
  200. package/dist/queue/index.d.cts.map +1 -1
  201. package/dist/queue/index.d.mts +8 -15
  202. package/dist/queue/index.d.mts.map +1 -1
  203. package/dist/queue/index.mjs +15 -11
  204. package/dist/queue/index.mjs.map +1 -1
  205. package/dist/rest-api.cjs +22 -18
  206. package/dist/rest-api.cjs.map +1 -1
  207. package/dist/rest-api.d.cts +15 -20
  208. package/dist/rest-api.d.cts.map +1 -1
  209. package/dist/rest-api.d.mts +9 -14
  210. package/dist/rest-api.d.mts.map +1 -1
  211. package/dist/rest-api.mjs +14 -10
  212. package/dist/rest-api.mjs.map +1 -1
  213. package/dist/{chunk-DWy1uDak.cjs → rolldown-runtime-y5ARvAq5.cjs} +14 -18
  214. package/dist/site.cjs +31 -7
  215. package/dist/site.cjs.map +1 -1
  216. package/dist/site.d.cts +3 -7
  217. package/dist/site.d.cts.map +1 -1
  218. package/dist/site.d.mts +3 -7
  219. package/dist/site.d.mts.map +1 -1
  220. package/dist/site.mjs +27 -3
  221. package/dist/site.mjs.map +1 -1
  222. package/dist/subscribers/index.cjs +3 -6
  223. package/dist/subscribers/index.d.cts +2 -5
  224. package/dist/subscribers/index.d.mts +2 -5
  225. package/dist/subscribers/index.mjs +2 -6
  226. package/dist/surfaceEnv-CNimK76p.cjs +56 -0
  227. package/dist/surfaceEnv-CNimK76p.cjs.map +1 -0
  228. package/dist/surfaceEnv-wMT5QzgZ.mjs +45 -0
  229. package/dist/surfaceEnv-wMT5QzgZ.mjs.map +1 -0
  230. package/dist/{telemetry-C3L0iS28.d.cts → telemetry-DGcFlVpB.d.cts} +2 -5
  231. package/dist/telemetry-DGcFlVpB.d.cts.map +1 -0
  232. package/dist/{telemetry-D7bVFLGi.d.mts → telemetry-DGcFlVpB.d.mts} +2 -5
  233. package/dist/telemetry-DGcFlVpB.d.mts.map +1 -0
  234. package/dist/topic/index.cjs +18 -20
  235. package/dist/topic/index.cjs.map +1 -1
  236. package/dist/topic/index.d.cts +3 -4
  237. package/dist/topic/index.d.mts +3 -4
  238. package/dist/topic/index.mjs +8 -10
  239. package/dist/topic/index.mjs.map +1 -1
  240. package/dist/{types-BlAkSuGI.d.cts → types-DMuSQeLL.d.cts} +3 -5
  241. package/dist/types-DMuSQeLL.d.cts.map +1 -0
  242. package/dist/{types-aKksMEWL.d.mts → types-DMuSQeLL.d.mts} +3 -5
  243. package/dist/types-DMuSQeLL.d.mts.map +1 -0
  244. package/dist/types.d.cts +1 -1
  245. package/dist/types.d.mts +1 -1
  246. package/dist/types.mjs +1 -0
  247. package/dist/worker.cjs +13 -14
  248. package/dist/worker.cjs.map +1 -1
  249. package/dist/worker.d.cts +21 -27
  250. package/dist/worker.d.cts.map +1 -1
  251. package/dist/worker.d.mts +14 -19
  252. package/dist/worker.d.mts.map +1 -1
  253. package/dist/worker.mjs +8 -9
  254. package/dist/worker.mjs.map +1 -1
  255. package/package.json +30 -30
  256. package/dist/Construct-C0ijr2qp.d.cts.map +0 -1
  257. package/dist/Construct-Ct8nalEi.d.mts.map +0 -1
  258. package/dist/Construct-CyS3RpTL.cjs.map +0 -1
  259. package/dist/Cron-DmQ8vQ4b.d.cts.map +0 -1
  260. package/dist/Cron-dh4rUgib.d.mts.map +0 -1
  261. package/dist/CronBuilder-BquXDbDI.d.cts.map +0 -1
  262. package/dist/CronBuilder-CGgY2080.d.mts.map +0 -1
  263. package/dist/CronBuilder-CYKT5RiO.mjs.map +0 -1
  264. package/dist/CronBuilder-Da0C0edR.cjs.map +0 -1
  265. package/dist/Endpoint-BjWKinFA.d.mts.map +0 -1
  266. package/dist/Endpoint-DCQPMdUX.mjs.map +0 -1
  267. package/dist/Endpoint-DcWXE-SZ.cjs.map +0 -1
  268. package/dist/Endpoint-dav89W6-.d.cts.map +0 -1
  269. package/dist/EndpointFactory-CdWB7wPw.cjs.map +0 -1
  270. package/dist/EndpointFactory-CjV8F_lJ.mjs.map +0 -1
  271. package/dist/HonoEndpointAdaptor-P1ahhZHu.mjs.map +0 -1
  272. package/dist/Queue-D7ZuwBhy.d.cts.map +0 -1
  273. package/dist/Queue-gVGfi2Yk.d.mts.map +0 -1
  274. package/dist/Subscriber-2mEi0ImH.d.cts.map +0 -1
  275. package/dist/Subscriber-xTJ9ayPN.d.mts.map +0 -1
  276. package/dist/SubscriberBuilder-4OPehf2R.cjs.map +0 -1
  277. package/dist/SubscriberBuilder-BjkbeT9l.mjs.map +0 -1
  278. package/dist/SubscriberBuilder-Dptmo-1A.d.mts.map +0 -1
  279. package/dist/SubscriberBuilder-waNhzjSM.d.cts.map +0 -1
  280. package/dist/Topic-19QeHBIR.d.cts.map +0 -1
  281. package/dist/Topic-DuFeqkBh.d.mts.map +0 -1
  282. package/dist/cache-0ANvRQnD.mjs +0 -51
  283. package/dist/cache-0ANvRQnD.mjs.map +0 -1
  284. package/dist/cache-3WSvAulx.cjs +0 -57
  285. package/dist/cache-3WSvAulx.cjs.map +0 -1
  286. package/dist/cache-BrRz3fEB.d.mts +0 -47
  287. package/dist/cache-BrRz3fEB.d.mts.map +0 -1
  288. package/dist/cache-BtZY_tHe.d.cts +0 -47
  289. package/dist/cache-BtZY_tHe.d.cts.map +0 -1
  290. package/dist/clone-DblgEZZa.mjs.map +0 -1
  291. package/dist/clone-Dy0cR2SZ.cjs.map +0 -1
  292. package/dist/construct-interface-BfjcOD_E.cjs +0 -117
  293. package/dist/construct-interface-BfjcOD_E.cjs.map +0 -1
  294. package/dist/construct-interface-D9d4Gm4p.d.cts.map +0 -1
  295. package/dist/construct-interface-Z4CpS8tK.mjs +0 -81
  296. package/dist/construct-interface-Z4CpS8tK.mjs.map +0 -1
  297. package/dist/construct-interface-g5GM5pwR.d.mts.map +0 -1
  298. package/dist/functions-14lpEFL4.mjs.map +0 -1
  299. package/dist/functions-i_la-N5r.cjs.map +0 -1
  300. package/dist/index-Bd5FqCoe.d.cts.map +0 -1
  301. package/dist/index-BknhM6Ux.d.mts.map +0 -1
  302. package/dist/index-CBSfrowv.d.cts.map +0 -1
  303. package/dist/index-D24Xm79M.d.cts.map +0 -1
  304. package/dist/index-_ajboYxK.d.mts.map +0 -1
  305. package/dist/index-lAO9egTb.d.mts.map +0 -1
  306. package/dist/lazyAccessors-BoJN3SMd.mjs.map +0 -1
  307. package/dist/lazyAccessors-e3j2oE2m.cjs.map +0 -1
  308. package/dist/processAudits-CGqttuXm.cjs.map +0 -1
  309. package/dist/processAudits-Dmts9H_b.mjs.map +0 -1
  310. package/dist/surfaceEnv-BFXEms2f.cjs +0 -39
  311. package/dist/surfaceEnv-BFXEms2f.cjs.map +0 -1
  312. package/dist/surfaceEnv-C3Ktahea.mjs +0 -27
  313. package/dist/surfaceEnv-C3Ktahea.mjs.map +0 -1
  314. package/dist/telemetry-C3L0iS28.d.cts.map +0 -1
  315. package/dist/telemetry-D7bVFLGi.d.mts.map +0 -1
  316. package/dist/types-BlAkSuGI.d.cts.map +0 -1
  317. package/dist/types-aKksMEWL.d.mts.map +0 -1
@@ -1,11 +1,10 @@
1
- const require_chunk = require('./chunk-DWy1uDak.cjs');
2
- const require_construct_interface = require('./construct-interface-BfjcOD_E.cjs');
3
- const require_Construct = require('./Construct-CyS3RpTL.cjs');
4
- const require_functions = require('./functions-i_la-N5r.cjs');
5
- const require_clone = require('./clone-Dy0cR2SZ.cjs');
6
- const require_Endpoint = require('./Endpoint-DcWXE-SZ.cjs');
7
- const __geekmidas_logger_console = require_chunk.__toESM(require("@geekmidas/logger/console"));
8
-
1
+ const require_rolldown_runtime = require("./rolldown-runtime-y5ARvAq5.cjs");
2
+ require("./Construct-DqdlARxq.cjs");
3
+ const require_construct_interface = require("./construct-interface.cjs");
4
+ const require_functions = require("./functions-B6qCvfmy.cjs");
5
+ const require_clone = require("./clone-UGJpvQnL.cjs");
6
+ const require_Endpoint = require("./Endpoint-BpZHtJ2W.cjs");
7
+ let _geekmidas_logger_console = require("@geekmidas/logger/console");
9
8
  //#region src/endpoints/Authorizer.ts
10
9
  /**
11
10
  * Built-in security schemes available by default.
@@ -68,20 +67,19 @@ function isBuiltInSecurityScheme(name) {
68
67
  function getSecurityScheme(name, customSchemes) {
69
68
  if (customSchemes && name in customSchemes) return customSchemes[name];
70
69
  if (isBuiltInSecurityScheme(name)) return BUILT_IN_SECURITY_SCHEMES[name];
71
- return void 0;
72
70
  }
73
-
74
71
  //#endregion
75
72
  //#region src/endpoints/rls.ts
73
+ var import_lodash_uniqby = /* @__PURE__ */ require_rolldown_runtime.__toESM(require_functions.require_lodash_uniqby(), 1);
76
74
  /**
77
75
  * Symbol used to bypass RLS for an endpoint.
78
76
  */
79
77
  const RLS_BYPASS = Symbol.for("geekmidas.rls.bypass");
80
-
81
78
  //#endregion
82
79
  //#region src/endpoints/EndpointBuilder.ts
83
- var import_lodash$1 = require_chunk.__toESM(require_functions.require_lodash(), 1);
84
80
  var EndpointBuilder = class extends require_functions.BaseFunctionBuilder {
81
+ route;
82
+ method;
85
83
  schemas = {};
86
84
  _description;
87
85
  _status;
@@ -106,7 +104,7 @@ var EndpointBuilder = class extends require_functions.BaseFunctionBuilder {
106
104
  _rlsConfig;
107
105
  _rlsBypass;
108
106
  constructor(route, method) {
109
- super(require_Construct.ConstructType.Endpoint);
107
+ super("dev.geekmidas.function.endpoint");
110
108
  this.route = route;
111
109
  this.method = method;
112
110
  }
@@ -181,8 +179,7 @@ var EndpointBuilder = class extends require_functions.BaseFunctionBuilder {
181
179
  }
182
180
  authorizer(name) {
183
181
  if (name === "none") return require_clone.cloneWith(this, { _authorizerName: void 0 });
184
- const authorizerExists = this._availableAuthorizers.some((a) => a.name === name);
185
- if (!authorizerExists && this._availableAuthorizers.length > 0) {
182
+ if (!this._availableAuthorizers.some((a) => a.name === name) && this._availableAuthorizers.length > 0) {
186
183
  const available = this._availableAuthorizers.map((a) => a.name).join(", ");
187
184
  throw new Error(`Authorizer "${name}" not found in available authorizers: ${available}`);
188
185
  }
@@ -202,12 +199,12 @@ var EndpointBuilder = class extends require_functions.BaseFunctionBuilder {
202
199
  dependsOn(constructs) {
203
200
  const services = require_construct_interface.servicesOf(constructs);
204
201
  return require_clone.cloneWith(this, {
205
- _services: (0, import_lodash$1.default)([...this._services, ...services], (service) => service.serviceName),
202
+ _services: (0, import_lodash_uniqby.default)([...this._services, ...services], (service) => service.serviceName),
206
203
  _constructs: require_construct_interface.idsOf(constructs, this._constructs)
207
204
  });
208
205
  }
209
206
  services(services) {
210
- return require_clone.cloneWith(this, { _services: (0, import_lodash$1.default)([...this._services, ...services], (s) => s.serviceName) });
207
+ return require_clone.cloneWith(this, { _services: (0, import_lodash_uniqby.default)([...this._services, ...services], (s) => s.serviceName) });
211
208
  }
212
209
  logger(logger) {
213
210
  return require_clone.cloneWith(this, { _logger: logger });
@@ -366,10 +363,8 @@ var EndpointBuilder = class extends require_functions.BaseFunctionBuilder {
366
363
  return endpoint;
367
364
  }
368
365
  };
369
-
370
366
  //#endregion
371
367
  //#region src/endpoints/EndpointFactory.ts
372
- var import_lodash = require_chunk.__toESM(require_functions.require_lodash(), 1);
373
368
  var EndpointFactory = class EndpointFactory {
374
369
  defaultServices = [];
375
370
  /**
@@ -403,9 +398,9 @@ var EndpointFactory = class EndpointFactory {
403
398
  defaultActorExtractor;
404
399
  customSecuritySchemes;
405
400
  defaultRlsConfig;
406
- constructor({ basePath, defaultAuthorizeFn, defaultLogger = __geekmidas_logger_console.DEFAULT_LOGGER, defaultSessionExtractor, defaultServices = [], defaultConstructs = [], defaultEventPublisher, availableAuthorizers = [], defaultAuthorizerName, defaultAuditorStorage, defaultDatabaseService, defaultActorExtractor, customSecuritySchemes = {}, defaultRlsConfig, surface }) {
401
+ constructor({ basePath, defaultAuthorizeFn, defaultLogger = _geekmidas_logger_console.DEFAULT_LOGGER, defaultSessionExtractor, defaultServices = [], defaultConstructs = [], defaultEventPublisher, availableAuthorizers = [], defaultAuthorizerName, defaultAuditorStorage, defaultDatabaseService, defaultActorExtractor, customSecuritySchemes = {}, defaultRlsConfig, surface }) {
407
402
  this.defaultConstructs = [...new Set(defaultConstructs)];
408
- this.defaultServices = (0, import_lodash.default)(defaultServices, (s) => s.serviceName);
403
+ this.defaultServices = (0, import_lodash_uniqby.default)(defaultServices, (s) => s.serviceName);
409
404
  this.basePath = basePath || "";
410
405
  this.defaultAuthorizeFn = defaultAuthorizeFn;
411
406
  this.defaultLogger = defaultLogger;
@@ -424,9 +419,7 @@ var EndpointFactory = class EndpointFactory {
424
419
  if (!basePath && !path) return "/";
425
420
  if (!basePath) return path.startsWith("/") ? path : `/${path}`;
426
421
  if (!path) return basePath.startsWith("/") ? basePath : `/${basePath}`;
427
- const base = basePath.endsWith("/") ? basePath.slice(0, -1) : basePath;
428
- const segment = path.startsWith("/") ? path : `/${path}`;
429
- let result = base + segment;
422
+ let result = (basePath.endsWith("/") ? basePath.slice(0, -1) : basePath) + (path.startsWith("/") ? path : `/${path}`);
430
423
  if (!result.startsWith("/")) result = `/${result}`;
431
424
  result = result.replace(/^\/+/g, "/");
432
425
  if (result.length > 1 && result.endsWith("/")) result = result.slice(0, -1);
@@ -505,8 +498,7 @@ var EndpointFactory = class EndpointFactory {
505
498
  */
506
499
  authorizer(name) {
507
500
  if (name !== "none" && this.availableAuthorizers.length > 0) {
508
- const authorizerExists = this.availableAuthorizers.some((a) => a.name === name);
509
- if (!authorizerExists) {
501
+ if (!this.availableAuthorizers.some((a) => a.name === name)) {
510
502
  const available = this.availableAuthorizers.map((a) => a.name).join(", ");
511
503
  throw new Error(`Authorizer "${name}" not found in available authorizers: ${available}`);
512
504
  }
@@ -581,7 +573,7 @@ var EndpointFactory = class EndpointFactory {
581
573
  */
582
574
  dependsOn(constructs) {
583
575
  const next = this.services(require_construct_interface.servicesOf(constructs));
584
- next.defaultConstructs = [...new Set([...this.defaultConstructs, ...constructs.map((construct) => construct.id)])];
576
+ next.defaultConstructs = [.../* @__PURE__ */ new Set([...this.defaultConstructs, ...constructs.map((construct) => construct.id)])];
585
577
  return next;
586
578
  }
587
579
  services(services) {
@@ -768,8 +760,7 @@ var EndpointFactory = class EndpointFactory {
768
760
  });
769
761
  }
770
762
  createBuilder(method, path) {
771
- const fullPath = EndpointFactory.joinPaths(path, this.basePath);
772
- const builder = new EndpointBuilder(fullPath, method);
763
+ const builder = new EndpointBuilder(EndpointFactory.joinPaths(path, this.basePath), method);
773
764
  if (this.defaultAuthorizeFn) builder._authorize = this.defaultAuthorizeFn;
774
765
  if (this.defaultServices.length) builder._services = [...this.defaultServices];
775
766
  if (this.defaultConstructs.length) builder._constructs = [...this.defaultConstructs];
@@ -805,48 +796,48 @@ var EndpointFactory = class EndpointFactory {
805
796
  return this.createBuilder("OPTIONS", path);
806
797
  }
807
798
  };
808
-
809
799
  //#endregion
810
- Object.defineProperty(exports, 'BUILT_IN_SECURITY_SCHEMES', {
811
- enumerable: true,
812
- get: function () {
813
- return BUILT_IN_SECURITY_SCHEMES;
814
- }
800
+ Object.defineProperty(exports, "BUILT_IN_SECURITY_SCHEMES", {
801
+ enumerable: true,
802
+ get: function() {
803
+ return BUILT_IN_SECURITY_SCHEMES;
804
+ }
815
805
  });
816
- Object.defineProperty(exports, 'EndpointBuilder', {
817
- enumerable: true,
818
- get: function () {
819
- return EndpointBuilder;
820
- }
806
+ Object.defineProperty(exports, "EndpointBuilder", {
807
+ enumerable: true,
808
+ get: function() {
809
+ return EndpointBuilder;
810
+ }
821
811
  });
822
- Object.defineProperty(exports, 'EndpointFactory', {
823
- enumerable: true,
824
- get: function () {
825
- return EndpointFactory;
826
- }
812
+ Object.defineProperty(exports, "EndpointFactory", {
813
+ enumerable: true,
814
+ get: function() {
815
+ return EndpointFactory;
816
+ }
827
817
  });
828
- Object.defineProperty(exports, 'RLS_BYPASS', {
829
- enumerable: true,
830
- get: function () {
831
- return RLS_BYPASS;
832
- }
818
+ Object.defineProperty(exports, "RLS_BYPASS", {
819
+ enumerable: true,
820
+ get: function() {
821
+ return RLS_BYPASS;
822
+ }
833
823
  });
834
- Object.defineProperty(exports, 'createAuthorizer', {
835
- enumerable: true,
836
- get: function () {
837
- return createAuthorizer;
838
- }
824
+ Object.defineProperty(exports, "createAuthorizer", {
825
+ enumerable: true,
826
+ get: function() {
827
+ return createAuthorizer;
828
+ }
839
829
  });
840
- Object.defineProperty(exports, 'getSecurityScheme', {
841
- enumerable: true,
842
- get: function () {
843
- return getSecurityScheme;
844
- }
830
+ Object.defineProperty(exports, "getSecurityScheme", {
831
+ enumerable: true,
832
+ get: function() {
833
+ return getSecurityScheme;
834
+ }
845
835
  });
846
- Object.defineProperty(exports, 'isBuiltInSecurityScheme', {
847
- enumerable: true,
848
- get: function () {
849
- return isBuiltInSecurityScheme;
850
- }
836
+ Object.defineProperty(exports, "isBuiltInSecurityScheme", {
837
+ enumerable: true,
838
+ get: function() {
839
+ return isBuiltInSecurityScheme;
840
+ }
851
841
  });
852
- //# sourceMappingURL=EndpointFactory-CdWB7wPw.cjs.map
842
+
843
+ //# sourceMappingURL=EndpointFactory-CLvWuHyt.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EndpointFactory-CLvWuHyt.cjs","names":["BaseFunctionBuilder","cloneWith","servicesOf","uniqBy","idsOf","serviceOf","Endpoint","DEFAULT_LOGGER","uniqBy","servicesOf","serviceOf"],"sources":["../src/endpoints/Authorizer.ts","../src/endpoints/rls.ts","../src/endpoints/EndpointBuilder.ts","../src/endpoints/EndpointFactory.ts"],"sourcesContent":["/**\n * OpenAPI 3.1 compliant security scheme definition.\n * @see https://spec.openapis.org/oas/v3.1.0#security-scheme-object\n */\nexport interface SecurityScheme {\n\t/** The type of the security scheme */\n\ttype: 'apiKey' | 'http' | 'mutualTLS' | 'oauth2' | 'openIdConnect';\n\t/** A description for security scheme */\n\tdescription?: string;\n\t/** Required for apiKey. The name of the header, query or cookie parameter */\n\tname?: string;\n\t/** Required for apiKey. The location of the API key */\n\tin?: 'query' | 'header' | 'cookie';\n\t/** Required for http. The name of the HTTP Authorization scheme (e.g., 'bearer') */\n\tscheme?: string;\n\t/** Optional for http bearer. A hint to the format of the bearer token */\n\tbearerFormat?: string;\n\t/** Required for oauth2. An object containing configuration for the flow types */\n\tflows?: OAuthFlows;\n\t/** Required for openIdConnect. The URL to discover OAuth2 configuration */\n\topenIdConnectUrl?: string;\n\t/** Vendor extensions (e.g., x-amazon-apigateway-authtype) */\n\t[key: `x-${string}`]: unknown;\n}\n\n/**\n * OAuth2 flow configuration\n */\nexport interface OAuthFlows {\n\timplicit?: OAuthFlow;\n\tpassword?: OAuthFlow;\n\tclientCredentials?: OAuthFlow;\n\tauthorizationCode?: OAuthFlow;\n}\n\nexport interface OAuthFlow {\n\tauthorizationUrl?: string;\n\ttokenUrl?: string;\n\trefreshUrl?: string;\n\tscopes: Record<string, string>;\n}\n\n/**\n * Built-in security schemes available by default.\n * Users can use these without defining them via .securitySchemes().\n */\nexport const BUILT_IN_SECURITY_SCHEMES = {\n\tjwt: {\n\t\ttype: 'http',\n\t\tscheme: 'bearer',\n\t\tbearerFormat: 'JWT',\n\t\tdescription: 'JWT Bearer token authentication',\n\t},\n\tbearer: {\n\t\ttype: 'http',\n\t\tscheme: 'bearer',\n\t\tdescription: 'Bearer token authentication',\n\t},\n\tapiKey: {\n\t\ttype: 'apiKey',\n\t\tin: 'header',\n\t\tname: 'X-API-Key',\n\t\tdescription: 'API key authentication via header',\n\t},\n\toauth2: {\n\t\ttype: 'oauth2',\n\t\tflows: {},\n\t\tdescription: 'OAuth 2.0 authentication',\n\t},\n\toidc: {\n\t\ttype: 'openIdConnect',\n\t\topenIdConnectUrl: '',\n\t\tdescription: 'OpenID Connect authentication',\n\t},\n\tiam: {\n\t\ttype: 'apiKey',\n\t\tin: 'header',\n\t\tname: 'Authorization',\n\t\tdescription: 'AWS IAM Signature Version 4 authentication',\n\t\t'x-amazon-apigateway-authtype': 'awsSigv4',\n\t},\n} as const satisfies Record<string, SecurityScheme>;\n\n/** Names of built-in security schemes */\nexport type BuiltInSecuritySchemeId = keyof typeof BUILT_IN_SECURITY_SCHEMES;\n\n/**\n * Represents an authorizer configuration for endpoints\n */\nexport interface Authorizer {\n\t/**\n\t * Unique identifier for the authorizer\n\t */\n\tname: string;\n\t/**\n\t * The OpenAPI security scheme definition for this authorizer\n\t */\n\tsecurityScheme?: SecurityScheme;\n\t/**\n\t * Type of authorizer (e.g., 'iam', 'jwt', 'custom')\n\t * @deprecated Use securityScheme.type instead\n\t */\n\ttype?: string;\n\t/**\n\t * Description of what this authorizer does\n\t * @deprecated Use securityScheme.description instead\n\t */\n\tdescription?: string;\n\t/**\n\t * Additional metadata specific to the authorizer type\n\t * @deprecated Use securityScheme with x-* extensions instead\n\t */\n\tmetadata?: Record<string, unknown>;\n}\n\n/**\n * Helper to create an authorizer configuration\n */\nexport function createAuthorizer(\n\tname: string,\n\toptions?: Omit<Authorizer, 'name'>,\n): Authorizer {\n\treturn {\n\t\tname,\n\t\t...options,\n\t};\n}\n\n/**\n * Check if a name is a built-in security scheme\n */\nexport function isBuiltInSecurityScheme(\n\tname: string,\n): name is BuiltInSecuritySchemeId {\n\treturn name in BUILT_IN_SECURITY_SCHEMES;\n}\n\n/**\n * Get a security scheme by name (built-in or custom)\n */\nexport function getSecurityScheme(\n\tname: string,\n\tcustomSchemes?: Record<string, SecurityScheme>,\n): SecurityScheme | undefined {\n\tif (customSchemes && name in customSchemes) {\n\t\treturn customSchemes[name];\n\t}\n\tif (isBuiltInSecurityScheme(name)) {\n\t\treturn BUILT_IN_SECURITY_SCHEMES[name];\n\t}\n\treturn undefined;\n}\n","import type { Logger } from '@geekmidas/logger';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport type { CookieFn, HeaderFn } from './Endpoint';\n\n/**\n * RLS context - key-value pairs to set as PostgreSQL session variables.\n * Keys become `prefix.key` (e.g., `app.user_id`).\n */\nexport interface RlsContext {\n\t[key: string]: string | number | boolean | null | undefined;\n}\n\n/**\n * Function type for extracting RLS context from request context.\n *\n * @template TServices - Available service dependencies\n * @template TSession - Session data type\n * @template TLogger - Logger type\n *\n * @example\n * ```ts\n * const extractor: RlsContextExtractor<[], UserSession> = ({ session }) => ({\n * user_id: session.userId,\n * tenant_id: session.tenantId,\n * roles: session.roles.join(','),\n * });\n * ```\n */\nexport type RlsContextExtractor<\n\tTServices extends Service[] = [],\n\tTSession = unknown,\n\tTLogger extends Logger = Logger,\n> = (ctx: {\n\tservices: ServiceRecord<TServices>;\n\tsession: TSession;\n\theader: HeaderFn;\n\tcookie: CookieFn;\n\tlogger: TLogger;\n}) => RlsContext | Promise<RlsContext>;\n\n/**\n * Configuration for RLS on an endpoint or factory.\n *\n * @template TServices - Available service dependencies\n * @template TSession - Session data type\n * @template TLogger - Logger type\n */\nexport interface RlsConfig<\n\tTServices extends Service[] = [],\n\tTSession = unknown,\n\tTLogger extends Logger = Logger,\n> {\n\t/** Function to extract RLS context from request */\n\textractor: RlsContextExtractor<TServices, TSession, TLogger>;\n\t/** Prefix for PostgreSQL session variables (default: 'app') */\n\tprefix?: string;\n}\n\n/**\n * Symbol used to bypass RLS for an endpoint.\n */\nexport const RLS_BYPASS = Symbol.for('geekmidas.rls.bypass');\n\n/**\n * Type for RLS bypass marker.\n */\nexport type RlsBypass = typeof RLS_BYPASS;\n","import type {\n\tAuditableAction,\n\tAuditStorage,\n\tExtractStorageAuditAction,\n} from '@geekmidas/audit';\nimport type { EventPublisher, MappedEvent } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type { RateLimitConfig } from '@geekmidas/rate-limit';\nimport type { Service } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport uniqBy from 'lodash.uniqby';\nimport { ConstructType } from '../Construct';\nimport { cloneWith } from '../clone';\nimport {\n\ttype Consumable,\n\tidsOf,\n\ttype ServicesOf,\n\tserviceOf,\n\tservicesOf,\n} from '../construct-interface';\nimport { BaseFunctionBuilder } from '../functions';\nimport type { HttpMethod } from '../types';\nimport type { Authorizer, SecurityScheme } from './Authorizer';\nimport { getSecurityScheme } from './Authorizer';\nimport type { ActorExtractor, MappedAudit } from './audit';\nimport type {\n\tAuthorizeFn,\n\tEndpointHandler,\n\tSessionFn,\n\tSuccessStatus,\n} from './Endpoint';\nimport {\n\tEndpoint,\n\ttype EndpointSchemas,\n\ttype EndpointSurface,\n} from './Endpoint';\nimport type { RlsBypass, RlsConfig } from './rls';\nimport { RLS_BYPASS } from './rls';\n\nexport class EndpointBuilder<\n\tTRoute extends string,\n\tTMethod extends HttpMethod,\n\tTInput extends EndpointSchemas = {},\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTSession = unknown,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTAuthorizers extends readonly string[] = readonly string[],\n\tTAuditStorage extends AuditStorage | undefined = undefined,\n\tTAuditStorageServiceName extends string = string,\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n\tTDatabase = undefined,\n\tTDatabaseServiceName extends string = string,\n> extends BaseFunctionBuilder<\n\tTInput,\n\tOutSchema,\n\tTServices,\n\tTLogger,\n\tTEventPublisher,\n\tTEventPublisherServiceName,\n\tTAuditStorage,\n\tTAuditStorageServiceName,\n\tTDatabase,\n\tTDatabaseServiceName\n> {\n\tprotected schemas: TInput = {} as TInput;\n\tprotected _description?: string;\n\tprotected _status?: SuccessStatus;\n\tprotected _tags?: string[];\n\tprotected _memorySize?: number;\n\tprotected _responseType: string = 'application/json';\n\t_getSession: SessionFn<TServices, TLogger, TSession, TDatabase> = () =>\n\t\t({}) as TSession;\n\t_authorize: AuthorizeFn<TServices, TLogger, TSession, TInput, TDatabase> =\n\t\t() => true;\n\t_rateLimit?: RateLimitConfig;\n\t_availableAuthorizers: Authorizer[] = [];\n\t_authorizerName?: TAuthorizers[number];\n\t_actorExtractor?: ActorExtractor<TServices, TSession, TLogger>;\n\t_audits: MappedAudit<TAuditAction, OutSchema>[] = [];\n\t/**\n\t * Internal: the surface this builder came from, carried to the endpoint.\n\t *\n\t * Assigned by the factory before the builder is handed out, which is the\n\t * only way a builder is ever created.\n\t */\n\t_surface!: EndpointSurface;\n\t_customSecuritySchemes: Record<string, SecurityScheme> = {};\n\t_rlsConfig?: RlsConfig<TServices, TSession, TLogger>;\n\t_rlsBypass?: boolean;\n\n\tconstructor(\n\t\treadonly route: TRoute,\n\t\treadonly method: TMethod,\n\t) {\n\t\tsuper(ConstructType.Endpoint);\n\t}\n\n\t// Internal setter for EndpointFactory to set default publisher\n\t_setPublisher(\n\t\tpublisher: Service<TEventPublisherServiceName, TEventPublisher>,\n\t) {\n\t\tthis._publisher = publisher;\n\t}\n\n\t// Internal setter for EndpointFactory to set default auditor storage\n\t_setAuditorStorage(\n\t\tstorage: Service<TAuditStorageServiceName, TAuditStorage>,\n\t) {\n\t\tthis._auditorStorage = storage;\n\t}\n\n\t// Internal setter for EndpointFactory to set default database service\n\t_setDatabaseService(service: Service<TDatabaseServiceName, TDatabase>) {\n\t\tthis._databaseService = service;\n\t}\n\n\tdescription(description: string): this {\n\t\treturn cloneWith(this, { _description: description });\n\t}\n\n\tstatus(status: SuccessStatus): this {\n\t\treturn cloneWith(this, { _status: status });\n\t}\n\n\toverride event<TEvent extends MappedEvent<TEventPublisher, OutSchema>>(\n\t\tevent: TEvent,\n\t): this {\n\t\t// Replaced rather than pushed: a clone shares whatever array the field\n\t\t// points at, so an in-place push would be seen by the base it came from.\n\t\treturn cloneWith(this, { _events: [...this._events, event] });\n\t}\n\n\ttags(tags: string[]): this {\n\t\treturn cloneWith(this, { _tags: tags });\n\t}\n\n\tmemorySize(memorySize: number): this {\n\t\treturn cloneWith(this, { _memorySize: memorySize });\n\t}\n\n\t/**\n\t * Set the response content type for this endpoint.\n\t *\n\t * Defaults to `'application/json'`. When set to any other value\n\t * (e.g. `'text/html'`, `'text/plain'`), the response body is emitted\n\t * as-is rather than JSON-serialized, and the `Content-Type` header\n\t * reflects the declared value. Runtime overrides via `r.header()` still win.\n\t *\n\t * @param type - The MIME type to return (e.g. `'text/html'`)\n\t *\n\t * @example\n\t * ```typescript\n\t * api.get('/checkout-page')\n\t * .output(z.string())\n\t * .responseType('text/html')\n\t * .handle(async () => '<html>...</html>');\n\t * ```\n\t */\n\tresponseType(type: string): this {\n\t\treturn cloneWith(this, { _responseType: type });\n\t}\n\n\toverride publisher<T extends EventPublisher<any>, TName extends string>(\n\t\tpublisher: Service<TName, T>,\n\t): EndpointBuilder<\n\t\tTRoute,\n\t\tTMethod,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTSession,\n\t\tT,\n\t\tTName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\treturn cloneWith(this, {\n\t\t\t_publisher: publisher as unknown as Service<\n\t\t\t\tTEventPublisherServiceName,\n\t\t\t\tTEventPublisher\n\t\t\t>,\n\t\t}) as unknown as EndpointBuilder<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTSession,\n\t\t\tT,\n\t\t\tTName,\n\t\t\tTAuthorizers,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>;\n\t}\n\n\tbody<T extends StandardSchemaV1>(\n\t\tschema: T,\n\t): EndpointBuilder<\n\t\tTRoute,\n\t\tTMethod,\n\t\tOmit<TInput, 'body'> & { body: T },\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\tthis.schemas.body = schema as unknown as T;\n\t\t// @ts-expect-error\n\t\treturn this;\n\t}\n\n\tsearch<T extends StandardSchemaV1>(\n\t\tschema: T,\n\t): EndpointBuilder<\n\t\tTRoute,\n\t\tTMethod,\n\t\tOmit<TInput, 'query'> & { query: T },\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\tthis.schemas.query = schema as unknown as T;\n\t\t// @ts-expect-error\n\t\treturn this;\n\t}\n\n\tquery<T extends StandardSchemaV1>(\n\t\tschema: T,\n\t): EndpointBuilder<\n\t\tTRoute,\n\t\tTMethod,\n\t\tOmit<TInput, 'query'> & { query: T },\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\treturn this.search(schema);\n\t}\n\n\tparams<T extends StandardSchemaV1>(\n\t\tschema: T,\n\t): EndpointBuilder<\n\t\tTRoute,\n\t\tTMethod,\n\t\tOmit<TInput, 'params'> & { params: T },\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\tthis.schemas.params = schema as unknown as T;\n\t\t// @ts-expect-error\n\t\treturn this;\n\t}\n\n\tauthorize(\n\t\tfn: AuthorizeFn<TServices, TLogger, TSession, TInput, TDatabase>,\n\t): this {\n\t\treturn cloneWith(this, { _authorize: fn });\n\t}\n\n\trateLimit(config: RateLimitConfig): this {\n\t\treturn cloneWith(this, { _rateLimit: config });\n\t}\n\n\tauthorizer(\n\t\tname: TAuthorizers[number] | 'none',\n\t): EndpointBuilder<\n\t\tTRoute,\n\t\tTMethod,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\t// Special case: 'none' explicitly marks endpoint as having no authorizer\n\t\tif (name === 'none') {\n\t\t\treturn cloneWith(this, { _authorizerName: undefined });\n\t\t}\n\n\t\t// Validate that the authorizer exists in available authorizers\n\t\tconst authorizerExists = this._availableAuthorizers.some(\n\t\t\t(a) => a.name === name,\n\t\t);\n\t\tif (!authorizerExists && this._availableAuthorizers.length > 0) {\n\t\t\tconst available = this._availableAuthorizers\n\t\t\t\t.map((a) => a.name)\n\t\t\t\t.join(', ');\n\t\t\tthrow new Error(\n\t\t\t\t`Authorizer \"${name as string}\" not found in available authorizers: ${available}`,\n\t\t\t);\n\t\t}\n\n\t\treturn cloneWith(this, { _authorizerName: name });\n\t}\n\n\t/**\n\t * Depend on constructs — a database, a bucket, a mail sender, a queue, a\n\t * topic.\n\t *\n\t * It records the edge and dissolves each construct's client into the\n\t * handler's service record under the construct's own id, so\n\t * `.dependsOn([uploads])` is what makes `services.uploads` exist and type.\n\t *\n\t * Constructs only. A `Service` does not match the shape, which is what keeps\n\t * env sniffing confined to `.services()` and the explicit lift.\n\t */\n\tdependsOn<const T extends readonly Consumable[]>(\n\t\tconstructs: T,\n\t): EndpointBuilder<\n\t\tTRoute,\n\t\tTMethod,\n\t\tTInput,\n\t\t[...TServices, ...ServicesOf<T>],\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\t// Both halves of the edge, from one call and one clone: the services the\n\t\t// handler runs with, and the ids the manifest records. Recording them\n\t\t// separately is what let them drift apart.\n\t\t//\n\t\t// `servicesOf` is the half that validates, so it runs first — recording\n\t\t// ids ahead of it left a caught `NotAConstruct` with `undefined` already\n\t\t// on a `string[]`.\n\t\tconst services = servicesOf(constructs) as unknown as Service[];\n\n\t\treturn cloneWith(this, {\n\t\t\t_services: uniqBy(\n\t\t\t\t[...this._services, ...services],\n\t\t\t\t(service: Service) => service.serviceName,\n\t\t\t),\n\t\t\t_constructs: idsOf(constructs, this._constructs),\n\t\t}) as unknown as EndpointBuilder<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\t[...TServices, ...ServicesOf<T>],\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuthorizers,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>;\n\t}\n\n\tservices<T extends Service[]>(\n\t\tservices: T,\n\t): EndpointBuilder<\n\t\tTRoute,\n\t\tTMethod,\n\t\tTInput,\n\t\t[...TServices, ...T],\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\treturn cloneWith(this, {\n\t\t\t_services: uniqBy(\n\t\t\t\t[...this._services, ...services],\n\t\t\t\t(s) => s.serviceName,\n\t\t\t) as TServices,\n\t\t}) as unknown as EndpointBuilder<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\t[...TServices, ...T],\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuthorizers,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>;\n\t}\n\n\tlogger<T extends Logger>(\n\t\tlogger: T,\n\t): EndpointBuilder<\n\t\tTRoute,\n\t\tTMethod,\n\t\tTInput,\n\t\tTServices,\n\t\tT,\n\t\tOutSchema,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\treturn cloneWith(this, {\n\t\t\t_logger: logger as unknown as TLogger,\n\t\t}) as unknown as EndpointBuilder<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tT,\n\t\t\tOutSchema,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuthorizers,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>;\n\t}\n\n\toutput<T extends StandardSchemaV1>(\n\t\tschema: T,\n\t): EndpointBuilder<\n\t\tTRoute,\n\t\tTMethod,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tT,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\treturn cloneWith(this, {\n\t\t\toutputSchema: schema as unknown as OutSchema,\n\t\t}) as unknown as EndpointBuilder<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tT,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuthorizers,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>;\n\t}\n\n\t/**\n\t * Set the auditor storage service for this endpoint.\n\t * This enables audit functionality and makes `auditor` available in the handler context.\n\t * The audit action type is automatically inferred from the storage's generic parameter.\n\t */\n\toverride auditor<T extends AuditStorage<any>, TName extends string>(\n\t\tstorage: Service<TName, T>,\n\t): EndpointBuilder<\n\t\tTRoute,\n\t\tTMethod,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tT,\n\t\tTName,\n\t\tExtractStorageAuditAction<T>,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\treturn cloneWith(this, {\n\t\t\t_auditorStorage: storage as unknown as Service<\n\t\t\t\tTAuditStorageServiceName,\n\t\t\t\tTAuditStorage\n\t\t\t>,\n\t\t}) as unknown as EndpointBuilder<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuthorizers,\n\t\t\tT,\n\t\t\tTName,\n\t\t\tExtractStorageAuditAction<T>,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>;\n\t}\n\n\t/**\n\t * Set the actor extractor function for audit records.\n\t * The actor is extracted from the request context and attached to all audits.\n\t */\n\tactor(\n\t\textractor: ActorExtractor<TServices, TSession, TLogger>,\n\t): EndpointBuilder<\n\t\tTRoute,\n\t\tTMethod,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\treturn cloneWith(this, { _actorExtractor: extractor });\n\t}\n\n\t/**\n\t * Add declarative audit definitions that are processed after the handler executes.\n\t * Similar to `.event()` for events, but for audits.\n\t *\n\t * @example\n\t * ```typescript\n\t * .audit<AppAuditAction>([\n\t * {\n\t * type: 'user.created',\n\t * payload: (response) => ({ userId: response.id, email: response.email }),\n\t * when: (response) => response.active,\n\t * entityId: (response) => response.id,\n\t * table: 'users',\n\t * },\n\t * ])\n\t * ```\n\t */\n\taudit(audits: MappedAudit<TAuditAction, OutSchema>[]): this {\n\t\treturn cloneWith(this, { _audits: audits });\n\t}\n\n\t/**\n\t * Set the database service for this endpoint.\n\t * The database will be available in the handler context as `db`.\n\t * When audit storage is configured and uses the same database,\n\t * `db` will automatically be the transaction for ACID compliance.\n\t *\n\t * @example\n\t * ```typescript\n\t * .database(databaseService)\n\t * .handle(async ({ db }) => {\n\t * // db is the raw database or transaction (when auditor uses same db)\n\t * return await db.selectFrom('users').selectAll().execute();\n\t * })\n\t * ```\n\t */\n\toverride database<T, TName extends string>(\n\t\tsource: Consumable<TName, T> | Service<TName, T>,\n\t): EndpointBuilder<\n\t\tTRoute,\n\t\tTMethod,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tOutSchema,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tT,\n\t\tTName\n\t> {\n\t\tconst service = serviceOf(source);\n\n\t\treturn cloneWith(this, {\n\t\t\t_databaseService: service as unknown as Service<\n\t\t\t\tTDatabaseServiceName,\n\t\t\t\tTDatabase\n\t\t\t>,\n\t\t}) as unknown as EndpointBuilder<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuthorizers,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tT,\n\t\t\tTName\n\t\t>;\n\t}\n\n\t/**\n\t * Configure RLS (Row-Level Security) context for this endpoint.\n\t * Pass `false` or `RLS_BYPASS` to explicitly bypass RLS for this endpoint.\n\t *\n\t * @example\n\t * ```typescript\n\t * // Custom RLS config for this endpoint\n\t * .rls({\n\t * extractor: ({ session }) => ({\n\t * user_id: session.userId,\n\t * tenant_id: session.tenantId,\n\t * }),\n\t * prefix: 'app',\n\t * })\n\t *\n\t * // Bypass RLS (for admin endpoints)\n\t * .rls(false)\n\t * ```\n\t */\n\trls(\n\t\tconfig: RlsConfig<TServices, TSession, TLogger> | false | RlsBypass,\n\t): this {\n\t\tif (config === false || config === RLS_BYPASS) {\n\t\t\tthis._rlsBypass = true;\n\t\t\tthis._rlsConfig = undefined;\n\t\t} else {\n\t\t\tthis._rlsConfig = config;\n\t\t\tthis._rlsBypass = false;\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Explicitly bypass RLS for this endpoint.\n\t * Useful for admin operations that need unrestricted database access.\n\t *\n\t * @example\n\t * ```typescript\n\t * .rlsBypass()\n\t * .handle(async ({ db }) => {\n\t * // Full access, no RLS filtering\n\t * return db.selectFrom('orders').selectAll().execute();\n\t * })\n\t * ```\n\t */\n\trlsBypass(): this {\n\t\treturn cloneWith(this, { _rlsBypass: true, _rlsConfig: undefined });\n\t}\n\n\t// EndpointBuilder doesn't have a generic input method - it uses body, query, params instead\n\tinput(_schema: any): any {\n\t\tthrow new Error(\n\t\t\t'EndpointBuilder does not support generic input. Use body(), query(), or params() instead.',\n\t\t);\n\t}\n\n\thandle(\n\t\tfn: EndpointHandler<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTSession,\n\t\t\tTDatabase,\n\t\t\tTAuditStorage,\n\t\t\tTAuditAction\n\t\t>,\n\t): Endpoint<\n\t\tTRoute,\n\t\tTMethod,\n\t\tTInput,\n\t\tOutSchema,\n\t\tTServices,\n\t\tTLogger,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\t// Find authorizer metadata if name is set\n\t\t// If the authorizer name is set but not in availableAuthorizers, create a simple authorizer object\n\t\tlet authorizer: Authorizer | undefined;\n\t\tif (this._authorizerName) {\n\t\t\tconst existingAuthorizer = this._availableAuthorizers.find(\n\t\t\t\t(a) => a.name === this._authorizerName,\n\t\t\t);\n\n\t\t\tif (existingAuthorizer) {\n\t\t\t\tauthorizer = existingAuthorizer;\n\t\t\t} else {\n\t\t\t\t// Create authorizer with security scheme if available (built-in or custom)\n\t\t\t\tconst securityScheme = getSecurityScheme(\n\t\t\t\t\tthis._authorizerName as string,\n\t\t\t\t\tthis._customSecuritySchemes,\n\t\t\t\t);\n\t\t\t\tauthorizer = {\n\t\t\t\t\tname: this._authorizerName as string,\n\t\t\t\t\tsecurityScheme,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst endpoint = new Endpoint({\n\t\t\tfn,\n\t\t\tmethod: this.method,\n\t\t\troute: this.route,\n\t\t\tdescription: this._description,\n\t\t\ttags: this._tags,\n\t\t\tinput: this.schemas,\n\t\t\toutput: this.outputSchema,\n\t\t\tservices: this._services,\n\t\t\tconstructs: this._constructs,\n\t\t\tlogger: this._logger,\n\t\t\ttimeout: this._timeout,\n\t\t\tmemorySize: this._memorySize,\n\t\t\tauthorize: this._authorize,\n\t\t\tstatus: this._status,\n\t\t\tgetSession: this._getSession,\n\t\t\trateLimit: this._rateLimit,\n\t\t\tpublisherService: this._publisher,\n\t\t\tevents: this._events,\n\t\t\tauthorizer,\n\t\t\tsurface: this._surface,\n\t\t\tauditorStorageService: this._auditorStorage,\n\t\t\tactorExtractor: this._actorExtractor,\n\t\t\taudits: this._audits,\n\t\t\tdatabaseService: this._databaseService,\n\t\t\trlsConfig: this._rlsConfig,\n\t\t\trlsBypass: this._rlsBypass,\n\t\t\tresponseType: this._responseType,\n\t\t});\n\n\t\t// One field says which process runs a construct, whatever its kind. An\n\t\t// endpoint's is its surface; a cron's is the worker that handed out the\n\t\t// factory. The build partitions on this rather than on directories.\n\t\tendpoint.owner = this._surface?.id;\n\n\t\treturn endpoint;\n\t}\n}\n","import type {\n\tAuditableAction,\n\tAuditStorage,\n\tExtractStorageAuditAction,\n} from '@geekmidas/audit';\nimport type { EventPublisher, MappedEvent } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport { DEFAULT_LOGGER } from '@geekmidas/logger/console';\nimport type { Service } from '@geekmidas/services';\nimport uniqBy from 'lodash.uniqby';\nimport {\n\ttype Consumable,\n\ttype ServicesOf,\n\tserviceOf,\n\tservicesOf,\n} from '../construct-interface';\nimport type { HttpMethod } from '../types';\nimport {\n\ttype Authorizer,\n\ttype BuiltInSecuritySchemeId,\n\tgetSecurityScheme,\n\ttype SecurityScheme,\n} from './Authorizer';\nimport type { ActorExtractor } from './audit';\nimport type { AuthorizeFn, EndpointSurface, SessionFn } from './Endpoint';\nimport { EndpointBuilder } from './EndpointBuilder';\nimport type { RlsConfig } from './rls';\n\n// Re-export SecurityScheme to make the type portable in declaration files\nexport type { SecurityScheme } from './Authorizer';\n\nexport class EndpointFactory<\n\tTServices extends Service[] = [],\n\tTBasePath extends string = '',\n\tTLogger extends Logger = Logger,\n\tTSession = unknown,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTAuthorizers extends readonly string[] = readonly string[],\n\tTAuditStorage extends AuditStorage<any> | undefined = undefined,\n\tTAuditStorageServiceName extends string = string,\n\tTAuditAction extends AuditableAction<\n\t\tstring,\n\t\tunknown\n\t> = ExtractStorageAuditAction<NonNullable<TAuditStorage>>,\n\tTDatabase = undefined,\n\tTDatabaseServiceName extends string = string,\n\tTSecuritySchemes extends Record<string, SecurityScheme> = Record<\n\t\tstring,\n\t\tSecurityScheme\n\t>,\n\tTRlsConfig extends\n\t\t| RlsConfig<TServices, TSession, TLogger>\n\t\t| undefined = undefined,\n> {\n\tprivate defaultServices: TServices = [] as unknown as TServices;\n\t/**\n\t * The constructs `.dependsOn()` was given, kept alongside the services they\n\t * dissolve into.\n\t *\n\t * `.dependsOn()` collapses straight into `.services()`, which is right for\n\t * *running* — a handler wants clients, not ids — and loses the one thing the\n\t * manifest needs: which constructs this endpoint reaches. Keeping the ids\n\t * here is what lets a route declare its edges, and lets a target derive its\n\t * environment from the graph rather than from sniffing what the code touched.\n\t */\n\tprivate defaultConstructs: string[] = [];\n\tprivate basePath: TBasePath = '' as TBasePath;\n\tprivate defaultAuthorizeFn?: AuthorizeFn<\n\t\tTServices,\n\t\tTLogger,\n\t\tTSession,\n\t\tundefined,\n\t\tTDatabase\n\t>;\n\tprivate defaultEventPublisher:\n\t\t| Service<TEventPublisherServiceName, TEventPublisher>\n\t\t| undefined;\n\tprivate defaultSessionExtractor?: SessionFn<\n\t\tTServices,\n\t\tTLogger,\n\t\tTSession,\n\t\tTDatabase\n\t>;\n\tprivate defaultLogger: TLogger;\n\t/**\n\t * The surface this factory belongs to, stamped onto everything it builds.\n\t *\n\t * Set only by `RestApi`, which is the only thing that has one. A factory\n\t * with no surface produces endpoints that carry none, which is what a\n\t * standalone endpoint has always been.\n\t */\n\tprivate surface: EndpointSurface;\n\tprivate availableAuthorizers: Authorizer[];\n\tprivate defaultAuthorizerName?: TAuthorizers[number];\n\tprivate defaultAuditorStorage:\n\t\t| Service<TAuditStorageServiceName, TAuditStorage>\n\t\t| undefined;\n\tprivate defaultDatabaseService:\n\t\t| Service<TDatabaseServiceName, TDatabase>\n\t\t| undefined;\n\tprivate defaultActorExtractor?: ActorExtractor<TServices, TSession, TLogger>;\n\tprivate customSecuritySchemes: TSecuritySchemes;\n\tprivate defaultRlsConfig?: TRlsConfig;\n\n\tconstructor({\n\t\tbasePath,\n\t\tdefaultAuthorizeFn,\n\t\tdefaultLogger = DEFAULT_LOGGER as TLogger,\n\t\tdefaultSessionExtractor,\n\t\t// @ts-expect-error\n\t\tdefaultServices = [] as TServices,\n\t\tdefaultConstructs = [] as string[],\n\t\tdefaultEventPublisher,\n\t\tavailableAuthorizers = [],\n\t\tdefaultAuthorizerName,\n\t\tdefaultAuditorStorage,\n\t\tdefaultDatabaseService,\n\t\tdefaultActorExtractor,\n\t\tcustomSecuritySchemes = {} as TSecuritySchemes,\n\t\tdefaultRlsConfig,\n\t\tsurface,\n\t}: EndpointFactoryOptions<\n\t\tTServices,\n\t\tTBasePath,\n\t\tTLogger,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTDatabase,\n\t\tTDatabaseServiceName,\n\t\tTSecuritySchemes,\n\t\tTRlsConfig\n\t>) {\n\t\t// Initialize default services\n\t\tthis.defaultConstructs = [...new Set(defaultConstructs)];\n\t\tthis.defaultServices = uniqBy(\n\t\t\tdefaultServices,\n\t\t\t(s) => s.serviceName,\n\t\t) as TServices;\n\n\t\tthis.basePath = basePath || ('' as TBasePath);\n\t\tthis.defaultAuthorizeFn = defaultAuthorizeFn;\n\t\tthis.defaultLogger = defaultLogger;\n\t\tthis.defaultSessionExtractor = defaultSessionExtractor;\n\t\tthis.defaultEventPublisher = defaultEventPublisher;\n\t\tthis.availableAuthorizers = availableAuthorizers;\n\t\tthis.defaultAuthorizerName = defaultAuthorizerName;\n\t\tthis.defaultAuditorStorage = defaultAuditorStorage;\n\t\tthis.defaultDatabaseService = defaultDatabaseService;\n\t\tthis.defaultActorExtractor = defaultActorExtractor;\n\t\tthis.customSecuritySchemes = customSecuritySchemes;\n\t\tthis.defaultRlsConfig = defaultRlsConfig;\n\t\tthis.surface = surface;\n\t}\n\n\tstatic joinPaths<TBasePath extends string, P extends string>(\n\t\tpath: P,\n\t\tbasePath: TBasePath = '' as TBasePath,\n\t): JoinPaths<TBasePath, P> {\n\t\t// Handle empty cases\n\t\tif (!basePath && !path) return '/' as JoinPaths<TBasePath, P>;\n\t\tif (!basePath)\n\t\t\treturn (path.startsWith('/') ? path : `/${path}`) as JoinPaths<\n\t\t\t\tTBasePath,\n\t\t\t\tP\n\t\t\t>;\n\t\tif (!path)\n\t\t\treturn (\n\t\t\t\tbasePath.startsWith('/') ? basePath : `/${basePath}`\n\t\t\t) as JoinPaths<TBasePath, P>;\n\n\t\tconst base = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;\n\t\tconst segment = path.startsWith('/') ? path : `/${path}`;\n\n\t\tlet result = base + segment;\n\n\t\t// Ensure leading slash\n\t\tif (!result.startsWith('/')) {\n\t\t\tresult = `/${result}`;\n\t\t}\n\n\t\t// Normalize multiple slashes (except in the middle of the path where they might be intentional)\n\t\tresult = result.replace(/^\\/+/g, '/');\n\n\t\t// Remove trailing slash unless it's the root path \"/\"\n\t\tif (result.length > 1 && result.endsWith('/')) {\n\t\t\tresult = result.slice(0, -1);\n\t\t}\n\n\t\treturn result as JoinPaths<TBasePath, P>;\n\t}\n\n\t// Configure available authorizers\n\tauthorizers<const T extends readonly string[]>(\n\t\tauthorizers: T,\n\t): EndpointFactory<\n\t\tTServices,\n\t\tTBasePath,\n\t\tTLogger,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tT,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName,\n\t\tTSecuritySchemes,\n\t\tTRlsConfig\n\t> {\n\t\tconst authorizerConfigs = authorizers.map((name) => ({\n\t\t\tname,\n\t\t\tsecurityScheme: getSecurityScheme(name, this.customSecuritySchemes),\n\t\t}));\n\t\treturn new EndpointFactory<\n\t\t\tTServices,\n\t\t\tTBasePath,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tT,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTSecuritySchemes,\n\t\t\tTRlsConfig\n\t\t>({\n\t\t\tdefaultServices: this.defaultServices,\n\t\t\tdefaultConstructs: this.defaultConstructs,\n\t\t\tbasePath: this.basePath,\n\t\t\tdefaultAuthorizeFn: this.defaultAuthorizeFn,\n\t\t\tdefaultLogger: this.defaultLogger,\n\t\t\tdefaultSessionExtractor: this.defaultSessionExtractor,\n\t\t\tdefaultEventPublisher: this.defaultEventPublisher,\n\t\t\tavailableAuthorizers: authorizerConfigs,\n\t\t\tdefaultAuthorizerName: this.defaultAuthorizerName,\n\t\t\tdefaultAuditorStorage: this.defaultAuditorStorage,\n\t\t\tdefaultDatabaseService: this.defaultDatabaseService,\n\t\t\tdefaultActorExtractor: this.defaultActorExtractor,\n\t\t\tcustomSecuritySchemes: this.customSecuritySchemes,\n\t\t\tsurface: this.surface,\n\t\t\tdefaultRlsConfig: this.defaultRlsConfig,\n\t\t});\n\t}\n\n\t/**\n\t * Define custom security schemes for this factory.\n\t * These extend the built-in schemes (jwt, bearer, apiKey, oauth2, oidc).\n\t *\n\t * @example\n\t * ```typescript\n\t * const router = e.securitySchemes({\n\t * awsIamSigV4: {\n\t * type: 'apiKey',\n\t * in: 'header',\n\t * name: 'Authorization',\n\t * 'x-amazon-apigateway-authtype': 'awsSigv4',\n\t * },\n\t * });\n\t * ```\n\t */\n\tsecuritySchemes<T extends Record<string, SecurityScheme>>(\n\t\tschemes: T,\n\t): EndpointFactory<\n\t\tTServices,\n\t\tTBasePath,\n\t\tTLogger,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName,\n\t\tTSecuritySchemes & T,\n\t\tTRlsConfig\n\t> {\n\t\treturn new EndpointFactory<\n\t\t\tTServices,\n\t\t\tTBasePath,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuthorizers,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTSecuritySchemes & T,\n\t\t\tTRlsConfig\n\t\t>({\n\t\t\tdefaultServices: this.defaultServices,\n\t\t\tdefaultConstructs: this.defaultConstructs,\n\t\t\tbasePath: this.basePath,\n\t\t\tdefaultAuthorizeFn: this.defaultAuthorizeFn,\n\t\t\tdefaultLogger: this.defaultLogger,\n\t\t\tdefaultSessionExtractor: this.defaultSessionExtractor,\n\t\t\tdefaultEventPublisher: this.defaultEventPublisher,\n\t\t\tavailableAuthorizers: this.availableAuthorizers,\n\t\t\tdefaultAuthorizerName: this.defaultAuthorizerName,\n\t\t\tdefaultAuditorStorage: this.defaultAuditorStorage,\n\t\t\tdefaultDatabaseService: this.defaultDatabaseService,\n\t\t\tdefaultActorExtractor: this.defaultActorExtractor,\n\t\t\tcustomSecuritySchemes: {\n\t\t\t\t...this.customSecuritySchemes,\n\t\t\t\t...schemes,\n\t\t\t} as TSecuritySchemes & T,\n\t\t\tsurface: this.surface,\n\t\t\tdefaultRlsConfig: this.defaultRlsConfig,\n\t\t});\n\t}\n\n\t/**\n\t * Set the default authorizer for all endpoints created from this factory.\n\t * Individual endpoints can override this by calling `.authorizer()` on the builder.\n\t * Use `'none'` to explicitly disable authorization for all endpoints.\n\t *\n\t * Accepts:\n\t * - Built-in security scheme names: 'jwt', 'bearer', 'apiKey', 'oauth2', 'oidc'\n\t * - Custom security scheme names defined via `.securitySchemes()`\n\t * - 'none' to disable authorization\n\t */\n\tauthorizer(\n\t\tname:\n\t\t\t| BuiltInSecuritySchemeId\n\t\t\t| keyof TSecuritySchemes\n\t\t\t| TAuthorizers[number]\n\t\t\t| 'none',\n\t): EndpointFactory<\n\t\tTServices,\n\t\tTBasePath,\n\t\tTLogger,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName,\n\t\tTSecuritySchemes,\n\t\tTRlsConfig\n\t> {\n\t\t// Validate that the authorizer exists in available authorizers (if authorizers() was called)\n\t\tif (name !== 'none' && this.availableAuthorizers.length > 0) {\n\t\t\tconst authorizerExists = this.availableAuthorizers.some(\n\t\t\t\t(a) => a.name === name,\n\t\t\t);\n\t\t\tif (!authorizerExists) {\n\t\t\t\tconst available = this.availableAuthorizers\n\t\t\t\t\t.map((a) => a.name)\n\t\t\t\t\t.join(', ');\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Authorizer \"${name as string}\" not found in available authorizers: ${available}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn new EndpointFactory<\n\t\t\tTServices,\n\t\t\tTBasePath,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuthorizers,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTSecuritySchemes,\n\t\t\tTRlsConfig\n\t\t>({\n\t\t\tdefaultServices: this.defaultServices,\n\t\t\tdefaultConstructs: this.defaultConstructs,\n\t\t\tbasePath: this.basePath,\n\t\t\tdefaultAuthorizeFn: this.defaultAuthorizeFn,\n\t\t\tdefaultLogger: this.defaultLogger,\n\t\t\tdefaultSessionExtractor: this.defaultSessionExtractor,\n\t\t\tdefaultEventPublisher: this.defaultEventPublisher,\n\t\t\tavailableAuthorizers: this.availableAuthorizers,\n\t\t\tdefaultAuthorizerName:\n\t\t\t\tname === 'none' ? undefined : (name as TAuthorizers[number]),\n\t\t\tdefaultAuditorStorage: this.defaultAuditorStorage,\n\t\t\tdefaultDatabaseService: this.defaultDatabaseService,\n\t\t\tdefaultActorExtractor: this.defaultActorExtractor,\n\t\t\tcustomSecuritySchemes: this.customSecuritySchemes,\n\t\t\tsurface: this.surface,\n\t\t\tdefaultRlsConfig: this.defaultRlsConfig,\n\t\t});\n\t}\n\n\t// Create a sub-router with a path prefix\n\troute<TPath extends string>(\n\t\tpath: TPath,\n\t): EndpointFactory<\n\t\tTServices,\n\t\tJoinPaths<TBasePath, TPath>,\n\t\tTLogger,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName,\n\t\tTSecuritySchemes,\n\t\tTRlsConfig\n\t> {\n\t\tconst newBasePath = EndpointFactory.joinPaths(path, this.basePath);\n\t\treturn new EndpointFactory<\n\t\t\tTServices,\n\t\t\tJoinPaths<TBasePath, TPath>,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuthorizers,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTSecuritySchemes,\n\t\t\tTRlsConfig\n\t\t>({\n\t\t\tdefaultServices: this.defaultServices,\n\t\t\tdefaultConstructs: this.defaultConstructs,\n\t\t\tbasePath: newBasePath,\n\t\t\tdefaultAuthorizeFn: this.defaultAuthorizeFn,\n\t\t\tdefaultLogger: this.defaultLogger,\n\t\t\tdefaultSessionExtractor: this.defaultSessionExtractor,\n\t\t\tdefaultEventPublisher: this.defaultEventPublisher,\n\t\t\tavailableAuthorizers: this.availableAuthorizers,\n\t\t\tdefaultAuthorizerName: this.defaultAuthorizerName,\n\t\t\tdefaultAuditorStorage: this.defaultAuditorStorage,\n\t\t\tdefaultDatabaseService: this.defaultDatabaseService,\n\t\t\tdefaultActorExtractor: this.defaultActorExtractor,\n\t\t\tcustomSecuritySchemes: this.customSecuritySchemes,\n\t\t\tsurface: this.surface,\n\t\t\tdefaultRlsConfig: this.defaultRlsConfig,\n\t\t});\n\t}\n\n\t// Create a new factory with authorization\n\tauthorize(\n\t\tfn: AuthorizeFn<TServices, TLogger, TSession, undefined, TDatabase>,\n\t): EndpointFactory<\n\t\tTServices,\n\t\tTBasePath,\n\t\tTLogger,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName,\n\t\tTSecuritySchemes,\n\t\tTRlsConfig\n\t> {\n\t\treturn new EndpointFactory<\n\t\t\tTServices,\n\t\t\tTBasePath,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuthorizers,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTSecuritySchemes,\n\t\t\tTRlsConfig\n\t\t>({\n\t\t\tdefaultServices: this.defaultServices,\n\t\t\tdefaultConstructs: this.defaultConstructs,\n\t\t\tbasePath: this.basePath,\n\t\t\tdefaultAuthorizeFn: fn,\n\t\t\tdefaultLogger: this.defaultLogger,\n\t\t\tdefaultSessionExtractor: this.defaultSessionExtractor,\n\t\t\tdefaultEventPublisher: this.defaultEventPublisher,\n\t\t\tavailableAuthorizers: this.availableAuthorizers,\n\t\t\tdefaultAuthorizerName: this.defaultAuthorizerName,\n\t\t\tdefaultAuditorStorage: this.defaultAuditorStorage,\n\t\t\tdefaultDatabaseService: this.defaultDatabaseService,\n\t\t\tdefaultActorExtractor: this.defaultActorExtractor,\n\t\t\tcustomSecuritySchemes: this.customSecuritySchemes,\n\t\t\tsurface: this.surface,\n\t\t\tdefaultRlsConfig: this.defaultRlsConfig,\n\t\t});\n\t}\n\n\t// Create a new factory with services\n\t/**\n\t * Depend on constructs — a database, a bucket, a mail sender, a queue, a\n\t * topic.\n\t *\n\t * It records the edge and dissolves each construct's client into the\n\t * handler's service record under the construct's own id, so\n\t * `.dependsOn([uploads])` is what makes `services.uploads` exist and type.\n\t *\n\t * Constructs only. A `Service` does not match the shape, which is what keeps\n\t * env sniffing confined to `.services()` and the explicit lift.\n\t */\n\tdependsOn<const S extends readonly Consumable[]>(\n\t\tconstructs: S,\n\t): EndpointFactory<\n\t\t[...ServicesOf<S>, ...TServices],\n\t\tTBasePath,\n\t\tTLogger,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName,\n\t\tTSecuritySchemes,\n\t\tRlsConfig<[...ServicesOf<S>, ...TServices], TSession, TLogger> | undefined\n\t> {\n\t\t// The services are what a handler *runs* with; the ids are what the\n\t\t// manifest needs. Dissolving to services alone is what lost the edges —\n\t\t// the same information, one of the two forms discarded.\n\t\tconst next = this.services(servicesOf(constructs) as unknown as Service[]);\n\t\tnext.defaultConstructs = [\n\t\t\t...new Set([\n\t\t\t\t...this.defaultConstructs,\n\t\t\t\t...constructs.map((construct) => construct.id),\n\t\t\t]),\n\t\t];\n\n\t\treturn next as unknown as EndpointFactory<\n\t\t\t[...ServicesOf<S>, ...TServices],\n\t\t\tTBasePath,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuthorizers,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTSecuritySchemes,\n\t\t\tRlsConfig<[...ServicesOf<S>, ...TServices], TSession, TLogger> | undefined\n\t\t>;\n\t}\n\n\tservices<S extends Service[]>(\n\t\tservices: S,\n\t): EndpointFactory<\n\t\t[...S, ...TServices],\n\t\tTBasePath,\n\t\tTLogger,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName,\n\t\tTSecuritySchemes,\n\t\tRlsConfig<[...S, ...TServices], TSession, TLogger> | undefined\n\t> {\n\t\treturn new EndpointFactory<\n\t\t\t[...S, ...TServices],\n\t\t\tTBasePath,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuthorizers,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTSecuritySchemes,\n\t\t\tRlsConfig<[...S, ...TServices], TSession, TLogger> | undefined\n\t\t>({\n\t\t\tdefaultServices: [...services, ...this.defaultServices],\n\t\t\tdefaultConstructs: this.defaultConstructs,\n\t\t\tbasePath: this.basePath,\n\t\t\tdefaultAuthorizeFn: this.defaultAuthorizeFn as unknown as AuthorizeFn<\n\t\t\t\t[...S, ...TServices],\n\t\t\t\tTLogger,\n\t\t\t\tTSession\n\t\t\t>,\n\t\t\tdefaultLogger: this.defaultLogger,\n\t\t\tdefaultSessionExtractor: this.defaultSessionExtractor as unknown as\n\t\t\t\t| SessionFn<[...S, ...TServices], TLogger, TSession, TDatabase>\n\t\t\t\t| undefined,\n\t\t\tdefaultEventPublisher: this.defaultEventPublisher,\n\t\t\tavailableAuthorizers: this.availableAuthorizers,\n\t\t\tdefaultAuthorizerName: this.defaultAuthorizerName,\n\t\t\tdefaultAuditorStorage: this.defaultAuditorStorage,\n\t\t\tdefaultDatabaseService: this.defaultDatabaseService,\n\t\t\tdefaultActorExtractor: this.defaultActorExtractor as unknown as\n\t\t\t\t| ActorExtractor<[...S, ...TServices], TSession, TLogger>\n\t\t\t\t| undefined,\n\t\t\tcustomSecuritySchemes: this.customSecuritySchemes,\n\t\t\tsurface: this.surface,\n\t\t\tdefaultRlsConfig: this.defaultRlsConfig as unknown as\n\t\t\t\t| RlsConfig<[...S, ...TServices], TSession, TLogger>\n\t\t\t\t| undefined,\n\t\t});\n\t}\n\n\tlogger<L extends Logger>(\n\t\tlogger: L,\n\t): EndpointFactory<\n\t\tTServices,\n\t\tTBasePath,\n\t\tL,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName,\n\t\tTSecuritySchemes,\n\t\tRlsConfig<TServices, TSession, L> | undefined\n\t> {\n\t\treturn new EndpointFactory<\n\t\t\tTServices,\n\t\t\tTBasePath,\n\t\t\tL,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuthorizers,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTSecuritySchemes,\n\t\t\tRlsConfig<TServices, TSession, L> | undefined\n\t\t>({\n\t\t\tdefaultServices: this.defaultServices,\n\t\t\tdefaultConstructs: this.defaultConstructs,\n\t\t\tbasePath: this.basePath,\n\t\t\tdefaultAuthorizeFn: this.defaultAuthorizeFn as unknown as AuthorizeFn<\n\t\t\t\tTServices,\n\t\t\t\tL,\n\t\t\t\tTSession\n\t\t\t>,\n\t\t\tdefaultLogger: logger,\n\t\t\tdefaultSessionExtractor: this\n\t\t\t\t.defaultSessionExtractor as unknown as SessionFn<\n\t\t\t\tTServices,\n\t\t\t\tL,\n\t\t\t\tTSession\n\t\t\t>,\n\t\t\tdefaultEventPublisher: this.defaultEventPublisher,\n\t\t\tavailableAuthorizers: this.availableAuthorizers,\n\t\t\tdefaultAuthorizerName: this.defaultAuthorizerName,\n\t\t\tdefaultAuditorStorage: this.defaultAuditorStorage,\n\t\t\tdefaultDatabaseService: this.defaultDatabaseService,\n\t\t\tdefaultActorExtractor: this\n\t\t\t\t.defaultActorExtractor as unknown as ActorExtractor<\n\t\t\t\tTServices,\n\t\t\t\tTSession,\n\t\t\t\tL\n\t\t\t>,\n\t\t\tcustomSecuritySchemes: this.customSecuritySchemes,\n\t\t\tsurface: this.surface,\n\t\t\tdefaultRlsConfig: this.defaultRlsConfig as unknown as\n\t\t\t\t| RlsConfig<TServices, TSession, L>\n\t\t\t\t| undefined,\n\t\t});\n\t}\n\n\tpublisher<\n\t\tT extends EventPublisher<any>,\n\t\tTServiceName extends string = string,\n\t>(\n\t\tpublisher: Service<TServiceName, T>,\n\t): EndpointFactory<\n\t\tTServices,\n\t\tTBasePath,\n\t\tTLogger,\n\t\tTSession,\n\t\tT,\n\t\tTServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName,\n\t\tTSecuritySchemes,\n\t\tTRlsConfig\n\t> {\n\t\treturn new EndpointFactory<\n\t\t\tTServices,\n\t\t\tTBasePath,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tT,\n\t\t\tTServiceName,\n\t\t\tTAuthorizers,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTSecuritySchemes,\n\t\t\tTRlsConfig\n\t\t>({\n\t\t\tdefaultServices: this.defaultServices,\n\t\t\tdefaultConstructs: this.defaultConstructs,\n\t\t\tbasePath: this.basePath,\n\t\t\tdefaultAuthorizeFn: this.defaultAuthorizeFn,\n\t\t\tdefaultLogger: this.defaultLogger,\n\t\t\tdefaultSessionExtractor: this.defaultSessionExtractor,\n\t\t\tdefaultEventPublisher: publisher,\n\t\t\tavailableAuthorizers: this.availableAuthorizers,\n\t\t\tdefaultAuthorizerName: this.defaultAuthorizerName,\n\t\t\tdefaultAuditorStorage: this.defaultAuditorStorage,\n\t\t\tdefaultDatabaseService: this.defaultDatabaseService,\n\t\t\tdefaultActorExtractor: this.defaultActorExtractor,\n\t\t\tcustomSecuritySchemes: this.customSecuritySchemes,\n\t\t\tsurface: this.surface,\n\t\t\tdefaultRlsConfig: this.defaultRlsConfig,\n\t\t});\n\t}\n\n\tsession<T>(\n\t\tsession: SessionFn<TServices, TLogger, T, TDatabase>,\n\t): EndpointFactory<\n\t\tTServices,\n\t\tTBasePath,\n\t\tTLogger,\n\t\tT,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName,\n\t\tTSecuritySchemes,\n\t\tRlsConfig<TServices, T, TLogger> | undefined\n\t> {\n\t\treturn new EndpointFactory<\n\t\t\tTServices,\n\t\t\tTBasePath,\n\t\t\tTLogger,\n\t\t\tT,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuthorizers,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTSecuritySchemes,\n\t\t\tRlsConfig<TServices, T, TLogger> | undefined\n\t\t>({\n\t\t\tdefaultServices: this.defaultServices,\n\t\t\tdefaultConstructs: this.defaultConstructs,\n\t\t\tbasePath: this.basePath,\n\t\t\tdefaultAuthorizeFn: this.defaultAuthorizeFn as unknown as AuthorizeFn<\n\t\t\t\tTServices,\n\t\t\t\tTLogger,\n\t\t\t\tT\n\t\t\t>,\n\t\t\tdefaultLogger: this.defaultLogger,\n\t\t\tdefaultSessionExtractor: session,\n\t\t\tdefaultEventPublisher: this.defaultEventPublisher,\n\t\t\tavailableAuthorizers: this.availableAuthorizers,\n\t\t\tdefaultAuthorizerName: this.defaultAuthorizerName,\n\t\t\tdefaultAuditorStorage: this.defaultAuditorStorage,\n\t\t\tdefaultDatabaseService: this.defaultDatabaseService,\n\t\t\tdefaultActorExtractor: this\n\t\t\t\t.defaultActorExtractor as unknown as ActorExtractor<\n\t\t\t\tTServices,\n\t\t\t\tT,\n\t\t\t\tTLogger\n\t\t\t>,\n\t\t\tcustomSecuritySchemes: this.customSecuritySchemes,\n\t\t\tsurface: this.surface,\n\t\t\tdefaultRlsConfig: this.defaultRlsConfig as unknown as\n\t\t\t\t| RlsConfig<TServices, T, TLogger>\n\t\t\t\t| undefined,\n\t\t});\n\t}\n\n\t/**\n\t * Set the database service for endpoints created from this factory.\n\t * The database will be available in handler context as `db`.\n\t */\n\tdatabase<T, TName extends string>(\n\t\tsource: Consumable<TName, T> | Service<TName, T>,\n\t): EndpointFactory<\n\t\tTServices,\n\t\tTBasePath,\n\t\tTLogger,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tT,\n\t\tTName,\n\t\tTSecuritySchemes,\n\t\tTRlsConfig\n\t> {\n\t\tconst service = serviceOf(source);\n\n\t\treturn new EndpointFactory<\n\t\t\tTServices,\n\t\t\tTBasePath,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuthorizers,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tT,\n\t\t\tTName,\n\t\t\tTSecuritySchemes,\n\t\t\tTRlsConfig\n\t\t>({\n\t\t\tdefaultServices: this.defaultServices,\n\t\t\tdefaultConstructs: this.defaultConstructs,\n\t\t\tbasePath: this.basePath,\n\t\t\tdefaultAuthorizeFn: this.defaultAuthorizeFn as unknown as\n\t\t\t\t| AuthorizeFn<TServices, TLogger, TSession, undefined, T>\n\t\t\t\t| undefined,\n\t\t\tdefaultLogger: this.defaultLogger,\n\t\t\t// Reset session extractor when database changes - user should call .session() after .database()\n\t\t\t// to get proper type inference for the new database type\n\t\t\tdefaultSessionExtractor: this.defaultSessionExtractor as unknown as\n\t\t\t\t| SessionFn<TServices, TLogger, TSession, T>\n\t\t\t\t| undefined,\n\t\t\tdefaultEventPublisher: this.defaultEventPublisher,\n\t\t\tavailableAuthorizers: this.availableAuthorizers,\n\t\t\tdefaultAuthorizerName: this.defaultAuthorizerName,\n\t\t\tdefaultAuditorStorage: this.defaultAuditorStorage,\n\t\t\tdefaultDatabaseService: service,\n\t\t\tcustomSecuritySchemes: this.customSecuritySchemes,\n\t\t\tsurface: this.surface,\n\t\t\tdefaultRlsConfig: this.defaultRlsConfig,\n\t\t});\n\t}\n\n\t/**\n\t * Set the auditor storage service for endpoints created from this factory.\n\t * This enables audit functionality and makes `auditor` available in handler context.\n\t * The audit action type is automatically inferred from the storage's generic parameter.\n\t */\n\tauditor<T extends AuditStorage<any>, TName extends string>(\n\t\tstorage: Service<TName, T>,\n\t): EndpointFactory<\n\t\tTServices,\n\t\tTBasePath,\n\t\tTLogger,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tT,\n\t\tTName,\n\t\tExtractStorageAuditAction<T>,\n\t\tTDatabase,\n\t\tTDatabaseServiceName,\n\t\tTSecuritySchemes,\n\t\tTRlsConfig\n\t> {\n\t\treturn new EndpointFactory<\n\t\t\tTServices,\n\t\t\tTBasePath,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuthorizers,\n\t\t\tT,\n\t\t\tTName,\n\t\t\tExtractStorageAuditAction<T>,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTSecuritySchemes,\n\t\t\tTRlsConfig\n\t\t>({\n\t\t\tdefaultServices: this.defaultServices,\n\t\t\tdefaultConstructs: this.defaultConstructs,\n\t\t\tbasePath: this.basePath,\n\t\t\tdefaultAuthorizeFn: this.defaultAuthorizeFn,\n\t\t\tdefaultLogger: this.defaultLogger,\n\t\t\tdefaultSessionExtractor: this.defaultSessionExtractor,\n\t\t\tdefaultEventPublisher: this.defaultEventPublisher,\n\t\t\tavailableAuthorizers: this.availableAuthorizers,\n\t\t\tdefaultAuthorizerName: this.defaultAuthorizerName,\n\t\t\tdefaultAuditorStorage: storage,\n\t\t\tdefaultDatabaseService: this.defaultDatabaseService,\n\t\t\tdefaultActorExtractor: this\n\t\t\t\t.defaultActorExtractor as unknown as ActorExtractor<\n\t\t\t\tTServices,\n\t\t\t\tTSession,\n\t\t\t\tTLogger\n\t\t\t>,\n\t\t\tcustomSecuritySchemes: this.customSecuritySchemes,\n\t\t\tsurface: this.surface,\n\t\t\tdefaultRlsConfig: this.defaultRlsConfig,\n\t\t});\n\t}\n\n\t/**\n\t * Set the actor extractor function for endpoints created from this factory.\n\t * The actor is extracted from the request context and attached to all audits.\n\t */\n\tactor(\n\t\textractor: ActorExtractor<TServices, TSession, TLogger>,\n\t): EndpointFactory<\n\t\tTServices,\n\t\tTBasePath,\n\t\tTLogger,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName,\n\t\tTSecuritySchemes,\n\t\tTRlsConfig\n\t> {\n\t\treturn new EndpointFactory<\n\t\t\tTServices,\n\t\t\tTBasePath,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuthorizers,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTSecuritySchemes,\n\t\t\tTRlsConfig\n\t\t>({\n\t\t\tdefaultServices: this.defaultServices,\n\t\t\tdefaultConstructs: this.defaultConstructs,\n\t\t\tbasePath: this.basePath,\n\t\t\tdefaultAuthorizeFn: this.defaultAuthorizeFn,\n\t\t\tdefaultLogger: this.defaultLogger,\n\t\t\tdefaultSessionExtractor: this.defaultSessionExtractor,\n\t\t\tdefaultEventPublisher: this.defaultEventPublisher,\n\t\t\tavailableAuthorizers: this.availableAuthorizers,\n\t\t\tdefaultAuthorizerName: this.defaultAuthorizerName,\n\t\t\tdefaultAuditorStorage: this.defaultAuditorStorage,\n\t\t\tdefaultDatabaseService: this.defaultDatabaseService,\n\t\t\tdefaultActorExtractor: extractor,\n\t\t\tcustomSecuritySchemes: this.customSecuritySchemes,\n\t\t\tsurface: this.surface,\n\t\t\tdefaultRlsConfig: this.defaultRlsConfig,\n\t\t});\n\t}\n\n\t/**\n\t * Set the RLS (Row-Level Security) configuration for endpoints created from this factory.\n\t * This enables automatic PostgreSQL session variable setting for RLS policies.\n\t *\n\t * @example\n\t * ```typescript\n\t * const api = new EndpointFactory()\n\t * .database(databaseService)\n\t * .session(extractSession)\n\t * .rls({\n\t * extractor: ({ session }) => ({\n\t * user_id: session.userId,\n\t * tenant_id: session.tenantId,\n\t * }),\n\t * prefix: 'app',\n\t * });\n\t * ```\n\t */\n\trls<TConfig extends RlsConfig<TServices, TSession, TLogger>>(\n\t\tconfig: TConfig,\n\t): EndpointFactory<\n\t\tTServices,\n\t\tTBasePath,\n\t\tTLogger,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName,\n\t\tTSecuritySchemes,\n\t\tTConfig\n\t> {\n\t\treturn new EndpointFactory<\n\t\t\tTServices,\n\t\t\tTBasePath,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuthorizers,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTSecuritySchemes,\n\t\t\tTConfig\n\t\t>({\n\t\t\tdefaultServices: this.defaultServices,\n\t\t\tdefaultConstructs: this.defaultConstructs,\n\t\t\tbasePath: this.basePath,\n\t\t\tdefaultAuthorizeFn: this.defaultAuthorizeFn,\n\t\t\tdefaultLogger: this.defaultLogger,\n\t\t\tdefaultSessionExtractor: this.defaultSessionExtractor,\n\t\t\tdefaultEventPublisher: this.defaultEventPublisher,\n\t\t\tavailableAuthorizers: this.availableAuthorizers,\n\t\t\tdefaultAuthorizerName: this.defaultAuthorizerName,\n\t\t\tdefaultAuditorStorage: this.defaultAuditorStorage,\n\t\t\tdefaultDatabaseService: this.defaultDatabaseService,\n\t\t\tdefaultActorExtractor: this.defaultActorExtractor,\n\t\t\tcustomSecuritySchemes: this.customSecuritySchemes,\n\t\t\tsurface: this.surface,\n\t\t\tdefaultRlsConfig: config,\n\t\t});\n\t}\n\n\tprivate createBuilder<TMethod extends HttpMethod, TPath extends string>(\n\t\tmethod: TMethod,\n\t\tpath: TPath,\n\t): EndpointBuilder<\n\t\tJoinPaths<TBasePath, TPath>,\n\t\tTMethod,\n\t\t{},\n\t\tTServices,\n\t\tTLogger,\n\t\tundefined,\n\t\tTSession,\n\t\tTEventPublisher,\n\t\tTEventPublisherServiceName,\n\t\tTAuthorizers,\n\t\tTAuditStorage,\n\t\tTAuditStorageServiceName,\n\t\tTAuditAction,\n\t\tTDatabase,\n\t\tTDatabaseServiceName\n\t> {\n\t\tconst fullPath = EndpointFactory.joinPaths(path, this.basePath);\n\t\tconst builder = new EndpointBuilder<\n\t\t\tJoinPaths<TBasePath, TPath>,\n\t\t\tTMethod,\n\t\t\t{},\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tundefined,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuthorizers,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>(fullPath, method);\n\n\t\tif (this.defaultAuthorizeFn) {\n\t\t\tbuilder._authorize = this.defaultAuthorizeFn as any;\n\t\t}\n\t\tif (this.defaultServices.length) {\n\t\t\t// Create a copy to avoid sharing references between builders\n\t\t\tbuilder._services = [...this.defaultServices] as TServices;\n\t\t}\n\t\tif (this.defaultConstructs.length) {\n\t\t\t// Alongside the services, not instead of them: one is what the handler\n\t\t\t// runs with, the other is what the manifest records it reaches.\n\t\t\tbuilder._constructs = [...this.defaultConstructs];\n\t\t}\n\n\t\tif (this.defaultLogger) {\n\t\t\tbuilder._logger = this.defaultLogger as TLogger;\n\t\t}\n\n\t\tbuilder._surface = this.surface;\n\n\t\tif (this.defaultSessionExtractor) {\n\t\t\tbuilder._getSession = this.defaultSessionExtractor as SessionFn<\n\t\t\t\tTServices,\n\t\t\t\tTLogger,\n\t\t\t\tTSession\n\t\t\t>;\n\t\t}\n\n\t\tif (this.defaultEventPublisher) {\n\t\t\tbuilder._setPublisher(this.defaultEventPublisher);\n\t\t}\n\n\t\t// Set available authorizers and default\n\t\tbuilder._availableAuthorizers = this.availableAuthorizers;\n\t\tif (this.defaultAuthorizerName) {\n\t\t\tbuilder._authorizerName = this.defaultAuthorizerName;\n\t\t}\n\n\t\t// Set auditor storage if configured\n\t\tif (this.defaultAuditorStorage) {\n\t\t\tbuilder._setAuditorStorage(this.defaultAuditorStorage as any);\n\t\t}\n\n\t\t// Set database service if configured\n\t\tif (this.defaultDatabaseService) {\n\t\t\tbuilder._setDatabaseService(this.defaultDatabaseService as any);\n\t\t}\n\n\t\t// Set actor extractor if configured\n\t\tif (this.defaultActorExtractor) {\n\t\t\tbuilder._actorExtractor = this.defaultActorExtractor;\n\t\t}\n\n\t\t// Set custom security schemes\n\t\tbuilder._customSecuritySchemes = this.customSecuritySchemes;\n\n\t\t// Set RLS config if configured\n\t\tif (this.defaultRlsConfig) {\n\t\t\tbuilder._rlsConfig = this.defaultRlsConfig as any;\n\t\t}\n\n\t\treturn builder;\n\t}\n\n\tpost<TPath extends string>(path: TPath) {\n\t\treturn this.createBuilder('POST', path);\n\t}\n\n\tget<TPath extends string>(path: TPath) {\n\t\treturn this.createBuilder('GET', path);\n\t}\n\n\tput<TPath extends string>(path: TPath) {\n\t\treturn this.createBuilder('PUT', path);\n\t}\n\n\tdelete<TPath extends string>(path: TPath) {\n\t\treturn this.createBuilder('DELETE', path);\n\t}\n\n\tpatch<TPath extends string>(path: TPath) {\n\t\treturn this.createBuilder('PATCH', path);\n\t}\n\n\toptions<TPath extends string>(path: TPath) {\n\t\treturn this.createBuilder('OPTIONS', path);\n\t}\n}\n\nexport type RemoveTrailingSlash<T extends string> = T extends `${infer Rest}/`\n\t? Rest extends ''\n\t\t? T // Keep \"/\" as is\n\t\t: Rest\n\t: T;\n\nexport type JoinPaths<\n\tTBasePath extends string,\n\tTPath extends string,\n> = RemoveTrailingSlash<\n\tTBasePath extends ''\n\t\t? TPath\n\t\t: TPath extends ''\n\t\t\t? TBasePath\n\t\t\t: TBasePath extends '/'\n\t\t\t\t? TPath extends `/${string}`\n\t\t\t\t\t? TPath\n\t\t\t\t\t: `/${TPath}`\n\t\t\t\t: TBasePath extends `${infer Base}/`\n\t\t\t\t\t? TPath extends `/${infer Rest}`\n\t\t\t\t\t\t? `${Base}/${Rest}`\n\t\t\t\t\t\t: `${Base}/${TPath}`\n\t\t\t\t\t: TPath extends `/${infer Rest}`\n\t\t\t\t\t\t? `${TBasePath}/${Rest}`\n\t\t\t\t\t\t: `${TBasePath}/${TPath}`\n>;\n\nexport interface EndpointFactoryOptions<\n\tTServices extends Service[] = [],\n\tTBasePath extends string = '',\n\tTLogger extends Logger = Logger,\n\tTSession = unknown,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTAuthorizers extends readonly string[] = readonly string[],\n\tTAuditStorage extends AuditStorage | undefined = undefined,\n\tTAuditStorageServiceName extends string = string,\n\tTDatabase = undefined,\n\tTDatabaseServiceName extends string = string,\n\tTSecuritySchemes extends Record<string, SecurityScheme> = Record<\n\t\tstring,\n\t\tSecurityScheme\n\t>,\n\tTRlsConfig extends\n\t\t| RlsConfig<TServices, TSession, TLogger>\n\t\t| undefined = undefined,\n> {\n\tdefaultServices?: TServices;\n\t/** Construct ids from `.dependsOn()`, carried so a route can declare edges. */\n\tdefaultConstructs?: string[];\n\tbasePath?: TBasePath;\n\tdefaultAuthorizeFn?: AuthorizeFn<\n\t\tTServices,\n\t\tTLogger,\n\t\tTSession,\n\t\tundefined,\n\t\tTDatabase\n\t>;\n\tdefaultLogger?: TLogger;\n\tdefaultSessionExtractor?: SessionFn<TServices, TLogger, TSession, TDatabase>;\n\tdefaultEventPublisher?: Service<TEventPublisherServiceName, TEventPublisher>;\n\tdefaultEvents?: MappedEvent<TEventPublisher, undefined>[];\n\tavailableAuthorizers?: Authorizer[];\n\tdefaultAuthorizerName?: TAuthorizers[number];\n\tdefaultAuditorStorage?: Service<TAuditStorageServiceName, TAuditStorage>;\n\tdefaultDatabaseService?: Service<TDatabaseServiceName, TDatabase>;\n\tdefaultActorExtractor?: ActorExtractor<TServices, TSession, TLogger>;\n\tcustomSecuritySchemes?: TSecuritySchemes;\n\tdefaultRlsConfig?: TRlsConfig;\n\t/**\n\t * The surface this factory belongs to.\n\t *\n\t * Required. A factory exists to build endpoints for a surface, and an\n\t * endpoint without one has no logger, no env parser and nothing to\n\t * attribute its traffic to — which was survivable only while `e` existed.\n\t *\n\t * Carried through every derived factory, so `api.endpoints.database(db)`\n\t * still produces endpoints that know which API serves them.\n\t */\n\tsurface: EndpointSurface;\n}\n"],"mappings":"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"}
@@ -1,20 +1,22 @@
1
- const require_chunk = require('./chunk-DWy1uDak.cjs');
2
- const require_Endpoint = require('./Endpoint-DcWXE-SZ.cjs');
3
- const require_lazyAccessors = require('./lazyAccessors-e3j2oE2m.cjs');
4
- const require_processAudits = require('./processAudits-CGqttuXm.cjs');
5
- const __geekmidas_errors = require_chunk.__toESM(require("@geekmidas/errors"));
6
- const __geekmidas_services = require_chunk.__toESM(require("@geekmidas/services"));
7
- const __geekmidas_db_rls = require_chunk.__toESM(require("@geekmidas/db/rls"));
8
- const qs = require_chunk.__toESM(require("qs"));
9
- const hono_cookie = require_chunk.__toESM(require("hono/cookie"));
10
- const __geekmidas_rate_limit = require_chunk.__toESM(require("@geekmidas/rate-limit"));
11
- const hono = require_chunk.__toESM(require("hono"));
12
- const hono_logger = require_chunk.__toESM(require("hono/logger"));
13
- const hono_timing = require_chunk.__toESM(require("hono/timing"));
14
- const hono_validator = require_chunk.__toESM(require("hono/validator"));
15
- const node_path = require_chunk.__toESM(require("node:path"));
16
- const fast_glob = require_chunk.__toESM(require("fast-glob"));
17
-
1
+ const require_rolldown_runtime = require("./rolldown-runtime-y5ARvAq5.cjs");
2
+ const require_Endpoint = require("./Endpoint-BpZHtJ2W.cjs");
3
+ const require_lazyAccessors = require("./lazyAccessors-Dx9NLwJZ.cjs");
4
+ const require_processAudits = require("./processAudits-D_2W5x8k.cjs");
5
+ let _geekmidas_errors = require("@geekmidas/errors");
6
+ let hono_cookie = require("hono/cookie");
7
+ let _geekmidas_db_rls = require("@geekmidas/db/rls");
8
+ let _geekmidas_rate_limit = require("@geekmidas/rate-limit");
9
+ let _geekmidas_services = require("@geekmidas/services");
10
+ let hono = require("hono");
11
+ let hono_logger = require("hono/logger");
12
+ let hono_timing = require("hono/timing");
13
+ let hono_validator = require("hono/validator");
14
+ let node_path = require("node:path");
15
+ node_path = require_rolldown_runtime.__toESM(node_path, 1);
16
+ let fast_glob = require("fast-glob");
17
+ fast_glob = require_rolldown_runtime.__toESM(fast_glob, 1);
18
+ let qs = require("qs");
19
+ qs = require_rolldown_runtime.__toESM(qs, 1);
18
20
  //#region src/endpoints/helpers.ts
19
21
  /**
20
22
  * Discovers and imports all Endpoint instances from the specified route patterns.
@@ -48,8 +50,7 @@ async function getEndpointsFromRoutes(routes, cwd) {
48
50
  const stream = fast_glob.default.stream(routes, { cwd });
49
51
  const endpoints = [];
50
52
  for await (const f of stream) {
51
- const routePath = node_path.default.resolve(cwd, f.toString());
52
- const route = await import(routePath);
53
+ const route = await import(node_path.default.resolve(cwd, f.toString()));
53
54
  const handlers = Object.values(route).filter((value) => {
54
55
  return require_Endpoint.Endpoint.isEndpoint(value);
55
56
  });
@@ -57,7 +58,6 @@ async function getEndpointsFromRoutes(routes, cwd) {
57
58
  }
58
59
  return endpoints;
59
60
  }
60
-
61
61
  //#endregion
62
62
  //#region src/endpoints/parseHonoQuery.ts
63
63
  /**
@@ -71,7 +71,6 @@ function parseHonoQuery(c) {
71
71
  const queryString = url.slice(queryIndex + 1);
72
72
  return qs.default.parse(queryString);
73
73
  }
74
-
75
74
  //#endregion
76
75
  //#region src/endpoints/HonoEndpointAdaptor.ts
77
76
  /**
@@ -98,12 +97,13 @@ function analyzeEndpointFeatures(endpoint) {
98
97
  };
99
98
  }
100
99
  var HonoEndpoint = class HonoEndpoint {
100
+ endpoint;
101
101
  constructor(endpoint) {
102
102
  this.endpoint = endpoint;
103
103
  }
104
104
  static isDev = process.env.NODE_ENV === "development";
105
105
  static async validate(c, data, schema) {
106
- if (!schema) return void 0;
106
+ if (!schema) return;
107
107
  const parsed = await require_Endpoint.Endpoint.validate(schema, data);
108
108
  if (parsed.issues) return c.json(parsed.issues, 422);
109
109
  return parsed.value;
@@ -119,7 +119,7 @@ var HonoEndpoint = class HonoEndpoint {
119
119
  static applyEventMiddleware(_app, _serviceDiscovery) {}
120
120
  static async fromRoutes(routes, envParser, app = new hono.Hono(), _logger, cwd = process.cwd(), options) {
121
121
  const endpoints = await getEndpointsFromRoutes(routes, cwd);
122
- const serviceDiscovery = __geekmidas_services.ServiceDiscovery.getInstance(envParser);
122
+ const serviceDiscovery = _geekmidas_services.ServiceDiscovery.getInstance(envParser);
123
123
  HonoEndpoint.addRoutes(endpoints, serviceDiscovery, app, options);
124
124
  return app;
125
125
  }
@@ -167,7 +167,7 @@ var HonoEndpoint = class HonoEndpoint {
167
167
  path: c.req.path
168
168
  });
169
169
  c.header("X-Request-ID", requestId);
170
- return (0, __geekmidas_services.runWithRequestContext)({
170
+ return (0, _geekmidas_services.runWithRequestContext)({
171
171
  logger,
172
172
  requestId,
173
173
  startTime
@@ -184,7 +184,7 @@ var HonoEndpoint = class HonoEndpoint {
184
184
  cookie,
185
185
  ...rawDb !== void 0 && { db: rawDb }
186
186
  });
187
- const isAuthorized = await endpoint.authorize({
187
+ if (!await endpoint.authorize({
188
188
  header,
189
189
  cookie,
190
190
  services,
@@ -194,13 +194,12 @@ var HonoEndpoint = class HonoEndpoint {
194
194
  body: features.hasBodyValidation ? c.req.valid("json") : void 0,
195
195
  query: features.hasQueryValidation ? c.req.valid("query") : void 0,
196
196
  params: features.hasParamValidation ? c.req.valid("param") : void 0
197
- });
198
- if (!isAuthorized) {
197
+ })) {
199
198
  logger.warn("Forbidden access attempt");
200
199
  return c.json({ error: "Forbidden" }, 403);
201
200
  }
202
201
  if (features.hasRateLimit) {
203
- const rateLimitInfo = await (0, __geekmidas_rate_limit.checkRateLimit)(endpoint.rateLimit, {
202
+ const rateLimitInfo = await (0, _geekmidas_rate_limit.checkRateLimit)(endpoint.rateLimit, {
204
203
  header,
205
204
  services,
206
205
  logger,
@@ -208,7 +207,7 @@ var HonoEndpoint = class HonoEndpoint {
208
207
  path: c.req.path,
209
208
  method: endpoint.method
210
209
  });
211
- const rateLimitHeaders = (0, __geekmidas_rate_limit.getRateLimitHeaders)(rateLimitInfo, endpoint.rateLimit);
210
+ const rateLimitHeaders = (0, _geekmidas_rate_limit.getRateLimitHeaders)(rateLimitInfo, endpoint.rateLimit);
212
211
  for (const [key, value] of Object.entries(rateLimitHeaders)) if (value) c.header(key, value);
213
212
  }
214
213
  const auditContext = features.hasAudits ? await require_processAudits.createAuditContext(endpoint, serviceDiscovery, logger, {
@@ -226,9 +225,8 @@ var HonoEndpoint = class HonoEndpoint {
226
225
  cookie,
227
226
  logger
228
227
  }) : void 0;
229
- const result = await require_processAudits.executeWithAuditTransaction(auditContext, async (auditor) => {
230
- const sameDatabase = auditContext?.storage?.databaseServiceName && auditContext.storage.databaseServiceName === endpoint.databaseService?.serviceName;
231
- const baseDb = sameDatabase ? auditor?.getTransaction?.() ?? rawDb : rawDb;
228
+ const { output, metadata } = await require_processAudits.executeWithAuditTransaction(auditContext, async (auditor) => {
229
+ const baseDb = auditContext?.storage?.databaseServiceName && auditContext.storage.databaseServiceName === endpoint.databaseService?.serviceName ? auditor?.getTransaction?.() ?? rawDb : rawDb;
232
230
  const executeHandler = async (db) => {
233
231
  const responseBuilder = new require_Endpoint.ResponseBuilder();
234
232
  const response = await endpoint.handler({
@@ -244,33 +242,31 @@ var HonoEndpoint = class HonoEndpoint {
244
242
  db
245
243
  }, responseBuilder);
246
244
  let data = response;
247
- let metadata$1 = responseBuilder.getMetadata();
245
+ let metadata = responseBuilder.getMetadata();
248
246
  if (require_Endpoint.Endpoint.hasMetadata(response)) {
249
247
  data = response.data;
250
- metadata$1 = response.metadata;
248
+ metadata = response.metadata;
251
249
  }
252
- const output$1 = endpoint.outputSchema ? await endpoint.parseOutput(data) : void 0;
253
250
  return {
254
- output: output$1,
255
- metadata: metadata$1,
251
+ output: endpoint.outputSchema ? await endpoint.parseOutput(data) : void 0,
252
+ metadata,
256
253
  responseBuilder
257
254
  };
258
255
  };
259
- if (features.hasRls && rlsContext && baseDb) return (0, __geekmidas_db_rls.withRlsContext)(baseDb, rlsContext, async (trx) => executeHandler(trx), { prefix: endpoint.rlsConfig?.prefix });
256
+ if (features.hasRls && rlsContext && baseDb) return (0, _geekmidas_db_rls.withRlsContext)(baseDb, rlsContext, async (trx) => executeHandler(trx), { prefix: endpoint.rlsConfig?.prefix });
260
257
  return executeHandler(baseDb);
261
- }, async (result$1, auditor) => {
258
+ }, async (result, auditor) => {
262
259
  if (!audits?.length) return;
263
260
  for (const audit of audits) {
264
- if (audit.when && !audit.when(result$1.output)) continue;
265
- const payload = audit.payload(result$1.output);
266
- const entityId = audit.entityId?.(result$1.output);
261
+ if (audit.when && !audit.when(result.output)) continue;
262
+ const payload = audit.payload(result.output);
263
+ const entityId = audit.entityId?.(result.output);
267
264
  auditor.audit(audit.type, payload, {
268
265
  table: audit.table,
269
266
  entityId
270
267
  });
271
268
  }
272
269
  }, { db: rawDb });
273
- const { output, metadata } = result;
274
270
  try {
275
271
  let status = endpoint.status;
276
272
  if (metadata.status) status = metadata.status;
@@ -286,7 +282,7 @@ var HonoEndpoint = class HonoEndpoint {
286
282
  return c.body(output, status);
287
283
  } catch (validationError) {
288
284
  logger.error(validationError, "Output validation failed");
289
- const error = (0, __geekmidas_errors.wrapError)(validationError, 422, "Response validation failed");
285
+ const error = (0, _geekmidas_errors.wrapError)(validationError, 422, "Response validation failed");
290
286
  if (HonoEndpoint.isDev) logger.info({
291
287
  status: error.statusCode,
292
288
  body: error
@@ -295,7 +291,7 @@ var HonoEndpoint = class HonoEndpoint {
295
291
  }
296
292
  } catch (e) {
297
293
  logger.error(e, "Error processing endpoint request");
298
- const error = (0, __geekmidas_errors.wrapError)(e, 500, "Internal Server Error");
294
+ const error = (0, _geekmidas_errors.wrapError)(e, 500, "Internal Server Error");
299
295
  if (HonoEndpoint.isDev) logger.info({
300
296
  status: error.statusCode,
301
297
  body: error
@@ -317,12 +313,12 @@ var HonoEndpoint = class HonoEndpoint {
317
313
  });
318
314
  }
319
315
  };
320
-
321
316
  //#endregion
322
- Object.defineProperty(exports, 'HonoEndpoint', {
323
- enumerable: true,
324
- get: function () {
325
- return HonoEndpoint;
326
- }
317
+ Object.defineProperty(exports, "HonoEndpoint", {
318
+ enumerable: true,
319
+ get: function() {
320
+ return HonoEndpoint;
321
+ }
327
322
  });
328
- //# sourceMappingURL=HonoEndpointAdaptor-DtL9j19R.cjs.map
323
+
324
+ //# sourceMappingURL=HonoEndpointAdaptor-92zavCsV.cjs.map