@geekmidas/constructs 0.0.19 → 0.0.21
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-vobYqQ0w.cjs → AWSLambdaFunction-C-fuCLA3.cjs} +2 -2
- package/dist/{AWSLambdaFunction-vobYqQ0w.cjs.map → AWSLambdaFunction-C-fuCLA3.cjs.map} +1 -1
- package/dist/{AWSLambdaFunction-DBUENdP0.mjs → AWSLambdaFunction-H65WfXLt.mjs} +2 -2
- package/dist/{AWSLambdaFunction-DBUENdP0.mjs.map → AWSLambdaFunction-H65WfXLt.mjs.map} +1 -1
- package/dist/{AWSLambdaFunction-B-Oxr8qt.d.cts → AWSLambdaFunction-gpqm7UBb.d.cts} +3 -3
- package/dist/{AWSLambdaFunction-CAm9r5ZX.d.mts → AWSLambdaFunction-qWpalqfr.d.mts} +3 -3
- package/dist/{AWSLambdaSubscriberAdaptor-DpHzp-AM.d.mts → AWSLambdaSubscriberAdaptor-CWbBNRz3.d.mts} +2 -2
- package/dist/{AWSLambdaSubscriberAdaptor-BLHDyqzQ.mjs → AWSLambdaSubscriberAdaptor-CyFh7MN8.mjs} +1 -1
- package/dist/{AWSLambdaSubscriberAdaptor-BLHDyqzQ.mjs.map → AWSLambdaSubscriberAdaptor-CyFh7MN8.mjs.map} +1 -1
- package/dist/{AWSLambdaSubscriberAdaptor-Cknp_nn1.d.cts → AWSLambdaSubscriberAdaptor-DT8icDRf.d.cts} +2 -2
- package/dist/{AWSLambdaSubscriberAdaptor-DVC4VAQR.cjs → AWSLambdaSubscriberAdaptor-Dum5bkw3.cjs} +1 -1
- package/dist/{AWSLambdaSubscriberAdaptor-DVC4VAQR.cjs.map → AWSLambdaSubscriberAdaptor-Dum5bkw3.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayEndpointAdaptor-4hPy5vty.d.mts → AmazonApiGatewayEndpointAdaptor-BQ0IJdaI.d.mts} +3 -2
- package/dist/{AmazonApiGatewayEndpointAdaptor-DBK53gB5.mjs → AmazonApiGatewayEndpointAdaptor-CacGag6F.mjs} +18 -7
- package/dist/AmazonApiGatewayEndpointAdaptor-CacGag6F.mjs.map +1 -0
- package/dist/{AmazonApiGatewayEndpointAdaptor-BLUW--OF.cjs → AmazonApiGatewayEndpointAdaptor-DXssXsJi.cjs} +18 -7
- package/dist/AmazonApiGatewayEndpointAdaptor-DXssXsJi.cjs.map +1 -0
- package/dist/{AmazonApiGatewayEndpointAdaptor-ro0RMLzr.d.cts → AmazonApiGatewayEndpointAdaptor-Da9BR5On.d.cts} +3 -2
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-DfU3n5im.mjs → AmazonApiGatewayV1EndpointAdaptor-BpnG55R7.mjs} +3 -3
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-DfU3n5im.mjs.map → AmazonApiGatewayV1EndpointAdaptor-BpnG55R7.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-hyR-WwyP.d.mts → AmazonApiGatewayV1EndpointAdaptor-C4_AZ1ek.d.mts} +3 -3
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-BWJWKqQT.d.cts → AmazonApiGatewayV1EndpointAdaptor-CSm3NsWz.d.cts} +3 -3
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-B-i9_OtQ.cjs → AmazonApiGatewayV1EndpointAdaptor-Df4kszio.cjs} +3 -3
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-B-i9_OtQ.cjs.map → AmazonApiGatewayV1EndpointAdaptor-Df4kszio.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-D4k_Bg7Q.cjs → AmazonApiGatewayV2EndpointAdaptor-5SIvqPby.cjs} +3 -3
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-D4k_Bg7Q.cjs.map → AmazonApiGatewayV2EndpointAdaptor-5SIvqPby.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-D1Irdggp.d.cts → AmazonApiGatewayV2EndpointAdaptor-6hsBFVLf.d.cts} +3 -3
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-DX3SuI5S.d.mts → AmazonApiGatewayV2EndpointAdaptor-DdM8Tr1X.d.mts} +3 -3
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-D-AFyzaQ.mjs → AmazonApiGatewayV2EndpointAdaptor-ZORzMEET.mjs} +3 -3
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-D-AFyzaQ.mjs.map → AmazonApiGatewayV2EndpointAdaptor-ZORzMEET.mjs.map} +1 -1
- package/dist/{BaseFunctionBuilder-CbDnPZpD.d.mts → BaseFunctionBuilder-Ct6zY6Jq.d.mts} +2 -2
- package/dist/{BaseFunctionBuilder-DUZMbEr3.d.cts → BaseFunctionBuilder-DaQA0uKE.d.cts} +2 -2
- package/dist/{Construct-ZPqE0vhn.d.mts → Construct-DDR0295I.d.mts} +7 -7
- package/dist/{Construct-dI_rgdSp.d.cts → Construct-Dkd8Kvc9.d.cts} +7 -7
- package/dist/Construct.d.cts +1 -1
- package/dist/Construct.d.mts +1 -1
- package/dist/{Cron-COdfP0Jd.d.cts → Cron-7VPR2cNR.d.cts} +6 -5
- package/dist/{Cron-CmtKQOmE.cjs → Cron-Bi3QOge_.cjs} +1 -1
- package/dist/Cron-Bi3QOge_.cjs.map +1 -0
- package/dist/{Cron-D8cn_ahj.d.mts → Cron-DnMRWPFR.d.mts} +6 -5
- package/dist/{Cron-mWi3PQxt.mjs → Cron-Dy_HW2Vv.mjs} +1 -1
- package/dist/Cron-Dy_HW2Vv.mjs.map +1 -0
- package/dist/{CronBuilder-DntF6H3A.d.cts → CronBuilder-290th4zF.d.cts} +4 -4
- package/dist/{CronBuilder-4DxT6wUa.mjs → CronBuilder-Bl3A2Zp4.mjs} +2 -2
- package/dist/{CronBuilder-4DxT6wUa.mjs.map → CronBuilder-Bl3A2Zp4.mjs.map} +1 -1
- package/dist/{CronBuilder-CeffP9Rs.cjs → CronBuilder-Dv_w7Yri.cjs} +2 -2
- package/dist/{CronBuilder-CeffP9Rs.cjs.map → CronBuilder-Dv_w7Yri.cjs.map} +1 -1
- package/dist/{CronBuilder-DoMnSs_0.d.mts → CronBuilder-RLDitFmP.d.mts} +4 -4
- package/dist/{Endpoint-BTvS2vwp.cjs → Endpoint-CA-byrDr.cjs} +1 -3
- package/dist/Endpoint-CA-byrDr.cjs.map +1 -0
- package/dist/{Endpoint-Bu8Phz6y.d.cts → Endpoint-D2Imgihs.d.cts} +31 -7
- package/dist/{Endpoint-D2LVHBEO.mjs → Endpoint-DbPsw13b.mjs} +1 -3
- package/dist/Endpoint-DbPsw13b.mjs.map +1 -0
- package/dist/{Endpoint-Bbs_sFvg.d.mts → Endpoint-PtQ-wLIS.d.mts} +31 -7
- package/dist/{EndpointBuilder-O6B1zJ6v.mjs → EndpointBuilder-B5QPf5Wd.mjs} +2 -2
- package/dist/EndpointBuilder-B5QPf5Wd.mjs.map +1 -0
- package/dist/{EndpointBuilder-D02Qo4Ha.d.mts → EndpointBuilder-BPHpUekp.d.mts} +4 -4
- package/dist/{EndpointBuilder-C4qahFeS.cjs → EndpointBuilder-DrJbIf3Z.cjs} +2 -2
- package/dist/EndpointBuilder-DrJbIf3Z.cjs.map +1 -0
- package/dist/{EndpointBuilder-DHPOWw0B.d.cts → EndpointBuilder-TApJQhtG.d.cts} +4 -4
- package/dist/{EndpointFactory-C_neYSiA.cjs → EndpointFactory-CSeDcWYn.cjs} +2 -2
- package/dist/EndpointFactory-CSeDcWYn.cjs.map +1 -0
- package/dist/{EndpointFactory-DFFXRU-l.d.cts → EndpointFactory-D94AFjIc.d.cts} +5 -5
- package/dist/{EndpointFactory-BUYrnjau.mjs → EndpointFactory-DNwMexc7.mjs} +2 -2
- package/dist/EndpointFactory-DNwMexc7.mjs.map +1 -0
- package/dist/{EndpointFactory-g84YJjGf.d.mts → EndpointFactory-TJ6gtM0W.d.mts} +5 -5
- package/dist/{Function-V9M9UVHp.d.mts → Function-CD3rXWfa.d.mts} +5 -5
- package/dist/{Function-VI1TB3Mh.d.cts → Function-DHD1V9QW.d.cts} +5 -5
- package/dist/{FunctionBuilder-CjVEFTYC.d.cts → FunctionBuilder-FV6r3I7X.d.cts} +4 -4
- package/dist/{FunctionBuilder-D1ofSeMd.d.mts → FunctionBuilder-j2VkwuGf.d.mts} +4 -4
- package/dist/{FunctionExecutionWrapper-CwtwYozd.d.cts → FunctionExecutionWrapper-B0WP-Vec.d.mts} +4 -4
- package/dist/{FunctionExecutionWrapper-BPIdmPe8.mjs → FunctionExecutionWrapper-Bubnr0zA.mjs} +1 -1
- package/dist/{FunctionExecutionWrapper-BPIdmPe8.mjs.map → FunctionExecutionWrapper-Bubnr0zA.mjs.map} +1 -1
- package/dist/{FunctionExecutionWrapper-rhbIYT0Q.d.mts → FunctionExecutionWrapper-DYt3C8b9.d.cts} +4 -4
- package/dist/{FunctionExecutionWrapper-B8agyYHk.cjs → FunctionExecutionWrapper-DkNycmOh.cjs} +1 -1
- package/dist/{FunctionExecutionWrapper-B8agyYHk.cjs.map → FunctionExecutionWrapper-DkNycmOh.cjs.map} +1 -1
- package/dist/{HonoEndpointAdaptor-DbLeXkR6.cjs → HonoEndpointAdaptor-B_gJPWGD.cjs} +9 -8
- package/dist/HonoEndpointAdaptor-B_gJPWGD.cjs.map +1 -0
- package/dist/{HonoEndpointAdaptor-DEFNrIv7.mjs → HonoEndpointAdaptor-Bg_vTyA5.mjs} +9 -8
- package/dist/HonoEndpointAdaptor-Bg_vTyA5.mjs.map +1 -0
- package/dist/{HonoEndpointAdaptor-Br1vuQ3A.d.mts → HonoEndpointAdaptor-D99d4b-Z.d.mts} +4 -4
- package/dist/{HonoEndpointAdaptor-C9wC10-w.d.cts → HonoEndpointAdaptor-DB_DdiJr.d.cts} +5 -5
- package/dist/{Subscriber-BhzqUzs-.d.cts → Subscriber-DMSzvO_J.d.cts} +6 -6
- package/dist/{Subscriber-s6yfjeOc.d.mts → Subscriber-itwm7ugy.d.mts} +6 -6
- package/dist/{SubscriberBuilder-BCVkp-ga.d.cts → SubscriberBuilder-9j3JCu8-.d.mts} +3 -3
- package/dist/{SubscriberBuilder-aCua5_wA.d.mts → SubscriberBuilder-BxJM3Hz_.d.cts} +3 -3
- package/dist/{TestEndpointAdaptor-ByXqQufk.d.cts → TestEndpointAdaptor-BYCwwiYk.d.cts} +2 -2
- package/dist/{TestEndpointAdaptor-JCvZ3VVi.cjs → TestEndpointAdaptor-Bew9lWsx.cjs} +6 -5
- package/dist/TestEndpointAdaptor-Bew9lWsx.cjs.map +1 -0
- package/dist/{TestEndpointAdaptor-Bl2ic-yr.d.mts → TestEndpointAdaptor-C-c8v7VI.d.mts} +2 -2
- package/dist/{TestEndpointAdaptor-BGrZsg5c.mjs → TestEndpointAdaptor-JONQJeXc.mjs} +6 -5
- package/dist/TestEndpointAdaptor-JONQJeXc.mjs.map +1 -0
- package/dist/adaptors/aws.cjs +9 -9
- package/dist/adaptors/aws.d.cts +13 -13
- package/dist/adaptors/aws.d.mts +13 -13
- package/dist/adaptors/aws.mjs +9 -9
- package/dist/adaptors/hono.cjs +5 -5
- package/dist/adaptors/hono.d.cts +7 -7
- package/dist/adaptors/hono.d.mts +7 -7
- package/dist/adaptors/hono.mjs +5 -5
- package/dist/adaptors/testing.cjs +3 -3
- package/dist/adaptors/testing.d.cts +7 -7
- package/dist/adaptors/testing.d.mts +7 -7
- package/dist/adaptors/testing.mjs +3 -3
- package/dist/crons/Cron.cjs +1 -1
- package/dist/crons/Cron.d.cts +6 -6
- package/dist/crons/Cron.d.mts +6 -6
- package/dist/crons/Cron.mjs +1 -1
- package/dist/crons/CronBuilder.cjs +2 -2
- package/dist/crons/CronBuilder.d.cts +7 -7
- package/dist/crons/CronBuilder.d.mts +7 -7
- package/dist/crons/CronBuilder.mjs +2 -2
- package/dist/crons/index.cjs +2 -2
- package/dist/crons/index.d.cts +11 -11
- package/dist/crons/index.d.mts +7 -7
- package/dist/crons/index.mjs +2 -2
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +3 -3
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +7 -7
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +7 -7
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +3 -3
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +5 -5
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +8 -8
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +8 -8
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +5 -5
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +5 -5
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +8 -8
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +8 -8
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +5 -5
- package/dist/endpoints/Endpoint.cjs +1 -1
- package/dist/endpoints/Endpoint.d.cts +6 -6
- package/dist/endpoints/Endpoint.d.mts +6 -6
- package/dist/endpoints/Endpoint.mjs +1 -1
- package/dist/endpoints/EndpointBuilder.cjs +2 -2
- package/dist/endpoints/EndpointBuilder.d.cts +7 -7
- package/dist/endpoints/EndpointBuilder.d.mts +7 -7
- package/dist/endpoints/EndpointBuilder.mjs +2 -2
- package/dist/endpoints/EndpointFactory.cjs +3 -3
- package/dist/endpoints/EndpointFactory.d.cts +8 -8
- package/dist/endpoints/EndpointFactory.d.mts +8 -8
- package/dist/endpoints/EndpointFactory.mjs +3 -3
- package/dist/endpoints/HonoEndpointAdaptor.cjs +5 -5
- package/dist/endpoints/HonoEndpointAdaptor.d.cts +7 -7
- package/dist/endpoints/HonoEndpointAdaptor.d.mts +7 -7
- package/dist/endpoints/HonoEndpointAdaptor.mjs +5 -5
- package/dist/endpoints/TestEndpointAdaptor.cjs +3 -3
- package/dist/endpoints/TestEndpointAdaptor.d.cts +7 -7
- package/dist/endpoints/TestEndpointAdaptor.d.mts +7 -7
- package/dist/endpoints/TestEndpointAdaptor.mjs +3 -3
- package/dist/endpoints/audit.d.cts +6 -6
- package/dist/endpoints/audit.d.mts +6 -6
- package/dist/endpoints/helpers.cjs +2 -2
- package/dist/endpoints/helpers.d.cts +6 -6
- package/dist/endpoints/helpers.d.mts +6 -6
- package/dist/endpoints/helpers.mjs +2 -2
- package/dist/endpoints/index.cjs +3 -3
- package/dist/endpoints/index.d.cts +10 -10
- package/dist/endpoints/index.d.mts +8 -8
- package/dist/endpoints/index.mjs +3 -3
- 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 +1 -1
- package/dist/endpoints/processAudits.d.cts +6 -6
- package/dist/endpoints/processAudits.d.mts +6 -6
- package/dist/endpoints/processAudits.mjs +1 -1
- package/dist/functions/AWSLambdaFunction.cjs +2 -2
- package/dist/functions/AWSLambdaFunction.d.cts +4 -4
- package/dist/functions/AWSLambdaFunction.d.mts +4 -4
- package/dist/functions/AWSLambdaFunction.mjs +2 -2
- package/dist/functions/BaseFunctionBuilder.d.cts +2 -2
- package/dist/functions/BaseFunctionBuilder.d.mts +2 -2
- package/dist/functions/Function.d.cts +2 -2
- package/dist/functions/Function.d.mts +2 -2
- package/dist/functions/FunctionBuilder.d.cts +4 -4
- package/dist/functions/FunctionBuilder.d.mts +4 -4
- package/dist/functions/FunctionExecutionWrapper.cjs +1 -1
- package/dist/functions/FunctionExecutionWrapper.d.cts +3 -3
- package/dist/functions/FunctionExecutionWrapper.d.mts +3 -3
- package/dist/functions/FunctionExecutionWrapper.mjs +1 -1
- package/dist/functions/TestFunctionAdaptor.d.cts +2 -2
- package/dist/functions/TestFunctionAdaptor.d.mts +2 -2
- package/dist/functions/index.d.cts +5 -5
- package/dist/functions/index.d.mts +5 -5
- package/dist/{helpers-D-OW3LI_.mjs → helpers-CrrdyA04.mjs} +2 -2
- package/dist/{helpers-D-OW3LI_.mjs.map → helpers-CrrdyA04.mjs.map} +1 -1
- package/dist/{helpers-CUYRcimZ.cjs → helpers-DiPZVJQC.cjs} +2 -2
- package/dist/{helpers-CUYRcimZ.cjs.map → helpers-DiPZVJQC.cjs.map} +1 -1
- package/dist/index-C6vCFivC.d.cts +10 -0
- package/dist/index-IoTEI3As.d.mts +10 -0
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/{parseHonoQuery-D-fMmSbA.cjs → parseHonoQuery-CT8Cvin-.cjs} +1 -1
- package/dist/{parseHonoQuery-D-fMmSbA.cjs.map → parseHonoQuery-CT8Cvin-.cjs.map} +1 -1
- package/dist/{parseHonoQuery-BlwMModJ.mjs → parseHonoQuery-CwFKw2ua.mjs} +1 -1
- package/dist/{parseHonoQuery-BlwMModJ.mjs.map → parseHonoQuery-CwFKw2ua.mjs.map} +1 -1
- package/dist/{parseQueryParams-DlbV3_SB.mjs → parseQueryParams-CHINupbZ.mjs} +1 -1
- package/dist/{parseQueryParams-DlbV3_SB.mjs.map → parseQueryParams-CHINupbZ.mjs.map} +1 -1
- package/dist/{parseQueryParams-CbY1zcCU.cjs → parseQueryParams-CwvXXwkW.cjs} +1 -1
- package/dist/{parseQueryParams-CbY1zcCU.cjs.map → parseQueryParams-CwvXXwkW.cjs.map} +1 -1
- package/dist/{processAudits-MHp5_fc7.cjs → processAudits-BFokHhCO.cjs} +1 -1
- package/dist/{processAudits-MHp5_fc7.cjs.map → processAudits-BFokHhCO.cjs.map} +1 -1
- package/dist/{processAudits-CW7z5Kj9.mjs → processAudits-DfcB-X-4.mjs} +1 -1
- package/dist/{processAudits-CW7z5Kj9.mjs.map → processAudits-DfcB-X-4.mjs.map} +1 -1
- package/dist/publisher.d.cts +2 -2
- package/dist/publisher.d.mts +2 -2
- 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.d.cts +2 -2
- package/dist/subscribers/Subscriber.d.mts +2 -2
- package/dist/subscribers/SubscriberBuilder.d.cts +3 -3
- package/dist/subscribers/SubscriberBuilder.d.mts +3 -3
- package/dist/subscribers/index.d.cts +5 -5
- package/dist/subscribers/index.d.mts +5 -5
- package/package.json +6 -6
- package/src/crons/Cron.ts +7 -6
- package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +31 -10
- package/src/endpoints/Endpoint.ts +41 -6
- package/src/endpoints/EndpointBuilder.ts +2 -1
- package/src/endpoints/EndpointFactory.ts +13 -4
- package/src/endpoints/HonoEndpointAdaptor.ts +14 -13
- package/src/endpoints/TestEndpointAdaptor.ts +11 -6
- package/src/endpoints/__tests__/HonoEndpointAdaptor.spec.ts +3 -2
- package/src/endpoints/__tests__/TestEndpointAdaptor.audits.spec.ts +30 -42
- package/dist/AmazonApiGatewayEndpointAdaptor-BLUW--OF.cjs.map +0 -1
- package/dist/AmazonApiGatewayEndpointAdaptor-DBK53gB5.mjs.map +0 -1
- package/dist/Cron-CmtKQOmE.cjs.map +0 -1
- package/dist/Cron-mWi3PQxt.mjs.map +0 -1
- package/dist/Endpoint-BTvS2vwp.cjs.map +0 -1
- package/dist/Endpoint-D2LVHBEO.mjs.map +0 -1
- package/dist/EndpointBuilder-C4qahFeS.cjs.map +0 -1
- package/dist/EndpointBuilder-O6B1zJ6v.mjs.map +0 -1
- package/dist/EndpointFactory-BUYrnjau.mjs.map +0 -1
- package/dist/EndpointFactory-C_neYSiA.cjs.map +0 -1
- package/dist/HonoEndpointAdaptor-DEFNrIv7.mjs.map +0 -1
- package/dist/HonoEndpointAdaptor-DbLeXkR6.cjs.map +0 -1
- package/dist/TestEndpointAdaptor-BGrZsg5c.mjs.map +0 -1
- package/dist/TestEndpointAdaptor-JCvZ3VVi.cjs.map +0 -1
- package/dist/index-Doa8YPmH.d.cts +0 -10
- package/dist/index-TxufD5Xp.d.mts +0 -10
package/src/crons/Cron.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
+
import type { AuditableAction } from '@geekmidas/audit';
|
|
2
|
+
import type { EventPublisher } from '@geekmidas/events';
|
|
1
3
|
import type { Logger } from '@geekmidas/logger';
|
|
4
|
+
import type { ComposableStandardSchema } from '@geekmidas/schema';
|
|
5
|
+
import type { Service } from '@geekmidas/services';
|
|
2
6
|
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
3
7
|
|
|
4
8
|
import { ConstructType } from '../Construct';
|
|
5
9
|
import { Function, type FunctionHandler } from '../functions';
|
|
6
10
|
|
|
7
|
-
import type { EventPublisher } from '@geekmidas/events';
|
|
8
|
-
import type { ComposableStandardSchema } from '@geekmidas/schema';
|
|
9
|
-
import type { Service } from '@geekmidas/services';
|
|
10
|
-
|
|
11
11
|
export class Cron<
|
|
12
12
|
TInput extends ComposableStandardSchema | undefined = undefined,
|
|
13
13
|
TServices extends Service[] = [],
|
|
@@ -22,13 +22,14 @@ export class Cron<
|
|
|
22
22
|
TServices,
|
|
23
23
|
TLogger,
|
|
24
24
|
OutSchema,
|
|
25
|
-
FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>,
|
|
26
25
|
TEventPublisher,
|
|
27
26
|
TEventPublisherServiceName,
|
|
28
27
|
undefined,
|
|
29
28
|
string,
|
|
30
29
|
TDatabase,
|
|
31
|
-
TDatabaseServiceName
|
|
30
|
+
TDatabaseServiceName,
|
|
31
|
+
AuditableAction<string, unknown>,
|
|
32
|
+
FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>
|
|
32
33
|
> {
|
|
33
34
|
static isCron(obj: any): obj is Cron<any, any, any, any> {
|
|
34
35
|
return Boolean(
|
|
@@ -191,17 +191,44 @@ export abstract class AmazonApiGatewayEndpoint<
|
|
|
191
191
|
};
|
|
192
192
|
}
|
|
193
193
|
|
|
194
|
+
private database(): Middleware<TEvent, TInput, TServices, TLogger> {
|
|
195
|
+
return {
|
|
196
|
+
before: async (req) => {
|
|
197
|
+
if (!this.endpoint.databaseService) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const logger = req.event.logger as TLogger;
|
|
202
|
+
const serviceDiscovery = ServiceDiscovery.getInstance<
|
|
203
|
+
ServiceRecord<TServices>,
|
|
204
|
+
TLogger
|
|
205
|
+
>(logger, this.envParser);
|
|
206
|
+
|
|
207
|
+
const db = await serviceDiscovery
|
|
208
|
+
.register([this.endpoint.databaseService])
|
|
209
|
+
.then(
|
|
210
|
+
(s) =>
|
|
211
|
+
s[this.endpoint.databaseService!.serviceName as keyof typeof s],
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
(req.event as any).db = db;
|
|
215
|
+
},
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
|
|
194
219
|
private session(): Middleware<TEvent, TInput, TServices, TLogger> {
|
|
195
220
|
return {
|
|
196
221
|
before: async (req) => {
|
|
197
222
|
const logger = req.event.logger as TLogger;
|
|
198
223
|
const services = req.event.services;
|
|
224
|
+
const db = (req.event as any).db;
|
|
199
225
|
req.event.session = (await this.endpoint.getSession({
|
|
200
226
|
logger,
|
|
201
227
|
services,
|
|
202
228
|
header: req.event.header,
|
|
203
229
|
cookie: req.event.cookie,
|
|
204
|
-
|
|
230
|
+
...(db !== undefined && { db }),
|
|
231
|
+
} as any)) as TSession;
|
|
205
232
|
},
|
|
206
233
|
};
|
|
207
234
|
}
|
|
@@ -267,15 +294,8 @@ export abstract class AmazonApiGatewayEndpoint<
|
|
|
267
294
|
logger.warn('No auditor storage service available');
|
|
268
295
|
}
|
|
269
296
|
|
|
270
|
-
//
|
|
271
|
-
const rawDb =
|
|
272
|
-
? await serviceDiscovery
|
|
273
|
-
.register([this.endpoint.databaseService])
|
|
274
|
-
.then(
|
|
275
|
-
(s) =>
|
|
276
|
-
s[this.endpoint.databaseService!.serviceName as keyof typeof s],
|
|
277
|
-
)
|
|
278
|
-
: undefined;
|
|
297
|
+
// Get pre-resolved database from middleware
|
|
298
|
+
const rawDb = (event as any).db;
|
|
279
299
|
|
|
280
300
|
// Execute handler with automatic audit transaction support
|
|
281
301
|
const result = await executeWithAuditTransaction(
|
|
@@ -382,6 +402,7 @@ export abstract class AmazonApiGatewayEndpoint<
|
|
|
382
402
|
.use(this.error())
|
|
383
403
|
.use(this.services())
|
|
384
404
|
.use(this.input())
|
|
405
|
+
.use(this.database())
|
|
385
406
|
.use(this.session())
|
|
386
407
|
.use(this.authorize())
|
|
387
408
|
.use(this.events()) as unknown as THandler;
|
|
@@ -109,7 +109,7 @@ export class Endpoint<
|
|
|
109
109
|
/** Default headers to apply to all responses */
|
|
110
110
|
public readonly defaultHeaders: Record<string, string> = {};
|
|
111
111
|
/** Function to extract session data from the request context */
|
|
112
|
-
public getSession: SessionFn<TServices, TLogger, TSession> = () =>
|
|
112
|
+
public getSession: SessionFn<TServices, TLogger, TSession, TDatabase> = () =>
|
|
113
113
|
({}) as TSession;
|
|
114
114
|
/** Function to determine if the request is authorized */
|
|
115
115
|
public authorize: AuthorizeFn<TServices, TLogger, TSession> = () => true;
|
|
@@ -122,7 +122,7 @@ export class Endpoint<
|
|
|
122
122
|
/** Declarative audit definitions */
|
|
123
123
|
public audits: MappedAudit<TAuditAction, OutSchema>[] = [];
|
|
124
124
|
/** Database service for this endpoint */
|
|
125
|
-
public databaseService?: Service<TDatabaseServiceName, TDatabase>;
|
|
125
|
+
public declare databaseService?: Service<TDatabaseServiceName, TDatabase>;
|
|
126
126
|
/** The endpoint handler function */
|
|
127
127
|
private endpointFn!: EndpointHandler<
|
|
128
128
|
TInput,
|
|
@@ -752,7 +752,7 @@ export interface EndpointOptions<
|
|
|
752
752
|
/** Logger instance */
|
|
753
753
|
logger: TLogger;
|
|
754
754
|
/** Optional session extraction function */
|
|
755
|
-
getSession: SessionFn<TServices, TLogger, TSession> | undefined;
|
|
755
|
+
getSession: SessionFn<TServices, TLogger, TSession, TDatabase> | undefined;
|
|
756
756
|
/** Optional rate limiting configuration */
|
|
757
757
|
rateLimit?: RateLimitConfig;
|
|
758
758
|
/** Success HTTP status code */
|
|
@@ -826,7 +826,10 @@ export type AuthorizeFn<
|
|
|
826
826
|
ctx: AuthorizeContext<TServices, TLogger, TSession>,
|
|
827
827
|
) => Promise<boolean> | boolean;
|
|
828
828
|
|
|
829
|
-
|
|
829
|
+
/**
|
|
830
|
+
* Base session context without database
|
|
831
|
+
*/
|
|
832
|
+
type BaseSessionContext<
|
|
830
833
|
TServices extends Service[] = [],
|
|
831
834
|
TLogger extends Logger = Logger,
|
|
832
835
|
> = {
|
|
@@ -835,29 +838,61 @@ export type SessionContext<
|
|
|
835
838
|
header: HeaderFn;
|
|
836
839
|
cookie: CookieFn;
|
|
837
840
|
};
|
|
841
|
+
|
|
842
|
+
/**
|
|
843
|
+
* Conditional database context for session - only present when database service is configured
|
|
844
|
+
*/
|
|
845
|
+
type SessionDatabaseContext<TDatabase = undefined> = TDatabase extends undefined
|
|
846
|
+
? {}
|
|
847
|
+
: {
|
|
848
|
+
/**
|
|
849
|
+
* Database instance for session extraction.
|
|
850
|
+
* Available when a database service is configured via `.database()`.
|
|
851
|
+
* Useful for looking up user data from the database based on auth tokens.
|
|
852
|
+
*/
|
|
853
|
+
db: TDatabase;
|
|
854
|
+
};
|
|
855
|
+
|
|
856
|
+
export type SessionContext<
|
|
857
|
+
TServices extends Service[] = [],
|
|
858
|
+
TLogger extends Logger = Logger,
|
|
859
|
+
TDatabase = undefined,
|
|
860
|
+
> = BaseSessionContext<TServices, TLogger> & SessionDatabaseContext<TDatabase>;
|
|
838
861
|
/**
|
|
839
862
|
* Function type for extracting session data from a request.
|
|
840
863
|
*
|
|
841
864
|
* @template TServices - Available service dependencies
|
|
842
865
|
* @template TLogger - Logger type
|
|
843
866
|
* @template TSession - Session data type to extract
|
|
867
|
+
* @template TDatabase - Database type (when database service is configured)
|
|
844
868
|
*
|
|
845
|
-
* @param ctx - Context containing services, logger, and
|
|
869
|
+
* @param ctx - Context containing services, logger, headers, and optionally database
|
|
846
870
|
* @returns The extracted session data
|
|
847
871
|
*
|
|
848
872
|
* @example
|
|
849
873
|
* ```typescript
|
|
874
|
+
* // Without database
|
|
850
875
|
* const getSession: SessionFn<Services, Logger, UserSession> = async ({ header, services }) => {
|
|
851
876
|
* const token = header('authorization');
|
|
852
877
|
* return await services.auth.verifyToken(token);
|
|
853
878
|
* };
|
|
879
|
+
*
|
|
880
|
+
* // With database
|
|
881
|
+
* const getSession: SessionFn<Services, Logger, UserSession, Database> = async ({ header, db }) => {
|
|
882
|
+
* const token = header('authorization');
|
|
883
|
+
* const user = await db.selectFrom('users').where('token', '=', token).executeTakeFirst();
|
|
884
|
+
* return { userId: user?.id };
|
|
885
|
+
* };
|
|
854
886
|
* ```
|
|
855
887
|
*/
|
|
856
888
|
export type SessionFn<
|
|
857
889
|
TServices extends Service[] = [],
|
|
858
890
|
TLogger extends Logger = Logger,
|
|
859
891
|
TSession = unknown,
|
|
860
|
-
|
|
892
|
+
TDatabase = undefined,
|
|
893
|
+
> = (
|
|
894
|
+
ctx: SessionContext<TServices, TLogger, TDatabase>,
|
|
895
|
+
) => Promise<TSession> | TSession;
|
|
861
896
|
|
|
862
897
|
/**
|
|
863
898
|
* Utility type that converts Express-style route parameters to OpenAPI format.
|
|
@@ -58,7 +58,8 @@ export class EndpointBuilder<
|
|
|
58
58
|
protected _status?: SuccessStatus;
|
|
59
59
|
protected _tags?: string[];
|
|
60
60
|
protected _memorySize?: number;
|
|
61
|
-
_getSession: SessionFn<TServices, TLogger, TSession> = () =>
|
|
61
|
+
_getSession: SessionFn<TServices, TLogger, TSession, TDatabase> = () =>
|
|
62
|
+
({}) as TSession;
|
|
62
63
|
_authorize: AuthorizeFn<TServices, TLogger, TSession> = () => true;
|
|
63
64
|
_rateLimit?: RateLimitConfig;
|
|
64
65
|
_availableAuthorizers: Authorizer[] = [];
|
|
@@ -40,7 +40,12 @@ export class EndpointFactory<
|
|
|
40
40
|
private defaultEventPublisher:
|
|
41
41
|
| Service<TEventPublisherServiceName, TEventPublisher>
|
|
42
42
|
| undefined;
|
|
43
|
-
private defaultSessionExtractor?: SessionFn<
|
|
43
|
+
private defaultSessionExtractor?: SessionFn<
|
|
44
|
+
TServices,
|
|
45
|
+
TLogger,
|
|
46
|
+
TSession,
|
|
47
|
+
TDatabase
|
|
48
|
+
>;
|
|
44
49
|
private defaultLogger: TLogger = DEFAULT_LOGGER;
|
|
45
50
|
private availableAuthorizers: Authorizer[] = [];
|
|
46
51
|
private defaultAuthorizerName?: TAuthorizers[number];
|
|
@@ -423,7 +428,7 @@ export class EndpointFactory<
|
|
|
423
428
|
}
|
|
424
429
|
|
|
425
430
|
session<T>(
|
|
426
|
-
session: SessionFn<TServices, TLogger, T>,
|
|
431
|
+
session: SessionFn<TServices, TLogger, T, TDatabase>,
|
|
427
432
|
): EndpointFactory<
|
|
428
433
|
TServices,
|
|
429
434
|
TBasePath,
|
|
@@ -513,7 +518,11 @@ export class EndpointFactory<
|
|
|
513
518
|
basePath: this.basePath,
|
|
514
519
|
defaultAuthorizeFn: this.defaultAuthorizeFn,
|
|
515
520
|
defaultLogger: this.defaultLogger,
|
|
516
|
-
|
|
521
|
+
// Reset session extractor when database changes - user should call .session() after .database()
|
|
522
|
+
// to get proper type inference for the new database type
|
|
523
|
+
defaultSessionExtractor: this.defaultSessionExtractor as unknown as
|
|
524
|
+
| SessionFn<TServices, TLogger, TSession, T>
|
|
525
|
+
| undefined,
|
|
517
526
|
defaultEventPublisher: this.defaultEventPublisher,
|
|
518
527
|
availableAuthorizers: this.availableAuthorizers,
|
|
519
528
|
defaultAuthorizerName: this.defaultAuthorizerName,
|
|
@@ -781,7 +790,7 @@ export interface EndpointFactoryOptions<
|
|
|
781
790
|
basePath?: TBasePath;
|
|
782
791
|
defaultAuthorizeFn?: AuthorizeFn<TServices, TLogger, TSession>;
|
|
783
792
|
defaultLogger?: TLogger;
|
|
784
|
-
defaultSessionExtractor?: SessionFn<TServices, TLogger, TSession>;
|
|
793
|
+
defaultSessionExtractor?: SessionFn<TServices, TLogger, TSession, TDatabase>;
|
|
785
794
|
defaultEventPublisher?: Service<TEventPublisherServiceName, TEventPublisher>;
|
|
786
795
|
defaultEvents?: MappedEvent<TEventPublisher, undefined>[];
|
|
787
796
|
availableAuthorizers?: Authorizer[];
|
|
@@ -298,12 +298,23 @@ export class HonoEndpoint<
|
|
|
298
298
|
|
|
299
299
|
const services = await serviceDiscovery.register(endpoint.services);
|
|
300
300
|
|
|
301
|
+
// Resolve database service early so it's available for session extraction
|
|
302
|
+
const rawDb = endpoint.databaseService
|
|
303
|
+
? await serviceDiscovery
|
|
304
|
+
.register([endpoint.databaseService])
|
|
305
|
+
.then(
|
|
306
|
+
(s) =>
|
|
307
|
+
s[endpoint.databaseService!.serviceName as keyof typeof s],
|
|
308
|
+
)
|
|
309
|
+
: undefined;
|
|
310
|
+
|
|
301
311
|
const session = await endpoint.getSession({
|
|
302
312
|
services,
|
|
303
313
|
logger,
|
|
304
314
|
header,
|
|
305
315
|
cookie,
|
|
306
|
-
|
|
316
|
+
...(rawDb !== undefined && { db: rawDb }),
|
|
317
|
+
} as any);
|
|
307
318
|
|
|
308
319
|
const isAuthorized = await endpoint.authorize({
|
|
309
320
|
header,
|
|
@@ -363,16 +374,6 @@ export class HonoEndpoint<
|
|
|
363
374
|
logger.warn('No auditor storage service available');
|
|
364
375
|
}
|
|
365
376
|
|
|
366
|
-
// Resolve database service if configured
|
|
367
|
-
const rawDb = endpoint.databaseService
|
|
368
|
-
? await serviceDiscovery
|
|
369
|
-
.register([endpoint.databaseService])
|
|
370
|
-
.then(
|
|
371
|
-
(s) =>
|
|
372
|
-
s[endpoint.databaseService!.serviceName as keyof typeof s],
|
|
373
|
-
)
|
|
374
|
-
: undefined;
|
|
375
|
-
|
|
376
377
|
// Execute handler with automatic audit transaction support
|
|
377
378
|
const result = await executeWithAuditTransaction(
|
|
378
379
|
auditContext,
|
|
@@ -480,8 +481,8 @@ export class HonoEndpoint<
|
|
|
480
481
|
if (HonoEndpoint.isDev) {
|
|
481
482
|
logger.info({ status, body: output }, 'Outgoing response');
|
|
482
483
|
}
|
|
483
|
-
|
|
484
|
-
return c.json(output
|
|
484
|
+
// @ts-ignore
|
|
485
|
+
return c.json(output, status);
|
|
485
486
|
} catch (validationError: any) {
|
|
486
487
|
logger.error(validationError, 'Output validation failed');
|
|
487
488
|
const error = wrapError(
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {
|
|
2
|
+
AuditActor,
|
|
3
|
+
AuditStorage,
|
|
4
|
+
AuditableAction,
|
|
5
|
+
} from '@geekmidas/audit';
|
|
2
6
|
import { DefaultAuditor } from '@geekmidas/audit';
|
|
3
7
|
import { EnvironmentParser } from '@geekmidas/envkit';
|
|
4
8
|
import type { EventPublisher } from '@geekmidas/events';
|
|
@@ -179,12 +183,17 @@ export class TestEndpointAdaptor<
|
|
|
179
183
|
host: ctx.headers.host,
|
|
180
184
|
method: this.endpoint.method,
|
|
181
185
|
}) as TLogger;
|
|
186
|
+
|
|
187
|
+
// Get database from context for session extraction
|
|
188
|
+
const rawDb = (ctx as any).database as TDatabase;
|
|
189
|
+
|
|
182
190
|
const session = await this.endpoint.getSession({
|
|
183
191
|
logger,
|
|
184
192
|
services: ctx.services,
|
|
185
193
|
header,
|
|
186
194
|
cookie,
|
|
187
|
-
|
|
195
|
+
...(rawDb !== undefined && { db: rawDb }),
|
|
196
|
+
} as any);
|
|
188
197
|
|
|
189
198
|
// Create audit context if audit storage is provided
|
|
190
199
|
// The auditorStorage instance is required when endpoint uses .auditor()
|
|
@@ -229,10 +238,6 @@ export class TestEndpointAdaptor<
|
|
|
229
238
|
logger.warn('No auditor storage service available');
|
|
230
239
|
}
|
|
231
240
|
|
|
232
|
-
// Use database instance directly from context
|
|
233
|
-
// The database instance is required when endpoint uses .database()
|
|
234
|
-
const rawDb = (ctx as any).database as TDatabase;
|
|
235
|
-
|
|
236
241
|
// Execute handler with automatic audit transaction support
|
|
237
242
|
const result = await executeWithAuditTransaction(
|
|
238
243
|
auditContext,
|
|
@@ -1073,7 +1073,7 @@ describe('HonoEndpointAdaptor', () => {
|
|
|
1073
1073
|
expect(error).toHaveProperty('message', 'Validation failed');
|
|
1074
1074
|
});
|
|
1075
1075
|
|
|
1076
|
-
it('should return empty
|
|
1076
|
+
it('should return empty response when no output schema is defined', async () => {
|
|
1077
1077
|
const endpoint = new Endpoint({
|
|
1078
1078
|
route: '/users/no-schema',
|
|
1079
1079
|
method: 'GET',
|
|
@@ -1097,7 +1097,8 @@ describe('HonoEndpointAdaptor', () => {
|
|
|
1097
1097
|
|
|
1098
1098
|
const response = await app.request('/users/no-schema');
|
|
1099
1099
|
expect(response.status).toBe(200);
|
|
1100
|
-
|
|
1100
|
+
// When no output schema is defined, response body is empty
|
|
1101
|
+
expect(await response.text()).toBe('');
|
|
1101
1102
|
});
|
|
1102
1103
|
});
|
|
1103
1104
|
});
|
|
@@ -71,13 +71,11 @@ describe('TestEndpointAdaptor with auditorStorage and database', () => {
|
|
|
71
71
|
it('should process declarative audits when auditorStorage is provided', async () => {
|
|
72
72
|
const auditStorage = new InMemoryAuditStorage();
|
|
73
73
|
|
|
74
|
-
const auditStorageService: Service<
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
register: vi.fn().mockResolvedValue(auditStorage),
|
|
80
|
-
};
|
|
74
|
+
const auditStorageService: Service<'auditStorage', InMemoryAuditStorage> =
|
|
75
|
+
{
|
|
76
|
+
serviceName: 'auditStorage' as const,
|
|
77
|
+
register: vi.fn().mockResolvedValue(auditStorage),
|
|
78
|
+
};
|
|
81
79
|
|
|
82
80
|
const outputSchema = z.object({ id: z.string(), email: z.string() });
|
|
83
81
|
|
|
@@ -123,13 +121,11 @@ describe('TestEndpointAdaptor with auditorStorage and database', () => {
|
|
|
123
121
|
it('should allow manual auditing via auditor in handler context', async () => {
|
|
124
122
|
const auditStorage = new InMemoryAuditStorage();
|
|
125
123
|
|
|
126
|
-
const auditStorageService: Service<
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
register: vi.fn().mockResolvedValue(auditStorage),
|
|
132
|
-
};
|
|
124
|
+
const auditStorageService: Service<'auditStorage', InMemoryAuditStorage> =
|
|
125
|
+
{
|
|
126
|
+
serviceName: 'auditStorage' as const,
|
|
127
|
+
register: vi.fn().mockResolvedValue(auditStorage),
|
|
128
|
+
};
|
|
133
129
|
|
|
134
130
|
const endpoint = e
|
|
135
131
|
.post('/users')
|
|
@@ -168,13 +164,11 @@ describe('TestEndpointAdaptor with auditorStorage and database', () => {
|
|
|
168
164
|
it('should extract actor from session when actorExtractor is configured', async () => {
|
|
169
165
|
const auditStorage = new InMemoryAuditStorage();
|
|
170
166
|
|
|
171
|
-
const auditStorageService: Service<
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
register: vi.fn().mockResolvedValue(auditStorage),
|
|
177
|
-
};
|
|
167
|
+
const auditStorageService: Service<'auditStorage', InMemoryAuditStorage> =
|
|
168
|
+
{
|
|
169
|
+
serviceName: 'auditStorage' as const,
|
|
170
|
+
register: vi.fn().mockResolvedValue(auditStorage),
|
|
171
|
+
};
|
|
178
172
|
|
|
179
173
|
const outputSchema = z.object({ id: z.string(), email: z.string() });
|
|
180
174
|
|
|
@@ -349,13 +343,11 @@ describe('TestEndpointAdaptor with auditorStorage and database', () => {
|
|
|
349
343
|
{ id: 'db-user-1', email: 'dbuser@example.com' },
|
|
350
344
|
]);
|
|
351
345
|
|
|
352
|
-
const auditStorageService: Service<
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
register: vi.fn().mockResolvedValue(auditStorage),
|
|
358
|
-
};
|
|
346
|
+
const auditStorageService: Service<'auditStorage', InMemoryAuditStorage> =
|
|
347
|
+
{
|
|
348
|
+
serviceName: 'auditStorage' as const,
|
|
349
|
+
register: vi.fn().mockResolvedValue(auditStorage),
|
|
350
|
+
};
|
|
359
351
|
|
|
360
352
|
const databaseService: Service<'database', MockDatabase> = {
|
|
361
353
|
serviceName: 'database' as const,
|
|
@@ -438,13 +430,11 @@ describe('TestEndpointAdaptor with auditorStorage and database', () => {
|
|
|
438
430
|
const mockDb = createMockDatabase();
|
|
439
431
|
(mockDb.query as any).mockResolvedValue([]);
|
|
440
432
|
|
|
441
|
-
const auditStorageService: Service<
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
register: vi.fn().mockResolvedValue(auditStorage),
|
|
447
|
-
};
|
|
433
|
+
const auditStorageService: Service<'auditStorage', InMemoryAuditStorage> =
|
|
434
|
+
{
|
|
435
|
+
serviceName: 'auditStorage' as const,
|
|
436
|
+
register: vi.fn().mockResolvedValue(auditStorage),
|
|
437
|
+
};
|
|
448
438
|
|
|
449
439
|
const databaseService: Service<'database', MockDatabase> = {
|
|
450
440
|
serviceName: 'database' as const,
|
|
@@ -508,13 +498,11 @@ describe('TestEndpointAdaptor with auditorStorage and database', () => {
|
|
|
508
498
|
it('should require auditorStorage when endpoint uses .auditor()', async () => {
|
|
509
499
|
const auditStorage = new InMemoryAuditStorage();
|
|
510
500
|
|
|
511
|
-
const auditStorageService: Service<
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
register: vi.fn().mockResolvedValue(auditStorage),
|
|
517
|
-
};
|
|
501
|
+
const auditStorageService: Service<'auditStorage', InMemoryAuditStorage> =
|
|
502
|
+
{
|
|
503
|
+
serviceName: 'auditStorage' as const,
|
|
504
|
+
register: vi.fn().mockResolvedValue(auditStorage),
|
|
505
|
+
};
|
|
518
506
|
|
|
519
507
|
const endpoint = e
|
|
520
508
|
.post('/users')
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AmazonApiGatewayEndpointAdaptor-BLUW--OF.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 TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction\n >","UnprocessableEntityError","UnauthorizedError","event: Event<TEvent, TInput, TServices, TLogger, TSession>","ResponseBuilder","metadata","output","result","lambdaResponse: AmazonApiGatewayEndpointHandlerResponse","setCookieHeaders: string[]"],"sources":["../src/endpoints/AmazonApiGatewayEndpointAdaptor.ts"],"sourcesContent":["import type { AuditStorage, AuditableAction } from '@geekmidas/audit';\nimport 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';\nimport type { CookieFn, HeaderFn } from './Endpoint';\nimport type { MappedAudit } from './audit';\nimport {\n createAuditContext,\n executeWithAuditTransaction,\n} from './processAudits';\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 TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\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 TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction\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 // Note: Audits are processed inside the handler's transaction\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\n // Publish events\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 const logger = event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n // Create audit context if audit storage is configured\n const auditContext = await createAuditContext(\n this.endpoint,\n serviceDiscovery,\n logger,\n {\n session: event.session,\n header: event.header,\n cookie: event.cookie,\n services: event.services as Record<string, unknown>,\n },\n );\n\n // Warn if declarative audits are configured but no audit storage\n const audits = this.endpoint.audits as MappedAudit<\n TAuditAction,\n TOutSchema\n >[];\n if (!auditContext && audits?.length) {\n logger.warn('No auditor storage service available');\n }\n\n // Resolve database service if configured\n const rawDb = this.endpoint.databaseService\n ? await serviceDiscovery\n .register([this.endpoint.databaseService])\n .then(\n (s) =>\n s[this.endpoint.databaseService!.serviceName as keyof typeof s],\n )\n : undefined;\n\n // Execute handler with automatic audit transaction support\n const result = await executeWithAuditTransaction(\n auditContext,\n async (auditor) => {\n // Use audit transaction as db only if the storage uses the same database service\n const sameDatabase =\n auditContext?.storage?.databaseServiceName &&\n auditContext.storage.databaseServiceName ===\n this.endpoint.databaseService?.serviceName;\n const db = sameDatabase\n ? (auditor?.getTransaction?.() ?? rawDb)\n : rawDb;\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 auditor,\n db,\n ...input,\n } as any,\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 return { output, metadata, responseBuilder };\n },\n // Process declarative audits after handler (inside transaction)\n async (result, auditor) => {\n if (!audits?.length) return;\n\n for (const audit of audits) {\n if (audit.when && !audit.when(result.output as any)) {\n continue;\n }\n const payload = audit.payload(result.output as any);\n const entityId = audit.entityId?.(result.output as any);\n auditor.audit(audit.type as any, payload as any, {\n table: audit.table,\n entityId,\n });\n }\n },\n );\n\n const { output, metadata } = result;\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: HeaderFn;\n cookie: CookieFn;\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":";;;;;;;;;;AAyCA,IAAsB,2BAAtB,MAoBE;CACA,YACYA,WACSC,UAcnB;EAfU;EACS;CAcjB;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;AAI7D,OAAI,0BAAS,gBAAgB,WAAW,EAAE;IACxC,MAAM,SAAS,MAAM;IACrB,MAAM,mBAAmB,sCAAiB,YAGxC,QAAQ,KAAK,UAAU;AAGzB,UAAM,yCACJ,KAAK,UACL,UACA,kBACA,OACD;GACF;EACF,EACF;CACF;CAED,MAAc,SACZC,OACA;EACA,MAAM,QAAQ,KAAK,SAAS,YAAY,MAAM;EAC9C,MAAM,SAAS,MAAM;EACrB,MAAM,mBAAmB,sCAAiB,YAGxC,QAAQ,KAAK,UAAU;EAGzB,MAAM,eAAe,MAAM,yCACzB,KAAK,UACL,kBACA,QACA;GACE,SAAS,MAAM;GACf,QAAQ,MAAM;GACd,QAAQ,MAAM;GACd,UAAU,MAAM;EACjB,EACF;EAGD,MAAM,SAAS,KAAK,SAAS;AAI7B,OAAK,gBAAgB,QAAQ,OAC3B,QAAO,KAAK,uCAAuC;EAIrD,MAAM,QAAQ,KAAK,SAAS,kBACxB,MAAM,iBACH,SAAS,CAAC,KAAK,SAAS,eAAgB,EAAC,CACzC,KACC,CAAC,MACC,EAAE,KAAK,SAAS,gBAAiB,aACpC;EAIP,MAAM,SAAS,MAAM,kDACnB,cACA,OAAO,YAAY;GAEjB,MAAM,eACJ,cAAc,SAAS,uBACvB,aAAa,QAAQ,wBACnB,KAAK,SAAS,iBAAiB;GACnC,MAAM,KAAK,eACN,SAAS,kBAAkB,IAAI,QAChC;GAEJ,MAAM,kBAAkB,IAAIC;GAC5B,MAAM,WAAW,MAAM,KAAK,SAAS,QACnC;IACE,QAAQ,MAAM;IACd,QAAQ,MAAM;IACd,QAAQ,MAAM;IACd,UAAU,MAAM;IAChB,SAAS,MAAM;IACf;IACA;IACA,GAAG;GACJ,GACD,gBACD;GAGD,IAAI,OAAO;GACX,IAAIC,aAAW,gBAAgB,aAAa;AAE5C,OAAI,0BAAS,YAAY,SAAS,EAAE;AAClC,WAAO,SAAS;AAChB,iBAAW,SAAS;GACrB;GAED,MAAMC,WAAS,KAAK,SAAS,eACzB,MAAM,KAAK,SAAS,YAAY,KAAK;AAGzC,UAAO;IAAE;IAAQ;IAAU;GAAiB;EAC7C,GAED,OAAOC,UAAQ,YAAY;AACzB,QAAK,QAAQ,OAAQ;AAErB,QAAK,MAAM,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,MAAM,KAAKA,SAAO,OAAc,CACjD;IAEF,MAAM,UAAU,MAAM,QAAQA,SAAO,OAAc;IACnD,MAAM,WAAW,MAAM,WAAWA,SAAO,OAAc;AACvD,YAAQ,MAAM,MAAM,MAAa,SAAgB;KAC/C,OAAO,MAAM;KACb;IACD,EAAC;GACH;EACF,EACF;EAED,MAAM,EAAE,QAAQ,UAAU,GAAG;EAC7B,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-DBK53gB5.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 TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction\n >","event: Event<TEvent, TInput, TServices, TLogger, TSession>","metadata","output","result","lambdaResponse: AmazonApiGatewayEndpointHandlerResponse","setCookieHeaders: string[]"],"sources":["../src/endpoints/AmazonApiGatewayEndpointAdaptor.ts"],"sourcesContent":["import type { AuditStorage, AuditableAction } from '@geekmidas/audit';\nimport 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';\nimport type { CookieFn, HeaderFn } from './Endpoint';\nimport type { MappedAudit } from './audit';\nimport {\n createAuditContext,\n executeWithAuditTransaction,\n} from './processAudits';\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 TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\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 TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction\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 // Note: Audits are processed inside the handler's transaction\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\n // Publish events\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 const logger = event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n // Create audit context if audit storage is configured\n const auditContext = await createAuditContext(\n this.endpoint,\n serviceDiscovery,\n logger,\n {\n session: event.session,\n header: event.header,\n cookie: event.cookie,\n services: event.services as Record<string, unknown>,\n },\n );\n\n // Warn if declarative audits are configured but no audit storage\n const audits = this.endpoint.audits as MappedAudit<\n TAuditAction,\n TOutSchema\n >[];\n if (!auditContext && audits?.length) {\n logger.warn('No auditor storage service available');\n }\n\n // Resolve database service if configured\n const rawDb = this.endpoint.databaseService\n ? await serviceDiscovery\n .register([this.endpoint.databaseService])\n .then(\n (s) =>\n s[this.endpoint.databaseService!.serviceName as keyof typeof s],\n )\n : undefined;\n\n // Execute handler with automatic audit transaction support\n const result = await executeWithAuditTransaction(\n auditContext,\n async (auditor) => {\n // Use audit transaction as db only if the storage uses the same database service\n const sameDatabase =\n auditContext?.storage?.databaseServiceName &&\n auditContext.storage.databaseServiceName ===\n this.endpoint.databaseService?.serviceName;\n const db = sameDatabase\n ? (auditor?.getTransaction?.() ?? rawDb)\n : rawDb;\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 auditor,\n db,\n ...input,\n } as any,\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 return { output, metadata, responseBuilder };\n },\n // Process declarative audits after handler (inside transaction)\n async (result, auditor) => {\n if (!audits?.length) return;\n\n for (const audit of audits) {\n if (audit.when && !audit.when(result.output as any)) {\n continue;\n }\n const payload = audit.payload(result.output as any);\n const entityId = audit.entityId?.(result.output as any);\n auditor.audit(audit.type as any, payload as any, {\n table: audit.table,\n entityId,\n });\n }\n },\n );\n\n const { output, metadata } = result;\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: HeaderFn;\n cookie: CookieFn;\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":"Cron-CmtKQOmE.cjs","names":["Function","obj: any","ConstructType","fn: FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>","timeout?: number","_schedule?: ScheduleExpression","input?: TInput","outputSchema?: OutSchema","services: TServices","logger?: TLogger","publisherService?: Service<TEventPublisherServiceName, TEventPublisher>","events: any[]","memorySize?: number","databaseService?: Service<TDatabaseServiceName, TDatabase>"],"sources":["../src/crons/Cron.ts"],"sourcesContent":["import type { Logger } from '@geekmidas/logger';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\n\nimport { ConstructType } from '../Construct';\nimport { Function, type FunctionHandler } from '../functions';\n\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { ComposableStandardSchema } from '@geekmidas/schema';\nimport type { Service } from '@geekmidas/services';\n\nexport class Cron<\n TInput extends ComposableStandardSchema | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TDatabase = undefined,\n TDatabaseServiceName extends string = string,\n> extends Function<\n TInput,\n TServices,\n TLogger,\n OutSchema,\n FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>,\n TEventPublisher,\n TEventPublisherServiceName,\n undefined,\n string,\n TDatabase,\n TDatabaseServiceName\n> {\n static isCron(obj: any): obj is Cron<any, any, any, any> {\n return Boolean(\n obj &&\n (obj as Function).__IS_FUNCTION__ === true &&\n obj.type === ConstructType.Cron,\n );\n }\n\n constructor(\n fn: FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>,\n timeout?: number,\n protected _schedule?: ScheduleExpression,\n input?: TInput,\n outputSchema?: OutSchema,\n services: TServices = [] as unknown as TServices,\n logger?: TLogger,\n publisherService?: Service<TEventPublisherServiceName, TEventPublisher>,\n events: any[] = [],\n memorySize?: number,\n databaseService?: Service<TDatabaseServiceName, TDatabase>,\n ) {\n super(\n fn,\n timeout,\n ConstructType.Cron,\n input,\n outputSchema,\n services,\n logger,\n publisherService,\n events,\n memorySize,\n undefined, // auditorStorageService\n databaseService,\n );\n }\n\n get schedule(): ScheduleExpression | undefined {\n return this._schedule;\n }\n}\n\nexport type RateExpression = `rate(${string})`;\n\ntype CronMinute =\n | '*'\n | number\n | `${number}`\n | `${number}-${number}`\n | `${number}/${number}`\n | `*/${number}`\n | `${number},${number}`\n | string; // Allow more complex patterns\n\ntype CronHour =\n | '*'\n | number\n | `${number}`\n | `${number}-${number}`\n | `${number}/${number}`\n | `*/${number}`\n | `${number},${number}`\n | string; // Allow more complex patterns\n\ntype CronDay =\n | '*'\n | number\n | `${number}`\n | `${number}-${number}`\n | `${number}/${number}`\n | `*/${number}`\n | `${number},${number}`\n | string; // Allow more complex patterns\n\ntype CronMonth =\n | '*'\n | number\n | `${number}`\n | `${number}-${number}`\n | `${number}/${number}`\n | `*/${number}`\n | 'JAN'\n | 'FEB'\n | 'MAR'\n | 'APR'\n | 'MAY'\n | 'JUN'\n | 'JUL'\n | 'AUG'\n | 'SEP'\n | 'OCT'\n | 'NOV'\n | 'DEC'\n | string; // Allow more complex patterns\n\ntype CronWeekday =\n | '*'\n | number\n | `${number}`\n | `${number}-${number}`\n | `${number}/${number}`\n | `*/${number}`\n | 'SUN'\n | 'MON'\n | 'TUE'\n | 'WED'\n | 'THU'\n | 'FRI'\n | 'SAT'\n | `${string}-${string}` // Allow patterns like MON-FRI\n | string; // Allow more complex patterns\n\nexport type CronExpression =\n `cron(${CronMinute} ${CronHour} ${CronDay} ${CronMonth} ${CronWeekday})`;\n\nexport type ScheduleExpression = RateExpression | CronExpression;\n"],"mappings":";;;;AAUA,IAAa,OAAb,cASUA,0BAYR;CACA,OAAO,OAAOC,KAA2C;AACvD,SAAO,QACL,OACG,IAAiB,oBAAoB,QACtC,IAAI,SAASC,gCAAc,KAC9B;CACF;CAED,YACEC,IACAC,SACUC,WACVC,OACAC,cACAC,WAAsB,CAAE,GACxBC,QACAC,kBACAC,SAAgB,CAAE,GAClBC,YACAC,iBACA;AACA,QACE,IACA,SACAX,gCAAc,MACd,OACA,cACA,UACA,QACA,kBACA,QACA,oBAEA,gBACD;EAvBS;CAwBX;CAED,IAAI,WAA2C;AAC7C,SAAO,KAAK;CACb;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Cron-mWi3PQxt.mjs","names":["obj: any","fn: FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>","timeout?: number","_schedule?: ScheduleExpression","input?: TInput","outputSchema?: OutSchema","services: TServices","logger?: TLogger","publisherService?: Service<TEventPublisherServiceName, TEventPublisher>","events: any[]","memorySize?: number","databaseService?: Service<TDatabaseServiceName, TDatabase>"],"sources":["../src/crons/Cron.ts"],"sourcesContent":["import type { Logger } from '@geekmidas/logger';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\n\nimport { ConstructType } from '../Construct';\nimport { Function, type FunctionHandler } from '../functions';\n\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { ComposableStandardSchema } from '@geekmidas/schema';\nimport type { Service } from '@geekmidas/services';\n\nexport class Cron<\n TInput extends ComposableStandardSchema | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n OutSchema extends StandardSchemaV1 | undefined = undefined,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TDatabase = undefined,\n TDatabaseServiceName extends string = string,\n> extends Function<\n TInput,\n TServices,\n TLogger,\n OutSchema,\n FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>,\n TEventPublisher,\n TEventPublisherServiceName,\n undefined,\n string,\n TDatabase,\n TDatabaseServiceName\n> {\n static isCron(obj: any): obj is Cron<any, any, any, any> {\n return Boolean(\n obj &&\n (obj as Function).__IS_FUNCTION__ === true &&\n obj.type === ConstructType.Cron,\n );\n }\n\n constructor(\n fn: FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>,\n timeout?: number,\n protected _schedule?: ScheduleExpression,\n input?: TInput,\n outputSchema?: OutSchema,\n services: TServices = [] as unknown as TServices,\n logger?: TLogger,\n publisherService?: Service<TEventPublisherServiceName, TEventPublisher>,\n events: any[] = [],\n memorySize?: number,\n databaseService?: Service<TDatabaseServiceName, TDatabase>,\n ) {\n super(\n fn,\n timeout,\n ConstructType.Cron,\n input,\n outputSchema,\n services,\n logger,\n publisherService,\n events,\n memorySize,\n undefined, // auditorStorageService\n databaseService,\n );\n }\n\n get schedule(): ScheduleExpression | undefined {\n return this._schedule;\n }\n}\n\nexport type RateExpression = `rate(${string})`;\n\ntype CronMinute =\n | '*'\n | number\n | `${number}`\n | `${number}-${number}`\n | `${number}/${number}`\n | `*/${number}`\n | `${number},${number}`\n | string; // Allow more complex patterns\n\ntype CronHour =\n | '*'\n | number\n | `${number}`\n | `${number}-${number}`\n | `${number}/${number}`\n | `*/${number}`\n | `${number},${number}`\n | string; // Allow more complex patterns\n\ntype CronDay =\n | '*'\n | number\n | `${number}`\n | `${number}-${number}`\n | `${number}/${number}`\n | `*/${number}`\n | `${number},${number}`\n | string; // Allow more complex patterns\n\ntype CronMonth =\n | '*'\n | number\n | `${number}`\n | `${number}-${number}`\n | `${number}/${number}`\n | `*/${number}`\n | 'JAN'\n | 'FEB'\n | 'MAR'\n | 'APR'\n | 'MAY'\n | 'JUN'\n | 'JUL'\n | 'AUG'\n | 'SEP'\n | 'OCT'\n | 'NOV'\n | 'DEC'\n | string; // Allow more complex patterns\n\ntype CronWeekday =\n | '*'\n | number\n | `${number}`\n | `${number}-${number}`\n | `${number}/${number}`\n | `*/${number}`\n | 'SUN'\n | 'MON'\n | 'TUE'\n | 'WED'\n | 'THU'\n | 'FRI'\n | 'SAT'\n | `${string}-${string}` // Allow patterns like MON-FRI\n | string; // Allow more complex patterns\n\nexport type CronExpression =\n `cron(${CronMinute} ${CronHour} ${CronDay} ${CronMonth} ${CronWeekday})`;\n\nexport type ScheduleExpression = RateExpression | CronExpression;\n"],"mappings":";;;;AAUA,IAAa,OAAb,cASU,SAYR;CACA,OAAO,OAAOA,KAA2C;AACvD,SAAO,QACL,OACG,IAAiB,oBAAoB,QACtC,IAAI,SAAS,cAAc,KAC9B;CACF;CAED,YACEC,IACAC,SACUC,WACVC,OACAC,cACAC,WAAsB,CAAE,GACxBC,QACAC,kBACAC,SAAgB,CAAE,GAClBC,YACAC,iBACA;AACA,QACE,IACA,SACA,cAAc,MACd,OACA,cACA,UACA,QACA,kBACA,QACA,oBAEA,gBACD;EAvBS;CAwBX;CAED,IAAI,WAA2C;AAC7C,SAAO,KAAK;CACb;AACF"}
|