@geekmidas/constructs 0.0.10 → 0.0.12
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-DhUb-Vs6.cjs → AWSLambdaFunction-DMxScuaw.cjs} +3 -3
- package/dist/{AWSLambdaFunction-DhUb-Vs6.cjs.map → AWSLambdaFunction-DMxScuaw.cjs.map} +1 -1
- package/dist/{AWSLambdaFunction-D5V3YVqv.d.cts → AWSLambdaFunction-DSB2oaFG.d.mts} +5 -5
- package/dist/{AWSLambdaFunction-D_V-ZQmS.mjs → AWSLambdaFunction-cL8A169J.mjs} +3 -3
- package/dist/{AWSLambdaFunction-D_V-ZQmS.mjs.map → AWSLambdaFunction-cL8A169J.mjs.map} +1 -1
- package/dist/{AWSLambdaFunction-DvZcnL8a.d.mts → AWSLambdaFunction-t6q2o8EL.d.cts} +5 -5
- package/dist/{AWSLambdaSubscriberAdaptor-J_pSz6pu.d.cts → AWSLambdaSubscriberAdaptor-Cknp_nn1.d.cts} +2 -2
- package/dist/{AWSLambdaSubscriberAdaptor-G8y3YkWj.mjs → AWSLambdaSubscriberAdaptor-CyFh7MN8.mjs} +1 -1
- package/dist/{AWSLambdaSubscriberAdaptor-G8y3YkWj.mjs.map → AWSLambdaSubscriberAdaptor-CyFh7MN8.mjs.map} +1 -1
- package/dist/{AWSLambdaSubscriberAdaptor-D6kjKjSf.d.mts → AWSLambdaSubscriberAdaptor-DpHzp-AM.d.mts} +2 -2
- package/dist/{AWSLambdaSubscriberAdaptor-CmPZ10JF.cjs → AWSLambdaSubscriberAdaptor-Dum5bkw3.cjs} +1 -1
- package/dist/{AWSLambdaSubscriberAdaptor-CmPZ10JF.cjs.map → AWSLambdaSubscriberAdaptor-Dum5bkw3.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayEndpointAdaptor-DHcUetbw.mjs → AmazonApiGatewayEndpointAdaptor-CIEhW1TQ.mjs} +47 -16
- package/dist/AmazonApiGatewayEndpointAdaptor-CIEhW1TQ.mjs.map +1 -0
- package/dist/{AmazonApiGatewayEndpointAdaptor-BnNd8tCz.d.cts → AmazonApiGatewayEndpointAdaptor-CwItKPz2.d.cts} +6 -5
- package/dist/{AmazonApiGatewayEndpointAdaptor-DHBF_5jn.cjs → AmazonApiGatewayEndpointAdaptor-H8YvtfQm.cjs} +47 -16
- package/dist/AmazonApiGatewayEndpointAdaptor-H8YvtfQm.cjs.map +1 -0
- package/dist/{AmazonApiGatewayEndpointAdaptor-B7MKo8h3.d.mts → AmazonApiGatewayEndpointAdaptor-eDQgPNLH.d.mts} +7 -6
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-CmUxFoPx.cjs → AmazonApiGatewayV1EndpointAdaptor-0n71d3gq.cjs} +3 -3
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-CmUxFoPx.cjs.map → AmazonApiGatewayV1EndpointAdaptor-0n71d3gq.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-CsV6zyvn.mjs → AmazonApiGatewayV1EndpointAdaptor-B36zXLJ7.mjs} +3 -3
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-CsV6zyvn.mjs.map → AmazonApiGatewayV1EndpointAdaptor-B36zXLJ7.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-gO9OxdZl.d.mts → AmazonApiGatewayV1EndpointAdaptor-CnGVpA38.d.mts} +4 -4
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-BC-a2tt3.d.cts → AmazonApiGatewayV1EndpointAdaptor-DaCvUL6y.d.cts} +3 -3
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-D1uz4wNg.d.mts → AmazonApiGatewayV2EndpointAdaptor-BELz2ijs.d.mts} +4 -4
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-_bFcbEa-.mjs → AmazonApiGatewayV2EndpointAdaptor-CE3wZEb8.mjs} +3 -3
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-_bFcbEa-.mjs.map → AmazonApiGatewayV2EndpointAdaptor-CE3wZEb8.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-zNFUPxSY.d.cts → AmazonApiGatewayV2EndpointAdaptor-DA1PH0nc.d.cts} +3 -3
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-cZbaqiUi.cjs → AmazonApiGatewayV2EndpointAdaptor-DtU3Cb8F.cjs} +3 -3
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-cZbaqiUi.cjs.map → AmazonApiGatewayV2EndpointAdaptor-DtU3Cb8F.cjs.map} +1 -1
- package/dist/{Authorizer-Bbk9ziuG.d.mts → Authorizer-BRCVPz_O.d.mts} +1 -1
- package/dist/{Authorizer-iXsSB600.d.cts → Authorizer-DG54w1m2.d.cts} +1 -1
- package/dist/{BaseFunctionBuilder-BmsbV0BU.cjs → BaseFunctionBuilder-B8rT07QR.cjs} +7 -2
- package/dist/BaseFunctionBuilder-B8rT07QR.cjs.map +1 -0
- package/dist/{BaseFunctionBuilder-DCUtCdVL.mjs → BaseFunctionBuilder-CT7p10K1.mjs} +7 -2
- package/dist/BaseFunctionBuilder-CT7p10K1.mjs.map +1 -0
- package/dist/{BaseFunctionBuilder-C4ZJPkIZ.d.cts → BaseFunctionBuilder-Cf0op65o.d.cts} +7 -4
- package/dist/{BaseFunctionBuilder-CxBX0arJ.d.mts → BaseFunctionBuilder-DilipY1y.d.mts} +7 -4
- package/dist/{Construct-VEI7M3fs.cjs → Construct-BYSPikVm.cjs} +28 -10
- package/dist/Construct-BYSPikVm.cjs.map +1 -0
- package/dist/{Construct-C3hsQBy4.mjs → Construct-LWeB1rSQ.mjs} +28 -10
- package/dist/Construct-LWeB1rSQ.mjs.map +1 -0
- package/dist/{Construct-ci5u8Xnu.d.cts → Construct-ZPqE0vhn.d.mts} +9 -4
- package/dist/{Construct-zhmcmIdY.d.mts → Construct-dI_rgdSp.d.cts} +9 -4
- 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-ByNYsQDH.d.mts → Cron-6lOgKqSA.d.cts} +3 -3
- package/dist/{Cron-DkPL-Fms.d.cts → Cron-BH_07atD.d.mts} +3 -3
- package/dist/{Cron-Dfgr8F9d.cjs → Cron-Bnd-2pgE.cjs} +3 -3
- package/dist/{Cron-Dfgr8F9d.cjs.map → Cron-Bnd-2pgE.cjs.map} +1 -1
- package/dist/{Cron-wP6Ob48_.mjs → Cron-DNRjf2cp.mjs} +3 -3
- package/dist/{Cron-wP6Ob48_.mjs.map → Cron-DNRjf2cp.mjs.map} +1 -1
- package/dist/{CronBuilder-BknVTWLE.d.mts → CronBuilder-5oK2AL2n.d.cts} +5 -5
- package/dist/{CronBuilder-BqTTozUi.d.cts → CronBuilder-D2b4zY4l.d.mts} +5 -5
- package/dist/{CronBuilder-C27c5oqh.mjs → CronBuilder-DdR2TuQa.mjs} +5 -5
- package/dist/{CronBuilder-C27c5oqh.mjs.map → CronBuilder-DdR2TuQa.mjs.map} +1 -1
- package/dist/{CronBuilder-W1ZqCJ7m.cjs → CronBuilder-dtw4ZyH6.cjs} +5 -5
- package/dist/{CronBuilder-W1ZqCJ7m.cjs.map → CronBuilder-dtw4ZyH6.cjs.map} +1 -1
- package/dist/{Endpoint-C98BwZjA.mjs → Endpoint-B69TqESg.mjs} +15 -8
- package/dist/Endpoint-B69TqESg.mjs.map +1 -0
- package/dist/{Endpoint-BjpQmTek.cjs → Endpoint-B9PryZES.cjs} +15 -8
- package/dist/Endpoint-B9PryZES.cjs.map +1 -0
- package/dist/{Endpoint-zHPjZ35J.d.cts → Endpoint-Cs-MsYlY.d.cts} +80 -12
- package/dist/{Endpoint-C16whGI-.d.mts → Endpoint-DuZlyjd4.d.mts} +80 -12
- package/dist/EndpointBuilder-BrB-K1jO.d.mts +86 -0
- package/dist/EndpointBuilder-C-PHInEW.d.cts +86 -0
- package/dist/{EndpointBuilder-CCUx4vep.mjs → EndpointBuilder-DnVL-EU_.mjs} +47 -5
- package/dist/EndpointBuilder-DnVL-EU_.mjs.map +1 -0
- package/dist/{EndpointBuilder-D2Zu8i9b.cjs → EndpointBuilder-DofwCnWJ.cjs} +47 -5
- package/dist/EndpointBuilder-DofwCnWJ.cjs.map +1 -0
- package/dist/{EndpointFactory-KkyIOE62.d.cts → EndpointFactory-6zNpVSYp.d.mts} +12 -11
- package/dist/{EndpointFactory-C4YhgXOc.cjs → EndpointFactory-Ba9mx9MU.cjs} +3 -3
- package/dist/{EndpointFactory-C4YhgXOc.cjs.map → EndpointFactory-Ba9mx9MU.cjs.map} +1 -1
- package/dist/{EndpointFactory-VnSAdwdv.d.mts → EndpointFactory-e5WYVR6t.d.cts} +12 -11
- package/dist/{EndpointFactory-RAb2zcw0.mjs → EndpointFactory-pPaIGFHV.mjs} +3 -3
- package/dist/{EndpointFactory-RAb2zcw0.mjs.map → EndpointFactory-pPaIGFHV.mjs.map} +1 -1
- package/dist/{Function-BbLYIKLL.d.cts → Function-6EWabl_X.d.cts} +5 -4
- package/dist/{Function-1Fh6Tdkg.cjs → Function-CO-s2pB8.cjs} +6 -6
- package/dist/Function-CO-s2pB8.cjs.map +1 -0
- package/dist/{Function-D-QEfH7k.mjs → Function-COnc-tWM.mjs} +6 -6
- package/dist/Function-COnc-tWM.mjs.map +1 -0
- package/dist/{Function-DFRZZCC-.d.mts → Function-G3JPHMaY.d.mts} +5 -4
- package/dist/{FunctionBuilder-DdGjpiFT.d.cts → FunctionBuilder-B3fpp3hA.d.cts} +13 -11
- package/dist/{FunctionBuilder-DuktGyZc.d.mts → FunctionBuilder-ByaB_LQ4.d.mts} +13 -11
- package/dist/{FunctionBuilder-Bxyr1Pf9.mjs → FunctionBuilder-CMhLQ4dt.mjs} +11 -6
- package/dist/FunctionBuilder-CMhLQ4dt.mjs.map +1 -0
- package/dist/{FunctionBuilder-DcEFYgbn.cjs → FunctionBuilder-_hMwZUof.cjs} +11 -6
- package/dist/FunctionBuilder-_hMwZUof.cjs.map +1 -0
- package/dist/{FunctionExecutionWrapper-CRYi047B.d.cts → FunctionExecutionWrapper-Ci-ookJG.d.cts} +2 -2
- package/dist/{FunctionExecutionWrapper-DaR-dSLw.d.mts → FunctionExecutionWrapper-DHFMLrOl.d.mts} +2 -2
- package/dist/{FunctionExecutionWrapper-BL6PE6Dv.mjs → FunctionExecutionWrapper-i9v5L3Av.mjs} +2 -2
- package/dist/{FunctionExecutionWrapper-BL6PE6Dv.mjs.map → FunctionExecutionWrapper-i9v5L3Av.mjs.map} +1 -1
- package/dist/{FunctionExecutionWrapper-Ee-CE8Fz.cjs → FunctionExecutionWrapper-sxJNTpuc.cjs} +2 -2
- package/dist/{FunctionExecutionWrapper-Ee-CE8Fz.cjs.map → FunctionExecutionWrapper-sxJNTpuc.cjs.map} +1 -1
- package/dist/{HonoEndpointAdaptor-CY1mXTe6.d.mts → HonoEndpointAdaptor-BElil8O5.d.mts} +9 -8
- package/dist/{HonoEndpointAdaptor-DcvZdYzx.cjs → HonoEndpointAdaptor-Cw2if5cG.cjs} +51 -20
- package/dist/HonoEndpointAdaptor-Cw2if5cG.cjs.map +1 -0
- package/dist/{HonoEndpointAdaptor-CyVPl4w2.mjs → HonoEndpointAdaptor-DAfnTFVS.mjs} +51 -20
- package/dist/HonoEndpointAdaptor-DAfnTFVS.mjs.map +1 -0
- package/dist/{HonoEndpointAdaptor-CYvrXBe-.d.cts → HonoEndpointAdaptor-DSHl8ZCY.d.cts} +8 -7
- package/dist/{Subscriber-Cy28j8MS.d.cts → Subscriber-BhzqUzs-.d.cts} +2 -2
- package/dist/{Subscriber-CTczVFsF.mjs → Subscriber-CGb8LjZa.mjs} +2 -2
- package/dist/{Subscriber-CTczVFsF.mjs.map → Subscriber-CGb8LjZa.mjs.map} +1 -1
- package/dist/{Subscriber-BL30GpWp.cjs → Subscriber-D-FPWts6.cjs} +2 -2
- package/dist/{Subscriber-BL30GpWp.cjs.map → Subscriber-D-FPWts6.cjs.map} +1 -1
- package/dist/{Subscriber-g3IWM1_d.d.mts → Subscriber-s6yfjeOc.d.mts} +2 -2
- package/dist/{SubscriberBuilder-BzK8kc2a.d.cts → SubscriberBuilder-BCVkp-ga.d.cts} +2 -2
- package/dist/{SubscriberBuilder-CekL3BoP.mjs → SubscriberBuilder-BcAspHv9.mjs} +2 -2
- package/dist/{SubscriberBuilder-CekL3BoP.mjs.map → SubscriberBuilder-BcAspHv9.mjs.map} +1 -1
- package/dist/{SubscriberBuilder-D1hojYLa.cjs → SubscriberBuilder-BfE2cL1q.cjs} +2 -2
- package/dist/{SubscriberBuilder-D1hojYLa.cjs.map → SubscriberBuilder-BfE2cL1q.cjs.map} +1 -1
- package/dist/{SubscriberBuilder-YjQ7qIpQ.d.mts → SubscriberBuilder-aCua5_wA.d.mts} +2 -2
- package/dist/{TestEndpointAdaptor-C-ahwGW6.cjs → TestEndpointAdaptor-Bn1WRFph.cjs} +47 -18
- package/dist/TestEndpointAdaptor-Bn1WRFph.cjs.map +1 -0
- package/dist/{TestEndpointAdaptor-DGWuai69.d.mts → TestEndpointAdaptor-DnlAA_rm.d.mts} +7 -6
- package/dist/{TestEndpointAdaptor-B4z9G5Ap.mjs → TestEndpointAdaptor-DubQOJk_.mjs} +47 -18
- package/dist/TestEndpointAdaptor-DubQOJk_.mjs.map +1 -0
- package/dist/{TestEndpointAdaptor-uXliWYjS.d.cts → TestEndpointAdaptor-o-xtSyQ3.d.cts} +6 -5
- package/dist/adaptors/aws.cjs +14 -13
- package/dist/adaptors/aws.d.cts +14 -14
- package/dist/adaptors/aws.d.mts +15 -15
- package/dist/adaptors/aws.mjs +14 -13
- package/dist/adaptors/hono.cjs +10 -9
- package/dist/adaptors/hono.d.cts +8 -8
- package/dist/adaptors/hono.d.mts +9 -9
- package/dist/adaptors/hono.mjs +10 -9
- package/dist/adaptors/testing.cjs +8 -7
- package/dist/adaptors/testing.d.cts +8 -8
- package/dist/adaptors/testing.d.mts +9 -9
- package/dist/adaptors/testing.mjs +8 -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 +8 -7
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +8 -8
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +9 -9
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +8 -7
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +10 -9
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +9 -9
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +10 -10
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +10 -9
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +10 -9
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +9 -9
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +10 -10
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +10 -9
- package/dist/endpoints/Authorizer.d.cts +1 -1
- package/dist/endpoints/Authorizer.d.mts +1 -1
- package/dist/endpoints/Endpoint.cjs +6 -6
- package/dist/endpoints/Endpoint.d.cts +7 -7
- package/dist/endpoints/Endpoint.d.mts +8 -8
- package/dist/endpoints/Endpoint.mjs +6 -6
- package/dist/endpoints/EndpointBuilder.cjs +7 -7
- package/dist/endpoints/EndpointBuilder.d.cts +8 -8
- package/dist/endpoints/EndpointBuilder.d.mts +9 -9
- package/dist/endpoints/EndpointBuilder.mjs +7 -7
- package/dist/endpoints/EndpointFactory.cjs +8 -8
- package/dist/endpoints/EndpointFactory.d.cts +9 -9
- package/dist/endpoints/EndpointFactory.d.mts +10 -10
- package/dist/endpoints/EndpointFactory.mjs +8 -8
- package/dist/endpoints/HonoEndpointAdaptor.cjs +10 -9
- package/dist/endpoints/HonoEndpointAdaptor.d.cts +8 -8
- package/dist/endpoints/HonoEndpointAdaptor.d.mts +9 -9
- package/dist/endpoints/HonoEndpointAdaptor.mjs +10 -9
- package/dist/endpoints/TestEndpointAdaptor.cjs +8 -7
- package/dist/endpoints/TestEndpointAdaptor.d.cts +8 -8
- package/dist/endpoints/TestEndpointAdaptor.d.mts +9 -9
- package/dist/endpoints/TestEndpointAdaptor.mjs +8 -7
- package/dist/endpoints/audit.cjs +0 -0
- package/dist/endpoints/audit.d.cts +9 -0
- package/dist/endpoints/audit.d.mts +9 -0
- package/dist/endpoints/audit.mjs +0 -0
- package/dist/endpoints/helpers.cjs +7 -7
- package/dist/endpoints/helpers.d.cts +7 -7
- package/dist/endpoints/helpers.d.mts +8 -8
- package/dist/endpoints/helpers.mjs +7 -7
- package/dist/endpoints/index.cjs +8 -8
- package/dist/endpoints/index.cjs.map +1 -1
- package/dist/endpoints/index.d.cts +12 -12
- package/dist/endpoints/index.d.mts +13 -13
- package/dist/endpoints/index.mjs +8 -8
- package/dist/endpoints/index.mjs.map +1 -1
- package/dist/endpoints/parseHonoQuery.cjs +1 -1
- package/dist/endpoints/parseHonoQuery.mjs +1 -1
- package/dist/endpoints/parseQueryParams.cjs +1 -1
- package/dist/endpoints/parseQueryParams.mjs +1 -1
- package/dist/endpoints/processAudits.cjs +5 -0
- package/dist/endpoints/processAudits.d.cts +74 -0
- package/dist/endpoints/processAudits.d.mts +74 -0
- package/dist/endpoints/processAudits.mjs +3 -0
- 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-BYqZAob8.mjs +8 -0
- package/dist/{functions-DD-00sWF.mjs.map → functions-BYqZAob8.mjs.map} +1 -1
- package/dist/{functions-BtgBiuC_.cjs → functions-D03lqK-r.cjs} +2 -2
- package/dist/{functions-BtgBiuC_.cjs.map → functions-D03lqK-r.cjs.map} +1 -1
- package/dist/{helpers-QM_FSjPY.cjs → helpers-BApRyhly.cjs} +2 -2
- package/dist/{helpers-QM_FSjPY.cjs.map → helpers-BApRyhly.cjs.map} +1 -1
- package/dist/{helpers-DtPeOhUV.mjs → helpers-BPDogwac.mjs} +2 -2
- package/dist/{helpers-DtPeOhUV.mjs.map → helpers-BPDogwac.mjs.map} +1 -1
- package/dist/index-CUg_hSq-.d.cts +9 -0
- package/dist/index-D-a7e2gv.d.mts +9 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +1 -1
- package/dist/{parseHonoQuery-DopC24vB.cjs → parseHonoQuery-CT8Cvin-.cjs} +1 -1
- package/dist/{parseHonoQuery-DopC24vB.cjs.map → parseHonoQuery-CT8Cvin-.cjs.map} +1 -1
- package/dist/{parseHonoQuery-znDKBhdE.mjs → parseHonoQuery-CwFKw2ua.mjs} +1 -1
- package/dist/{parseHonoQuery-znDKBhdE.mjs.map → parseHonoQuery-CwFKw2ua.mjs.map} +1 -1
- package/dist/{parseQueryParams-BJaRh3OB.mjs → parseQueryParams-CHINupbZ.mjs} +1 -1
- package/dist/{parseQueryParams-BJaRh3OB.mjs.map → parseQueryParams-CHINupbZ.mjs.map} +1 -1
- package/dist/{parseQueryParams-BzPop4I1.cjs → parseQueryParams-CwvXXwkW.cjs} +1 -1
- package/dist/{parseQueryParams-BzPop4I1.cjs.map → parseQueryParams-CwvXXwkW.cjs.map} +1 -1
- package/dist/processAudits-BFokHhCO.cjs +174 -0
- package/dist/processAudits-BFokHhCO.cjs.map +1 -0
- package/dist/processAudits-DfcB-X-4.mjs +156 -0
- package/dist/processAudits-DfcB-X-4.mjs.map +1 -0
- package/dist/publisher.d.cts +1 -1
- package/dist/publisher.d.mts +1 -1
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.cjs +1 -1
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.cts +3 -3
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +3 -3
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.mjs +1 -1
- 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 +5 -5
- package/dist/subscribers/index.d.mts +5 -5
- package/dist/subscribers/index.mjs +3 -3
- package/dist/{types-CVq20-fE.d.mts → types-DKf0juBf.d.mts} +1 -1
- package/dist/types.d.mts +1 -1
- package/package.json +14 -10
- package/src/Construct.ts +31 -5
- package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +88 -19
- package/src/endpoints/Endpoint.ts +66 -13
- package/src/endpoints/EndpointBuilder.ts +183 -19
- package/src/endpoints/HonoEndpointAdaptor.ts +114 -33
- package/src/endpoints/TestEndpointAdaptor.ts +96 -21
- package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.events.spec.ts +8 -0
- package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.spec.ts +29 -0
- package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.audits.spec.ts +626 -0
- package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.events.spec.ts +9 -0
- package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.kysely-audit.integration.spec.ts +718 -0
- package/src/endpoints/__tests__/Endpoint.spec.ts +19 -0
- package/src/endpoints/__tests__/EndpointBuilder.audit.spec.ts +424 -0
- package/src/endpoints/__tests__/HonoEndpointAdaptor.audit-transactions.spec.ts +685 -0
- package/src/endpoints/__tests__/HonoEndpointAdaptor.audits.spec.ts +632 -0
- package/src/endpoints/__tests__/HonoEndpointAdaptor.events.spec.ts +8 -0
- package/src/endpoints/__tests__/HonoEndpointAdaptor.kysely-audit.integration.spec.ts +678 -0
- package/src/endpoints/__tests__/HonoEndpointAdaptor.openapi.spec.ts +4 -0
- package/src/endpoints/__tests__/HonoEndpointAdaptor.spec.ts +25 -0
- package/src/endpoints/audit.ts +87 -0
- package/src/endpoints/index.ts +1 -0
- package/src/endpoints/processAudits.ts +339 -0
- package/src/functions/BaseFunctionBuilder.ts +50 -7
- package/src/functions/Function.ts +13 -9
- package/src/functions/FunctionBuilder.ts +78 -14
- package/src/functions/__tests__/FunctionBuilder.state-isolation.spec.ts +43 -2
- package/dist/AmazonApiGatewayEndpointAdaptor-DHBF_5jn.cjs.map +0 -1
- package/dist/AmazonApiGatewayEndpointAdaptor-DHcUetbw.mjs.map +0 -1
- package/dist/BaseFunctionBuilder-BmsbV0BU.cjs.map +0 -1
- package/dist/BaseFunctionBuilder-DCUtCdVL.mjs.map +0 -1
- package/dist/Construct-C3hsQBy4.mjs.map +0 -1
- package/dist/Construct-VEI7M3fs.cjs.map +0 -1
- package/dist/Endpoint-BjpQmTek.cjs.map +0 -1
- package/dist/Endpoint-C98BwZjA.mjs.map +0 -1
- package/dist/EndpointBuilder-B5l7zQU1.d.cts +0 -55
- package/dist/EndpointBuilder-BzqR0xvt.d.mts +0 -55
- package/dist/EndpointBuilder-CCUx4vep.mjs.map +0 -1
- package/dist/EndpointBuilder-D2Zu8i9b.cjs.map +0 -1
- package/dist/Function-1Fh6Tdkg.cjs.map +0 -1
- package/dist/Function-D-QEfH7k.mjs.map +0 -1
- package/dist/FunctionBuilder-Bxyr1Pf9.mjs.map +0 -1
- package/dist/FunctionBuilder-DcEFYgbn.cjs.map +0 -1
- package/dist/HonoEndpointAdaptor-CyVPl4w2.mjs.map +0 -1
- package/dist/HonoEndpointAdaptor-DcvZdYzx.cjs.map +0 -1
- package/dist/TestEndpointAdaptor-B4z9G5Ap.mjs.map +0 -1
- package/dist/TestEndpointAdaptor-C-ahwGW6.cjs.map +0 -1
- package/dist/functions-DD-00sWF.mjs +0 -8
- package/dist/index-CcmV3PKF.d.cts +0 -9
- package/dist/index-DQt3pQtF.d.mts +0 -9
|
@@ -1,15 +1,15 @@
|
|
|
1
|
+
import type { AuditStorage } from '@geekmidas/audit';
|
|
2
|
+
import type { EventPublisher, MappedEvent } from '@geekmidas/events';
|
|
1
3
|
import type { Logger } from '@geekmidas/logger';
|
|
2
4
|
import { ConsoleLogger } from '@geekmidas/logger/console';
|
|
3
|
-
import type { Service } from '@geekmidas/services';
|
|
4
|
-
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
5
|
-
import get from 'lodash.get';
|
|
6
|
-
import { ConstructType } from '../Construct';
|
|
7
|
-
|
|
8
|
-
import type { EventPublisher, MappedEvent } from '@geekmidas/events';
|
|
9
5
|
import type {
|
|
10
6
|
ComposableStandardSchema,
|
|
11
7
|
InferComposableStandardSchema,
|
|
12
8
|
} from '@geekmidas/schema';
|
|
9
|
+
import type { Service } from '@geekmidas/services';
|
|
10
|
+
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
11
|
+
import get from 'lodash.get';
|
|
12
|
+
import { ConstructType } from '../Construct';
|
|
13
13
|
|
|
14
14
|
const DEFAULT_LOGGER = new ConsoleLogger() as any;
|
|
15
15
|
|
|
@@ -20,6 +20,8 @@ export abstract class BaseFunctionBuilder<
|
|
|
20
20
|
TLogger extends Logger = Logger,
|
|
21
21
|
TEventPublisher extends EventPublisher<any> | undefined = undefined,
|
|
22
22
|
TEventPublisherServiceName extends string = string,
|
|
23
|
+
TAuditStorage extends AuditStorage | undefined = undefined,
|
|
24
|
+
TAuditStorageServiceName extends string = string,
|
|
23
25
|
> {
|
|
24
26
|
protected inputSchema?: TInput;
|
|
25
27
|
protected outputSchema?: OutSchema;
|
|
@@ -30,6 +32,7 @@ export abstract class BaseFunctionBuilder<
|
|
|
30
32
|
|
|
31
33
|
protected _events: MappedEvent<TEventPublisher, OutSchema>[] = [];
|
|
32
34
|
protected _publisher?: Service<TEventPublisherServiceName, TEventPublisher>;
|
|
35
|
+
protected _auditorStorage?: Service<TAuditStorageServiceName, TAuditStorage>;
|
|
33
36
|
|
|
34
37
|
static isStandardSchemaV1(s: unknown): s is StandardSchemaV1 {
|
|
35
38
|
const schema = (s as StandardSchemaV1)['~standard'];
|
|
@@ -92,7 +95,16 @@ export abstract class BaseFunctionBuilder<
|
|
|
92
95
|
|
|
93
96
|
publisher<T extends EventPublisher<any>, TName extends string>(
|
|
94
97
|
publisher: Service<TName, T>,
|
|
95
|
-
): BaseFunctionBuilder<
|
|
98
|
+
): BaseFunctionBuilder<
|
|
99
|
+
TInput,
|
|
100
|
+
OutSchema,
|
|
101
|
+
TServices,
|
|
102
|
+
TLogger,
|
|
103
|
+
T,
|
|
104
|
+
TName,
|
|
105
|
+
TAuditStorage,
|
|
106
|
+
TAuditStorageServiceName
|
|
107
|
+
> {
|
|
96
108
|
this._publisher = publisher as unknown as Service<
|
|
97
109
|
TEventPublisherServiceName,
|
|
98
110
|
TEventPublisher
|
|
@@ -104,6 +116,37 @@ export abstract class BaseFunctionBuilder<
|
|
|
104
116
|
TServices,
|
|
105
117
|
TLogger,
|
|
106
118
|
T,
|
|
119
|
+
TName,
|
|
120
|
+
TAuditStorage,
|
|
121
|
+
TAuditStorageServiceName
|
|
122
|
+
>;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
auditor<T extends AuditStorage, TName extends string>(
|
|
126
|
+
storage: Service<TName, T>,
|
|
127
|
+
): BaseFunctionBuilder<
|
|
128
|
+
TInput,
|
|
129
|
+
OutSchema,
|
|
130
|
+
TServices,
|
|
131
|
+
TLogger,
|
|
132
|
+
TEventPublisher,
|
|
133
|
+
TEventPublisherServiceName,
|
|
134
|
+
T,
|
|
135
|
+
TName
|
|
136
|
+
> {
|
|
137
|
+
this._auditorStorage = storage as unknown as Service<
|
|
138
|
+
TAuditStorageServiceName,
|
|
139
|
+
TAuditStorage
|
|
140
|
+
>;
|
|
141
|
+
|
|
142
|
+
return this as unknown as BaseFunctionBuilder<
|
|
143
|
+
TInput,
|
|
144
|
+
OutSchema,
|
|
145
|
+
TServices,
|
|
146
|
+
TLogger,
|
|
147
|
+
TEventPublisher,
|
|
148
|
+
TEventPublisherServiceName,
|
|
149
|
+
T,
|
|
107
150
|
TName
|
|
108
151
|
>;
|
|
109
152
|
}
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
import type { Service, ServiceRecord } from '@geekmidas/services';
|
|
5
|
-
import { Construct, ConstructType } from '../Construct';
|
|
6
|
-
|
|
1
|
+
import type { AuditStorage } from '@geekmidas/audit';
|
|
2
|
+
import { UnprocessableEntityError } from '@geekmidas/errors';
|
|
7
3
|
import type { EventPublisher, MappedEvent } from '@geekmidas/events';
|
|
8
4
|
import type { Logger } from '@geekmidas/logger';
|
|
9
5
|
import { ConsoleLogger } from '@geekmidas/logger/console';
|
|
@@ -12,9 +8,11 @@ import type {
|
|
|
12
8
|
InferComposableStandardSchema,
|
|
13
9
|
InferStandardSchema,
|
|
14
10
|
} from '@geekmidas/schema';
|
|
15
|
-
|
|
16
|
-
import { UnprocessableEntityError } from '@geekmidas/errors';
|
|
17
11
|
import { parseSchema } from '@geekmidas/schema/parser';
|
|
12
|
+
import type { Service, ServiceRecord } from '@geekmidas/services';
|
|
13
|
+
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
14
|
+
import uniqBy from 'lodash.uniqby';
|
|
15
|
+
import { Construct, ConstructType } from '../Construct';
|
|
18
16
|
|
|
19
17
|
const DEFAULT_LOGGER = new ConsoleLogger() as any;
|
|
20
18
|
|
|
@@ -62,12 +60,16 @@ export class Function<
|
|
|
62
60
|
> = FunctionHandler<TInput, TServices, TLogger, OutSchema>,
|
|
63
61
|
TEventPublisher extends EventPublisher<any> | undefined = undefined,
|
|
64
62
|
TEventPublisherServiceName extends string = string,
|
|
63
|
+
TAuditStorage extends AuditStorage | undefined = undefined,
|
|
64
|
+
TAuditStorageServiceName extends string = string,
|
|
65
65
|
> extends Construct<
|
|
66
66
|
TLogger,
|
|
67
67
|
TEventPublisherServiceName,
|
|
68
68
|
TEventPublisher,
|
|
69
69
|
OutSchema,
|
|
70
|
-
TServices
|
|
70
|
+
TServices,
|
|
71
|
+
TAuditStorageServiceName,
|
|
72
|
+
TAuditStorage
|
|
71
73
|
> {
|
|
72
74
|
__IS_FUNCTION__ = true;
|
|
73
75
|
|
|
@@ -134,6 +136,7 @@ export class Function<
|
|
|
134
136
|
publisherService?: Service<TEventPublisherServiceName, TEventPublisher>,
|
|
135
137
|
events: MappedEvent<TEventPublisher, OutSchema>[] = [],
|
|
136
138
|
memorySize?: number,
|
|
139
|
+
auditorStorageService?: Service<TAuditStorageServiceName, TAuditStorage>,
|
|
137
140
|
) {
|
|
138
141
|
super(
|
|
139
142
|
type,
|
|
@@ -144,6 +147,7 @@ export class Function<
|
|
|
144
147
|
outputSchema,
|
|
145
148
|
timeout,
|
|
146
149
|
memorySize,
|
|
150
|
+
auditorStorageService,
|
|
147
151
|
);
|
|
148
152
|
}
|
|
149
153
|
}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import type { AuditStorage } from '@geekmidas/audit';
|
|
2
|
+
import type { EventPublisher } from '@geekmidas/events';
|
|
1
3
|
import type { Logger } from '@geekmidas/logger';
|
|
2
4
|
import { ConsoleLogger } from '@geekmidas/logger/console';
|
|
5
|
+
import type { ComposableStandardSchema } from '@geekmidas/schema';
|
|
3
6
|
import type { Service } from '@geekmidas/services';
|
|
4
7
|
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
5
8
|
import uniqBy from 'lodash.uniqby';
|
|
@@ -7,9 +10,6 @@ import { ConstructType } from '../Construct';
|
|
|
7
10
|
import { BaseFunctionBuilder } from './BaseFunctionBuilder';
|
|
8
11
|
import { Function, type FunctionHandler } from './Function';
|
|
9
12
|
|
|
10
|
-
import type { EventPublisher } from '@geekmidas/events';
|
|
11
|
-
import type { ComposableStandardSchema } from '@geekmidas/schema';
|
|
12
|
-
|
|
13
13
|
const DEFAULT_LOGGER = new ConsoleLogger() as any;
|
|
14
14
|
|
|
15
15
|
export class FunctionBuilder<
|
|
@@ -19,13 +19,17 @@ export class FunctionBuilder<
|
|
|
19
19
|
TLogger extends Logger = Logger,
|
|
20
20
|
TEventPublisher extends EventPublisher<any> | undefined = undefined,
|
|
21
21
|
TEventPublisherServiceName extends string = string,
|
|
22
|
+
TAuditStorage extends AuditStorage | undefined = undefined,
|
|
23
|
+
TAuditStorageServiceName extends string = string,
|
|
22
24
|
> extends BaseFunctionBuilder<
|
|
23
25
|
TInput,
|
|
24
26
|
OutSchema,
|
|
25
27
|
TServices,
|
|
26
28
|
TLogger,
|
|
27
29
|
TEventPublisher,
|
|
28
|
-
TEventPublisherServiceName
|
|
30
|
+
TEventPublisherServiceName,
|
|
31
|
+
TAuditStorage,
|
|
32
|
+
TAuditStorageServiceName
|
|
29
33
|
> {
|
|
30
34
|
protected _memorySize?: number;
|
|
31
35
|
|
|
@@ -51,7 +55,9 @@ export class FunctionBuilder<
|
|
|
51
55
|
TServices,
|
|
52
56
|
TLogger,
|
|
53
57
|
TEventPublisher,
|
|
54
|
-
TEventPublisherServiceName
|
|
58
|
+
TEventPublisherServiceName,
|
|
59
|
+
TAuditStorage,
|
|
60
|
+
TAuditStorageServiceName
|
|
55
61
|
> {
|
|
56
62
|
this.outputSchema = schema as unknown as OutSchema;
|
|
57
63
|
|
|
@@ -61,7 +67,9 @@ export class FunctionBuilder<
|
|
|
61
67
|
TServices,
|
|
62
68
|
TLogger,
|
|
63
69
|
TEventPublisher,
|
|
64
|
-
TEventPublisherServiceName
|
|
70
|
+
TEventPublisherServiceName,
|
|
71
|
+
TAuditStorage,
|
|
72
|
+
TAuditStorageServiceName
|
|
65
73
|
>;
|
|
66
74
|
}
|
|
67
75
|
|
|
@@ -73,7 +81,9 @@ export class FunctionBuilder<
|
|
|
73
81
|
TServices,
|
|
74
82
|
TLogger,
|
|
75
83
|
TEventPublisher,
|
|
76
|
-
TEventPublisherServiceName
|
|
84
|
+
TEventPublisherServiceName,
|
|
85
|
+
TAuditStorage,
|
|
86
|
+
TAuditStorageServiceName
|
|
77
87
|
> {
|
|
78
88
|
this.inputSchema = schema as unknown as TInput;
|
|
79
89
|
|
|
@@ -83,7 +93,9 @@ export class FunctionBuilder<
|
|
|
83
93
|
TServices,
|
|
84
94
|
TLogger,
|
|
85
95
|
TEventPublisher,
|
|
86
|
-
TEventPublisherServiceName
|
|
96
|
+
TEventPublisherServiceName,
|
|
97
|
+
TAuditStorage,
|
|
98
|
+
TAuditStorageServiceName
|
|
87
99
|
>;
|
|
88
100
|
}
|
|
89
101
|
|
|
@@ -95,7 +107,9 @@ export class FunctionBuilder<
|
|
|
95
107
|
[...TServices, ...T],
|
|
96
108
|
TLogger,
|
|
97
109
|
TEventPublisher,
|
|
98
|
-
TEventPublisherServiceName
|
|
110
|
+
TEventPublisherServiceName,
|
|
111
|
+
TAuditStorage,
|
|
112
|
+
TAuditStorageServiceName
|
|
99
113
|
> {
|
|
100
114
|
this._services = uniqBy(
|
|
101
115
|
[...this._services, ...services],
|
|
@@ -108,7 +122,9 @@ export class FunctionBuilder<
|
|
|
108
122
|
[...TServices, ...T],
|
|
109
123
|
TLogger,
|
|
110
124
|
TEventPublisher,
|
|
111
|
-
TEventPublisherServiceName
|
|
125
|
+
TEventPublisherServiceName,
|
|
126
|
+
TAuditStorage,
|
|
127
|
+
TAuditStorageServiceName
|
|
112
128
|
>;
|
|
113
129
|
}
|
|
114
130
|
|
|
@@ -120,7 +136,9 @@ export class FunctionBuilder<
|
|
|
120
136
|
TServices,
|
|
121
137
|
T,
|
|
122
138
|
TEventPublisher,
|
|
123
|
-
TEventPublisherServiceName
|
|
139
|
+
TEventPublisherServiceName,
|
|
140
|
+
TAuditStorage,
|
|
141
|
+
TAuditStorageServiceName
|
|
124
142
|
> {
|
|
125
143
|
this._logger = logger as unknown as TLogger;
|
|
126
144
|
|
|
@@ -130,13 +148,24 @@ export class FunctionBuilder<
|
|
|
130
148
|
TServices,
|
|
131
149
|
T,
|
|
132
150
|
TEventPublisher,
|
|
133
|
-
TEventPublisherServiceName
|
|
151
|
+
TEventPublisherServiceName,
|
|
152
|
+
TAuditStorage,
|
|
153
|
+
TAuditStorageServiceName
|
|
134
154
|
>;
|
|
135
155
|
}
|
|
136
156
|
|
|
137
157
|
publisher<T extends EventPublisher<any>, TName extends string>(
|
|
138
158
|
publisher: Service<TName, T>,
|
|
139
|
-
): FunctionBuilder<
|
|
159
|
+
): FunctionBuilder<
|
|
160
|
+
TInput,
|
|
161
|
+
OutSchema,
|
|
162
|
+
TServices,
|
|
163
|
+
TLogger,
|
|
164
|
+
T,
|
|
165
|
+
TName,
|
|
166
|
+
TAuditStorage,
|
|
167
|
+
TAuditStorageServiceName
|
|
168
|
+
> {
|
|
140
169
|
this._publisher = publisher as unknown as Service<
|
|
141
170
|
TEventPublisherServiceName,
|
|
142
171
|
TEventPublisher
|
|
@@ -148,6 +177,37 @@ export class FunctionBuilder<
|
|
|
148
177
|
TServices,
|
|
149
178
|
TLogger,
|
|
150
179
|
T,
|
|
180
|
+
TName,
|
|
181
|
+
TAuditStorage,
|
|
182
|
+
TAuditStorageServiceName
|
|
183
|
+
>;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
auditor<T extends AuditStorage, TName extends string>(
|
|
187
|
+
storage: Service<TName, T>,
|
|
188
|
+
): FunctionBuilder<
|
|
189
|
+
TInput,
|
|
190
|
+
OutSchema,
|
|
191
|
+
TServices,
|
|
192
|
+
TLogger,
|
|
193
|
+
TEventPublisher,
|
|
194
|
+
TEventPublisherServiceName,
|
|
195
|
+
T,
|
|
196
|
+
TName
|
|
197
|
+
> {
|
|
198
|
+
this._auditorStorage = storage as unknown as Service<
|
|
199
|
+
TAuditStorageServiceName,
|
|
200
|
+
TAuditStorage
|
|
201
|
+
>;
|
|
202
|
+
|
|
203
|
+
return this as unknown as FunctionBuilder<
|
|
204
|
+
TInput,
|
|
205
|
+
OutSchema,
|
|
206
|
+
TServices,
|
|
207
|
+
TLogger,
|
|
208
|
+
TEventPublisher,
|
|
209
|
+
TEventPublisherServiceName,
|
|
210
|
+
T,
|
|
151
211
|
TName
|
|
152
212
|
>;
|
|
153
213
|
}
|
|
@@ -161,7 +221,9 @@ export class FunctionBuilder<
|
|
|
161
221
|
OutSchema,
|
|
162
222
|
FunctionHandler<TInput, TServices, TLogger, OutSchema>,
|
|
163
223
|
TEventPublisher,
|
|
164
|
-
TEventPublisherServiceName
|
|
224
|
+
TEventPublisherServiceName,
|
|
225
|
+
TAuditStorage,
|
|
226
|
+
TAuditStorageServiceName
|
|
165
227
|
> {
|
|
166
228
|
const func = new Function(
|
|
167
229
|
fn,
|
|
@@ -174,6 +236,7 @@ export class FunctionBuilder<
|
|
|
174
236
|
this._publisher,
|
|
175
237
|
this._events,
|
|
176
238
|
this._memorySize,
|
|
239
|
+
this._auditorStorage,
|
|
177
240
|
);
|
|
178
241
|
|
|
179
242
|
// Reset builder state after creating the function to prevent pollution
|
|
@@ -181,6 +244,7 @@ export class FunctionBuilder<
|
|
|
181
244
|
this._logger = DEFAULT_LOGGER;
|
|
182
245
|
this._events = [];
|
|
183
246
|
this._publisher = undefined;
|
|
247
|
+
this._auditorStorage = undefined;
|
|
184
248
|
this.inputSchema = undefined;
|
|
185
249
|
this.outputSchema = undefined;
|
|
186
250
|
this._timeout = undefined;
|
|
@@ -1,7 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { AuditRecord, AuditStorage } from '@geekmidas/audit';
|
|
2
2
|
import { ConsoleLogger } from '@geekmidas/logger/console';
|
|
3
|
-
import { FunctionBuilder } from '../FunctionBuilder';
|
|
4
3
|
import type { Service } from '@geekmidas/services';
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
|
+
import { FunctionBuilder } from '../FunctionBuilder';
|
|
6
|
+
|
|
7
|
+
// In-memory audit storage for testing
|
|
8
|
+
class InMemoryAuditStorage implements AuditStorage {
|
|
9
|
+
records: AuditRecord[] = [];
|
|
10
|
+
|
|
11
|
+
async write(records: AuditRecord[]): Promise<void> {
|
|
12
|
+
this.records.push(...records);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async query(): Promise<AuditRecord[]> {
|
|
16
|
+
return this.records;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
5
19
|
|
|
6
20
|
const ServiceA = {
|
|
7
21
|
serviceName: 'a' as const,
|
|
@@ -157,4 +171,31 @@ describe('FunctionBuilder - State Isolation', () => {
|
|
|
157
171
|
expect((fn2 as any).publisherService).toBeUndefined();
|
|
158
172
|
});
|
|
159
173
|
});
|
|
174
|
+
|
|
175
|
+
describe('auditor isolation', () => {
|
|
176
|
+
const auditStorageService = {
|
|
177
|
+
serviceName: 'auditStorage' as const,
|
|
178
|
+
async register() {
|
|
179
|
+
return new InMemoryAuditStorage();
|
|
180
|
+
},
|
|
181
|
+
} satisfies Service<'auditStorage', InMemoryAuditStorage>;
|
|
182
|
+
|
|
183
|
+
it('should set auditor storage service', () => {
|
|
184
|
+
const f = new FunctionBuilder();
|
|
185
|
+
|
|
186
|
+
const fn1 = f.auditor(auditStorageService).handle(async () => ({}));
|
|
187
|
+
|
|
188
|
+
expect((fn1 as any).auditorStorageService).toBe(auditStorageService);
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
it('should reset auditor storage after handle() is called', () => {
|
|
192
|
+
const f = new FunctionBuilder();
|
|
193
|
+
|
|
194
|
+
const fn1 = f.auditor(auditStorageService).handle(async () => ({}));
|
|
195
|
+
const fn2 = f.handle(async () => ({}));
|
|
196
|
+
|
|
197
|
+
expect((fn1 as any).auditorStorageService).toBe(auditStorageService);
|
|
198
|
+
expect((fn2 as any).auditorStorageService).toBeUndefined();
|
|
199
|
+
});
|
|
200
|
+
});
|
|
160
201
|
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AmazonApiGatewayEndpointAdaptor-DHBF_5jn.cjs","names":["envParser: EnvironmentParser<{}>","endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName\n >","UnprocessableEntityError","UnauthorizedError","event: Event<TEvent, TInput, TServices, TLogger, TSession>","ResponseBuilder","lambdaResponse: AmazonApiGatewayEndpointHandlerResponse","setCookieHeaders: string[]"],"sources":["../src/endpoints/AmazonApiGatewayEndpointAdaptor.ts"],"sourcesContent":["import type { Logger } from '@geekmidas/logger';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { HttpMethod } from '../types';\nimport { Endpoint, type EndpointSchemas, ResponseBuilder } from './Endpoint';\n\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyEventV2,\n Context,\n} from 'aws-lambda';\nimport set from 'lodash.set';\n\nimport {\n UnauthorizedError,\n UnprocessableEntityError,\n wrapError,\n} from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport {\n type Service,\n ServiceDiscovery,\n type ServiceRecord,\n} from '@geekmidas/services';\n\nimport type {\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport { publishConstructEvents } from '../publisher';\n\n// Helper function to publish events\n\nexport abstract class AmazonApiGatewayEndpoint<\n THandler extends\n | AmazonApiGatewayV1EndpointHandler\n | AmazonApiGatewayV2EndpointHandler,\n TEvent extends HandlerEvent<THandler>,\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema 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> {\n constructor(\n protected envParser: EnvironmentParser<{}>,\n protected readonly endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName\n >,\n ) {}\n\n private error(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n onError: (req) => {\n (req.event.logger || this.endpoint.logger).error(\n req.error || {},\n 'Error processing request',\n );\n const wrappedError = wrapError(req.error);\n\n // Set the response with the proper status code from the HttpError\n req.response = {\n statusCode: wrappedError.statusCode,\n body: wrappedError.body,\n };\n },\n };\n }\n abstract getInput(e: TEvent): GetInputResponse;\n\n private input(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n try {\n const { body, query, params } = this.getInput(req.event);\n const headers = req.event.headers as Record<string, string>;\n const header = Endpoint.createHeaders(headers);\n const cookie = Endpoint.createCookies(headers.cookie);\n\n set(req.event, 'body', await this.endpoint.parseInput(body, 'body'));\n\n set(\n req.event,\n 'query',\n await this.endpoint.parseInput(query, 'query'),\n );\n set(\n req.event,\n 'params',\n await this.endpoint.parseInput(params, 'params'),\n );\n set(req.event, 'header', header);\n set(req.event, 'cookie', cookie);\n } catch (error) {\n // Convert validation errors to 422 Unprocessable Entity\n if (error && typeof error === 'object' && Array.isArray(error)) {\n throw new UnprocessableEntityError('Validation failed', error);\n }\n throw error;\n }\n },\n };\n }\n\n abstract getLoggerContext(data: TEvent, context: Context): LoggerContext;\n\n private logger(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: (req) => {\n req.event.logger = this.endpoint.logger.child({\n route: this.endpoint.route,\n host: req.event.headers?.host,\n method: this.endpoint.method,\n ...this.getLoggerContext(req.event, req.context),\n }) as TLogger;\n },\n };\n }\n private services(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n const logger = req.event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n const services = await serviceDiscovery.register(\n this.endpoint.services,\n );\n\n req.event.services = services;\n },\n };\n }\n\n private authorize(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n const logger = req.event.logger as TLogger;\n const services = req.event.services;\n const header = req.event.header;\n const cookie = req.event.cookie;\n const session = req.event.session as TSession;\n\n const isAuthorized = await this.endpoint.authorize({\n header,\n cookie,\n services,\n logger,\n session,\n });\n\n if (!isAuthorized) {\n logger.warn('Unauthorized access attempt');\n throw new UnauthorizedError(\n 'Unauthorized access to the endpoint',\n 'You do not have permission to access this resource.',\n );\n }\n },\n };\n }\n\n private session(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n const logger = req.event.logger as TLogger;\n const services = req.event.services;\n req.event.session = (await this.endpoint.getSession({\n logger,\n services,\n header: req.event.header,\n cookie: req.event.cookie,\n })) as TSession;\n },\n };\n }\n\n private events(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n after: async (req) => {\n const event = req.event;\n const response = (event as any)\n .__response as InferStandardSchema<TOutSchema>;\n const statusCode = req.response?.statusCode ?? this.endpoint.status;\n\n // Only publish events on successful responses (2xx status codes)\n if (Endpoint.isSuccessStatus(statusCode)) {\n const logger = event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n await publishConstructEvents(\n this.endpoint,\n response,\n serviceDiscovery,\n logger,\n );\n }\n },\n };\n }\n\n private async _handler(\n event: Event<TEvent, TInput, TServices, TLogger, TSession>,\n ) {\n const input = this.endpoint.refineInput(event);\n\n const responseBuilder = new ResponseBuilder();\n const response = await this.endpoint.handler(\n {\n header: event.header,\n cookie: event.cookie,\n logger: event.logger,\n services: event.services,\n session: event.session,\n ...input,\n },\n responseBuilder,\n );\n\n // Check if response has metadata\n let data = response;\n let metadata = responseBuilder.getMetadata();\n\n if (Endpoint.hasMetadata(response)) {\n data = response.data;\n metadata = response.metadata;\n }\n\n const output = this.endpoint.outputSchema\n ? await this.endpoint.parseOutput(data)\n : undefined;\n\n const body = output !== undefined ? JSON.stringify(output) : undefined;\n\n // Store response for middleware access\n (event as any).__response = output;\n\n // Build response with metadata\n const lambdaResponse: AmazonApiGatewayEndpointHandlerResponse = {\n statusCode: metadata.status ?? this.endpoint.status,\n body,\n };\n\n // Add custom headers\n if (metadata.headers && Object.keys(metadata.headers).length > 0) {\n lambdaResponse.headers = { ...metadata.headers };\n }\n\n // Format cookies as Set-Cookie headers\n if (metadata.cookies && metadata.cookies.size > 0) {\n const setCookieHeaders: string[] = [];\n for (const [name, { value, options }] of metadata.cookies) {\n setCookieHeaders.push(\n Endpoint.formatCookieHeader(name, value, options),\n );\n }\n\n if (setCookieHeaders.length > 0) {\n lambdaResponse.multiValueHeaders = {\n ...lambdaResponse.multiValueHeaders,\n 'Set-Cookie': setCookieHeaders,\n };\n }\n }\n\n return lambdaResponse;\n }\n\n get handler() {\n const handler = this._handler.bind(this);\n return middy(handler)\n .use(this.logger())\n .use(this.error())\n .use(this.services())\n .use(this.input())\n .use(this.session())\n .use(this.authorize())\n .use(this.events()) as unknown as THandler;\n }\n}\n\nexport type Event<\n TEvent extends APIGatewayProxyEvent | APIGatewayProxyEventV2,\n TInput extends EndpointSchemas = {},\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = {\n services: ServiceRecord<TServices>;\n logger: TLogger;\n header(key: string): string | undefined;\n cookie(name: string): string | undefined;\n session: TSession;\n} & TEvent &\n InferComposableStandardSchema<TInput>;\n\ntype Middleware<\n TEvent extends APIGatewayProxyEvent | APIGatewayProxyEventV2,\n TInput extends EndpointSchemas = {},\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = MiddlewareObj<Event<TEvent, TInput, TServices, TLogger, TSession>>;\n\nexport type AmazonApiGatewayEndpointHandlerResponse = {\n statusCode: number;\n body: string | undefined;\n headers?: Record<string, string>;\n multiValueHeaders?: Record<string, string[]>;\n};\n\nexport type LoggerContext = {\n fn: {\n name: string;\n version: string;\n };\n req: {\n id: string | undefined;\n awsRequestId: string;\n path: string;\n ip: string | undefined;\n userAgent: string | undefined;\n };\n};\n\nexport type GetInputResponse = {\n body: any;\n query: any;\n params: any;\n};\n\nexport type AmazonApiGatewayV1EndpointHandler = (\n event: APIGatewayProxyEvent,\n context: Context,\n) => Promise<AmazonApiGatewayEndpointHandlerResponse>;\n\nexport type AmazonApiGatewayV2EndpointHandler = (\n event: APIGatewayProxyEventV2,\n context: Context,\n) => Promise<AmazonApiGatewayEndpointHandlerResponse>;\n\nexport type HandlerEvent<T extends Function> = T extends (\n event: infer E,\n context: Context,\n) => any\n ? E\n : never;\n"],"mappings":";;;;;;;;;AAkCA,IAAsB,2BAAtB,MAcE;CACA,YACYA,WACSC,UAWnB;EAZU;EACS;CAWjB;CAEJ,AAAQ,QAAwD;AAC9D,SAAO,EACL,SAAS,CAAC,QAAQ;AAChB,IAAC,IAAI,MAAM,UAAU,KAAK,SAAS,QAAQ,MACzC,IAAI,SAAS,CAAE,GACf,2BACD;GACD,MAAM,eAAe,kCAAU,IAAI,MAAM;AAGzC,OAAI,WAAW;IACb,YAAY,aAAa;IACzB,MAAM,aAAa;GACpB;EACF,EACF;CACF;CAGD,AAAQ,QAAwD;AAC9D,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI;IACF,MAAM,EAAE,MAAM,OAAO,QAAQ,GAAG,KAAK,SAAS,IAAI,MAAM;IACxD,MAAM,UAAU,IAAI,MAAM;IAC1B,MAAM,SAAS,0BAAS,cAAc,QAAQ;IAC9C,MAAM,SAAS,0BAAS,cAAc,QAAQ,OAAO;AAErD,4BAAI,IAAI,OAAO,QAAQ,MAAM,KAAK,SAAS,WAAW,MAAM,OAAO,CAAC;AAEpE,4BACE,IAAI,OACJ,SACA,MAAM,KAAK,SAAS,WAAW,OAAO,QAAQ,CAC/C;AACD,4BACE,IAAI,OACJ,UACA,MAAM,KAAK,SAAS,WAAW,QAAQ,SAAS,CACjD;AACD,4BAAI,IAAI,OAAO,UAAU,OAAO;AAChC,4BAAI,IAAI,OAAO,UAAU,OAAO;GACjC,SAAQ,OAAO;AAEd,QAAI,gBAAgB,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC5D,OAAM,IAAIC,4CAAyB,qBAAqB;AAE1D,UAAM;GACP;EACF,EACF;CACF;CAID,AAAQ,SAAyD;AAC/D,SAAO,EACL,QAAQ,CAAC,QAAQ;AACf,OAAI,MAAM,SAAS,KAAK,SAAS,OAAO,MAAM;IAC5C,OAAO,KAAK,SAAS;IACrB,MAAM,IAAI,MAAM,SAAS;IACzB,QAAQ,KAAK,SAAS;IACtB,GAAG,KAAK,iBAAiB,IAAI,OAAO,IAAI,QAAQ;GACjD,EAAC;EACH,EACF;CACF;CACD,AAAQ,WAA2D;AACjE,SAAO,EACL,QAAQ,OAAO,QAAQ;GACrB,MAAM,SAAS,IAAI,MAAM;GACzB,MAAM,mBAAmB,sCAAiB,YAGxC,QAAQ,KAAK,UAAU;GAEzB,MAAM,WAAW,MAAM,iBAAiB,SACtC,KAAK,SAAS,SACf;AAED,OAAI,MAAM,WAAW;EACtB,EACF;CACF;CAED,AAAQ,YAA4D;AAClE,SAAO,EACL,QAAQ,OAAO,QAAQ;GACrB,MAAM,SAAS,IAAI,MAAM;GACzB,MAAM,WAAW,IAAI,MAAM;GAC3B,MAAM,SAAS,IAAI,MAAM;GACzB,MAAM,SAAS,IAAI,MAAM;GACzB,MAAM,UAAU,IAAI,MAAM;GAE1B,MAAM,eAAe,MAAM,KAAK,SAAS,UAAU;IACjD;IACA;IACA;IACA;IACA;GACD,EAAC;AAEF,QAAK,cAAc;AACjB,WAAO,KAAK,8BAA8B;AAC1C,UAAM,IAAIC,qCACR,uCACA;GAEH;EACF,EACF;CACF;CAED,AAAQ,UAA0D;AAChE,SAAO,EACL,QAAQ,OAAO,QAAQ;GACrB,MAAM,SAAS,IAAI,MAAM;GACzB,MAAM,WAAW,IAAI,MAAM;AAC3B,OAAI,MAAM,UAAW,MAAM,KAAK,SAAS,WAAW;IAClD;IACA;IACA,QAAQ,IAAI,MAAM;IAClB,QAAQ,IAAI,MAAM;GACnB,EAAC;EACH,EACF;CACF;CAED,AAAQ,SAAyD;AAC/D,SAAO,EACL,OAAO,OAAO,QAAQ;GACpB,MAAM,QAAQ,IAAI;GAClB,MAAM,WAAY,MACf;GACH,MAAM,aAAa,IAAI,UAAU,cAAc,KAAK,SAAS;AAG7D,OAAI,0BAAS,gBAAgB,WAAW,EAAE;IACxC,MAAM,SAAS,MAAM;IACrB,MAAM,mBAAmB,sCAAiB,YAGxC,QAAQ,KAAK,UAAU;AACzB,UAAM,yCACJ,KAAK,UACL,UACA,kBACA,OACD;GACF;EACF,EACF;CACF;CAED,MAAc,SACZC,OACA;EACA,MAAM,QAAQ,KAAK,SAAS,YAAY,MAAM;EAE9C,MAAM,kBAAkB,IAAIC;EAC5B,MAAM,WAAW,MAAM,KAAK,SAAS,QACnC;GACE,QAAQ,MAAM;GACd,QAAQ,MAAM;GACd,QAAQ,MAAM;GACd,UAAU,MAAM;GAChB,SAAS,MAAM;GACf,GAAG;EACJ,GACD,gBACD;EAGD,IAAI,OAAO;EACX,IAAI,WAAW,gBAAgB,aAAa;AAE5C,MAAI,0BAAS,YAAY,SAAS,EAAE;AAClC,UAAO,SAAS;AAChB,cAAW,SAAS;EACrB;EAED,MAAM,SAAS,KAAK,SAAS,eACzB,MAAM,KAAK,SAAS,YAAY,KAAK;EAGzC,MAAM,OAAO,oBAAuB,KAAK,UAAU,OAAO;AAG1D,EAAC,MAAc,aAAa;EAG5B,MAAMC,iBAA0D;GAC9D,YAAY,SAAS,UAAU,KAAK,SAAS;GAC7C;EACD;AAGD,MAAI,SAAS,WAAW,OAAO,KAAK,SAAS,QAAQ,CAAC,SAAS,EAC7D,gBAAe,UAAU,EAAE,GAAG,SAAS,QAAS;AAIlD,MAAI,SAAS,WAAW,SAAS,QAAQ,OAAO,GAAG;GACjD,MAAMC,mBAA6B,CAAE;AACrC,QAAK,MAAM,CAAC,MAAM,EAAE,OAAO,SAAS,CAAC,IAAI,SAAS,QAChD,kBAAiB,KACf,0BAAS,mBAAmB,MAAM,OAAO,QAAQ,CAClD;AAGH,OAAI,iBAAiB,SAAS,EAC5B,gBAAe,oBAAoB;IACjC,GAAG,eAAe;IAClB,cAAc;GACf;EAEJ;AAED,SAAO;CACR;CAED,IAAI,UAAU;EACZ,MAAM,UAAU,KAAK,SAAS,KAAK,KAAK;AACxC,SAAO,0BAAM,QAAQ,CAClB,IAAI,KAAK,QAAQ,CAAC,CAClB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,SAAS,CAAC,CACnB,IAAI,KAAK,WAAW,CAAC,CACrB,IAAI,KAAK,QAAQ,CAAC;CACtB;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AmazonApiGatewayEndpointAdaptor-DHcUetbw.mjs","names":["envParser: EnvironmentParser<{}>","endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName\n >","event: Event<TEvent, TInput, TServices, TLogger, TSession>","lambdaResponse: AmazonApiGatewayEndpointHandlerResponse","setCookieHeaders: string[]"],"sources":["../src/endpoints/AmazonApiGatewayEndpointAdaptor.ts"],"sourcesContent":["import type { Logger } from '@geekmidas/logger';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { HttpMethod } from '../types';\nimport { Endpoint, type EndpointSchemas, ResponseBuilder } from './Endpoint';\n\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyEventV2,\n Context,\n} from 'aws-lambda';\nimport set from 'lodash.set';\n\nimport {\n UnauthorizedError,\n UnprocessableEntityError,\n wrapError,\n} from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport {\n type Service,\n ServiceDiscovery,\n type ServiceRecord,\n} from '@geekmidas/services';\n\nimport type {\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport { publishConstructEvents } from '../publisher';\n\n// Helper function to publish events\n\nexport abstract class AmazonApiGatewayEndpoint<\n THandler extends\n | AmazonApiGatewayV1EndpointHandler\n | AmazonApiGatewayV2EndpointHandler,\n TEvent extends HandlerEvent<THandler>,\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema 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> {\n constructor(\n protected envParser: EnvironmentParser<{}>,\n protected readonly endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName\n >,\n ) {}\n\n private error(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n onError: (req) => {\n (req.event.logger || this.endpoint.logger).error(\n req.error || {},\n 'Error processing request',\n );\n const wrappedError = wrapError(req.error);\n\n // Set the response with the proper status code from the HttpError\n req.response = {\n statusCode: wrappedError.statusCode,\n body: wrappedError.body,\n };\n },\n };\n }\n abstract getInput(e: TEvent): GetInputResponse;\n\n private input(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n try {\n const { body, query, params } = this.getInput(req.event);\n const headers = req.event.headers as Record<string, string>;\n const header = Endpoint.createHeaders(headers);\n const cookie = Endpoint.createCookies(headers.cookie);\n\n set(req.event, 'body', await this.endpoint.parseInput(body, 'body'));\n\n set(\n req.event,\n 'query',\n await this.endpoint.parseInput(query, 'query'),\n );\n set(\n req.event,\n 'params',\n await this.endpoint.parseInput(params, 'params'),\n );\n set(req.event, 'header', header);\n set(req.event, 'cookie', cookie);\n } catch (error) {\n // Convert validation errors to 422 Unprocessable Entity\n if (error && typeof error === 'object' && Array.isArray(error)) {\n throw new UnprocessableEntityError('Validation failed', error);\n }\n throw error;\n }\n },\n };\n }\n\n abstract getLoggerContext(data: TEvent, context: Context): LoggerContext;\n\n private logger(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: (req) => {\n req.event.logger = this.endpoint.logger.child({\n route: this.endpoint.route,\n host: req.event.headers?.host,\n method: this.endpoint.method,\n ...this.getLoggerContext(req.event, req.context),\n }) as TLogger;\n },\n };\n }\n private services(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n const logger = req.event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n const services = await serviceDiscovery.register(\n this.endpoint.services,\n );\n\n req.event.services = services;\n },\n };\n }\n\n private authorize(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n const logger = req.event.logger as TLogger;\n const services = req.event.services;\n const header = req.event.header;\n const cookie = req.event.cookie;\n const session = req.event.session as TSession;\n\n const isAuthorized = await this.endpoint.authorize({\n header,\n cookie,\n services,\n logger,\n session,\n });\n\n if (!isAuthorized) {\n logger.warn('Unauthorized access attempt');\n throw new UnauthorizedError(\n 'Unauthorized access to the endpoint',\n 'You do not have permission to access this resource.',\n );\n }\n },\n };\n }\n\n private session(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n const logger = req.event.logger as TLogger;\n const services = req.event.services;\n req.event.session = (await this.endpoint.getSession({\n logger,\n services,\n header: req.event.header,\n cookie: req.event.cookie,\n })) as TSession;\n },\n };\n }\n\n private events(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n after: async (req) => {\n const event = req.event;\n const response = (event as any)\n .__response as InferStandardSchema<TOutSchema>;\n const statusCode = req.response?.statusCode ?? this.endpoint.status;\n\n // Only publish events on successful responses (2xx status codes)\n if (Endpoint.isSuccessStatus(statusCode)) {\n const logger = event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n await publishConstructEvents(\n this.endpoint,\n response,\n serviceDiscovery,\n logger,\n );\n }\n },\n };\n }\n\n private async _handler(\n event: Event<TEvent, TInput, TServices, TLogger, TSession>,\n ) {\n const input = this.endpoint.refineInput(event);\n\n const responseBuilder = new ResponseBuilder();\n const response = await this.endpoint.handler(\n {\n header: event.header,\n cookie: event.cookie,\n logger: event.logger,\n services: event.services,\n session: event.session,\n ...input,\n },\n responseBuilder,\n );\n\n // Check if response has metadata\n let data = response;\n let metadata = responseBuilder.getMetadata();\n\n if (Endpoint.hasMetadata(response)) {\n data = response.data;\n metadata = response.metadata;\n }\n\n const output = this.endpoint.outputSchema\n ? await this.endpoint.parseOutput(data)\n : undefined;\n\n const body = output !== undefined ? JSON.stringify(output) : undefined;\n\n // Store response for middleware access\n (event as any).__response = output;\n\n // Build response with metadata\n const lambdaResponse: AmazonApiGatewayEndpointHandlerResponse = {\n statusCode: metadata.status ?? this.endpoint.status,\n body,\n };\n\n // Add custom headers\n if (metadata.headers && Object.keys(metadata.headers).length > 0) {\n lambdaResponse.headers = { ...metadata.headers };\n }\n\n // Format cookies as Set-Cookie headers\n if (metadata.cookies && metadata.cookies.size > 0) {\n const setCookieHeaders: string[] = [];\n for (const [name, { value, options }] of metadata.cookies) {\n setCookieHeaders.push(\n Endpoint.formatCookieHeader(name, value, options),\n );\n }\n\n if (setCookieHeaders.length > 0) {\n lambdaResponse.multiValueHeaders = {\n ...lambdaResponse.multiValueHeaders,\n 'Set-Cookie': setCookieHeaders,\n };\n }\n }\n\n return lambdaResponse;\n }\n\n get handler() {\n const handler = this._handler.bind(this);\n return middy(handler)\n .use(this.logger())\n .use(this.error())\n .use(this.services())\n .use(this.input())\n .use(this.session())\n .use(this.authorize())\n .use(this.events()) as unknown as THandler;\n }\n}\n\nexport type Event<\n TEvent extends APIGatewayProxyEvent | APIGatewayProxyEventV2,\n TInput extends EndpointSchemas = {},\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = {\n services: ServiceRecord<TServices>;\n logger: TLogger;\n header(key: string): string | undefined;\n cookie(name: string): string | undefined;\n session: TSession;\n} & TEvent &\n InferComposableStandardSchema<TInput>;\n\ntype Middleware<\n TEvent extends APIGatewayProxyEvent | APIGatewayProxyEventV2,\n TInput extends EndpointSchemas = {},\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = MiddlewareObj<Event<TEvent, TInput, TServices, TLogger, TSession>>;\n\nexport type AmazonApiGatewayEndpointHandlerResponse = {\n statusCode: number;\n body: string | undefined;\n headers?: Record<string, string>;\n multiValueHeaders?: Record<string, string[]>;\n};\n\nexport type LoggerContext = {\n fn: {\n name: string;\n version: string;\n };\n req: {\n id: string | undefined;\n awsRequestId: string;\n path: string;\n ip: string | undefined;\n userAgent: string | undefined;\n };\n};\n\nexport type GetInputResponse = {\n body: any;\n query: any;\n params: any;\n};\n\nexport type AmazonApiGatewayV1EndpointHandler = (\n event: APIGatewayProxyEvent,\n context: Context,\n) => Promise<AmazonApiGatewayEndpointHandlerResponse>;\n\nexport type AmazonApiGatewayV2EndpointHandler = (\n event: APIGatewayProxyEventV2,\n context: Context,\n) => Promise<AmazonApiGatewayEndpointHandlerResponse>;\n\nexport type HandlerEvent<T extends Function> = T extends (\n event: infer E,\n context: Context,\n) => any\n ? E\n : never;\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BaseFunctionBuilder-BmsbV0BU.cjs","names":["ConsoleLogger","s: unknown","data: unknown","schema: T","result: any","ConstructType","timeout: number","event: TEvent","publisher: Service<TName, T>"],"sources":["../src/functions/BaseFunctionBuilder.ts"],"sourcesContent":["import type { Logger } from '@geekmidas/logger';\nimport { ConsoleLogger } from '@geekmidas/logger/console';\nimport type { Service } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport get from 'lodash.get';\nimport { ConstructType } from '../Construct';\n\nimport type { EventPublisher, MappedEvent } from '@geekmidas/events';\nimport type {\n ComposableStandardSchema,\n InferComposableStandardSchema,\n} from '@geekmidas/schema';\n\nconst DEFAULT_LOGGER = new ConsoleLogger() as any;\n\nexport abstract class BaseFunctionBuilder<\n TInput extends ComposableStandardSchema,\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n> {\n protected inputSchema?: TInput;\n protected outputSchema?: OutSchema;\n protected _timeout?: number;\n\n public _services: TServices = [] as Service[] as TServices;\n public _logger: TLogger = DEFAULT_LOGGER;\n\n protected _events: MappedEvent<TEventPublisher, OutSchema>[] = [];\n protected _publisher?: Service<TEventPublisherServiceName, TEventPublisher>;\n\n static isStandardSchemaV1(s: unknown): s is StandardSchemaV1 {\n const schema = (s as StandardSchemaV1)['~standard'];\n\n return schema && typeof schema.validate === 'function';\n }\n\n static async parseComposableStandardSchema<\n T extends ComposableStandardSchema | undefined,\n >(data: unknown, schema: T): Promise<InferComposableStandardSchema<T>> {\n if (BaseFunctionBuilder.isStandardSchemaV1(schema)) {\n const validated = await schema['~standard'].validate(data);\n\n if (validated.issues) {\n throw validated.issues;\n }\n\n return validated.value as InferComposableStandardSchema<T>;\n }\n\n const result: any = {};\n for (const key in schema) {\n const item = schema[key];\n if (BaseFunctionBuilder.isStandardSchemaV1(item)) {\n const value = get(data, key);\n const validated = await item['~standard'].validate(value);\n\n if (validated.issues) {\n throw validated.issues;\n }\n\n result[key] = validated.value;\n }\n }\n\n return result as InferComposableStandardSchema<T>;\n }\n\n constructor(public type = ConstructType.Function) {}\n\n abstract services<T extends Service[]>(services: T): any;\n\n abstract logger<T extends Logger>(logger: T): any;\n\n timeout(timeout: number): this {\n this._timeout = timeout;\n return this;\n }\n\n abstract output<T extends StandardSchemaV1>(schema: T): any;\n\n abstract input<T extends ComposableStandardSchema>(schema: T): any;\n\n event<TEvent extends MappedEvent<TEventPublisher, OutSchema>>(\n event: TEvent,\n ): this {\n this._events.push(event);\n return this;\n }\n\n publisher<T extends EventPublisher<any>, TName extends string>(\n publisher: Service<TName, T>,\n ): BaseFunctionBuilder<TInput, OutSchema, TServices, TLogger, T, TName> {\n this._publisher = publisher as unknown as Service<\n TEventPublisherServiceName,\n TEventPublisher\n >;\n\n return this as unknown as BaseFunctionBuilder<\n TInput,\n OutSchema,\n TServices,\n TLogger,\n T,\n TName\n >;\n }\n}\n"],"mappings":";;;;;;AAaA,MAAM,iBAAiB,IAAIA;AAE3B,IAAsB,sBAAtB,MAAsB,oBAOpB;CACA,AAAU;CACV,AAAU;CACV,AAAU;CAEV,AAAO,YAAuB,CAAE;CAChC,AAAO,UAAmB;CAE1B,AAAU,UAAqD,CAAE;CACjE,AAAU;CAEV,OAAO,mBAAmBC,GAAmC;EAC3D,MAAM,SAAU,EAAuB;AAEvC,SAAO,iBAAiB,OAAO,aAAa;CAC7C;CAED,aAAa,8BAEXC,MAAeC,QAAsD;AACrE,MAAI,oBAAoB,mBAAmB,OAAO,EAAE;GAClD,MAAM,YAAY,MAAM,OAAO,aAAa,SAAS,KAAK;AAE1D,OAAI,UAAU,OACZ,OAAM,UAAU;AAGlB,UAAO,UAAU;EAClB;EAED,MAAMC,SAAc,CAAE;AACtB,OAAK,MAAM,OAAO,QAAQ;GACxB,MAAM,OAAO,OAAO;AACpB,OAAI,oBAAoB,mBAAmB,KAAK,EAAE;IAChD,MAAM,QAAQ,wBAAI,MAAM,IAAI;IAC5B,MAAM,YAAY,MAAM,KAAK,aAAa,SAAS,MAAM;AAEzD,QAAI,UAAU,OACZ,OAAM,UAAU;AAGlB,WAAO,OAAO,UAAU;GACzB;EACF;AAED,SAAO;CACR;CAED,YAAmB,OAAOC,gCAAc,UAAU;EAA/B;CAAiC;CAMpD,QAAQC,SAAuB;AAC7B,OAAK,WAAW;AAChB,SAAO;CACR;CAMD,MACEC,OACM;AACN,OAAK,QAAQ,KAAK,MAAM;AACxB,SAAO;CACR;CAED,UACEC,WACsE;AACtE,OAAK,aAAa;AAKlB,SAAO;CAQR;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BaseFunctionBuilder-DCUtCdVL.mjs","names":["DEFAULT_LOGGER","s: unknown","data: unknown","schema: T","result: any","timeout: number","event: TEvent","publisher: Service<TName, T>"],"sources":["../src/functions/BaseFunctionBuilder.ts"],"sourcesContent":["import type { Logger } from '@geekmidas/logger';\nimport { ConsoleLogger } from '@geekmidas/logger/console';\nimport type { Service } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport get from 'lodash.get';\nimport { ConstructType } from '../Construct';\n\nimport type { EventPublisher, MappedEvent } from '@geekmidas/events';\nimport type {\n ComposableStandardSchema,\n InferComposableStandardSchema,\n} from '@geekmidas/schema';\n\nconst DEFAULT_LOGGER = new ConsoleLogger() as any;\n\nexport abstract class BaseFunctionBuilder<\n TInput extends ComposableStandardSchema,\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n> {\n protected inputSchema?: TInput;\n protected outputSchema?: OutSchema;\n protected _timeout?: number;\n\n public _services: TServices = [] as Service[] as TServices;\n public _logger: TLogger = DEFAULT_LOGGER;\n\n protected _events: MappedEvent<TEventPublisher, OutSchema>[] = [];\n protected _publisher?: Service<TEventPublisherServiceName, TEventPublisher>;\n\n static isStandardSchemaV1(s: unknown): s is StandardSchemaV1 {\n const schema = (s as StandardSchemaV1)['~standard'];\n\n return schema && typeof schema.validate === 'function';\n }\n\n static async parseComposableStandardSchema<\n T extends ComposableStandardSchema | undefined,\n >(data: unknown, schema: T): Promise<InferComposableStandardSchema<T>> {\n if (BaseFunctionBuilder.isStandardSchemaV1(schema)) {\n const validated = await schema['~standard'].validate(data);\n\n if (validated.issues) {\n throw validated.issues;\n }\n\n return validated.value as InferComposableStandardSchema<T>;\n }\n\n const result: any = {};\n for (const key in schema) {\n const item = schema[key];\n if (BaseFunctionBuilder.isStandardSchemaV1(item)) {\n const value = get(data, key);\n const validated = await item['~standard'].validate(value);\n\n if (validated.issues) {\n throw validated.issues;\n }\n\n result[key] = validated.value;\n }\n }\n\n return result as InferComposableStandardSchema<T>;\n }\n\n constructor(public type = ConstructType.Function) {}\n\n abstract services<T extends Service[]>(services: T): any;\n\n abstract logger<T extends Logger>(logger: T): any;\n\n timeout(timeout: number): this {\n this._timeout = timeout;\n return this;\n }\n\n abstract output<T extends StandardSchemaV1>(schema: T): any;\n\n abstract input<T extends ComposableStandardSchema>(schema: T): any;\n\n event<TEvent extends MappedEvent<TEventPublisher, OutSchema>>(\n event: TEvent,\n ): this {\n this._events.push(event);\n return this;\n }\n\n publisher<T extends EventPublisher<any>, TName extends string>(\n publisher: Service<TName, T>,\n ): BaseFunctionBuilder<TInput, OutSchema, TServices, TLogger, T, TName> {\n this._publisher = publisher as unknown as Service<\n TEventPublisherServiceName,\n TEventPublisher\n >;\n\n return this as unknown as BaseFunctionBuilder<\n TInput,\n OutSchema,\n TServices,\n TLogger,\n T,\n TName\n >;\n }\n}\n"],"mappings":";;;;;AAaA,MAAMA,mBAAiB,IAAI;AAE3B,IAAsB,sBAAtB,MAAsB,oBAOpB;CACA,AAAU;CACV,AAAU;CACV,AAAU;CAEV,AAAO,YAAuB,CAAE;CAChC,AAAO,UAAmBA;CAE1B,AAAU,UAAqD,CAAE;CACjE,AAAU;CAEV,OAAO,mBAAmBC,GAAmC;EAC3D,MAAM,SAAU,EAAuB;AAEvC,SAAO,iBAAiB,OAAO,aAAa;CAC7C;CAED,aAAa,8BAEXC,MAAeC,QAAsD;AACrE,MAAI,oBAAoB,mBAAmB,OAAO,EAAE;GAClD,MAAM,YAAY,MAAM,OAAO,aAAa,SAAS,KAAK;AAE1D,OAAI,UAAU,OACZ,OAAM,UAAU;AAGlB,UAAO,UAAU;EAClB;EAED,MAAMC,SAAc,CAAE;AACtB,OAAK,MAAM,OAAO,QAAQ;GACxB,MAAM,OAAO,OAAO;AACpB,OAAI,oBAAoB,mBAAmB,KAAK,EAAE;IAChD,MAAM,QAAQ,IAAI,MAAM,IAAI;IAC5B,MAAM,YAAY,MAAM,KAAK,aAAa,SAAS,MAAM;AAEzD,QAAI,UAAU,OACZ,OAAM,UAAU;AAGlB,WAAO,OAAO,UAAU;GACzB;EACF;AAED,SAAO;CACR;CAED,YAAmB,OAAO,cAAc,UAAU;EAA/B;CAAiC;CAMpD,QAAQC,SAAuB;AAC7B,OAAK,WAAW;AAChB,SAAO;CACR;CAMD,MACEC,OACM;AACN,OAAK,QAAQ,KAAK,MAAM;AACxB,SAAO;CACR;CAED,UACEC,WACsE;AACtE,OAAK,aAAa;AAKlB,SAAO;CAQR;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Construct-C3hsQBy4.mjs","names":["type: ConstructType","logger: TLogger","services: TServices","events: MappedEvent<T, any>[]","publisherService?: Service<TServiceName, T>","outputSchema?: OutSchema","timeout?: number","memorySize?: number","services: Service[]"],"sources":["../src/Construct.ts"],"sourcesContent":["import { SnifferEnvironmentParser } from '@geekmidas/envkit/sniffer';\nimport type { EventPublisher, MappedEvent } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type { Service } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport compact from 'lodash.compact';\n\nexport abstract class Construct<\n TLogger extends Logger = Logger,\n TServiceName extends string = string,\n T extends EventPublisher<any> | undefined = undefined,\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n> {\n constructor(\n public readonly type: ConstructType,\n public readonly logger: TLogger,\n public readonly services: TServices,\n public readonly events: MappedEvent<T, any>[] = [],\n\n public readonly publisherService?: Service<TServiceName, T>,\n public outputSchema?: OutSchema,\n public readonly timeout?: number,\n public readonly memorySize?: number,\n ) {}\n\n /**\n * Returns an array of environment variable names required by this construct's services.\n * This is determined by running a \"sniffer\" EnvironmentParser through each service's\n * register method to track which environment variables are accessed.\n *\n * @returns Promise that resolves to array of environment variable names, sorted alphabetically\n *\n * @example\n * ```typescript\n * const endpoint = e\n * .services([databaseService, authService])\n * .get('/users')\n * .handle(async () => []);\n *\n * const envVars = await endpoint.getEnvironment(); // ['AUTH_SECRET', 'DATABASE_URL']\n * ```\n */\n async getEnvironment(): Promise<string[]> {\n const sniffer = new SnifferEnvironmentParser();\n const services: Service[] = compact([\n ...this.services,\n this.publisherService,\n ]);\n\n try {\n // Run each service's register method with the sniffer to track env var access\n for (const service of services) {\n try {\n const result = service.register(sniffer as any);\n\n // Await if it's a Promise (async services)\n if (result && typeof result === 'object' && 'then' in result) {\n await Promise.resolve(result);\n }\n } catch {\n // Service registration may fail but env vars are still tracked\n continue;\n }\n }\n\n // Get tracked env vars directly from the sniffer\n return sniffer.getEnvironmentVariables();\n } catch (error) {\n console.error(\n 'Error determining environment variables for construct:',\n error,\n );\n\n return [];\n }\n }\n}\n\nexport enum ConstructType {\n Cron = 'dev.geekmidas.function.cron',\n Endpoint = 'dev.geekmidas.function.endpoint',\n Function = 'dev.geekmidas.function.function',\n Subscriber = 'dev.geekmidas.function.subscriber',\n}\n"],"mappings":";;;;AAOA,IAAsB,YAAtB,MAME;CACA,YACkBA,MACAC,QACAC,UACAC,SAAgC,CAAE,GAElCC,kBACTC,cACSC,SACAC,YAChB;EATgB;EACA;EACA;EACA;EAEA;EACT;EACS;EACA;CACd;;;;;;;;;;;;;;;;;;CAmBJ,MAAM,iBAAoC;EACxC,MAAM,UAAU,IAAI;EACpB,MAAMC,WAAsB,QAAQ,CAClC,GAAG,KAAK,UACR,KAAK,gBACN,EAAC;AAEF,MAAI;AAEF,QAAK,MAAM,WAAW,SACpB,KAAI;IACF,MAAM,SAAS,QAAQ,SAAS,QAAe;AAG/C,QAAI,iBAAiB,WAAW,YAAY,UAAU,OACpD,OAAM,QAAQ,QAAQ,OAAO;GAEhC,QAAO;AAEN;GACD;AAIH,UAAO,QAAQ,yBAAyB;EACzC,SAAQ,OAAO;AACd,WAAQ,MACN,0DACA,MACD;AAED,UAAO,CAAE;EACV;CACF;AACF;AAED,IAAY,0DAAL;AACL;AACA;AACA;AACA;;AACD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Construct-VEI7M3fs.cjs","names":["type: ConstructType","logger: TLogger","services: TServices","events: MappedEvent<T, any>[]","publisherService?: Service<TServiceName, T>","outputSchema?: OutSchema","timeout?: number","memorySize?: number","SnifferEnvironmentParser","services: Service[]"],"sources":["../src/Construct.ts"],"sourcesContent":["import { SnifferEnvironmentParser } from '@geekmidas/envkit/sniffer';\nimport type { EventPublisher, MappedEvent } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type { Service } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport compact from 'lodash.compact';\n\nexport abstract class Construct<\n TLogger extends Logger = Logger,\n TServiceName extends string = string,\n T extends EventPublisher<any> | undefined = undefined,\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n> {\n constructor(\n public readonly type: ConstructType,\n public readonly logger: TLogger,\n public readonly services: TServices,\n public readonly events: MappedEvent<T, any>[] = [],\n\n public readonly publisherService?: Service<TServiceName, T>,\n public outputSchema?: OutSchema,\n public readonly timeout?: number,\n public readonly memorySize?: number,\n ) {}\n\n /**\n * Returns an array of environment variable names required by this construct's services.\n * This is determined by running a \"sniffer\" EnvironmentParser through each service's\n * register method to track which environment variables are accessed.\n *\n * @returns Promise that resolves to array of environment variable names, sorted alphabetically\n *\n * @example\n * ```typescript\n * const endpoint = e\n * .services([databaseService, authService])\n * .get('/users')\n * .handle(async () => []);\n *\n * const envVars = await endpoint.getEnvironment(); // ['AUTH_SECRET', 'DATABASE_URL']\n * ```\n */\n async getEnvironment(): Promise<string[]> {\n const sniffer = new SnifferEnvironmentParser();\n const services: Service[] = compact([\n ...this.services,\n this.publisherService,\n ]);\n\n try {\n // Run each service's register method with the sniffer to track env var access\n for (const service of services) {\n try {\n const result = service.register(sniffer as any);\n\n // Await if it's a Promise (async services)\n if (result && typeof result === 'object' && 'then' in result) {\n await Promise.resolve(result);\n }\n } catch {\n // Service registration may fail but env vars are still tracked\n continue;\n }\n }\n\n // Get tracked env vars directly from the sniffer\n return sniffer.getEnvironmentVariables();\n } catch (error) {\n console.error(\n 'Error determining environment variables for construct:',\n error,\n );\n\n return [];\n }\n }\n}\n\nexport enum ConstructType {\n Cron = 'dev.geekmidas.function.cron',\n Endpoint = 'dev.geekmidas.function.endpoint',\n Function = 'dev.geekmidas.function.function',\n Subscriber = 'dev.geekmidas.function.subscriber',\n}\n"],"mappings":";;;;;AAOA,IAAsB,YAAtB,MAME;CACA,YACkBA,MACAC,QACAC,UACAC,SAAgC,CAAE,GAElCC,kBACTC,cACSC,SACAC,YAChB;EATgB;EACA;EACA;EACA;EAEA;EACT;EACS;EACA;CACd;;;;;;;;;;;;;;;;;;CAmBJ,MAAM,iBAAoC;EACxC,MAAM,UAAU,IAAIC;EACpB,MAAMC,WAAsB,4BAAQ,CAClC,GAAG,KAAK,UACR,KAAK,gBACN,EAAC;AAEF,MAAI;AAEF,QAAK,MAAM,WAAW,SACpB,KAAI;IACF,MAAM,SAAS,QAAQ,SAAS,QAAe;AAG/C,QAAI,iBAAiB,WAAW,YAAY,UAAU,OACpD,OAAM,QAAQ,QAAQ,OAAO;GAEhC,QAAO;AAEN;GACD;AAIH,UAAO,QAAQ,yBAAyB;EACzC,SAAQ,OAAO;AACd,WAAQ,MACN,0DACA,MACD;AAED,UAAO,CAAE;EACV;CACF;AACF;AAED,IAAY,0DAAL;AACL;AACA;AACA;AACA;;AACD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Endpoint-BjpQmTek.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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"}
|