@geekmidas/constructs 0.0.7 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AWSLambdaFunction-qA5LqPsv.cjs → AWSLambdaFunction-CMLZ3GaC.cjs} +3 -3
- package/dist/{AWSLambdaFunction-qA5LqPsv.cjs.map → AWSLambdaFunction-CMLZ3GaC.cjs.map} +1 -1
- package/dist/{AWSLambdaFunction-CANc3Qo2.d.mts → AWSLambdaFunction-D5V3YVqv.d.cts} +5 -5
- package/dist/{AWSLambdaFunction-CwagvPG3.d.cts → AWSLambdaFunction-_J0MjixY.d.mts} +5 -5
- package/dist/{AWSLambdaFunction-DWIZYsCy.mjs → AWSLambdaFunction-egVcP17n.mjs} +3 -3
- package/dist/{AWSLambdaFunction-DWIZYsCy.mjs.map → AWSLambdaFunction-egVcP17n.mjs.map} +1 -1
- package/dist/{AWSLambdaSubscriberAdaptor-QKVxR6qh.d.cts → AWSLambdaSubscriberAdaptor-DjG1ME3P.d.mts} +4 -4
- package/dist/{AWSLambdaSubscriberAdaptor-C6JYIZxn.d.mts → AWSLambdaSubscriberAdaptor-J_pSz6pu.d.cts} +4 -4
- package/dist/{AmazonApiGatewayEndpointAdaptor-BFhJ2Rpz.d.cts → AmazonApiGatewayEndpointAdaptor-BnNd8tCz.d.cts} +2 -2
- package/dist/{AmazonApiGatewayEndpointAdaptor-BrB3RfbI.d.mts → AmazonApiGatewayEndpointAdaptor-C-17dUai.d.mts} +2 -2
- package/dist/{AmazonApiGatewayEndpointAdaptor-Bmz6Cy1e.mjs → AmazonApiGatewayEndpointAdaptor-CQLjGSJe.mjs} +2 -2
- package/dist/{AmazonApiGatewayEndpointAdaptor-Bmz6Cy1e.mjs.map → AmazonApiGatewayEndpointAdaptor-CQLjGSJe.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayEndpointAdaptor-B8mozTcG.cjs → AmazonApiGatewayEndpointAdaptor-DPaV_5wG.cjs} +2 -2
- package/dist/{AmazonApiGatewayEndpointAdaptor-B8mozTcG.cjs.map → AmazonApiGatewayEndpointAdaptor-DPaV_5wG.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-Bd-o8ese.d.cts → AmazonApiGatewayV1EndpointAdaptor-BC-a2tt3.d.cts} +3 -3
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-BtNXt0-4.d.mts → AmazonApiGatewayV1EndpointAdaptor-Cjud-a6p.d.mts} +3 -3
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-24g3dLn5.mjs → AmazonApiGatewayV1EndpointAdaptor-DEBcyZe0.mjs} +2 -2
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-24g3dLn5.mjs.map → AmazonApiGatewayV1EndpointAdaptor-DEBcyZe0.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-D4eZ-fx5.cjs → AmazonApiGatewayV1EndpointAdaptor-DkFcSRwT.cjs} +2 -2
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-D4eZ-fx5.cjs.map → AmazonApiGatewayV1EndpointAdaptor-DkFcSRwT.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-Cc40RThv.mjs → AmazonApiGatewayV2EndpointAdaptor-BB7t7LE2.mjs} +2 -2
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-Cc40RThv.mjs.map → AmazonApiGatewayV2EndpointAdaptor-BB7t7LE2.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-J6tACl-N.cjs → AmazonApiGatewayV2EndpointAdaptor-BQ21ry6s.cjs} +2 -2
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-J6tACl-N.cjs.map → AmazonApiGatewayV2EndpointAdaptor-BQ21ry6s.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-DAJdtgek.d.mts → AmazonApiGatewayV2EndpointAdaptor-C31Xcwmc.d.mts} +3 -3
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-DX-Uci5w.d.cts → AmazonApiGatewayV2EndpointAdaptor-zNFUPxSY.d.cts} +3 -3
- package/dist/Authorizer-Bbk9ziuG.d.mts +29 -0
- package/dist/Authorizer-iXsSB600.d.cts +29 -0
- package/dist/{BaseFunctionBuilder-DtO4Nwxm.cjs → BaseFunctionBuilder-B-kdtkzI.cjs} +2 -2
- package/dist/{BaseFunctionBuilder-DtO4Nwxm.cjs.map → BaseFunctionBuilder-B-kdtkzI.cjs.map} +1 -1
- package/dist/{BaseFunctionBuilder-5QCHkchp.d.cts → BaseFunctionBuilder-C4ZJPkIZ.d.cts} +2 -2
- package/dist/{BaseFunctionBuilder-Dda7AiID.d.mts → BaseFunctionBuilder-CxBX0arJ.d.mts} +2 -2
- package/dist/{BaseFunctionBuilder-BPE9JBbT.mjs → BaseFunctionBuilder-DOhEn5Ce.mjs} +2 -2
- package/dist/{BaseFunctionBuilder-BPE9JBbT.mjs.map → BaseFunctionBuilder-DOhEn5Ce.mjs.map} +1 -1
- package/dist/{Construct-BbKCIPQm.mjs → Construct-B-O9OBS1.mjs} +4 -2
- package/dist/Construct-B-O9OBS1.mjs.map +1 -0
- package/dist/{Construct-BSEs6uwW.cjs → Construct-BtfN2fcm.cjs} +4 -2
- package/dist/Construct-BtfN2fcm.cjs.map +1 -0
- package/dist/{Construct-Bm-PSO2V.d.cts → Construct-ci5u8Xnu.d.cts} +4 -2
- package/dist/{Construct-DdyYENBD.d.mts → Construct-zhmcmIdY.d.mts} +4 -2
- package/dist/Construct.cjs +1 -1
- package/dist/Construct.d.cts +1 -1
- package/dist/Construct.d.mts +1 -1
- package/dist/Construct.mjs +1 -1
- package/dist/{Cron-BxMXmn4t.d.cts → Cron-ByNYsQDH.d.mts} +4 -4
- package/dist/{Cron-D6hnZLk7.mjs → Cron-D8DPUXBd.mjs} +5 -5
- package/dist/Cron-D8DPUXBd.mjs.map +1 -0
- package/dist/{Cron-NDBlJhb3.d.mts → Cron-DkPL-Fms.d.cts} +4 -4
- package/dist/{Cron-CmZ6esMM.cjs → Cron-sOrsPuQj.cjs} +5 -5
- package/dist/Cron-sOrsPuQj.cjs.map +1 -0
- package/dist/{CronBuilder-C6K5AbIO.d.cts → CronBuilder-BknVTWLE.d.mts} +6 -5
- package/dist/{CronBuilder-s5x8V8hH.d.mts → CronBuilder-BqTTozUi.d.cts} +6 -5
- package/dist/{CronBuilder-Dfv5JguE.mjs → CronBuilder-ChyrDobL.mjs} +10 -5
- package/dist/CronBuilder-ChyrDobL.mjs.map +1 -0
- package/dist/{CronBuilder-Di7QK8Rt.cjs → CronBuilder-Kvz1GiUp.cjs} +10 -5
- package/dist/CronBuilder-Kvz1GiUp.cjs.map +1 -0
- package/dist/{Endpoint-COGAflGh.cjs → Endpoint-Bghj0fiL.cjs} +21 -12
- package/dist/Endpoint-Bghj0fiL.cjs.map +1 -0
- package/dist/{Endpoint-C7jPJzAH.d.mts → Endpoint-C16whGI-.d.mts} +45 -13
- package/dist/{Endpoint-DLLZvqoh.mjs → Endpoint-DCJz2VQ_.mjs} +21 -12
- package/dist/Endpoint-DCJz2VQ_.mjs.map +1 -0
- package/dist/{Endpoint-XUMNAXYy.d.cts → Endpoint-zHPjZ35J.d.cts} +45 -13
- package/dist/{EndpointBuilder-t6fVEKBH.d.cts → EndpointBuilder-B5l7zQU1.d.cts} +18 -12
- package/dist/{EndpointBuilder-oXO_ka1-.mjs → EndpointBuilder-B6xIAruu.mjs} +28 -5
- package/dist/EndpointBuilder-B6xIAruu.mjs.map +1 -0
- package/dist/{EndpointBuilder-CFtWQhcv.d.mts → EndpointBuilder-BzqR0xvt.d.mts} +18 -12
- package/dist/{EndpointBuilder-FJktpPOu.cjs → EndpointBuilder-i7-4ieP_.cjs} +28 -5
- package/dist/EndpointBuilder-i7-4ieP_.cjs.map +1 -0
- package/dist/{EndpointFactory-Kk1tpifs.cjs → EndpointFactory-CYTBPu_G.cjs} +41 -10
- package/dist/EndpointFactory-CYTBPu_G.cjs.map +1 -0
- package/dist/{EndpointFactory-eG8bDhOh.mjs → EndpointFactory-CYuT-nt-.mjs} +41 -10
- package/dist/EndpointFactory-CYuT-nt-.mjs.map +1 -0
- package/dist/{EndpointFactory-DBRGrXAy.d.mts → EndpointFactory-KkyIOE62.d.cts} +29 -21
- package/dist/{EndpointFactory-DInjHvFR.d.cts → EndpointFactory-VnSAdwdv.d.mts} +29 -21
- package/dist/{Function-CbO2NZx-.cjs → Function-BCEAZFyL.cjs} +4 -5
- package/dist/Function-BCEAZFyL.cjs.map +1 -0
- package/dist/{Function-BP58p9Mp.d.cts → Function-BbLYIKLL.d.cts} +3 -4
- package/dist/{Function-C5mW-38v.mjs → Function-CmfMIDoS.mjs} +4 -5
- package/dist/Function-CmfMIDoS.mjs.map +1 -0
- package/dist/{Function-C98H68DW.d.mts → Function-DFRZZCC-.d.mts} +3 -4
- package/dist/{FunctionBuilder-DuOeWCAl.cjs → FunctionBuilder-BqivB_cc.cjs} +11 -5
- package/dist/FunctionBuilder-BqivB_cc.cjs.map +1 -0
- package/dist/{FunctionBuilder-BS1KgxA_.d.cts → FunctionBuilder-DdGjpiFT.d.cts} +6 -4
- package/dist/{FunctionBuilder-DBwR7jg7.d.mts → FunctionBuilder-DuktGyZc.d.mts} +6 -4
- package/dist/{FunctionBuilder-CosgPmMl.mjs → FunctionBuilder-QvqvEyFa.mjs} +11 -5
- package/dist/FunctionBuilder-QvqvEyFa.mjs.map +1 -0
- package/dist/{FunctionExecutionWrapper-B0V7V8YS.d.mts → FunctionExecutionWrapper-CAHR74yI.d.mts} +2 -2
- package/dist/{FunctionExecutionWrapper-Bx-Dl-2a.d.cts → FunctionExecutionWrapper-CRYi047B.d.cts} +2 -2
- package/dist/{FunctionExecutionWrapper-XGrSAAPD.mjs → FunctionExecutionWrapper-JsZIHhcl.mjs} +2 -2
- package/dist/{FunctionExecutionWrapper-XGrSAAPD.mjs.map → FunctionExecutionWrapper-JsZIHhcl.mjs.map} +1 -1
- package/dist/{FunctionExecutionWrapper-CElXEjPe.cjs → FunctionExecutionWrapper-TJxf9p4v.cjs} +2 -2
- package/dist/{FunctionExecutionWrapper-CElXEjPe.cjs.map → FunctionExecutionWrapper-TJxf9p4v.cjs.map} +1 -1
- package/dist/{HonoEndpointAdaptor-BlT1rWHV.mjs → HonoEndpointAdaptor-8eYrSFRn.mjs} +33 -16
- package/dist/HonoEndpointAdaptor-8eYrSFRn.mjs.map +1 -0
- package/dist/{HonoEndpointAdaptor-BrbM9vxd.d.cts → HonoEndpointAdaptor-DAsZoX2a.d.mts} +9 -8
- package/dist/{HonoEndpointAdaptor-CxcYKdzT.d.mts → HonoEndpointAdaptor-lYw6EN1Q.d.cts} +7 -6
- package/dist/{HonoEndpointAdaptor-Ds433Q8w.cjs → HonoEndpointAdaptor-vWSpXdNp.cjs} +20 -3
- package/dist/HonoEndpointAdaptor-vWSpXdNp.cjs.map +1 -0
- package/dist/{Subscriber-CSt7EOlT.cjs → Subscriber-BdiqU7da.cjs} +2 -2
- package/dist/{Subscriber-CSt7EOlT.cjs.map → Subscriber-BdiqU7da.cjs.map} +1 -1
- package/dist/{Subscriber-BoFm12i_.d.cts → Subscriber-Cy28j8MS.d.cts} +2 -2
- package/dist/{Subscriber-DkCDcTUL.mjs → Subscriber-bJSqvjdK.mjs} +2 -2
- package/dist/{Subscriber-DkCDcTUL.mjs.map → Subscriber-bJSqvjdK.mjs.map} +1 -1
- package/dist/{Subscriber-BxH6n8zQ.d.mts → Subscriber-g3IWM1_d.d.mts} +2 -2
- package/dist/{SubscriberBuilder-BpSDPzBz.d.mts → SubscriberBuilder-BzK8kc2a.d.cts} +3 -3
- package/dist/{SubscriberBuilder-Bn9Hyi28.mjs → SubscriberBuilder-CyCyjT6L.mjs} +2 -2
- package/dist/{SubscriberBuilder-Bn9Hyi28.mjs.map → SubscriberBuilder-CyCyjT6L.mjs.map} +1 -1
- package/dist/{SubscriberBuilder-RsiOmnwq.cjs → SubscriberBuilder-JTJcIZYy.cjs} +2 -2
- package/dist/{SubscriberBuilder-RsiOmnwq.cjs.map → SubscriberBuilder-JTJcIZYy.cjs.map} +1 -1
- package/dist/{SubscriberBuilder-DgljKtYu.d.cts → SubscriberBuilder-YjQ7qIpQ.d.mts} +3 -3
- package/dist/{TestEndpointAdaptor-Ct4I-gDo.mjs → TestEndpointAdaptor-BevV2LLd.mjs} +2 -2
- package/dist/{TestEndpointAdaptor-Ct4I-gDo.mjs.map → TestEndpointAdaptor-BevV2LLd.mjs.map} +1 -1
- package/dist/{TestEndpointAdaptor-vboVyJ0w.d.mts → TestEndpointAdaptor-DGWuai69.d.mts} +2 -2
- package/dist/{TestEndpointAdaptor-FJUob2W_.cjs → TestEndpointAdaptor-DupnzEnS.cjs} +2 -2
- package/dist/{TestEndpointAdaptor-FJUob2W_.cjs.map → TestEndpointAdaptor-DupnzEnS.cjs.map} +1 -1
- package/dist/{TestEndpointAdaptor-wwEaVHAt.d.cts → TestEndpointAdaptor-uXliWYjS.d.cts} +2 -2
- package/dist/adaptors/aws.cjs +11 -11
- package/dist/adaptors/aws.d.cts +14 -13
- package/dist/adaptors/aws.d.mts +14 -13
- package/dist/adaptors/aws.mjs +11 -11
- package/dist/adaptors/hono.cjs +8 -8
- package/dist/adaptors/hono.d.cts +8 -7
- package/dist/adaptors/hono.d.mts +8 -7
- package/dist/adaptors/hono.mjs +8 -8
- package/dist/adaptors/testing.cjs +7 -7
- package/dist/adaptors/testing.d.cts +8 -7
- package/dist/adaptors/testing.d.mts +8 -7
- package/dist/adaptors/testing.mjs +7 -7
- package/dist/crons/Cron.cjs +6 -6
- package/dist/crons/Cron.d.cts +6 -6
- package/dist/crons/Cron.d.mts +6 -6
- package/dist/crons/Cron.mjs +6 -6
- package/dist/crons/CronBuilder.cjs +7 -7
- package/dist/crons/CronBuilder.d.cts +7 -7
- package/dist/crons/CronBuilder.d.mts +7 -7
- package/dist/crons/CronBuilder.mjs +7 -7
- package/dist/crons/index.cjs +7 -7
- package/dist/crons/index.d.cts +11 -11
- package/dist/crons/index.d.mts +11 -11
- package/dist/crons/index.mjs +7 -7
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +7 -7
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +8 -7
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +8 -7
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +7 -7
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +8 -8
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +9 -8
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +9 -8
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +8 -8
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +8 -8
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +9 -8
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +9 -8
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +8 -8
- package/dist/endpoints/Authorizer.cjs +15 -0
- package/dist/endpoints/Authorizer.cjs.map +1 -0
- package/dist/endpoints/Authorizer.d.cts +2 -0
- package/dist/endpoints/Authorizer.d.mts +2 -0
- package/dist/endpoints/Authorizer.mjs +14 -0
- package/dist/endpoints/Authorizer.mjs.map +1 -0
- package/dist/endpoints/Endpoint.cjs +6 -6
- package/dist/endpoints/Endpoint.d.cts +7 -6
- package/dist/endpoints/Endpoint.d.mts +7 -6
- package/dist/endpoints/Endpoint.mjs +6 -6
- package/dist/endpoints/EndpointBuilder.cjs +7 -7
- package/dist/endpoints/EndpointBuilder.d.cts +8 -7
- package/dist/endpoints/EndpointBuilder.d.mts +8 -7
- package/dist/endpoints/EndpointBuilder.mjs +7 -7
- package/dist/endpoints/EndpointFactory.cjs +8 -8
- package/dist/endpoints/EndpointFactory.d.cts +9 -8
- package/dist/endpoints/EndpointFactory.d.mts +9 -8
- package/dist/endpoints/EndpointFactory.mjs +8 -8
- package/dist/endpoints/HonoEndpointAdaptor.cjs +8 -8
- package/dist/endpoints/HonoEndpointAdaptor.d.cts +8 -7
- package/dist/endpoints/HonoEndpointAdaptor.d.mts +8 -7
- package/dist/endpoints/HonoEndpointAdaptor.mjs +8 -8
- package/dist/endpoints/TestEndpointAdaptor.cjs +7 -7
- package/dist/endpoints/TestEndpointAdaptor.d.cts +8 -7
- package/dist/endpoints/TestEndpointAdaptor.d.mts +8 -7
- package/dist/endpoints/TestEndpointAdaptor.mjs +7 -7
- package/dist/endpoints/helpers.cjs +7 -7
- package/dist/endpoints/helpers.d.cts +7 -6
- package/dist/endpoints/helpers.d.mts +7 -6
- package/dist/endpoints/helpers.mjs +7 -7
- package/dist/endpoints/index.cjs +8 -8
- package/dist/endpoints/index.d.cts +11 -10
- package/dist/endpoints/index.d.mts +11 -10
- package/dist/endpoints/index.mjs +8 -8
- package/dist/functions/AWSLambdaFunction.cjs +6 -6
- package/dist/functions/AWSLambdaFunction.d.cts +4 -4
- package/dist/functions/AWSLambdaFunction.d.mts +4 -4
- package/dist/functions/AWSLambdaFunction.mjs +6 -6
- package/dist/functions/BaseFunctionBuilder.cjs +2 -2
- package/dist/functions/BaseFunctionBuilder.d.cts +2 -2
- package/dist/functions/BaseFunctionBuilder.d.mts +2 -2
- package/dist/functions/BaseFunctionBuilder.mjs +2 -2
- package/dist/functions/Function.cjs +2 -2
- package/dist/functions/Function.d.cts +2 -2
- package/dist/functions/Function.d.mts +2 -2
- package/dist/functions/Function.mjs +2 -2
- package/dist/functions/FunctionBuilder.cjs +4 -4
- package/dist/functions/FunctionBuilder.d.cts +4 -4
- package/dist/functions/FunctionBuilder.d.mts +4 -4
- package/dist/functions/FunctionBuilder.mjs +4 -4
- package/dist/functions/FunctionExecutionWrapper.cjs +5 -5
- package/dist/functions/FunctionExecutionWrapper.d.cts +3 -3
- package/dist/functions/FunctionExecutionWrapper.d.mts +3 -3
- package/dist/functions/FunctionExecutionWrapper.mjs +5 -5
- package/dist/functions/TestFunctionAdaptor.cjs +4 -4
- package/dist/functions/TestFunctionAdaptor.d.cts +2 -2
- package/dist/functions/TestFunctionAdaptor.d.mts +2 -2
- package/dist/functions/TestFunctionAdaptor.mjs +4 -4
- package/dist/functions/index.cjs +5 -5
- package/dist/functions/index.d.cts +5 -5
- package/dist/functions/index.d.mts +5 -5
- package/dist/functions/index.mjs +5 -5
- package/dist/{functions-DVDb5wEA.cjs → functions-B9mEg9D9.cjs} +2 -2
- package/dist/{functions-DVDb5wEA.cjs.map → functions-B9mEg9D9.cjs.map} +1 -1
- package/dist/functions-DcQZSOHg.mjs +8 -0
- package/dist/{functions-mM-jcphA.mjs.map → functions-DcQZSOHg.mjs.map} +1 -1
- package/dist/{helpers-go4jiRvV.cjs → helpers-BJrzAmhb.cjs} +2 -2
- package/dist/{helpers-go4jiRvV.cjs.map → helpers-BJrzAmhb.cjs.map} +1 -1
- package/dist/{helpers-CM0U-4Vk.mjs → helpers-D_UKinz8.mjs} +2 -2
- package/dist/{helpers-CM0U-4Vk.mjs.map → helpers-D_UKinz8.mjs.map} +1 -1
- package/dist/index-DQt3pQtF.d.mts +9 -0
- package/dist/index-Dq-LQIwK.d.cts +9 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +1 -1
- package/dist/publisher.d.cts +1 -1
- package/dist/publisher.d.mts +1 -1
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.cts +3 -3
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +3 -3
- package/dist/subscribers/Subscriber.cjs +2 -2
- package/dist/subscribers/Subscriber.d.cts +2 -2
- package/dist/subscribers/Subscriber.d.mts +2 -2
- package/dist/subscribers/Subscriber.mjs +2 -2
- package/dist/subscribers/SubscriberBuilder.cjs +3 -3
- package/dist/subscribers/SubscriberBuilder.d.cts +3 -3
- package/dist/subscribers/SubscriberBuilder.d.mts +3 -3
- package/dist/subscribers/SubscriberBuilder.mjs +3 -3
- package/dist/subscribers/index.cjs +3 -3
- package/dist/subscribers/index.d.cts +3 -3
- package/dist/subscribers/index.d.mts +5 -5
- package/dist/subscribers/index.mjs +3 -3
- package/package.json +5 -5
- package/src/Construct.ts +2 -0
- package/src/crons/Cron.ts +2 -0
- package/src/crons/CronBuilder.ts +8 -0
- package/src/crons/__tests__/CronBuilder.state-isolation.spec.ts +227 -0
- package/src/endpoints/Authorizer.ts +34 -0
- package/src/endpoints/Endpoint.ts +67 -14
- package/src/endpoints/EndpointBuilder.ts +79 -12
- package/src/endpoints/EndpointFactory.ts +106 -27
- package/src/endpoints/HonoEndpointAdaptor.ts +29 -0
- package/src/endpoints/__tests__/Endpoint.cookies.spec.ts +85 -0
- package/src/endpoints/__tests__/Endpoint.headers.spec.ts +187 -0
- package/src/endpoints/__tests__/Endpoint.manifest.spec.ts +176 -0
- package/src/endpoints/__tests__/EndpointFactory.authorizers.spec.ts +259 -0
- package/src/endpoints/__tests__/EndpointFactory.reference-audit.spec.ts +190 -0
- package/src/endpoints/__tests__/EndpointFactory.state-isolation.spec.ts +155 -0
- package/src/functions/Function.ts +12 -2
- package/src/functions/FunctionBuilder.ts +9 -0
- package/src/functions/__tests__/FunctionBuilder.state-isolation.spec.ts +160 -0
- package/dist/Construct-BSEs6uwW.cjs.map +0 -1
- package/dist/Construct-BbKCIPQm.mjs.map +0 -1
- package/dist/Cron-CmZ6esMM.cjs.map +0 -1
- package/dist/Cron-D6hnZLk7.mjs.map +0 -1
- package/dist/CronBuilder-Dfv5JguE.mjs.map +0 -1
- package/dist/CronBuilder-Di7QK8Rt.cjs.map +0 -1
- package/dist/Endpoint-COGAflGh.cjs.map +0 -1
- package/dist/Endpoint-DLLZvqoh.mjs.map +0 -1
- package/dist/EndpointBuilder-FJktpPOu.cjs.map +0 -1
- package/dist/EndpointBuilder-oXO_ka1-.mjs.map +0 -1
- package/dist/EndpointFactory-Kk1tpifs.cjs.map +0 -1
- package/dist/EndpointFactory-eG8bDhOh.mjs.map +0 -1
- package/dist/Function-C5mW-38v.mjs.map +0 -1
- package/dist/Function-CbO2NZx-.cjs.map +0 -1
- package/dist/FunctionBuilder-CosgPmMl.mjs.map +0 -1
- package/dist/FunctionBuilder-DuOeWCAl.cjs.map +0 -1
- package/dist/HonoEndpointAdaptor-BlT1rWHV.mjs.map +0 -1
- package/dist/HonoEndpointAdaptor-Ds433Q8w.cjs.map +0 -1
- package/dist/functions-mM-jcphA.mjs +0 -8
- package/dist/index-BGr5gFrX.d.cts +0 -9
- package/dist/index-YM4W9XUq.d.mts +0 -9
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const require_chunk = require('./chunk-CUT6urMc.cjs');
|
|
2
|
-
const require_Construct = require('./Construct-
|
|
3
|
-
const require_FunctionBuilder = require('./FunctionBuilder-
|
|
4
|
-
const require_Cron = require('./Cron-
|
|
2
|
+
const require_Construct = require('./Construct-BtfN2fcm.cjs');
|
|
3
|
+
const require_FunctionBuilder = require('./FunctionBuilder-BqivB_cc.cjs');
|
|
4
|
+
const require_Cron = require('./Cron-sOrsPuQj.cjs');
|
|
5
5
|
const lodash_uniqby = require_chunk.__toESM(require("lodash.uniqby"));
|
|
6
6
|
const __geekmidas_logger_console = require_chunk.__toESM(require("@geekmidas/logger/console"));
|
|
7
7
|
|
|
@@ -12,6 +12,10 @@ var CronBuilder = class extends require_FunctionBuilder.FunctionBuilder {
|
|
|
12
12
|
constructor() {
|
|
13
13
|
super(require_Construct.ConstructType.Cron);
|
|
14
14
|
}
|
|
15
|
+
memorySize(memorySize) {
|
|
16
|
+
this._memorySize = memorySize;
|
|
17
|
+
return this;
|
|
18
|
+
}
|
|
15
19
|
schedule(_expression) {
|
|
16
20
|
this._schedule = _expression;
|
|
17
21
|
return this;
|
|
@@ -37,7 +41,7 @@ var CronBuilder = class extends require_FunctionBuilder.FunctionBuilder {
|
|
|
37
41
|
return this;
|
|
38
42
|
}
|
|
39
43
|
handle(fn) {
|
|
40
|
-
const cron = new require_Cron.Cron(fn, this._timeout, this._schedule, this.inputSchema, this.outputSchema, this._services, this._logger, this._publisher, this._events);
|
|
44
|
+
const cron = new require_Cron.Cron(fn, this._timeout, this._schedule, this.inputSchema, this.outputSchema, this._services, this._logger, this._publisher, this._events, this._memorySize);
|
|
41
45
|
this._services = [];
|
|
42
46
|
this._logger = DEFAULT_LOGGER;
|
|
43
47
|
this._events = [];
|
|
@@ -46,6 +50,7 @@ var CronBuilder = class extends require_FunctionBuilder.FunctionBuilder {
|
|
|
46
50
|
this.inputSchema = void 0;
|
|
47
51
|
this.outputSchema = void 0;
|
|
48
52
|
this._timeout = void 0;
|
|
53
|
+
this._memorySize = void 0;
|
|
49
54
|
return cron;
|
|
50
55
|
}
|
|
51
56
|
};
|
|
@@ -57,4 +62,4 @@ Object.defineProperty(exports, 'CronBuilder', {
|
|
|
57
62
|
return CronBuilder;
|
|
58
63
|
}
|
|
59
64
|
});
|
|
60
|
-
//# sourceMappingURL=CronBuilder-
|
|
65
|
+
//# sourceMappingURL=CronBuilder-Kvz1GiUp.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CronBuilder-Kvz1GiUp.cjs","names":["ConsoleLogger","FunctionBuilder","ConstructType","memorySize: number","_expression: ScheduleExpression","schema: T","services: T","logger: T","publisher: Service<TName, T>","fn: FunctionHandler<TInput, TServices, TLogger, OutSchema>","Cron"],"sources":["../src/crons/CronBuilder.ts"],"sourcesContent":["import type { Logger } from '@geekmidas/logger';\nimport { ConsoleLogger } from '@geekmidas/logger/console';\nimport type { ComposableStandardSchema } from '@geekmidas/schema';\nimport type { Service } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport uniqBy from 'lodash.uniqby';\nimport { ConstructType } from '../Construct';\nimport { FunctionBuilder, type FunctionHandler } from '../functions';\nimport { Cron, type ScheduleExpression } from './Cron';\n\nimport type { EventPublisher } from '@geekmidas/events';\n\nconst DEFAULT_LOGGER = new ConsoleLogger() as any;\n\nexport class CronBuilder<\n TInput extends ComposableStandardSchema,\n TServices extends Service[],\n TLogger extends Logger = Logger,\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n> extends FunctionBuilder<\n TInput,\n OutSchema,\n TServices,\n TLogger,\n TEventPublisher,\n TEventPublisherServiceName\n> {\n private _schedule?: ScheduleExpression;\n\n constructor() {\n super(ConstructType.Cron);\n }\n\n memorySize(memorySize: number): this {\n this._memorySize = memorySize;\n return this;\n }\n\n schedule(\n _expression: ScheduleExpression,\n ): CronBuilder<\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TEventPublisher,\n TEventPublisherServiceName\n > {\n this._schedule = _expression;\n return this;\n }\n\n input<T extends ComposableStandardSchema>(\n schema: T,\n ): CronBuilder<\n T,\n TServices,\n TLogger,\n OutSchema,\n TEventPublisher,\n TEventPublisherServiceName\n > {\n this.inputSchema = schema as unknown as TInput;\n\n return this as unknown as CronBuilder<\n T,\n TServices,\n TLogger,\n OutSchema,\n TEventPublisher,\n TEventPublisherServiceName\n >;\n }\n\n output<T extends StandardSchemaV1>(\n schema: T,\n ): CronBuilder<\n TInput,\n TServices,\n TLogger,\n T,\n TEventPublisher,\n TEventPublisherServiceName\n > {\n this.outputSchema = schema as unknown as OutSchema;\n\n return this as unknown as CronBuilder<\n TInput,\n TServices,\n TLogger,\n T,\n TEventPublisher,\n TEventPublisherServiceName\n >;\n }\n\n services<T extends Service[]>(\n services: T,\n ): CronBuilder<\n TInput,\n [...TServices, ...T],\n TLogger,\n OutSchema,\n TEventPublisher,\n TEventPublisherServiceName\n > {\n this._services = uniqBy(\n [...this._services, ...services],\n (s) => s.serviceName,\n ) as TServices;\n\n return this as unknown as CronBuilder<\n TInput,\n [...TServices, ...T],\n TLogger,\n OutSchema,\n TEventPublisher,\n TEventPublisherServiceName\n >;\n }\n\n logger<T extends Logger>(\n logger: T,\n ): CronBuilder<\n TInput,\n TServices,\n T,\n OutSchema,\n TEventPublisher,\n TEventPublisherServiceName\n > {\n this._logger = logger as unknown as TLogger;\n\n return this as unknown as CronBuilder<\n TInput,\n TServices,\n T,\n OutSchema,\n TEventPublisher,\n TEventPublisherServiceName\n >;\n }\n\n publisher<T extends EventPublisher<any>, TName extends string>(\n publisher: Service<TName, T>,\n ): CronBuilder<TInput, TServices, TLogger, OutSchema, T, TName> {\n this._publisher = publisher as unknown as Service<\n TEventPublisherServiceName,\n TEventPublisher\n >;\n\n return this as unknown as CronBuilder<\n TInput,\n TServices,\n TLogger,\n OutSchema,\n T,\n TName\n >;\n }\n\n handle(\n fn: FunctionHandler<TInput, TServices, TLogger, OutSchema>,\n ): Cron<\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TEventPublisher,\n TEventPublisherServiceName\n > {\n const cron = new Cron(\n fn,\n this._timeout,\n this._schedule,\n this.inputSchema,\n this.outputSchema,\n this._services,\n this._logger,\n this._publisher,\n this._events,\n this._memorySize,\n );\n\n // Reset builder state after creating the cron to prevent pollution\n this._services = [] as Service[] as TServices;\n this._logger = DEFAULT_LOGGER;\n this._events = [];\n this._publisher = undefined;\n this._schedule = undefined;\n this.inputSchema = undefined;\n this.outputSchema = undefined;\n this._timeout = undefined;\n this._memorySize = undefined;\n\n return cron;\n }\n}\n"],"mappings":";;;;;;;;AAYA,MAAM,iBAAiB,IAAIA;AAE3B,IAAa,cAAb,cAOUC,wCAOR;CACA,AAAQ;CAER,cAAc;AACZ,QAAMC,gCAAc,KAAK;CAC1B;CAED,WAAWC,YAA0B;AACnC,OAAK,cAAc;AACnB,SAAO;CACR;CAED,SACEC,aAQA;AACA,OAAK,YAAY;AACjB,SAAO;CACR;CAED,MACEC,QAQA;AACA,OAAK,cAAc;AAEnB,SAAO;CAQR;CAED,OACEA,QAQA;AACA,OAAK,eAAe;AAEpB,SAAO;CAQR;CAED,SACEC,UAQA;AACA,OAAK,YAAY,2BACf,CAAC,GAAG,KAAK,WAAW,GAAG,QAAS,GAChC,CAAC,MAAM,EAAE,YACV;AAED,SAAO;CAQR;CAED,OACEC,QAQA;AACA,OAAK,UAAU;AAEf,SAAO;CAQR;CAED,UACEC,WAC8D;AAC9D,OAAK,aAAa;AAKlB,SAAO;CAQR;CAED,OACEC,IAQA;EACA,MAAM,OAAO,IAAIC,kBACf,IACA,KAAK,UACL,KAAK,WACL,KAAK,aACL,KAAK,cACL,KAAK,WACL,KAAK,SACL,KAAK,YACL,KAAK,SACL,KAAK;AAIP,OAAK,YAAY,CAAE;AACnB,OAAK,UAAU;AACf,OAAK,UAAU,CAAE;AACjB,OAAK;AACL,OAAK;AACL,OAAK;AACL,OAAK;AACL,OAAK;AACL,OAAK;AAEL,SAAO;CACR;AACF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const require_chunk = require('./chunk-CUT6urMc.cjs');
|
|
2
|
-
const require_Construct = require('./Construct-
|
|
3
|
-
const require_Function = require('./Function-
|
|
2
|
+
const require_Construct = require('./Construct-BtfN2fcm.cjs');
|
|
3
|
+
const require_Function = require('./Function-BCEAZFyL.cjs');
|
|
4
4
|
const lodash_pick = require_chunk.__toESM(require("lodash.pick"));
|
|
5
5
|
const lodash_set = require_chunk.__toESM(require("lodash.set"));
|
|
6
6
|
const __geekmidas_schema_conversion = require_chunk.__toESM(require("@geekmidas/schema/conversion"));
|
|
@@ -52,6 +52,8 @@ var Endpoint = class Endpoint extends require_Function.Function {
|
|
|
52
52
|
authorize = () => true;
|
|
53
53
|
/** Optional rate limiting configuration */
|
|
54
54
|
rateLimit;
|
|
55
|
+
/** Optional authorizer for this endpoint */
|
|
56
|
+
authorizer;
|
|
55
57
|
/** The endpoint handler function */
|
|
56
58
|
endpointFn;
|
|
57
59
|
/**
|
|
@@ -111,12 +113,13 @@ var Endpoint = class Endpoint extends require_Function.Function {
|
|
|
111
113
|
* Creates a case-insensitive header lookup function from a headers object.
|
|
112
114
|
*
|
|
113
115
|
* @param headers - Object containing header key-value pairs
|
|
114
|
-
* @returns Function to retrieve header values by case-insensitive key
|
|
116
|
+
* @returns Function to retrieve header values by case-insensitive key, or all headers
|
|
115
117
|
*
|
|
116
118
|
* @example
|
|
117
119
|
* ```typescript
|
|
118
120
|
* const headerFn = Endpoint.createHeaders({ 'Content-Type': 'application/json' });
|
|
119
121
|
* headerFn('content-type'); // Returns 'application/json'
|
|
122
|
+
* headerFn(); // Returns { 'content-type': 'application/json' }
|
|
120
123
|
* ```
|
|
121
124
|
*/
|
|
122
125
|
static createHeaders(headers) {
|
|
@@ -125,21 +128,23 @@ var Endpoint = class Endpoint extends require_Function.Function {
|
|
|
125
128
|
const key = k.toLowerCase();
|
|
126
129
|
headerMap.set(key, v);
|
|
127
130
|
}
|
|
128
|
-
|
|
131
|
+
function get(key) {
|
|
132
|
+
if (key === void 0) return Object.fromEntries(headerMap.entries());
|
|
129
133
|
return headerMap.get(key.toLowerCase());
|
|
130
|
-
}
|
|
134
|
+
}
|
|
135
|
+
return get;
|
|
131
136
|
}
|
|
132
137
|
/**
|
|
133
138
|
* Parses cookie string and creates a cookie lookup function.
|
|
134
139
|
*
|
|
135
140
|
* @param cookieHeader - The Cookie header value
|
|
136
|
-
* @returns Function to retrieve cookie values by name
|
|
141
|
+
* @returns Function to retrieve cookie values by name, or all cookies
|
|
137
142
|
*
|
|
138
143
|
* @example
|
|
139
144
|
* ```typescript
|
|
140
145
|
* const cookieFn = Endpoint.createCookies('session=abc123; theme=dark');
|
|
141
146
|
* cookieFn('session'); // Returns 'abc123'
|
|
142
|
-
* cookieFn(
|
|
147
|
+
* cookieFn(); // Returns { session: 'abc123', theme: 'dark' }
|
|
143
148
|
* ```
|
|
144
149
|
*/
|
|
145
150
|
static createCookies(cookieHeader) {
|
|
@@ -154,9 +159,11 @@ var Endpoint = class Endpoint extends require_Function.Function {
|
|
|
154
159
|
}
|
|
155
160
|
}
|
|
156
161
|
}
|
|
157
|
-
|
|
162
|
+
function get(name) {
|
|
163
|
+
if (name === void 0) return Object.fromEntries(cookieMap.entries());
|
|
158
164
|
return cookieMap.get(name);
|
|
159
|
-
}
|
|
165
|
+
}
|
|
166
|
+
return get;
|
|
160
167
|
}
|
|
161
168
|
/**
|
|
162
169
|
* Formats a cookie as a Set-Cookie header string.
|
|
@@ -316,9 +323,10 @@ var Endpoint = class Endpoint extends require_Function.Function {
|
|
|
316
323
|
* @param options.getSession - Session extraction function
|
|
317
324
|
* @param options.authorize - Authorization check function
|
|
318
325
|
* @param options.status - Success HTTP status code (default: 200)
|
|
326
|
+
* @param options.authorizer - Optional authorizer configuration
|
|
319
327
|
*/
|
|
320
|
-
constructor({ fn, method, route, description, tags, input, logger, output: outputSchema, services, timeout, getSession, authorize, rateLimit, status = SuccessStatus.OK, publisherService, events }) {
|
|
321
|
-
super(fn, timeout, require_Construct.ConstructType.Endpoint, input, outputSchema, services, logger, publisherService, events);
|
|
328
|
+
constructor({ fn, method, route, description, tags, input, logger, output: outputSchema, services, timeout, memorySize, getSession, authorize, rateLimit, status = SuccessStatus.OK, publisherService, events, authorizer }) {
|
|
329
|
+
super(fn, timeout, require_Construct.ConstructType.Endpoint, input, outputSchema, services, logger, publisherService, events, memorySize);
|
|
322
330
|
this.route = route;
|
|
323
331
|
this.method = method;
|
|
324
332
|
this.description = description;
|
|
@@ -328,6 +336,7 @@ var Endpoint = class Endpoint extends require_Function.Function {
|
|
|
328
336
|
if (getSession) this.getSession = getSession;
|
|
329
337
|
if (authorize) this.authorize = authorize;
|
|
330
338
|
if (rateLimit) this.rateLimit = rateLimit;
|
|
339
|
+
if (authorizer) this.authorizer = authorizer;
|
|
331
340
|
}
|
|
332
341
|
};
|
|
333
342
|
/**
|
|
@@ -412,4 +421,4 @@ Object.defineProperty(exports, 'SuccessStatus', {
|
|
|
412
421
|
return SuccessStatus;
|
|
413
422
|
}
|
|
414
423
|
});
|
|
415
|
-
//# sourceMappingURL=Endpoint-
|
|
424
|
+
//# sourceMappingURL=Endpoint-Bghj0fiL.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Endpoint-Bghj0fiL.cjs","names":["Function","endpoints: Endpoint<any, any, any, any, any, any>[]","options?: OpenApiSchemaOptions","input: unknown","key: K","body: unknown","status: number","headers: Record<string, string>","key?: string","cookieHeader: string | undefined","name?: string","name: string","value: string","options?: CookieOptions","ctx: EndpointContext<TInput, TServices, TLogger, TSession>","response: ResponseBuilder","obj: any","ConstructType","response: T | ResponseWithMetadata<T>","componentCollector?: ComponentCollector","operation: OpenAPIV3_1.OperationObject","pathParameters: OpenAPIV3_1.ParameterObject[]","queryParameters: OpenAPIV3_1.ParameterObject[]","routeObject: any","key: string","options?: Pick<CookieOptions, 'domain' | 'path'>","code: SuccessStatus","data: T"],"sources":["../src/endpoints/Endpoint.ts"],"sourcesContent":["import type { Logger } from '@geekmidas/logger';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport pick from 'lodash.pick';\nimport set from 'lodash.set';\nimport type { OpenAPIV3_1 } from 'openapi-types';\n\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport type { Authorizer } from './Authorizer';\nimport { ConstructType } from '../Construct';\nimport { Function, type FunctionHandler } from '../functions';\n\nimport type {\n EventPublisher,\n ExtractPublisherMessage,\n MappedEvent,\n} from '@geekmidas/events';\nimport type { RateLimitConfig } from '@geekmidas/rate-limit';\nimport type {\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport {\n convertSchemaWithComponents,\n convertStandardSchemaToJsonSchema,\n} from '@geekmidas/schema/conversion';\nimport {\n type ComponentCollector,\n type OpenApiSchemaOptions,\n buildOpenApiSchema,\n} from '@geekmidas/schema/openapi';\nimport type { HttpMethod, LowerHttpMethod, RemoveUndefined } from '../types';\n\n/**\n * Represents an HTTP endpoint that can handle requests with type-safe input/output validation,\n * dependency injection, session management, and authorization.\n *\n * @template TRoute - The route path string with parameter placeholders (e.g., '/users/:id')\n * @template TMethod - The HTTP method (GET, POST, PUT, DELETE, PATCH)\n * @template TInput - The input schema definition for body, query, and path parameters\n * @template OutSchema - The output schema for response validation\n * @template TServices - Array of service dependencies to inject\n * @template TLogger - The logger instance type\n * @template TSession - The session data type\n *\n * @extends Function - Base function construct for handler execution\n *\n * @example\n * ```typescript\n * const endpoint = new Endpoint({\n * route: '/users/:id',\n * method: 'GET',\n * input: { params: userIdSchema },\n * output: userSchema,\n * fn: async ({ params }) => getUserById(params.id)\n * });\n * ```\n */\nexport class Endpoint<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n> extends Function<\n TInput,\n TServices,\n TLogger,\n OutSchema,\n FunctionHandler<TInput, TServices, TLogger, OutSchema>,\n TEventPublisher,\n TEventPublisherServiceName\n> {\n operationId?: string;\n /** The route path pattern with parameter placeholders */\n route: TRoute;\n /** The HTTP method for this endpoint */\n method: TMethod;\n /** Optional description for OpenAPI documentation */\n description?: string;\n /** Optional tags for OpenAPI documentation */\n tags?: string[];\n /** The HTTP success status code to return (default: 200) */\n public readonly status: SuccessStatus;\n /** Default headers to apply to all responses */\n public readonly defaultHeaders: Record<string, string> = {};\n /** Function to extract session data from the request context */\n public getSession: SessionFn<TServices, TLogger, TSession> = () =>\n ({}) as TSession;\n /** Function to determine if the request is authorized */\n public authorize: AuthorizeFn<TServices, TLogger, TSession> = () => true;\n /** Optional rate limiting configuration */\n public rateLimit?: RateLimitConfig;\n /** Optional authorizer for this endpoint */\n public authorizer?: Authorizer;\n /** The endpoint handler function */\n private endpointFn!: EndpointHandler<\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession\n >;\n\n /**\n * Builds a complete OpenAPI 3.1 schema from an array of endpoints.\n *\n * @param endpoints - Array of endpoint instances to document\n * @param options - Optional configuration for OpenAPI generation\n * @returns OpenAPI 3.1 specification object\n *\n * @example\n * ```typescript\n * const schema = await Endpoint.buildOpenApiSchema([\n * getUserEndpoint,\n * createUserEndpoint\n * ], {\n * title: 'User API',\n * version: '1.0.0'\n * });\n * ```\n */\n static async buildOpenApiSchema(\n endpoints: Endpoint<any, any, any, any, any, any>[],\n options?: OpenApiSchemaOptions,\n ) {\n return buildOpenApiSchema(endpoints, options);\n }\n\n /**\n * Gets the full path including HTTP method and route.\n * @returns Formatted string like 'GET /users/{id}'\n */\n get fullPath() {\n return `${this.method} ${this._path}` as const;\n }\n\n /**\n * Parses and validates input data for a specific input type (body, query, params).\n *\n * @param input - The raw input data to validate\n * @param key - The input type key ('body', 'query', or 'params')\n * @returns The validated input data for the specified key\n * @throws {UnprocessableEntityError} When validation fails\n */\n async parseInput<K extends keyof TInput>(\n input: unknown,\n key: K,\n ): Promise<InferComposableStandardSchema<TInput[K]>> {\n const schema = this.input?.[key];\n return Endpoint.parseSchema(schema as StandardSchemaV1, input) as Promise<\n InferComposableStandardSchema<TInput[K]>\n >;\n }\n\n /**\n * Parses and validates the request body against the body schema.\n *\n * @param body - The raw request body to validate\n * @returns The validated body data\n * @throws {UnprocessableEntityError} When body validation fails\n */\n async parseBody(body: unknown): Promise<InferStandardSchema<TInput['body']>> {\n return this.parseInput(body, 'body') as Promise<\n InferStandardSchema<TInput['body']>\n >;\n }\n\n static isSuccessStatus(status: number): boolean {\n return status >= 200 && status < 300;\n }\n\n /**\n * Creates a case-insensitive header lookup function from a headers object.\n *\n * @param headers - Object containing header key-value pairs\n * @returns Function to retrieve header values by case-insensitive key, or all headers\n *\n * @example\n * ```typescript\n * const headerFn = Endpoint.createHeaders({ 'Content-Type': 'application/json' });\n * headerFn('content-type'); // Returns 'application/json'\n * headerFn(); // Returns { 'content-type': 'application/json' }\n * ```\n */\n static createHeaders(headers: Record<string, string>): HeaderFn {\n const headerMap = new Map<string, string>();\n for (const [k, v] of Object.entries(headers)) {\n const key = k.toLowerCase();\n headerMap.set(key, v);\n }\n\n function get(): Record<string, string>;\n function get(key: string): string | undefined;\n function get(key?: string): string | undefined | Record<string, string> {\n if (key === undefined) {\n // Return all headers as plain object\n return Object.fromEntries(headerMap.entries());\n }\n return headerMap.get(key.toLowerCase());\n }\n\n return get;\n }\n\n /**\n * Parses cookie string and creates a cookie lookup function.\n *\n * @param cookieHeader - The Cookie header value\n * @returns Function to retrieve cookie values by name, or all cookies\n *\n * @example\n * ```typescript\n * const cookieFn = Endpoint.createCookies('session=abc123; theme=dark');\n * cookieFn('session'); // Returns 'abc123'\n * cookieFn(); // Returns { session: 'abc123', theme: 'dark' }\n * ```\n */\n static createCookies(cookieHeader: string | undefined): CookieFn {\n const cookieMap = new Map<string, string>();\n\n if (cookieHeader) {\n // Parse cookie string: \"name1=value1; name2=value2\"\n const cookies = cookieHeader.split(';');\n for (const cookie of cookies) {\n const [name, ...valueParts] = cookie.trim().split('=');\n if (name) {\n const value = valueParts.join('='); // Handle values with = in them\n cookieMap.set(name, decodeURIComponent(value));\n }\n }\n }\n\n function get(): Record<string, string>;\n function get(name: string): string | undefined;\n function get(name?: string): string | undefined | Record<string, string> {\n if (name === undefined) {\n // Return all cookies as plain object\n return Object.fromEntries(cookieMap.entries());\n }\n return cookieMap.get(name);\n }\n\n return get;\n }\n\n /**\n * Formats a cookie as a Set-Cookie header string.\n *\n * @param name - Cookie name\n * @param value - Cookie value\n * @param options - Cookie options (httpOnly, secure, sameSite, etc.)\n * @returns Formatted Set-Cookie header string\n *\n * @example\n * ```typescript\n * const header = Endpoint.formatCookieHeader('session', 'abc123', {\n * httpOnly: true,\n * secure: true,\n * sameSite: 'strict',\n * maxAge: 3600\n * });\n * // Returns: \"session=abc123; Max-Age=3600; HttpOnly; Secure; SameSite=Strict\"\n * ```\n */\n static formatCookieHeader(\n name: string,\n value: string,\n options?: CookieOptions,\n ): string {\n let cookie = `${name}=${value}`;\n\n if (options) {\n if (options.domain) cookie += `; Domain=${options.domain}`;\n if (options.path) cookie += `; Path=${options.path}`;\n if (options.expires)\n cookie += `; Expires=${options.expires.toUTCString()}`;\n if (options.maxAge !== undefined) cookie += `; Max-Age=${options.maxAge}`;\n if (options.httpOnly) cookie += '; HttpOnly';\n if (options.secure) cookie += '; Secure';\n if (options.sameSite) {\n cookie += `; SameSite=${options.sameSite.charAt(0).toUpperCase() + options.sameSite.slice(1)}`;\n }\n }\n\n return cookie;\n }\n\n /**\n * Extracts and refines input data from the endpoint context.\n *\n * @param ctx - The endpoint execution context\n * @returns Object containing only the input data (body, query, params)\n * @internal\n */\n refineInput(\n ctx: EndpointContext<TInput, TServices, TLogger, TSession>,\n ): InferComposableStandardSchema<TInput> {\n const input = pick(ctx, [\n 'body',\n 'query',\n 'params',\n ]) as InferComposableStandardSchema<TInput>;\n\n return input;\n }\n\n handler = (\n ctx: EndpointContext<TInput, TServices, TLogger, TSession>,\n response: ResponseBuilder,\n ): OutSchema extends StandardSchemaV1\n ?\n | InferStandardSchema<OutSchema>\n | ResponseWithMetadata<InferStandardSchema<OutSchema>>\n | Promise<InferStandardSchema<OutSchema>>\n | Promise<ResponseWithMetadata<InferStandardSchema<OutSchema>>>\n :\n | any\n | ResponseWithMetadata<any>\n | Promise<any>\n | Promise<ResponseWithMetadata<any>> => {\n // Apply default headers to response builder\n for (const [key, value] of Object.entries(this.defaultHeaders)) {\n response.header(key, value);\n }\n\n return this.endpointFn(\n {\n ...this.refineInput(ctx),\n services: ctx.services,\n logger: ctx.logger,\n header: ctx.header,\n cookie: ctx.cookie,\n session: ctx.session,\n } as EndpointContext<TInput, TServices, TLogger, TSession>,\n response,\n );\n };\n\n /**\n * Type guard to check if an object is an Endpoint instance.\n *\n * @param obj - The object to check\n * @returns True if the object is an Endpoint\n */\n static isEndpoint(obj: any): obj is Endpoint<any, any, any, any> {\n return Boolean(\n obj &&\n (obj as Function).__IS_FUNCTION__ === true &&\n obj.type === ConstructType.Endpoint,\n );\n }\n\n /**\n * Helper to check if response has metadata\n */\n static hasMetadata<T>(\n response: T | ResponseWithMetadata<T>,\n ): response is ResponseWithMetadata<T> {\n return (\n response !== null &&\n typeof response === 'object' &&\n 'data' in response &&\n 'metadata' in response\n );\n }\n\n /**\n * Converts Express-style route params to OpenAPI format.\n * @returns Route with ':param' converted to '{param}'\n * @internal\n */\n get _path() {\n return this.route.replace(/:(\\w+)/g, '{$1}') as ConvertRouteParams<TRoute>;\n }\n\n /**\n * Generates OpenAPI 3.1 schema for this endpoint.\n *\n * @returns OpenAPI route definition with operation details\n */\n async toOpenApi3Route(\n componentCollector?: ComponentCollector,\n ): Promise<EndpointOpenApiSchema<TRoute, TMethod>> {\n const operation: OpenAPIV3_1.OperationObject = {\n operationId: this.operationId,\n ...(this.description && { description: this.description }),\n ...(this.tags && this.tags.length > 0 && { tags: this.tags }),\n responses: {\n '200': {\n description: 'Successful response',\n } as OpenAPIV3_1.ResponseObject,\n },\n };\n\n // Add response schema\n if (this.outputSchema) {\n const responseSchema = await convertSchemaWithComponents(\n this.outputSchema,\n componentCollector,\n );\n if (responseSchema) {\n set(\n operation,\n ['responses', '200', 'content', 'application/json', 'schema'],\n responseSchema,\n );\n }\n }\n\n // Separate path and query parameters\n const pathParameters: OpenAPIV3_1.ParameterObject[] = [];\n const queryParameters: OpenAPIV3_1.ParameterObject[] = [];\n\n // Since the EndpointBuilder doesn't have body/search/params methods yet,\n // and the input is a composite type, we need to check if input exists\n // and has the expected shape\n if (this.input && typeof this.input === 'object') {\n // Add request body for methods that support it\n if (\n ['POST', 'PUT', 'PATCH'].includes(this.method) &&\n 'body' in this.input &&\n this.input.body\n ) {\n const bodySchema = await convertSchemaWithComponents(\n this.input.body as StandardSchemaV1,\n componentCollector,\n );\n if (bodySchema) {\n set(operation, ['requestBody'], {\n required: true,\n content: {\n 'application/json': {\n schema: bodySchema,\n },\n },\n });\n }\n }\n\n // Add path parameters\n if ('params' in this.input && this.input.params) {\n const paramsSchema = await convertStandardSchemaToJsonSchema(\n this.input.params as StandardSchemaV1,\n );\n if (\n paramsSchema &&\n paramsSchema.type === 'object' &&\n paramsSchema.properties\n ) {\n for (const [name, schema] of Object.entries(\n paramsSchema.properties,\n )) {\n pathParameters.push({\n name,\n in: 'path',\n required: paramsSchema.required?.includes(name) ?? true,\n schema: schema as any,\n });\n }\n }\n }\n\n // Add query parameters\n if ('query' in this.input && this.input.query) {\n const querySchema = await convertStandardSchemaToJsonSchema(\n this.input.query,\n );\n if (\n querySchema &&\n querySchema.type === 'object' &&\n querySchema.properties\n ) {\n for (const [name, schema] of Object.entries(querySchema.properties)) {\n queryParameters.push({\n name,\n in: 'query',\n required: querySchema.required?.includes(name) ?? false,\n schema: schema as any,\n });\n }\n }\n }\n }\n\n // Only add query parameters to the operation\n if (queryParameters.length > 0) {\n operation.parameters = queryParameters;\n }\n\n // Build the route object with path parameters at the route level\n const routeObject: any = {};\n if (pathParameters.length > 0) {\n routeObject.parameters = pathParameters;\n }\n routeObject[this.method.toLowerCase()] = operation;\n\n return {\n [this._path]: routeObject,\n } as EndpointOpenApiSchema<TRoute, TMethod>;\n }\n\n /**\n * Creates a new Endpoint instance.\n *\n * @param options - Configuration options for the endpoint\n * @param options.fn - The handler function to execute\n * @param options.method - HTTP method\n * @param options.route - Route path with parameter placeholders\n * @param options.description - Optional description for documentation\n * @param options.input - Input schemas for validation\n * @param options.logger - Logger instance\n * @param options.output - Output schema for response validation\n * @param options.services - Service dependencies\n * @param options.timeout - Execution timeout in milliseconds\n * @param options.getSession - Session extraction function\n * @param options.authorize - Authorization check function\n * @param options.status - Success HTTP status code (default: 200)\n * @param options.authorizer - Optional authorizer configuration\n */\n constructor({\n fn,\n method,\n route,\n description,\n tags,\n input,\n logger,\n output: outputSchema,\n services,\n timeout,\n memorySize,\n getSession,\n authorize,\n rateLimit,\n status = SuccessStatus.OK,\n publisherService,\n events,\n authorizer,\n }: EndpointOptions<\n TRoute,\n TMethod,\n TInput,\n OutSchema,\n TServices,\n TLogger,\n TSession,\n OutSchema,\n TEventPublisher,\n TEventPublisherServiceName\n >) {\n super(\n fn as unknown as FunctionHandler<TInput, TServices, TLogger, OutSchema>,\n timeout,\n ConstructType.Endpoint,\n input,\n outputSchema,\n services,\n logger,\n publisherService,\n events,\n memorySize,\n );\n\n this.route = route;\n this.method = method;\n this.description = description;\n this.tags = tags;\n this.status = status;\n this.endpointFn = fn;\n\n if (getSession) {\n this.getSession = getSession;\n }\n\n if (authorize) {\n this.authorize = authorize;\n }\n\n if (rateLimit) {\n this.rateLimit = rateLimit;\n }\n\n if (authorizer) {\n this.authorizer = authorizer;\n }\n }\n}\n\n/**\n * Defines the input schema structure for an endpoint.\n *\n * @template TBody - Schema for request body validation\n * @template TSearch - Schema for query string validation\n * @template TParams - Schema for URL path parameters validation\n *\n * @example\n * ```typescript\n * type UserInput = EndpointInput<\n * typeof createUserBodySchema,\n * typeof userQuerySchema,\n * typeof userParamsSchema\n * >;\n * ```\n */\nexport type EndpointInput<\n TBody extends StandardSchemaV1 | undefined = undefined,\n TSearch extends StandardSchemaV1 | undefined = undefined,\n TParams extends StandardSchemaV1 | undefined = undefined,\n> = RemoveUndefined<{\n body: TBody;\n search: TSearch;\n params: TParams;\n}>;\n\n/**\n * Configuration options for creating an Endpoint instance.\n *\n * @template TRoute - The route path string\n * @template TMethod - The HTTP method\n * @template TInput - Input schema definitions\n * @template TOutput - Output schema definition\n * @template TServices - Service dependencies array\n * @template TLogger - Logger type\n * @template TSession - Session data type\n */\nexport interface EndpointOptions<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutput extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n> {\n /** The route path with parameter placeholders */\n route: TRoute;\n /** The HTTP method for this endpoint */\n method: TMethod;\n /** The handler function that implements the endpoint logic */\n fn: EndpointHandler<TInput, TServices, TLogger, TOutput, TSession>;\n /** Optional authorization check function */\n authorize: AuthorizeFn<TServices, TLogger, TSession> | undefined;\n /** Optional description for documentation */\n description: string | undefined;\n /** Optional tags for OpenAPI documentation */\n tags?: string[];\n /** Optional execution timeout in milliseconds */\n timeout: number | undefined;\n /** Optional memory size in MB for serverless deployments */\n memorySize: number | undefined;\n /** Input validation schemas */\n input: TInput | undefined;\n /** Output validation schema */\n output: TOutput | undefined;\n /** Service dependencies to inject */\n services: TServices;\n /** Logger instance */\n logger: TLogger;\n /** Optional session extraction function */\n getSession: SessionFn<TServices, TLogger, TSession> | undefined;\n /** Optional rate limiting configuration */\n rateLimit?: RateLimitConfig;\n /** Success HTTP status code */\n status: SuccessStatus | undefined;\n /**\n * Event publisher service for publishing events from this endpoint\n */\n publisherService?: Service<TEventPublisherServiceName, TEventPublisher>;\n\n events?: MappedEvent<TEventPublisher, OutSchema>[];\n /** Optional authorizer configuration */\n authorizer?: Authorizer;\n}\n\n/**\n * Defines the possible input schema types for an endpoint.\n * Each property represents a different part of the HTTP request.\n */\nexport type EndpointSchemas = Partial<{\n /** Schema for URL path parameters (e.g., /users/:id) */\n params: StandardSchemaV1;\n /** Schema for query string parameters */\n query: StandardSchemaV1;\n /** Schema for request body (POST, PUT, PATCH) */\n body: StandardSchemaV1;\n}>;\n\nexport type AuthorizeContext<\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = {\n services: ServiceRecord<TServices>;\n logger: TLogger;\n header: HeaderFn;\n cookie: CookieFn;\n session: TSession;\n};\n/**\n * Function type for endpoint authorization checks.\n *\n * @template TServices - Available service dependencies\n * @template TLogger - Logger type\n * @template TSession - Session data type\n *\n * @param ctx - Context containing services, logger, headers, and session\n * @returns Boolean indicating if the request is authorized\n *\n * @example\n * ```typescript\n * const authorize: AuthorizeFn = ({ session }) => {\n * return session.userId !== undefined;\n * };\n * ```\n */\nexport type AuthorizeFn<\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = (\n ctx: AuthorizeContext<TServices, TLogger, TSession>,\n) => Promise<boolean> | boolean;\n\nexport type SessionContext<\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n> = {\n services: ServiceRecord<TServices>;\n logger: TLogger;\n header: HeaderFn;\n cookie: CookieFn;\n};\n/**\n * Function type for extracting session data from a request.\n *\n * @template TServices - Available service dependencies\n * @template TLogger - Logger type\n * @template TSession - Session data type to extract\n *\n * @param ctx - Context containing services, logger, and headers\n * @returns The extracted session data\n *\n * @example\n * ```typescript\n * const getSession: SessionFn<Services, Logger, UserSession> = async ({ header, services }) => {\n * const token = header('authorization');\n * return await services.auth.verifyToken(token);\n * };\n * ```\n */\nexport type SessionFn<\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = (ctx: SessionContext<TServices, TLogger>) => Promise<TSession> | TSession;\n\n/**\n * Utility type that converts Express-style route parameters to OpenAPI format.\n * Transforms ':param' syntax to '{param}' syntax.\n *\n * @template T - The route string to convert\n *\n * @example\n * ```typescript\n * type Route1 = ConvertRouteParams<'/users/:id'>; // '/users/{id}'\n * type Route2 = ConvertRouteParams<'/users/:userId/posts/:postId'>; // '/users/{userId}/posts/{postId}'\n * ```\n */\nexport type ConvertRouteParams<T extends string> =\n T extends `${infer Start}:${infer Param}/${infer Rest}`\n ? `${Start}{${Param}}/${ConvertRouteParams<Rest>}`\n : T extends `${infer Start}:${infer Param}`\n ? `${Start}{${Param}}`\n : T;\n\n/**\n * Type representing the OpenAPI schema structure for an endpoint.\n *\n * @template TRoute - The route path\n * @template TMethod - The HTTP method\n *\n * @example\n * ```typescript\n * type Schema = EndpointOpenApiSchema<'/users/:id', 'GET'>;\n * // Results in: { '/users/{id}': { get: OperationObject, parameters?: ParameterObject[] } }\n * ```\n */\nexport type EndpointOpenApiSchema<\n TRoute extends string,\n TMethod extends HttpMethod,\n> = {\n [key in ConvertRouteParams<TRoute>]: {\n [key in LowerHttpMethod<TMethod>]: OpenAPIV3_1.OperationObject<{}>;\n } & {\n parameters?: OpenAPIV3_1.ParameterObject[];\n };\n};\n\nexport type SingleHeaderFn = (key: string) => string | undefined;\nexport type MultiHeaderFn = () => EndpointHeaders;\n/**\n * Type representing HTTP headers as a Map.\n */\nexport type EndpointHeaders = Map<string, string>;\n\n/**\n * Function type for retrieving HTTP header values.\n * Supports two calling patterns:\n * - `header(key)` - Get a single header value (case-insensitive)\n * - `header()` - Get all headers as a plain object\n *\n * @example\n * ```typescript\n * // Get single header\n * const contentType = header('content-type');\n *\n * // Get all headers\n * const allHeaders = header();\n * // { 'content-type': 'application/json', 'host': 'example.com', ... }\n * ```\n */\nexport interface HeaderFn {\n (): Record<string, string>;\n (key: string): string | undefined;\n}\n\n/**\n * Function type for retrieving cookie values.\n * Supports two calling patterns:\n * - `cookie(name)` - Get a single cookie value\n * - `cookie()` - Get all cookies as a plain object\n *\n * @example\n * ```typescript\n * // Get single cookie\n * const sessionId = cookie('session');\n *\n * // Get all cookies\n * const allCookies = cookie();\n * // { session: 'abc123', theme: 'dark', ... }\n * ```\n */\nexport interface CookieFn {\n (): Record<string, string>;\n (name: string): string | undefined;\n}\n\n/**\n * Cookie options matching standard Set-Cookie attributes\n */\nexport interface CookieOptions {\n domain?: string;\n path?: string;\n expires?: Date;\n maxAge?: number;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: 'strict' | 'lax' | 'none';\n}\n\n/**\n * Response metadata that handlers can set\n */\nexport interface ResponseMetadata {\n headers?: Record<string, string>;\n cookies?: Map<string, { value: string; options?: CookieOptions }>;\n status?: SuccessStatus;\n}\n\n/**\n * Return type for handlers that want to set response metadata\n */\nexport interface ResponseWithMetadata<T> {\n data: T;\n metadata: ResponseMetadata;\n}\n\n/**\n * Response builder for fluent API in handlers\n */\nexport class ResponseBuilder {\n private metadata: ResponseMetadata = {\n headers: {},\n cookies: new Map(),\n };\n\n header(key: string, value: string): this {\n this.metadata.headers![key] = value;\n return this;\n }\n\n cookie(name: string, value: string, options?: CookieOptions): this {\n this.metadata.cookies!.set(name, { value, options });\n return this;\n }\n\n deleteCookie(\n name: string,\n options?: Pick<CookieOptions, 'domain' | 'path'>,\n ): this {\n this.metadata.cookies!.set(name, {\n value: '',\n options: { ...options, maxAge: 0, expires: new Date(0) },\n });\n return this;\n }\n\n status(code: SuccessStatus): this {\n this.metadata.status = code;\n return this;\n }\n\n send<T>(data: T): ResponseWithMetadata<T> {\n return { data, metadata: this.metadata };\n }\n\n getMetadata(): ResponseMetadata {\n return this.metadata;\n }\n}\n\n/**\n * The execution context provided to endpoint handlers.\n * Contains all parsed input data, services, logger, headers, cookies, and session.\n *\n * @template Input - The input schemas (body, query, params)\n * @template TServices - Available service dependencies\n * @template TLogger - Logger type\n * @template TSession - Session data type\n */\nexport type EndpointContext<\n Input extends EndpointSchemas | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = {\n /** Injected service instances */\n services: ServiceRecord<TServices>;\n /** Logger instance for this request */\n logger: TLogger;\n /** Function to retrieve request headers */\n header: HeaderFn;\n /** Function to retrieve request cookies */\n cookie: CookieFn;\n /** Session data extracted by getSession */\n session: TSession;\n} & InferComposableStandardSchema<Input>;\n\n/**\n * Handler function type for endpoint implementations.\n *\n * @template TInput - Input schemas for validation\n * @template TServices - Available service dependencies\n * @template TLogger - Logger type\n * @template OutSchema - Output schema for response validation\n * @template TSession - Session data type\n *\n * @param ctx - The endpoint execution context\n * @param response - Response builder for setting cookies, headers, and status\n * @returns The response data (validated if OutSchema is provided) or ResponseWithMetadata\n *\n * @example\n * ```typescript\n * // Simple response\n * const handler: EndpointHandler<Input, [UserService], Logger, UserSchema> =\n * async ({ params, services }) => {\n * return await services.users.findById(params.id);\n * };\n *\n * // With response builder\n * const handler: EndpointHandler<Input, [UserService], Logger, UserSchema> =\n * async ({ params, services }, response) => {\n * const user = await services.users.findById(params.id);\n * return response.header('X-User-Id', user.id).send(user);\n * };\n * ```\n */\nexport type EndpointHandler<\n TInput extends EndpointSchemas | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TSession = unknown,\n> = (\n ctx: EndpointContext<TInput, TServices, TLogger, TSession>,\n response: ResponseBuilder,\n) => OutSchema extends StandardSchemaV1\n ?\n | InferStandardSchema<OutSchema>\n | ResponseWithMetadata<InferStandardSchema<OutSchema>>\n | Promise<InferStandardSchema<OutSchema>>\n | Promise<ResponseWithMetadata<InferStandardSchema<OutSchema>>>\n :\n | unknown\n | ResponseWithMetadata<unknown>\n | Promise<unknown>\n | Promise<ResponseWithMetadata<unknown>>;\n\n/**\n * HTTP success status codes that can be returned by endpoints.\n */\nexport enum SuccessStatus {\n /** Standard response for successful HTTP requests */\n OK = 200,\n /** Request has been fulfilled and resulted in a new resource being created */\n Created = 201,\n /** Request has been accepted for processing, but processing is not complete */\n Accepted = 202,\n /** Server successfully processed the request but is not returning any content */\n NoContent = 204,\n /** Server successfully processed the request and is not returning any content, client should reset the document view */\n ResetContent = 205,\n /** Server is delivering only part of the resource due to a range header */\n PartialContent = 206,\n}\n\nexport type EndpointOutput<T> = T extends Endpoint<\n any,\n any,\n any,\n infer OutSchema,\n any,\n any,\n any,\n any\n>\n ? InferStandardSchema<OutSchema>\n : never;\n\nexport type EndpointEvent<T> = T extends Endpoint<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n infer TEventPublisher\n>\n ? ExtractPublisherMessage<TEventPublisher>\n : never;\n"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { HttpMethod, LowerHttpMethod, RemoveUndefined } from "./types-CVq20-fE.mjs";
|
|
2
|
-
import {
|
|
2
|
+
import { Authorizer } from "./Authorizer-Bbk9ziuG.mjs";
|
|
3
|
+
import { Function, FunctionHandler } from "./Function-DFRZZCC-.mjs";
|
|
3
4
|
import { ComponentCollector, OpenApiSchemaOptions } from "@geekmidas/schema/openapi";
|
|
4
5
|
import { Service, ServiceRecord } from "@geekmidas/services";
|
|
5
6
|
import { RateLimitConfig } from "@geekmidas/rate-limit";
|
|
@@ -56,6 +57,8 @@ declare class Endpoint<TRoute extends string, TMethod extends HttpMethod, TInput
|
|
|
56
57
|
authorize: AuthorizeFn<TServices, TLogger, TSession>;
|
|
57
58
|
/** Optional rate limiting configuration */
|
|
58
59
|
rateLimit?: RateLimitConfig;
|
|
60
|
+
/** Optional authorizer for this endpoint */
|
|
61
|
+
authorizer?: Authorizer;
|
|
59
62
|
/** The endpoint handler function */
|
|
60
63
|
private endpointFn;
|
|
61
64
|
/**
|
|
@@ -104,12 +107,13 @@ declare class Endpoint<TRoute extends string, TMethod extends HttpMethod, TInput
|
|
|
104
107
|
* Creates a case-insensitive header lookup function from a headers object.
|
|
105
108
|
*
|
|
106
109
|
* @param headers - Object containing header key-value pairs
|
|
107
|
-
* @returns Function to retrieve header values by case-insensitive key
|
|
110
|
+
* @returns Function to retrieve header values by case-insensitive key, or all headers
|
|
108
111
|
*
|
|
109
112
|
* @example
|
|
110
113
|
* ```typescript
|
|
111
114
|
* const headerFn = Endpoint.createHeaders({ 'Content-Type': 'application/json' });
|
|
112
115
|
* headerFn('content-type'); // Returns 'application/json'
|
|
116
|
+
* headerFn(); // Returns { 'content-type': 'application/json' }
|
|
113
117
|
* ```
|
|
114
118
|
*/
|
|
115
119
|
static createHeaders(headers: Record<string, string>): HeaderFn;
|
|
@@ -117,13 +121,13 @@ declare class Endpoint<TRoute extends string, TMethod extends HttpMethod, TInput
|
|
|
117
121
|
* Parses cookie string and creates a cookie lookup function.
|
|
118
122
|
*
|
|
119
123
|
* @param cookieHeader - The Cookie header value
|
|
120
|
-
* @returns Function to retrieve cookie values by name
|
|
124
|
+
* @returns Function to retrieve cookie values by name, or all cookies
|
|
121
125
|
*
|
|
122
126
|
* @example
|
|
123
127
|
* ```typescript
|
|
124
128
|
* const cookieFn = Endpoint.createCookies('session=abc123; theme=dark');
|
|
125
129
|
* cookieFn('session'); // Returns 'abc123'
|
|
126
|
-
* cookieFn(
|
|
130
|
+
* cookieFn(); // Returns { session: 'abc123', theme: 'dark' }
|
|
127
131
|
* ```
|
|
128
132
|
*/
|
|
129
133
|
static createCookies(cookieHeader: string | undefined): CookieFn;
|
|
@@ -195,6 +199,7 @@ declare class Endpoint<TRoute extends string, TMethod extends HttpMethod, TInput
|
|
|
195
199
|
* @param options.getSession - Session extraction function
|
|
196
200
|
* @param options.authorize - Authorization check function
|
|
197
201
|
* @param options.status - Success HTTP status code (default: 200)
|
|
202
|
+
* @param options.authorizer - Optional authorizer configuration
|
|
198
203
|
*/
|
|
199
204
|
constructor({
|
|
200
205
|
fn,
|
|
@@ -207,12 +212,14 @@ declare class Endpoint<TRoute extends string, TMethod extends HttpMethod, TInput
|
|
|
207
212
|
output: outputSchema,
|
|
208
213
|
services,
|
|
209
214
|
timeout,
|
|
215
|
+
memorySize,
|
|
210
216
|
getSession,
|
|
211
217
|
authorize,
|
|
212
218
|
rateLimit,
|
|
213
219
|
status,
|
|
214
220
|
publisherService,
|
|
215
|
-
events
|
|
221
|
+
events,
|
|
222
|
+
authorizer
|
|
216
223
|
}: EndpointOptions<TRoute, TMethod, TInput, OutSchema, TServices, TLogger, TSession, OutSchema, TEventPublisher, TEventPublisherServiceName>);
|
|
217
224
|
}
|
|
218
225
|
/**
|
|
@@ -262,6 +269,8 @@ interface EndpointOptions<TRoute extends string, TMethod extends HttpMethod, TIn
|
|
|
262
269
|
tags?: string[];
|
|
263
270
|
/** Optional execution timeout in milliseconds */
|
|
264
271
|
timeout: number | undefined;
|
|
272
|
+
/** Optional memory size in MB for serverless deployments */
|
|
273
|
+
memorySize: number | undefined;
|
|
265
274
|
/** Input validation schemas */
|
|
266
275
|
input: TInput | undefined;
|
|
267
276
|
/** Output validation schema */
|
|
@@ -281,6 +290,8 @@ interface EndpointOptions<TRoute extends string, TMethod extends HttpMethod, TIn
|
|
|
281
290
|
*/
|
|
282
291
|
publisherService?: Service<TEventPublisherServiceName, TEventPublisher>;
|
|
283
292
|
events?: MappedEvent<TEventPublisher, OutSchema>[];
|
|
293
|
+
/** Optional authorizer configuration */
|
|
294
|
+
authorizer?: Authorizer;
|
|
284
295
|
}
|
|
285
296
|
/**
|
|
286
297
|
* Defines the possible input schema types for an endpoint.
|
|
@@ -380,23 +391,44 @@ type MultiHeaderFn = () => EndpointHeaders;
|
|
|
380
391
|
type EndpointHeaders = Map<string, string>;
|
|
381
392
|
/**
|
|
382
393
|
* Function type for retrieving HTTP header values.
|
|
394
|
+
* Supports two calling patterns:
|
|
395
|
+
* - `header(key)` - Get a single header value (case-insensitive)
|
|
396
|
+
* - `header()` - Get all headers as a plain object
|
|
383
397
|
*
|
|
384
|
-
* @
|
|
385
|
-
*
|
|
398
|
+
* @example
|
|
399
|
+
* ```typescript
|
|
400
|
+
* // Get single header
|
|
401
|
+
* const contentType = header('content-type');
|
|
402
|
+
*
|
|
403
|
+
* // Get all headers
|
|
404
|
+
* const allHeaders = header();
|
|
405
|
+
* // { 'content-type': 'application/json', 'host': 'example.com', ... }
|
|
406
|
+
* ```
|
|
386
407
|
*/
|
|
387
|
-
|
|
408
|
+
interface HeaderFn {
|
|
409
|
+
(): Record<string, string>;
|
|
410
|
+
(key: string): string | undefined;
|
|
411
|
+
}
|
|
388
412
|
/**
|
|
389
413
|
* Function type for retrieving cookie values.
|
|
390
|
-
*
|
|
391
|
-
*
|
|
392
|
-
*
|
|
414
|
+
* Supports two calling patterns:
|
|
415
|
+
* - `cookie(name)` - Get a single cookie value
|
|
416
|
+
* - `cookie()` - Get all cookies as a plain object
|
|
393
417
|
*
|
|
394
418
|
* @example
|
|
395
419
|
* ```typescript
|
|
420
|
+
* // Get single cookie
|
|
396
421
|
* const sessionId = cookie('session');
|
|
422
|
+
*
|
|
423
|
+
* // Get all cookies
|
|
424
|
+
* const allCookies = cookie();
|
|
425
|
+
* // { session: 'abc123', theme: 'dark', ... }
|
|
397
426
|
* ```
|
|
398
427
|
*/
|
|
399
|
-
|
|
428
|
+
interface CookieFn {
|
|
429
|
+
(): Record<string, string>;
|
|
430
|
+
(name: string): string | undefined;
|
|
431
|
+
}
|
|
400
432
|
/**
|
|
401
433
|
* Cookie options matching standard Set-Cookie attributes
|
|
402
434
|
*/
|
|
@@ -511,4 +543,4 @@ type EndpointOutput<T> = T extends Endpoint<any, any, any, infer OutSchema, any,
|
|
|
511
543
|
type EndpointEvent<T> = T extends Endpoint<any, any, any, any, any, any, any, infer TEventPublisher> ? ExtractPublisherMessage<TEventPublisher> : never;
|
|
512
544
|
//#endregion
|
|
513
545
|
export { AuthorizeContext, AuthorizeFn, ConvertRouteParams, CookieFn, CookieOptions, Endpoint, EndpointContext, EndpointEvent, EndpointHandler, EndpointHeaders, EndpointInput, EndpointOpenApiSchema, EndpointOptions, EndpointOutput, EndpointSchemas, HeaderFn, MultiHeaderFn, ResponseBuilder, ResponseMetadata, ResponseWithMetadata, SessionContext, SessionFn, SingleHeaderFn, SuccessStatus };
|
|
514
|
-
//# sourceMappingURL=Endpoint-
|
|
546
|
+
//# sourceMappingURL=Endpoint-C16whGI-.d.mts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ConstructType } from "./Construct-
|
|
2
|
-
import { Function } from "./Function-
|
|
1
|
+
import { ConstructType } from "./Construct-B-O9OBS1.mjs";
|
|
2
|
+
import { Function } from "./Function-CmfMIDoS.mjs";
|
|
3
3
|
import pick from "lodash.pick";
|
|
4
4
|
import set from "lodash.set";
|
|
5
5
|
import { convertSchemaWithComponents, convertStandardSchemaToJsonSchema } from "@geekmidas/schema/conversion";
|
|
@@ -51,6 +51,8 @@ var Endpoint = class Endpoint extends Function {
|
|
|
51
51
|
authorize = () => true;
|
|
52
52
|
/** Optional rate limiting configuration */
|
|
53
53
|
rateLimit;
|
|
54
|
+
/** Optional authorizer for this endpoint */
|
|
55
|
+
authorizer;
|
|
54
56
|
/** The endpoint handler function */
|
|
55
57
|
endpointFn;
|
|
56
58
|
/**
|
|
@@ -110,12 +112,13 @@ var Endpoint = class Endpoint extends Function {
|
|
|
110
112
|
* Creates a case-insensitive header lookup function from a headers object.
|
|
111
113
|
*
|
|
112
114
|
* @param headers - Object containing header key-value pairs
|
|
113
|
-
* @returns Function to retrieve header values by case-insensitive key
|
|
115
|
+
* @returns Function to retrieve header values by case-insensitive key, or all headers
|
|
114
116
|
*
|
|
115
117
|
* @example
|
|
116
118
|
* ```typescript
|
|
117
119
|
* const headerFn = Endpoint.createHeaders({ 'Content-Type': 'application/json' });
|
|
118
120
|
* headerFn('content-type'); // Returns 'application/json'
|
|
121
|
+
* headerFn(); // Returns { 'content-type': 'application/json' }
|
|
119
122
|
* ```
|
|
120
123
|
*/
|
|
121
124
|
static createHeaders(headers) {
|
|
@@ -124,21 +127,23 @@ var Endpoint = class Endpoint extends Function {
|
|
|
124
127
|
const key = k.toLowerCase();
|
|
125
128
|
headerMap.set(key, v);
|
|
126
129
|
}
|
|
127
|
-
|
|
130
|
+
function get(key) {
|
|
131
|
+
if (key === void 0) return Object.fromEntries(headerMap.entries());
|
|
128
132
|
return headerMap.get(key.toLowerCase());
|
|
129
|
-
}
|
|
133
|
+
}
|
|
134
|
+
return get;
|
|
130
135
|
}
|
|
131
136
|
/**
|
|
132
137
|
* Parses cookie string and creates a cookie lookup function.
|
|
133
138
|
*
|
|
134
139
|
* @param cookieHeader - The Cookie header value
|
|
135
|
-
* @returns Function to retrieve cookie values by name
|
|
140
|
+
* @returns Function to retrieve cookie values by name, or all cookies
|
|
136
141
|
*
|
|
137
142
|
* @example
|
|
138
143
|
* ```typescript
|
|
139
144
|
* const cookieFn = Endpoint.createCookies('session=abc123; theme=dark');
|
|
140
145
|
* cookieFn('session'); // Returns 'abc123'
|
|
141
|
-
* cookieFn(
|
|
146
|
+
* cookieFn(); // Returns { session: 'abc123', theme: 'dark' }
|
|
142
147
|
* ```
|
|
143
148
|
*/
|
|
144
149
|
static createCookies(cookieHeader) {
|
|
@@ -153,9 +158,11 @@ var Endpoint = class Endpoint extends Function {
|
|
|
153
158
|
}
|
|
154
159
|
}
|
|
155
160
|
}
|
|
156
|
-
|
|
161
|
+
function get(name) {
|
|
162
|
+
if (name === void 0) return Object.fromEntries(cookieMap.entries());
|
|
157
163
|
return cookieMap.get(name);
|
|
158
|
-
}
|
|
164
|
+
}
|
|
165
|
+
return get;
|
|
159
166
|
}
|
|
160
167
|
/**
|
|
161
168
|
* Formats a cookie as a Set-Cookie header string.
|
|
@@ -315,9 +322,10 @@ var Endpoint = class Endpoint extends Function {
|
|
|
315
322
|
* @param options.getSession - Session extraction function
|
|
316
323
|
* @param options.authorize - Authorization check function
|
|
317
324
|
* @param options.status - Success HTTP status code (default: 200)
|
|
325
|
+
* @param options.authorizer - Optional authorizer configuration
|
|
318
326
|
*/
|
|
319
|
-
constructor({ fn, method, route, description, tags, input, logger, output: outputSchema, services, timeout, getSession, authorize, rateLimit, status = SuccessStatus.OK, publisherService, events }) {
|
|
320
|
-
super(fn, timeout, ConstructType.Endpoint, input, outputSchema, services, logger, publisherService, events);
|
|
327
|
+
constructor({ fn, method, route, description, tags, input, logger, output: outputSchema, services, timeout, memorySize, getSession, authorize, rateLimit, status = SuccessStatus.OK, publisherService, events, authorizer }) {
|
|
328
|
+
super(fn, timeout, ConstructType.Endpoint, input, outputSchema, services, logger, publisherService, events, memorySize);
|
|
321
329
|
this.route = route;
|
|
322
330
|
this.method = method;
|
|
323
331
|
this.description = description;
|
|
@@ -327,6 +335,7 @@ var Endpoint = class Endpoint extends Function {
|
|
|
327
335
|
if (getSession) this.getSession = getSession;
|
|
328
336
|
if (authorize) this.authorize = authorize;
|
|
329
337
|
if (rateLimit) this.rateLimit = rateLimit;
|
|
338
|
+
if (authorizer) this.authorizer = authorizer;
|
|
330
339
|
}
|
|
331
340
|
};
|
|
332
341
|
/**
|
|
@@ -394,4 +403,4 @@ let SuccessStatus = /* @__PURE__ */ function(SuccessStatus$1) {
|
|
|
394
403
|
|
|
395
404
|
//#endregion
|
|
396
405
|
export { Endpoint, ResponseBuilder, SuccessStatus };
|
|
397
|
-
//# sourceMappingURL=Endpoint-
|
|
406
|
+
//# sourceMappingURL=Endpoint-DCJz2VQ_.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Endpoint-DCJz2VQ_.mjs","names":["endpoints: Endpoint<any, any, any, any, any, any>[]","options?: OpenApiSchemaOptions","input: unknown","key: K","body: unknown","status: number","headers: Record<string, string>","key?: string","cookieHeader: string | undefined","name?: string","name: string","value: string","options?: CookieOptions","ctx: EndpointContext<TInput, TServices, TLogger, TSession>","response: ResponseBuilder","obj: any","response: T | ResponseWithMetadata<T>","componentCollector?: ComponentCollector","operation: OpenAPIV3_1.OperationObject","pathParameters: OpenAPIV3_1.ParameterObject[]","queryParameters: OpenAPIV3_1.ParameterObject[]","routeObject: any","key: string","options?: Pick<CookieOptions, 'domain' | 'path'>","code: SuccessStatus","data: T"],"sources":["../src/endpoints/Endpoint.ts"],"sourcesContent":["import type { Logger } from '@geekmidas/logger';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport pick from 'lodash.pick';\nimport set from 'lodash.set';\nimport type { OpenAPIV3_1 } from 'openapi-types';\n\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport type { Authorizer } from './Authorizer';\nimport { ConstructType } from '../Construct';\nimport { Function, type FunctionHandler } from '../functions';\n\nimport type {\n EventPublisher,\n ExtractPublisherMessage,\n MappedEvent,\n} from '@geekmidas/events';\nimport type { RateLimitConfig } from '@geekmidas/rate-limit';\nimport type {\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport {\n convertSchemaWithComponents,\n convertStandardSchemaToJsonSchema,\n} from '@geekmidas/schema/conversion';\nimport {\n type ComponentCollector,\n type OpenApiSchemaOptions,\n buildOpenApiSchema,\n} from '@geekmidas/schema/openapi';\nimport type { HttpMethod, LowerHttpMethod, RemoveUndefined } from '../types';\n\n/**\n * Represents an HTTP endpoint that can handle requests with type-safe input/output validation,\n * dependency injection, session management, and authorization.\n *\n * @template TRoute - The route path string with parameter placeholders (e.g., '/users/:id')\n * @template TMethod - The HTTP method (GET, POST, PUT, DELETE, PATCH)\n * @template TInput - The input schema definition for body, query, and path parameters\n * @template OutSchema - The output schema for response validation\n * @template TServices - Array of service dependencies to inject\n * @template TLogger - The logger instance type\n * @template TSession - The session data type\n *\n * @extends Function - Base function construct for handler execution\n *\n * @example\n * ```typescript\n * const endpoint = new Endpoint({\n * route: '/users/:id',\n * method: 'GET',\n * input: { params: userIdSchema },\n * output: userSchema,\n * fn: async ({ params }) => getUserById(params.id)\n * });\n * ```\n */\nexport class Endpoint<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n> extends Function<\n TInput,\n TServices,\n TLogger,\n OutSchema,\n FunctionHandler<TInput, TServices, TLogger, OutSchema>,\n TEventPublisher,\n TEventPublisherServiceName\n> {\n operationId?: string;\n /** The route path pattern with parameter placeholders */\n route: TRoute;\n /** The HTTP method for this endpoint */\n method: TMethod;\n /** Optional description for OpenAPI documentation */\n description?: string;\n /** Optional tags for OpenAPI documentation */\n tags?: string[];\n /** The HTTP success status code to return (default: 200) */\n public readonly status: SuccessStatus;\n /** Default headers to apply to all responses */\n public readonly defaultHeaders: Record<string, string> = {};\n /** Function to extract session data from the request context */\n public getSession: SessionFn<TServices, TLogger, TSession> = () =>\n ({}) as TSession;\n /** Function to determine if the request is authorized */\n public authorize: AuthorizeFn<TServices, TLogger, TSession> = () => true;\n /** Optional rate limiting configuration */\n public rateLimit?: RateLimitConfig;\n /** Optional authorizer for this endpoint */\n public authorizer?: Authorizer;\n /** The endpoint handler function */\n private endpointFn!: EndpointHandler<\n TInput,\n TServices,\n TLogger,\n OutSchema,\n TSession\n >;\n\n /**\n * Builds a complete OpenAPI 3.1 schema from an array of endpoints.\n *\n * @param endpoints - Array of endpoint instances to document\n * @param options - Optional configuration for OpenAPI generation\n * @returns OpenAPI 3.1 specification object\n *\n * @example\n * ```typescript\n * const schema = await Endpoint.buildOpenApiSchema([\n * getUserEndpoint,\n * createUserEndpoint\n * ], {\n * title: 'User API',\n * version: '1.0.0'\n * });\n * ```\n */\n static async buildOpenApiSchema(\n endpoints: Endpoint<any, any, any, any, any, any>[],\n options?: OpenApiSchemaOptions,\n ) {\n return buildOpenApiSchema(endpoints, options);\n }\n\n /**\n * Gets the full path including HTTP method and route.\n * @returns Formatted string like 'GET /users/{id}'\n */\n get fullPath() {\n return `${this.method} ${this._path}` as const;\n }\n\n /**\n * Parses and validates input data for a specific input type (body, query, params).\n *\n * @param input - The raw input data to validate\n * @param key - The input type key ('body', 'query', or 'params')\n * @returns The validated input data for the specified key\n * @throws {UnprocessableEntityError} When validation fails\n */\n async parseInput<K extends keyof TInput>(\n input: unknown,\n key: K,\n ): Promise<InferComposableStandardSchema<TInput[K]>> {\n const schema = this.input?.[key];\n return Endpoint.parseSchema(schema as StandardSchemaV1, input) as Promise<\n InferComposableStandardSchema<TInput[K]>\n >;\n }\n\n /**\n * Parses and validates the request body against the body schema.\n *\n * @param body - The raw request body to validate\n * @returns The validated body data\n * @throws {UnprocessableEntityError} When body validation fails\n */\n async parseBody(body: unknown): Promise<InferStandardSchema<TInput['body']>> {\n return this.parseInput(body, 'body') as Promise<\n InferStandardSchema<TInput['body']>\n >;\n }\n\n static isSuccessStatus(status: number): boolean {\n return status >= 200 && status < 300;\n }\n\n /**\n * Creates a case-insensitive header lookup function from a headers object.\n *\n * @param headers - Object containing header key-value pairs\n * @returns Function to retrieve header values by case-insensitive key, or all headers\n *\n * @example\n * ```typescript\n * const headerFn = Endpoint.createHeaders({ 'Content-Type': 'application/json' });\n * headerFn('content-type'); // Returns 'application/json'\n * headerFn(); // Returns { 'content-type': 'application/json' }\n * ```\n */\n static createHeaders(headers: Record<string, string>): HeaderFn {\n const headerMap = new Map<string, string>();\n for (const [k, v] of Object.entries(headers)) {\n const key = k.toLowerCase();\n headerMap.set(key, v);\n }\n\n function get(): Record<string, string>;\n function get(key: string): string | undefined;\n function get(key?: string): string | undefined | Record<string, string> {\n if (key === undefined) {\n // Return all headers as plain object\n return Object.fromEntries(headerMap.entries());\n }\n return headerMap.get(key.toLowerCase());\n }\n\n return get;\n }\n\n /**\n * Parses cookie string and creates a cookie lookup function.\n *\n * @param cookieHeader - The Cookie header value\n * @returns Function to retrieve cookie values by name, or all cookies\n *\n * @example\n * ```typescript\n * const cookieFn = Endpoint.createCookies('session=abc123; theme=dark');\n * cookieFn('session'); // Returns 'abc123'\n * cookieFn(); // Returns { session: 'abc123', theme: 'dark' }\n * ```\n */\n static createCookies(cookieHeader: string | undefined): CookieFn {\n const cookieMap = new Map<string, string>();\n\n if (cookieHeader) {\n // Parse cookie string: \"name1=value1; name2=value2\"\n const cookies = cookieHeader.split(';');\n for (const cookie of cookies) {\n const [name, ...valueParts] = cookie.trim().split('=');\n if (name) {\n const value = valueParts.join('='); // Handle values with = in them\n cookieMap.set(name, decodeURIComponent(value));\n }\n }\n }\n\n function get(): Record<string, string>;\n function get(name: string): string | undefined;\n function get(name?: string): string | undefined | Record<string, string> {\n if (name === undefined) {\n // Return all cookies as plain object\n return Object.fromEntries(cookieMap.entries());\n }\n return cookieMap.get(name);\n }\n\n return get;\n }\n\n /**\n * Formats a cookie as a Set-Cookie header string.\n *\n * @param name - Cookie name\n * @param value - Cookie value\n * @param options - Cookie options (httpOnly, secure, sameSite, etc.)\n * @returns Formatted Set-Cookie header string\n *\n * @example\n * ```typescript\n * const header = Endpoint.formatCookieHeader('session', 'abc123', {\n * httpOnly: true,\n * secure: true,\n * sameSite: 'strict',\n * maxAge: 3600\n * });\n * // Returns: \"session=abc123; Max-Age=3600; HttpOnly; Secure; SameSite=Strict\"\n * ```\n */\n static formatCookieHeader(\n name: string,\n value: string,\n options?: CookieOptions,\n ): string {\n let cookie = `${name}=${value}`;\n\n if (options) {\n if (options.domain) cookie += `; Domain=${options.domain}`;\n if (options.path) cookie += `; Path=${options.path}`;\n if (options.expires)\n cookie += `; Expires=${options.expires.toUTCString()}`;\n if (options.maxAge !== undefined) cookie += `; Max-Age=${options.maxAge}`;\n if (options.httpOnly) cookie += '; HttpOnly';\n if (options.secure) cookie += '; Secure';\n if (options.sameSite) {\n cookie += `; SameSite=${options.sameSite.charAt(0).toUpperCase() + options.sameSite.slice(1)}`;\n }\n }\n\n return cookie;\n }\n\n /**\n * Extracts and refines input data from the endpoint context.\n *\n * @param ctx - The endpoint execution context\n * @returns Object containing only the input data (body, query, params)\n * @internal\n */\n refineInput(\n ctx: EndpointContext<TInput, TServices, TLogger, TSession>,\n ): InferComposableStandardSchema<TInput> {\n const input = pick(ctx, [\n 'body',\n 'query',\n 'params',\n ]) as InferComposableStandardSchema<TInput>;\n\n return input;\n }\n\n handler = (\n ctx: EndpointContext<TInput, TServices, TLogger, TSession>,\n response: ResponseBuilder,\n ): OutSchema extends StandardSchemaV1\n ?\n | InferStandardSchema<OutSchema>\n | ResponseWithMetadata<InferStandardSchema<OutSchema>>\n | Promise<InferStandardSchema<OutSchema>>\n | Promise<ResponseWithMetadata<InferStandardSchema<OutSchema>>>\n :\n | any\n | ResponseWithMetadata<any>\n | Promise<any>\n | Promise<ResponseWithMetadata<any>> => {\n // Apply default headers to response builder\n for (const [key, value] of Object.entries(this.defaultHeaders)) {\n response.header(key, value);\n }\n\n return this.endpointFn(\n {\n ...this.refineInput(ctx),\n services: ctx.services,\n logger: ctx.logger,\n header: ctx.header,\n cookie: ctx.cookie,\n session: ctx.session,\n } as EndpointContext<TInput, TServices, TLogger, TSession>,\n response,\n );\n };\n\n /**\n * Type guard to check if an object is an Endpoint instance.\n *\n * @param obj - The object to check\n * @returns True if the object is an Endpoint\n */\n static isEndpoint(obj: any): obj is Endpoint<any, any, any, any> {\n return Boolean(\n obj &&\n (obj as Function).__IS_FUNCTION__ === true &&\n obj.type === ConstructType.Endpoint,\n );\n }\n\n /**\n * Helper to check if response has metadata\n */\n static hasMetadata<T>(\n response: T | ResponseWithMetadata<T>,\n ): response is ResponseWithMetadata<T> {\n return (\n response !== null &&\n typeof response === 'object' &&\n 'data' in response &&\n 'metadata' in response\n );\n }\n\n /**\n * Converts Express-style route params to OpenAPI format.\n * @returns Route with ':param' converted to '{param}'\n * @internal\n */\n get _path() {\n return this.route.replace(/:(\\w+)/g, '{$1}') as ConvertRouteParams<TRoute>;\n }\n\n /**\n * Generates OpenAPI 3.1 schema for this endpoint.\n *\n * @returns OpenAPI route definition with operation details\n */\n async toOpenApi3Route(\n componentCollector?: ComponentCollector,\n ): Promise<EndpointOpenApiSchema<TRoute, TMethod>> {\n const operation: OpenAPIV3_1.OperationObject = {\n operationId: this.operationId,\n ...(this.description && { description: this.description }),\n ...(this.tags && this.tags.length > 0 && { tags: this.tags }),\n responses: {\n '200': {\n description: 'Successful response',\n } as OpenAPIV3_1.ResponseObject,\n },\n };\n\n // Add response schema\n if (this.outputSchema) {\n const responseSchema = await convertSchemaWithComponents(\n this.outputSchema,\n componentCollector,\n );\n if (responseSchema) {\n set(\n operation,\n ['responses', '200', 'content', 'application/json', 'schema'],\n responseSchema,\n );\n }\n }\n\n // Separate path and query parameters\n const pathParameters: OpenAPIV3_1.ParameterObject[] = [];\n const queryParameters: OpenAPIV3_1.ParameterObject[] = [];\n\n // Since the EndpointBuilder doesn't have body/search/params methods yet,\n // and the input is a composite type, we need to check if input exists\n // and has the expected shape\n if (this.input && typeof this.input === 'object') {\n // Add request body for methods that support it\n if (\n ['POST', 'PUT', 'PATCH'].includes(this.method) &&\n 'body' in this.input &&\n this.input.body\n ) {\n const bodySchema = await convertSchemaWithComponents(\n this.input.body as StandardSchemaV1,\n componentCollector,\n );\n if (bodySchema) {\n set(operation, ['requestBody'], {\n required: true,\n content: {\n 'application/json': {\n schema: bodySchema,\n },\n },\n });\n }\n }\n\n // Add path parameters\n if ('params' in this.input && this.input.params) {\n const paramsSchema = await convertStandardSchemaToJsonSchema(\n this.input.params as StandardSchemaV1,\n );\n if (\n paramsSchema &&\n paramsSchema.type === 'object' &&\n paramsSchema.properties\n ) {\n for (const [name, schema] of Object.entries(\n paramsSchema.properties,\n )) {\n pathParameters.push({\n name,\n in: 'path',\n required: paramsSchema.required?.includes(name) ?? true,\n schema: schema as any,\n });\n }\n }\n }\n\n // Add query parameters\n if ('query' in this.input && this.input.query) {\n const querySchema = await convertStandardSchemaToJsonSchema(\n this.input.query,\n );\n if (\n querySchema &&\n querySchema.type === 'object' &&\n querySchema.properties\n ) {\n for (const [name, schema] of Object.entries(querySchema.properties)) {\n queryParameters.push({\n name,\n in: 'query',\n required: querySchema.required?.includes(name) ?? false,\n schema: schema as any,\n });\n }\n }\n }\n }\n\n // Only add query parameters to the operation\n if (queryParameters.length > 0) {\n operation.parameters = queryParameters;\n }\n\n // Build the route object with path parameters at the route level\n const routeObject: any = {};\n if (pathParameters.length > 0) {\n routeObject.parameters = pathParameters;\n }\n routeObject[this.method.toLowerCase()] = operation;\n\n return {\n [this._path]: routeObject,\n } as EndpointOpenApiSchema<TRoute, TMethod>;\n }\n\n /**\n * Creates a new Endpoint instance.\n *\n * @param options - Configuration options for the endpoint\n * @param options.fn - The handler function to execute\n * @param options.method - HTTP method\n * @param options.route - Route path with parameter placeholders\n * @param options.description - Optional description for documentation\n * @param options.input - Input schemas for validation\n * @param options.logger - Logger instance\n * @param options.output - Output schema for response validation\n * @param options.services - Service dependencies\n * @param options.timeout - Execution timeout in milliseconds\n * @param options.getSession - Session extraction function\n * @param options.authorize - Authorization check function\n * @param options.status - Success HTTP status code (default: 200)\n * @param options.authorizer - Optional authorizer configuration\n */\n constructor({\n fn,\n method,\n route,\n description,\n tags,\n input,\n logger,\n output: outputSchema,\n services,\n timeout,\n memorySize,\n getSession,\n authorize,\n rateLimit,\n status = SuccessStatus.OK,\n publisherService,\n events,\n authorizer,\n }: EndpointOptions<\n TRoute,\n TMethod,\n TInput,\n OutSchema,\n TServices,\n TLogger,\n TSession,\n OutSchema,\n TEventPublisher,\n TEventPublisherServiceName\n >) {\n super(\n fn as unknown as FunctionHandler<TInput, TServices, TLogger, OutSchema>,\n timeout,\n ConstructType.Endpoint,\n input,\n outputSchema,\n services,\n logger,\n publisherService,\n events,\n memorySize,\n );\n\n this.route = route;\n this.method = method;\n this.description = description;\n this.tags = tags;\n this.status = status;\n this.endpointFn = fn;\n\n if (getSession) {\n this.getSession = getSession;\n }\n\n if (authorize) {\n this.authorize = authorize;\n }\n\n if (rateLimit) {\n this.rateLimit = rateLimit;\n }\n\n if (authorizer) {\n this.authorizer = authorizer;\n }\n }\n}\n\n/**\n * Defines the input schema structure for an endpoint.\n *\n * @template TBody - Schema for request body validation\n * @template TSearch - Schema for query string validation\n * @template TParams - Schema for URL path parameters validation\n *\n * @example\n * ```typescript\n * type UserInput = EndpointInput<\n * typeof createUserBodySchema,\n * typeof userQuerySchema,\n * typeof userParamsSchema\n * >;\n * ```\n */\nexport type EndpointInput<\n TBody extends StandardSchemaV1 | undefined = undefined,\n TSearch extends StandardSchemaV1 | undefined = undefined,\n TParams extends StandardSchemaV1 | undefined = undefined,\n> = RemoveUndefined<{\n body: TBody;\n search: TSearch;\n params: TParams;\n}>;\n\n/**\n * Configuration options for creating an Endpoint instance.\n *\n * @template TRoute - The route path string\n * @template TMethod - The HTTP method\n * @template TInput - Input schema definitions\n * @template TOutput - Output schema definition\n * @template TServices - Service dependencies array\n * @template TLogger - Logger type\n * @template TSession - Session data type\n */\nexport interface EndpointOptions<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutput extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n> {\n /** The route path with parameter placeholders */\n route: TRoute;\n /** The HTTP method for this endpoint */\n method: TMethod;\n /** The handler function that implements the endpoint logic */\n fn: EndpointHandler<TInput, TServices, TLogger, TOutput, TSession>;\n /** Optional authorization check function */\n authorize: AuthorizeFn<TServices, TLogger, TSession> | undefined;\n /** Optional description for documentation */\n description: string | undefined;\n /** Optional tags for OpenAPI documentation */\n tags?: string[];\n /** Optional execution timeout in milliseconds */\n timeout: number | undefined;\n /** Optional memory size in MB for serverless deployments */\n memorySize: number | undefined;\n /** Input validation schemas */\n input: TInput | undefined;\n /** Output validation schema */\n output: TOutput | undefined;\n /** Service dependencies to inject */\n services: TServices;\n /** Logger instance */\n logger: TLogger;\n /** Optional session extraction function */\n getSession: SessionFn<TServices, TLogger, TSession> | undefined;\n /** Optional rate limiting configuration */\n rateLimit?: RateLimitConfig;\n /** Success HTTP status code */\n status: SuccessStatus | undefined;\n /**\n * Event publisher service for publishing events from this endpoint\n */\n publisherService?: Service<TEventPublisherServiceName, TEventPublisher>;\n\n events?: MappedEvent<TEventPublisher, OutSchema>[];\n /** Optional authorizer configuration */\n authorizer?: Authorizer;\n}\n\n/**\n * Defines the possible input schema types for an endpoint.\n * Each property represents a different part of the HTTP request.\n */\nexport type EndpointSchemas = Partial<{\n /** Schema for URL path parameters (e.g., /users/:id) */\n params: StandardSchemaV1;\n /** Schema for query string parameters */\n query: StandardSchemaV1;\n /** Schema for request body (POST, PUT, PATCH) */\n body: StandardSchemaV1;\n}>;\n\nexport type AuthorizeContext<\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = {\n services: ServiceRecord<TServices>;\n logger: TLogger;\n header: HeaderFn;\n cookie: CookieFn;\n session: TSession;\n};\n/**\n * Function type for endpoint authorization checks.\n *\n * @template TServices - Available service dependencies\n * @template TLogger - Logger type\n * @template TSession - Session data type\n *\n * @param ctx - Context containing services, logger, headers, and session\n * @returns Boolean indicating if the request is authorized\n *\n * @example\n * ```typescript\n * const authorize: AuthorizeFn = ({ session }) => {\n * return session.userId !== undefined;\n * };\n * ```\n */\nexport type AuthorizeFn<\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = (\n ctx: AuthorizeContext<TServices, TLogger, TSession>,\n) => Promise<boolean> | boolean;\n\nexport type SessionContext<\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n> = {\n services: ServiceRecord<TServices>;\n logger: TLogger;\n header: HeaderFn;\n cookie: CookieFn;\n};\n/**\n * Function type for extracting session data from a request.\n *\n * @template TServices - Available service dependencies\n * @template TLogger - Logger type\n * @template TSession - Session data type to extract\n *\n * @param ctx - Context containing services, logger, and headers\n * @returns The extracted session data\n *\n * @example\n * ```typescript\n * const getSession: SessionFn<Services, Logger, UserSession> = async ({ header, services }) => {\n * const token = header('authorization');\n * return await services.auth.verifyToken(token);\n * };\n * ```\n */\nexport type SessionFn<\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = (ctx: SessionContext<TServices, TLogger>) => Promise<TSession> | TSession;\n\n/**\n * Utility type that converts Express-style route parameters to OpenAPI format.\n * Transforms ':param' syntax to '{param}' syntax.\n *\n * @template T - The route string to convert\n *\n * @example\n * ```typescript\n * type Route1 = ConvertRouteParams<'/users/:id'>; // '/users/{id}'\n * type Route2 = ConvertRouteParams<'/users/:userId/posts/:postId'>; // '/users/{userId}/posts/{postId}'\n * ```\n */\nexport type ConvertRouteParams<T extends string> =\n T extends `${infer Start}:${infer Param}/${infer Rest}`\n ? `${Start}{${Param}}/${ConvertRouteParams<Rest>}`\n : T extends `${infer Start}:${infer Param}`\n ? `${Start}{${Param}}`\n : T;\n\n/**\n * Type representing the OpenAPI schema structure for an endpoint.\n *\n * @template TRoute - The route path\n * @template TMethod - The HTTP method\n *\n * @example\n * ```typescript\n * type Schema = EndpointOpenApiSchema<'/users/:id', 'GET'>;\n * // Results in: { '/users/{id}': { get: OperationObject, parameters?: ParameterObject[] } }\n * ```\n */\nexport type EndpointOpenApiSchema<\n TRoute extends string,\n TMethod extends HttpMethod,\n> = {\n [key in ConvertRouteParams<TRoute>]: {\n [key in LowerHttpMethod<TMethod>]: OpenAPIV3_1.OperationObject<{}>;\n } & {\n parameters?: OpenAPIV3_1.ParameterObject[];\n };\n};\n\nexport type SingleHeaderFn = (key: string) => string | undefined;\nexport type MultiHeaderFn = () => EndpointHeaders;\n/**\n * Type representing HTTP headers as a Map.\n */\nexport type EndpointHeaders = Map<string, string>;\n\n/**\n * Function type for retrieving HTTP header values.\n * Supports two calling patterns:\n * - `header(key)` - Get a single header value (case-insensitive)\n * - `header()` - Get all headers as a plain object\n *\n * @example\n * ```typescript\n * // Get single header\n * const contentType = header('content-type');\n *\n * // Get all headers\n * const allHeaders = header();\n * // { 'content-type': 'application/json', 'host': 'example.com', ... }\n * ```\n */\nexport interface HeaderFn {\n (): Record<string, string>;\n (key: string): string | undefined;\n}\n\n/**\n * Function type for retrieving cookie values.\n * Supports two calling patterns:\n * - `cookie(name)` - Get a single cookie value\n * - `cookie()` - Get all cookies as a plain object\n *\n * @example\n * ```typescript\n * // Get single cookie\n * const sessionId = cookie('session');\n *\n * // Get all cookies\n * const allCookies = cookie();\n * // { session: 'abc123', theme: 'dark', ... }\n * ```\n */\nexport interface CookieFn {\n (): Record<string, string>;\n (name: string): string | undefined;\n}\n\n/**\n * Cookie options matching standard Set-Cookie attributes\n */\nexport interface CookieOptions {\n domain?: string;\n path?: string;\n expires?: Date;\n maxAge?: number;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: 'strict' | 'lax' | 'none';\n}\n\n/**\n * Response metadata that handlers can set\n */\nexport interface ResponseMetadata {\n headers?: Record<string, string>;\n cookies?: Map<string, { value: string; options?: CookieOptions }>;\n status?: SuccessStatus;\n}\n\n/**\n * Return type for handlers that want to set response metadata\n */\nexport interface ResponseWithMetadata<T> {\n data: T;\n metadata: ResponseMetadata;\n}\n\n/**\n * Response builder for fluent API in handlers\n */\nexport class ResponseBuilder {\n private metadata: ResponseMetadata = {\n headers: {},\n cookies: new Map(),\n };\n\n header(key: string, value: string): this {\n this.metadata.headers![key] = value;\n return this;\n }\n\n cookie(name: string, value: string, options?: CookieOptions): this {\n this.metadata.cookies!.set(name, { value, options });\n return this;\n }\n\n deleteCookie(\n name: string,\n options?: Pick<CookieOptions, 'domain' | 'path'>,\n ): this {\n this.metadata.cookies!.set(name, {\n value: '',\n options: { ...options, maxAge: 0, expires: new Date(0) },\n });\n return this;\n }\n\n status(code: SuccessStatus): this {\n this.metadata.status = code;\n return this;\n }\n\n send<T>(data: T): ResponseWithMetadata<T> {\n return { data, metadata: this.metadata };\n }\n\n getMetadata(): ResponseMetadata {\n return this.metadata;\n }\n}\n\n/**\n * The execution context provided to endpoint handlers.\n * Contains all parsed input data, services, logger, headers, cookies, and session.\n *\n * @template Input - The input schemas (body, query, params)\n * @template TServices - Available service dependencies\n * @template TLogger - Logger type\n * @template TSession - Session data type\n */\nexport type EndpointContext<\n Input extends EndpointSchemas | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = {\n /** Injected service instances */\n services: ServiceRecord<TServices>;\n /** Logger instance for this request */\n logger: TLogger;\n /** Function to retrieve request headers */\n header: HeaderFn;\n /** Function to retrieve request cookies */\n cookie: CookieFn;\n /** Session data extracted by getSession */\n session: TSession;\n} & InferComposableStandardSchema<Input>;\n\n/**\n * Handler function type for endpoint implementations.\n *\n * @template TInput - Input schemas for validation\n * @template TServices - Available service dependencies\n * @template TLogger - Logger type\n * @template OutSchema - Output schema for response validation\n * @template TSession - Session data type\n *\n * @param ctx - The endpoint execution context\n * @param response - Response builder for setting cookies, headers, and status\n * @returns The response data (validated if OutSchema is provided) or ResponseWithMetadata\n *\n * @example\n * ```typescript\n * // Simple response\n * const handler: EndpointHandler<Input, [UserService], Logger, UserSchema> =\n * async ({ params, services }) => {\n * return await services.users.findById(params.id);\n * };\n *\n * // With response builder\n * const handler: EndpointHandler<Input, [UserService], Logger, UserSchema> =\n * async ({ params, services }, response) => {\n * const user = await services.users.findById(params.id);\n * return response.header('X-User-Id', user.id).send(user);\n * };\n * ```\n */\nexport type EndpointHandler<\n TInput extends EndpointSchemas | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TSession = unknown,\n> = (\n ctx: EndpointContext<TInput, TServices, TLogger, TSession>,\n response: ResponseBuilder,\n) => OutSchema extends StandardSchemaV1\n ?\n | InferStandardSchema<OutSchema>\n | ResponseWithMetadata<InferStandardSchema<OutSchema>>\n | Promise<InferStandardSchema<OutSchema>>\n | Promise<ResponseWithMetadata<InferStandardSchema<OutSchema>>>\n :\n | unknown\n | ResponseWithMetadata<unknown>\n | Promise<unknown>\n | Promise<ResponseWithMetadata<unknown>>;\n\n/**\n * HTTP success status codes that can be returned by endpoints.\n */\nexport enum SuccessStatus {\n /** Standard response for successful HTTP requests */\n OK = 200,\n /** Request has been fulfilled and resulted in a new resource being created */\n Created = 201,\n /** Request has been accepted for processing, but processing is not complete */\n Accepted = 202,\n /** Server successfully processed the request but is not returning any content */\n NoContent = 204,\n /** Server successfully processed the request and is not returning any content, client should reset the document view */\n ResetContent = 205,\n /** Server is delivering only part of the resource due to a range header */\n PartialContent = 206,\n}\n\nexport type EndpointOutput<T> = T extends Endpoint<\n any,\n any,\n any,\n infer OutSchema,\n any,\n any,\n any,\n any\n>\n ? InferStandardSchema<OutSchema>\n : never;\n\nexport type EndpointEvent<T> = T extends Endpoint<\n any,\n any,\n any,\n any,\n any,\n any,\n any,\n infer TEventPublisher\n>\n ? ExtractPublisherMessage<TEventPublisher>\n : never;\n"],"mappings":"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"}
|