@geekmidas/constructs 3.0.7 → 3.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/dist/{Construct-BXG8cFSm.cjs → Construct-B14miJ6P.cjs} +95 -10
- package/dist/Construct-B14miJ6P.cjs.map +1 -0
- package/dist/{Construct-BjpXFNxy.d.mts → Construct-CXqvzglu.d.cts} +11 -6
- package/dist/{Construct-BjpXFNxy.d.mts.map → Construct-CXqvzglu.d.cts.map} +1 -1
- package/dist/{Construct-CQ9zV58W.mjs → Construct-CdJY2DJS.mjs} +83 -9
- package/dist/Construct-CdJY2DJS.mjs.map +1 -0
- package/dist/{Construct-CX7HyFfT.d.cts → Construct-D0n7QTaI.d.mts} +13 -8
- package/dist/Construct-D0n7QTaI.d.mts.map +1 -0
- package/dist/{Endpoint-CGdCGJkC.d.cts → Endpoint-CE7qHX5S.d.cts} +143 -28
- package/dist/Endpoint-CE7qHX5S.d.cts.map +1 -0
- package/dist/{Endpoint-BET0JSZK.d.mts → Endpoint-NvjIednd.d.mts} +143 -28
- package/dist/Endpoint-NvjIednd.d.mts.map +1 -0
- package/dist/{HonoEndpointAdaptor-B5fKdLi7.cjs → HonoEndpointAdaptor-Dl8BW_9u.cjs} +91 -25
- package/dist/HonoEndpointAdaptor-Dl8BW_9u.cjs.map +1 -0
- package/dist/{HonoEndpointAdaptor-DOUODM7n.mjs → HonoEndpointAdaptor-nHYMdbBi.mjs} +74 -8
- package/dist/HonoEndpointAdaptor-nHYMdbBi.mjs.map +1 -0
- package/dist/{Subscriber-1rDE7HuM.d.cts → Subscriber-D8WkA8np.d.cts} +3 -3
- package/dist/{Subscriber-1rDE7HuM.d.cts.map → Subscriber-D8WkA8np.d.cts.map} +1 -1
- package/dist/{Subscriber-9ObcUdcC.d.mts → Subscriber-Tft61-YG.d.mts} +5 -5
- package/dist/Subscriber-Tft61-YG.d.mts.map +1 -0
- package/dist/adaptors/aws.cjs +742 -21
- package/dist/adaptors/aws.cjs.map +1 -0
- package/dist/adaptors/aws.d.cts +221 -17
- package/dist/adaptors/aws.d.cts.map +1 -0
- package/dist/adaptors/aws.d.mts +221 -17
- package/dist/adaptors/aws.d.mts.map +1 -0
- package/dist/adaptors/aws.mjs +739 -18
- package/dist/adaptors/aws.mjs.map +1 -0
- package/dist/adaptors/hono.cjs +5 -12
- package/dist/adaptors/hono.d.cts +52 -10
- package/dist/adaptors/hono.d.cts.map +1 -0
- package/dist/adaptors/hono.d.mts +52 -10
- package/dist/adaptors/hono.d.mts.map +1 -0
- package/dist/adaptors/hono.mjs +5 -12
- package/dist/adaptors/testing.cjs +392 -21
- package/dist/adaptors/testing.cjs.map +1 -0
- package/dist/adaptors/testing.d.cts +177 -14
- package/dist/adaptors/testing.d.cts.map +1 -0
- package/dist/adaptors/testing.d.mts +177 -14
- package/dist/adaptors/testing.d.mts.map +1 -0
- package/dist/adaptors/testing.mjs +388 -17
- package/dist/adaptors/testing.mjs.map +1 -0
- package/dist/crons/index.cjs +82 -10
- package/dist/crons/index.cjs.map +1 -1
- package/dist/crons/index.d.cts +44 -7
- package/dist/crons/index.d.cts.map +1 -1
- package/dist/crons/index.d.mts +45 -11
- package/dist/crons/index.d.mts.map +1 -1
- package/dist/crons/index.mjs +79 -7
- package/dist/crons/index.mjs.map +1 -1
- package/dist/endpoints/index.cjs +741 -23
- package/dist/endpoints/index.cjs.map +1 -1
- package/dist/endpoints/index.d.cts +336 -14
- package/dist/endpoints/index.d.cts.map +1 -1
- package/dist/endpoints/index.d.mts +335 -14
- package/dist/endpoints/index.d.mts.map +1 -1
- package/dist/endpoints/index.mjs +730 -12
- package/dist/endpoints/index.mjs.map +1 -1
- package/dist/functions/index.cjs +5 -8
- package/dist/functions/index.d.cts +2 -5
- package/dist/functions/index.d.mts +2 -5
- package/dist/functions/index.mjs +2 -5
- package/dist/functions-DiaRAdfp.cjs +2893 -0
- package/dist/functions-DiaRAdfp.cjs.map +1 -0
- package/dist/functions-GmSHFbpr.mjs +2864 -0
- package/dist/functions-GmSHFbpr.mjs.map +1 -0
- package/dist/index-Cq4fz8uM.d.mts +132 -0
- package/dist/index-Cq4fz8uM.d.mts.map +1 -0
- package/dist/index-CzIMpK-e.d.cts +135 -0
- package/dist/index-CzIMpK-e.d.cts.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +1 -1
- package/dist/lazyAccessors-5h-aWohM.mjs +1894 -0
- package/dist/lazyAccessors-5h-aWohM.mjs.map +1 -0
- package/dist/lazyAccessors-Bc1u42WC.cjs +1971 -0
- package/dist/lazyAccessors-Bc1u42WC.cjs.map +1 -0
- package/dist/processAudits-B0PbJf1Z.mjs +80 -0
- package/dist/processAudits-B0PbJf1Z.mjs.map +1 -0
- package/dist/processAudits-CUko08pi.cjs +92 -0
- package/dist/processAudits-CUko08pi.cjs.map +1 -0
- package/dist/subscribers/index.cjs +77 -6
- package/dist/subscribers/index.cjs.map +1 -1
- package/dist/subscribers/index.d.cts +27 -5
- package/dist/subscribers/index.d.cts.map +1 -1
- package/dist/subscribers/index.d.mts +26 -5
- package/dist/subscribers/index.d.mts.map +1 -1
- package/dist/subscribers/index.mjs +74 -3
- package/dist/subscribers/index.mjs.map +1 -1
- package/dist/{telemetry-BTaiRqPo.d.cts → telemetry-Bt0vK4ma.d.cts} +1 -1
- package/dist/{telemetry-BJo1gcV1.d.mts.map → telemetry-Bt0vK4ma.d.cts.map} +1 -1
- package/dist/{telemetry-BJo1gcV1.d.mts → telemetry-COvVBKBM.d.mts} +1 -1
- package/dist/{telemetry-BTaiRqPo.d.cts.map → telemetry-COvVBKBM.d.mts.map} +1 -1
- package/dist/{types-B5H3piDg.d.cts → types-B8YlI4cx.d.cts} +1 -1
- package/dist/{types-B5H3piDg.d.cts.map → types-B8YlI4cx.d.cts.map} +1 -1
- package/dist/{types-BqPOdHEm.d.mts → types-BA3eK4xj.d.mts} +1 -1
- package/dist/{types-BqPOdHEm.d.mts.map → types-BA3eK4xj.d.mts.map} +1 -1
- package/dist/types.d.cts +1 -1
- package/dist/types.d.mts +1 -1
- package/package.json +12 -12
- package/src/Construct.ts +26 -8
- package/src/__tests__/Construct.environment.spec.ts +123 -0
- package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +23 -4
- package/src/endpoints/Endpoint.ts +14 -1
- package/src/endpoints/EndpointBuilder.ts +25 -0
- package/src/endpoints/HonoEndpointAdaptor.ts +24 -1
- package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.responseType.spec.ts +111 -0
- package/src/endpoints/__tests__/Endpoint.spec.ts +29 -0
- package/src/endpoints/__tests__/EndpointBuilder.responseType.spec.ts +47 -0
- package/src/endpoints/__tests__/HonoEndpointAdaptor.responseType.spec.ts +128 -0
- package/src/endpoints/__tests__/MswEndpointAdaptor.spec.ts +1 -9
- package/tsdown.config.ts +30 -1
- package/dist/AWSLambdaFunction-CC8gMZhz.d.mts +0 -32
- package/dist/AWSLambdaFunction-CC8gMZhz.d.mts.map +0 -1
- package/dist/AWSLambdaFunction-CPEAl5nZ.cjs +0 -120
- package/dist/AWSLambdaFunction-CPEAl5nZ.cjs.map +0 -1
- package/dist/AWSLambdaFunction-DJiCAPAf.mjs +0 -114
- package/dist/AWSLambdaFunction-DJiCAPAf.mjs.map +0 -1
- package/dist/AWSLambdaFunction-tzqv5XU6.d.cts +0 -32
- package/dist/AWSLambdaFunction-tzqv5XU6.d.cts.map +0 -1
- package/dist/AWSLambdaSubscriberAdaptor-Cj1wjkUP.d.cts +0 -36
- package/dist/AWSLambdaSubscriberAdaptor-Cj1wjkUP.d.cts.map +0 -1
- package/dist/AWSLambdaSubscriberAdaptor-Cmx9OQGG.d.mts +0 -36
- package/dist/AWSLambdaSubscriberAdaptor-Cmx9OQGG.d.mts.map +0 -1
- package/dist/AWSLambdaSubscriberAdaptor-RKwKYLl1.mjs +0 -172
- package/dist/AWSLambdaSubscriberAdaptor-RKwKYLl1.mjs.map +0 -1
- package/dist/AWSLambdaSubscriberAdaptor-eZ3qoKvK.cjs +0 -178
- package/dist/AWSLambdaSubscriberAdaptor-eZ3qoKvK.cjs.map +0 -1
- package/dist/AmazonApiGatewayEndpointAdaptor-BIltcbAc.cjs +0 -277
- package/dist/AmazonApiGatewayEndpointAdaptor-BIltcbAc.cjs.map +0 -1
- package/dist/AmazonApiGatewayEndpointAdaptor-BpYtYCeW.mjs +0 -271
- package/dist/AmazonApiGatewayEndpointAdaptor-BpYtYCeW.mjs.map +0 -1
- package/dist/AmazonApiGatewayEndpointAdaptor-DA0rS_1Y.d.mts +0 -124
- package/dist/AmazonApiGatewayEndpointAdaptor-DA0rS_1Y.d.mts.map +0 -1
- package/dist/AmazonApiGatewayEndpointAdaptor-DqNcQGMf.d.cts +0 -124
- package/dist/AmazonApiGatewayEndpointAdaptor-DqNcQGMf.d.cts.map +0 -1
- package/dist/AmazonApiGatewayV1EndpointAdaptor-C7rJzNvG.d.mts +0 -23
- package/dist/AmazonApiGatewayV1EndpointAdaptor-C7rJzNvG.d.mts.map +0 -1
- package/dist/AmazonApiGatewayV1EndpointAdaptor-CRwyWT6t.mjs +0 -42
- package/dist/AmazonApiGatewayV1EndpointAdaptor-CRwyWT6t.mjs.map +0 -1
- package/dist/AmazonApiGatewayV1EndpointAdaptor-DEETT6Wj.cjs +0 -47
- package/dist/AmazonApiGatewayV1EndpointAdaptor-DEETT6Wj.cjs.map +0 -1
- package/dist/AmazonApiGatewayV1EndpointAdaptor-DcN2fYsv.d.cts +0 -23
- package/dist/AmazonApiGatewayV1EndpointAdaptor-DcN2fYsv.d.cts.map +0 -1
- package/dist/AmazonApiGatewayV2EndpointAdaptor-C2qO8FN6.cjs +0 -48
- package/dist/AmazonApiGatewayV2EndpointAdaptor-C2qO8FN6.cjs.map +0 -1
- package/dist/AmazonApiGatewayV2EndpointAdaptor-Cn9UoRgB.d.cts +0 -22
- package/dist/AmazonApiGatewayV2EndpointAdaptor-Cn9UoRgB.d.cts.map +0 -1
- package/dist/AmazonApiGatewayV2EndpointAdaptor-d7NP-bZX.d.mts +0 -22
- package/dist/AmazonApiGatewayV2EndpointAdaptor-d7NP-bZX.d.mts.map +0 -1
- package/dist/AmazonApiGatewayV2EndpointAdaptor-m9YKI294.mjs +0 -42
- package/dist/AmazonApiGatewayV2EndpointAdaptor-m9YKI294.mjs.map +0 -1
- package/dist/Authorizer-BZ1LcZFt.cjs +0 -92
- package/dist/Authorizer-BZ1LcZFt.cjs.map +0 -1
- package/dist/Authorizer-C5_FC_Rq.d.mts +0 -126
- package/dist/Authorizer-C5_FC_Rq.d.mts.map +0 -1
- package/dist/Authorizer-CZpg1Jqk.mjs +0 -68
- package/dist/Authorizer-CZpg1Jqk.mjs.map +0 -1
- package/dist/Authorizer-DWtwC8we.d.cts +0 -126
- package/dist/Authorizer-DWtwC8we.d.cts.map +0 -1
- package/dist/BaseFunctionBuilder-C-4hYTfj.d.cts +0 -42
- package/dist/BaseFunctionBuilder-C-4hYTfj.d.cts.map +0 -1
- package/dist/BaseFunctionBuilder-C3rQMoWb.mjs +0 -70
- package/dist/BaseFunctionBuilder-C3rQMoWb.mjs.map +0 -1
- package/dist/BaseFunctionBuilder-DXf6HK-N.cjs +0 -76
- package/dist/BaseFunctionBuilder-DXf6HK-N.cjs.map +0 -1
- package/dist/BaseFunctionBuilder-Q5qIlF-F.d.mts +0 -42
- package/dist/BaseFunctionBuilder-Q5qIlF-F.d.mts.map +0 -1
- package/dist/Construct-BXG8cFSm.cjs.map +0 -1
- package/dist/Construct-CQ9zV58W.mjs.map +0 -1
- package/dist/Construct-CX7HyFfT.d.cts.map +0 -1
- package/dist/Construct.cjs +0 -6
- package/dist/Construct.d.cts +0 -2
- package/dist/Construct.d.mts +0 -2
- package/dist/Construct.mjs +0 -3
- package/dist/Cron-BljK1gsV.d.mts +0 -26
- package/dist/Cron-BljK1gsV.d.mts.map +0 -1
- package/dist/Cron-C1vyfJ8B.cjs +0 -25
- package/dist/Cron-C1vyfJ8B.cjs.map +0 -1
- package/dist/Cron-CjWQEad0.mjs +0 -20
- package/dist/Cron-CjWQEad0.mjs.map +0 -1
- package/dist/Cron-CllHkk3z.d.cts +0 -26
- package/dist/Cron-CllHkk3z.d.cts.map +0 -1
- package/dist/CronBuilder-CAJFtnmZ.mjs +0 -68
- package/dist/CronBuilder-CAJFtnmZ.mjs.map +0 -1
- package/dist/CronBuilder-CG54f9LM.d.mts +0 -32
- package/dist/CronBuilder-CG54f9LM.d.mts.map +0 -1
- package/dist/CronBuilder-CSMd02lu.cjs +0 -74
- package/dist/CronBuilder-CSMd02lu.cjs.map +0 -1
- package/dist/CronBuilder-i23l40xs.d.cts +0 -32
- package/dist/CronBuilder-i23l40xs.d.cts.map +0 -1
- package/dist/Endpoint-BET0JSZK.d.mts.map +0 -1
- package/dist/Endpoint-BcxvF4F3.cjs +0 -440
- package/dist/Endpoint-BcxvF4F3.cjs.map +0 -1
- package/dist/Endpoint-CGdCGJkC.d.cts.map +0 -1
- package/dist/Endpoint-DvY3aqAy.mjs +0 -422
- package/dist/Endpoint-DvY3aqAy.mjs.map +0 -1
- package/dist/EndpointBuilder-6kdrQyIh.d.mts +0 -146
- package/dist/EndpointBuilder-6kdrQyIh.d.mts.map +0 -1
- package/dist/EndpointBuilder-CSwIguiR.d.cts +0 -146
- package/dist/EndpointBuilder-CSwIguiR.d.cts.map +0 -1
- package/dist/EndpointBuilder-EptJojG9.cjs +0 -268
- package/dist/EndpointBuilder-EptJojG9.cjs.map +0 -1
- package/dist/EndpointBuilder-iDpnACRb.mjs +0 -262
- package/dist/EndpointBuilder-iDpnACRb.mjs.map +0 -1
- package/dist/EndpointFactory-CBagQW5j.d.mts +0 -142
- package/dist/EndpointFactory-CBagQW5j.d.mts.map +0 -1
- package/dist/EndpointFactory-D2QxeaAh.cjs +0 -393
- package/dist/EndpointFactory-D2QxeaAh.cjs.map +0 -1
- package/dist/EndpointFactory-DQYSH8XK.d.cts +0 -142
- package/dist/EndpointFactory-DQYSH8XK.d.cts.map +0 -1
- package/dist/EndpointFactory-wgcqWod-.mjs +0 -381
- package/dist/EndpointFactory-wgcqWod-.mjs.map +0 -1
- package/dist/Function-CwlB89lS.d.cts +0 -76
- package/dist/Function-CwlB89lS.d.cts.map +0 -1
- package/dist/Function-D74HrBnX.d.mts +0 -76
- package/dist/Function-D74HrBnX.d.mts.map +0 -1
- package/dist/Function-DgQ_no6B.cjs +0 -84
- package/dist/Function-DgQ_no6B.cjs.map +0 -1
- package/dist/Function-xfQbftdE.mjs +0 -72
- package/dist/Function-xfQbftdE.mjs.map +0 -1
- package/dist/FunctionBuilder-CBeqX18X.mjs +0 -80
- package/dist/FunctionBuilder-CBeqX18X.mjs.map +0 -1
- package/dist/FunctionBuilder-C_qPxC8g.d.mts +0 -40
- package/dist/FunctionBuilder-C_qPxC8g.d.mts.map +0 -1
- package/dist/FunctionBuilder-C_xG9As7.cjs +0 -86
- package/dist/FunctionBuilder-C_xG9As7.cjs.map +0 -1
- package/dist/FunctionBuilder-D_7f5MfS.d.cts +0 -40
- package/dist/FunctionBuilder-D_7f5MfS.d.cts.map +0 -1
- package/dist/FunctionExecutionWrapper-B0ZAssiy.mjs +0 -101
- package/dist/FunctionExecutionWrapper-B0ZAssiy.mjs.map +0 -1
- package/dist/FunctionExecutionWrapper-Cg8HjuHL.d.cts +0 -50
- package/dist/FunctionExecutionWrapper-Cg8HjuHL.d.cts.map +0 -1
- package/dist/FunctionExecutionWrapper-KKHP6fDY.cjs +0 -107
- package/dist/FunctionExecutionWrapper-KKHP6fDY.cjs.map +0 -1
- package/dist/FunctionExecutionWrapper-xbTmBARx.d.mts +0 -50
- package/dist/FunctionExecutionWrapper-xbTmBARx.d.mts.map +0 -1
- package/dist/HonoEndpointAdaptor-B5fKdLi7.cjs.map +0 -1
- package/dist/HonoEndpointAdaptor-C2deTEwW.d.mts +0 -50
- package/dist/HonoEndpointAdaptor-C2deTEwW.d.mts.map +0 -1
- package/dist/HonoEndpointAdaptor-D3IgM-0B.d.cts +0 -50
- package/dist/HonoEndpointAdaptor-D3IgM-0B.d.cts.map +0 -1
- package/dist/HonoEndpointAdaptor-DOUODM7n.mjs.map +0 -1
- package/dist/MswEndpointAdaptor-B41INCc7.mjs +0 -108
- package/dist/MswEndpointAdaptor-B41INCc7.mjs.map +0 -1
- package/dist/MswEndpointAdaptor-CA_fu6Wx.cjs +0 -120
- package/dist/MswEndpointAdaptor-CA_fu6Wx.cjs.map +0 -1
- package/dist/MswEndpointAdaptor-CXgYbOxw.d.mts +0 -101
- package/dist/MswEndpointAdaptor-CXgYbOxw.d.mts.map +0 -1
- package/dist/MswEndpointAdaptor-CsYvrQeB.d.cts +0 -101
- package/dist/MswEndpointAdaptor-CsYvrQeB.d.cts.map +0 -1
- package/dist/Subscriber-9ObcUdcC.d.mts.map +0 -1
- package/dist/Subscriber-BH76wgkL.mjs +0 -28
- package/dist/Subscriber-BH76wgkL.mjs.map +0 -1
- package/dist/Subscriber-BgspJeS4.cjs +0 -34
- package/dist/Subscriber-BgspJeS4.cjs.map +0 -1
- package/dist/SubscriberBuilder-B4md5wzs.mjs +0 -54
- package/dist/SubscriberBuilder-B4md5wzs.mjs.map +0 -1
- package/dist/SubscriberBuilder-Be7WBbCL.d.cts +0 -28
- package/dist/SubscriberBuilder-Be7WBbCL.d.cts.map +0 -1
- package/dist/SubscriberBuilder-BtL22ZJ9.cjs +0 -60
- package/dist/SubscriberBuilder-BtL22ZJ9.cjs.map +0 -1
- package/dist/SubscriberBuilder-DsfIkgTF.d.mts +0 -28
- package/dist/SubscriberBuilder-DsfIkgTF.d.mts.map +0 -1
- package/dist/TestEndpointAdaptor-BFmgf7Fn.mjs +0 -174
- package/dist/TestEndpointAdaptor-BFmgf7Fn.mjs.map +0 -1
- package/dist/TestEndpointAdaptor-C79Z-QS4.d.mts +0 -45
- package/dist/TestEndpointAdaptor-C79Z-QS4.d.mts.map +0 -1
- package/dist/TestEndpointAdaptor-DYLDyAAC.cjs +0 -180
- package/dist/TestEndpointAdaptor-DYLDyAAC.cjs.map +0 -1
- package/dist/TestEndpointAdaptor-pM8yskbb.d.cts +0 -45
- package/dist/TestEndpointAdaptor-pM8yskbb.d.cts.map +0 -1
- package/dist/TestFunctionAdaptor-B859kIeb.cjs +0 -81
- package/dist/TestFunctionAdaptor-B859kIeb.cjs.map +0 -1
- package/dist/TestFunctionAdaptor-C0A-VqnM.d.mts +0 -30
- package/dist/TestFunctionAdaptor-C0A-VqnM.d.mts.map +0 -1
- package/dist/TestFunctionAdaptor-CqdSlhx1.mjs +0 -75
- package/dist/TestFunctionAdaptor-CqdSlhx1.mjs.map +0 -1
- package/dist/TestFunctionAdaptor-Dbq55dKP.d.cts +0 -30
- package/dist/TestFunctionAdaptor-Dbq55dKP.d.cts.map +0 -1
- package/dist/TestSubscriberAdaptor-BEyCFP9G.d.mts +0 -26
- package/dist/TestSubscriberAdaptor-BEyCFP9G.d.mts.map +0 -1
- package/dist/TestSubscriberAdaptor-BknOLRQw.d.cts +0 -26
- package/dist/TestSubscriberAdaptor-BknOLRQw.d.cts.map +0 -1
- package/dist/TestSubscriberAdaptor-CCcviuKa.mjs +0 -51
- package/dist/TestSubscriberAdaptor-CCcviuKa.mjs.map +0 -1
- package/dist/TestSubscriberAdaptor-_69o1d0f.cjs +0 -57
- package/dist/TestSubscriberAdaptor-_69o1d0f.cjs.map +0 -1
- package/dist/chunk-CUT6urMc.cjs +0 -30
- package/dist/crons/Cron.cjs +0 -8
- package/dist/crons/Cron.d.cts +0 -7
- package/dist/crons/Cron.d.mts +0 -7
- package/dist/crons/Cron.mjs +0 -8
- package/dist/crons/CronBuilder.cjs +0 -9
- package/dist/crons/CronBuilder.d.cts +0 -8
- package/dist/crons/CronBuilder.d.mts +0 -8
- package/dist/crons/CronBuilder.mjs +0 -9
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +0 -11
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +0 -11
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +0 -11
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +0 -11
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +0 -13
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +0 -12
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +0 -12
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +0 -13
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +0 -13
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +0 -12
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +0 -12
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +0 -13
- package/dist/endpoints/Authorizer.cjs +0 -6
- package/dist/endpoints/Authorizer.d.cts +0 -2
- package/dist/endpoints/Authorizer.d.mts +0 -2
- package/dist/endpoints/Authorizer.mjs +0 -3
- package/dist/endpoints/Endpoint.cjs +0 -10
- package/dist/endpoints/Endpoint.d.cts +0 -9
- package/dist/endpoints/Endpoint.d.mts +0 -9
- package/dist/endpoints/Endpoint.mjs +0 -8
- package/dist/endpoints/EndpointBuilder.cjs +0 -11
- package/dist/endpoints/EndpointBuilder.d.cts +0 -10
- package/dist/endpoints/EndpointBuilder.d.mts +0 -10
- package/dist/endpoints/EndpointBuilder.mjs +0 -11
- package/dist/endpoints/EndpointFactory.cjs +0 -13
- package/dist/endpoints/EndpointFactory.d.cts +0 -11
- package/dist/endpoints/EndpointFactory.d.mts +0 -11
- package/dist/endpoints/EndpointFactory.mjs +0 -12
- package/dist/endpoints/HonoEndpointAdaptor.cjs +0 -14
- package/dist/endpoints/HonoEndpointAdaptor.d.cts +0 -10
- package/dist/endpoints/HonoEndpointAdaptor.d.mts +0 -10
- package/dist/endpoints/HonoEndpointAdaptor.mjs +0 -14
- package/dist/endpoints/MswEndpointAdaptor.cjs +0 -16
- package/dist/endpoints/MswEndpointAdaptor.d.cts +0 -10
- package/dist/endpoints/MswEndpointAdaptor.d.mts +0 -10
- package/dist/endpoints/MswEndpointAdaptor.mjs +0 -15
- package/dist/endpoints/TestEndpointAdaptor.cjs +0 -12
- package/dist/endpoints/TestEndpointAdaptor.d.cts +0 -10
- package/dist/endpoints/TestEndpointAdaptor.d.mts +0 -10
- package/dist/endpoints/TestEndpointAdaptor.mjs +0 -12
- package/dist/endpoints/audit.cjs +0 -0
- package/dist/endpoints/audit.d.cts +0 -9
- package/dist/endpoints/audit.d.mts +0 -9
- package/dist/endpoints/audit.mjs +0 -0
- package/dist/endpoints/helpers.cjs +0 -10
- package/dist/endpoints/helpers.d.cts +0 -60
- package/dist/endpoints/helpers.d.cts.map +0 -1
- package/dist/endpoints/helpers.d.mts +0 -60
- package/dist/endpoints/helpers.d.mts.map +0 -1
- package/dist/endpoints/helpers.mjs +0 -9
- package/dist/endpoints/lazyAccessors.cjs +0 -10
- package/dist/endpoints/lazyAccessors.d.cts +0 -10
- package/dist/endpoints/lazyAccessors.d.mts +0 -10
- package/dist/endpoints/lazyAccessors.mjs +0 -3
- package/dist/endpoints/parseHonoQuery.cjs +0 -3
- package/dist/endpoints/parseHonoQuery.d.cts +0 -14
- package/dist/endpoints/parseHonoQuery.d.cts.map +0 -1
- package/dist/endpoints/parseHonoQuery.d.mts +0 -14
- package/dist/endpoints/parseHonoQuery.d.mts.map +0 -1
- package/dist/endpoints/parseHonoQuery.mjs +0 -3
- package/dist/endpoints/parseQueryParams.cjs +0 -3
- package/dist/endpoints/parseQueryParams.d.cts +0 -14
- package/dist/endpoints/parseQueryParams.d.cts.map +0 -1
- package/dist/endpoints/parseQueryParams.d.mts +0 -14
- package/dist/endpoints/parseQueryParams.d.mts.map +0 -1
- package/dist/endpoints/parseQueryParams.mjs +0 -3
- package/dist/endpoints/processAudits.cjs +0 -5
- package/dist/endpoints/processAudits.d.cts +0 -95
- package/dist/endpoints/processAudits.d.cts.map +0 -1
- package/dist/endpoints/processAudits.d.mts +0 -95
- package/dist/endpoints/processAudits.d.mts.map +0 -1
- package/dist/endpoints/processAudits.mjs +0 -3
- package/dist/endpoints/rls.cjs +0 -3
- package/dist/endpoints/rls.d.cts +0 -9
- package/dist/endpoints/rls.d.mts +0 -9
- package/dist/endpoints/rls.mjs +0 -3
- package/dist/functions/AWSLambdaFunction.cjs +0 -9
- package/dist/functions/AWSLambdaFunction.d.cts +0 -5
- package/dist/functions/AWSLambdaFunction.d.mts +0 -5
- package/dist/functions/AWSLambdaFunction.mjs +0 -9
- package/dist/functions/BaseFunctionBuilder.cjs +0 -4
- package/dist/functions/BaseFunctionBuilder.d.cts +0 -3
- package/dist/functions/BaseFunctionBuilder.d.mts +0 -3
- package/dist/functions/BaseFunctionBuilder.mjs +0 -4
- package/dist/functions/Function.cjs +0 -5
- package/dist/functions/Function.d.cts +0 -3
- package/dist/functions/Function.d.mts +0 -3
- package/dist/functions/Function.mjs +0 -4
- package/dist/functions/FunctionBuilder.cjs +0 -6
- package/dist/functions/FunctionBuilder.d.cts +0 -5
- package/dist/functions/FunctionBuilder.d.mts +0 -5
- package/dist/functions/FunctionBuilder.mjs +0 -6
- package/dist/functions/FunctionExecutionWrapper.cjs +0 -8
- package/dist/functions/FunctionExecutionWrapper.d.cts +0 -4
- package/dist/functions/FunctionExecutionWrapper.d.mts +0 -4
- package/dist/functions/FunctionExecutionWrapper.mjs +0 -8
- package/dist/functions/TestFunctionAdaptor.cjs +0 -8
- package/dist/functions/TestFunctionAdaptor.d.cts +0 -4
- package/dist/functions/TestFunctionAdaptor.d.mts +0 -4
- package/dist/functions/TestFunctionAdaptor.mjs +0 -8
- package/dist/functions-B1mrMoUH.mjs +0 -8
- package/dist/functions-B1mrMoUH.mjs.map +0 -1
- package/dist/functions-rOD3pXQd.cjs +0 -13
- package/dist/functions-rOD3pXQd.cjs.map +0 -1
- package/dist/helpers-BYyX0qTA.cjs +0 -95
- package/dist/helpers-BYyX0qTA.cjs.map +0 -1
- package/dist/helpers-BtwC2IW8.mjs +0 -83
- package/dist/helpers-BtwC2IW8.mjs.map +0 -1
- package/dist/index-BfeupgMl.d.cts +0 -12
- package/dist/index-BfeupgMl.d.cts.map +0 -1
- package/dist/index-Cg2UDz1r.d.mts +0 -12
- package/dist/index-Cg2UDz1r.d.mts.map +0 -1
- package/dist/lazyAccessors-BVEtB9lU.cjs +0 -223
- package/dist/lazyAccessors-BVEtB9lU.cjs.map +0 -1
- package/dist/lazyAccessors-Bxy5DBp4.d.cts +0 -49
- package/dist/lazyAccessors-Bxy5DBp4.d.cts.map +0 -1
- package/dist/lazyAccessors-CWFdtzSR.d.mts +0 -49
- package/dist/lazyAccessors-CWFdtzSR.d.mts.map +0 -1
- package/dist/lazyAccessors-DM6HcXQk.mjs +0 -175
- package/dist/lazyAccessors-DM6HcXQk.mjs.map +0 -1
- package/dist/parseHonoQuery-BBs8CX-H.cjs +0 -24
- package/dist/parseHonoQuery-BBs8CX-H.cjs.map +0 -1
- package/dist/parseHonoQuery-Cp8CII0P.mjs +0 -18
- package/dist/parseHonoQuery-Cp8CII0P.mjs.map +0 -1
- package/dist/parseQueryParams-B4RK1za3.cjs +0 -31
- package/dist/parseQueryParams-B4RK1za3.cjs.map +0 -1
- package/dist/parseQueryParams-DS3Qmrbd.mjs +0 -25
- package/dist/parseQueryParams-DS3Qmrbd.mjs.map +0 -1
- package/dist/processAudits-CzHkPokQ.cjs +0 -180
- package/dist/processAudits-CzHkPokQ.cjs.map +0 -1
- package/dist/processAudits-Dj8UGqcW.mjs +0 -162
- package/dist/processAudits-Dj8UGqcW.mjs.map +0 -1
- package/dist/publisher-BUDHcaz3.d.cts +0 -16
- package/dist/publisher-BUDHcaz3.d.cts.map +0 -1
- package/dist/publisher-Bw4770Hi.mjs +0 -41
- package/dist/publisher-Bw4770Hi.mjs.map +0 -1
- package/dist/publisher-DXglijK_.d.mts +0 -16
- package/dist/publisher-DXglijK_.d.mts.map +0 -1
- package/dist/publisher-lFQleddL.cjs +0 -53
- package/dist/publisher-lFQleddL.cjs.map +0 -1
- package/dist/publisher.cjs +0 -4
- package/dist/publisher.d.cts +0 -3
- package/dist/publisher.d.mts +0 -3
- package/dist/publisher.mjs +0 -3
- package/dist/rls-C0r4UKVm.mjs +0 -9
- package/dist/rls-C0r4UKVm.mjs.map +0 -1
- package/dist/rls-Cfb6w-tQ.cjs +0 -15
- package/dist/rls-Cfb6w-tQ.cjs.map +0 -1
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.cjs +0 -3
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.cts +0 -4
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +0 -4
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.mjs +0 -3
- package/dist/subscribers/Subscriber.cjs +0 -4
- package/dist/subscribers/Subscriber.d.cts +0 -3
- package/dist/subscribers/Subscriber.d.mts +0 -3
- package/dist/subscribers/Subscriber.mjs +0 -4
- package/dist/subscribers/SubscriberBuilder.cjs +0 -5
- package/dist/subscribers/SubscriberBuilder.d.cts +0 -4
- package/dist/subscribers/SubscriberBuilder.d.mts +0 -4
- package/dist/subscribers/SubscriberBuilder.mjs +0 -5
- package/dist/subscribers/TestSubscriberAdaptor.cjs +0 -4
- package/dist/subscribers/TestSubscriberAdaptor.d.cts +0 -4
- package/dist/subscribers/TestSubscriberAdaptor.d.mts +0 -4
- package/dist/subscribers/TestSubscriberAdaptor.mjs +0 -4
- package/dist/telemetry.cjs +0 -0
- package/dist/telemetry.d.cts +0 -2
- package/dist/telemetry.d.mts +0 -2
- package/dist/telemetry.mjs +0 -0
|
@@ -61,6 +61,7 @@ export class EndpointBuilder<
|
|
|
61
61
|
protected _status?: SuccessStatus;
|
|
62
62
|
protected _tags?: string[];
|
|
63
63
|
protected _memorySize?: number;
|
|
64
|
+
protected _responseType: string = 'application/json';
|
|
64
65
|
_getSession: SessionFn<TServices, TLogger, TSession, TDatabase> = () =>
|
|
65
66
|
({}) as TSession;
|
|
66
67
|
_authorize: AuthorizeFn<TServices, TLogger, TSession, TInput, TDatabase> =
|
|
@@ -127,6 +128,29 @@ export class EndpointBuilder<
|
|
|
127
128
|
return this;
|
|
128
129
|
}
|
|
129
130
|
|
|
131
|
+
/**
|
|
132
|
+
* Set the response content type for this endpoint.
|
|
133
|
+
*
|
|
134
|
+
* Defaults to `'application/json'`. When set to any other value
|
|
135
|
+
* (e.g. `'text/html'`, `'text/plain'`), the response body is emitted
|
|
136
|
+
* as-is rather than JSON-serialized, and the `Content-Type` header
|
|
137
|
+
* reflects the declared value. Runtime overrides via `r.header()` still win.
|
|
138
|
+
*
|
|
139
|
+
* @param type - The MIME type to return (e.g. `'text/html'`)
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```typescript
|
|
143
|
+
* e.get('/checkout-page')
|
|
144
|
+
* .output(z.string())
|
|
145
|
+
* .responseType('text/html')
|
|
146
|
+
* .handle(async () => '<html>...</html>');
|
|
147
|
+
* ```
|
|
148
|
+
*/
|
|
149
|
+
responseType(type: string): this {
|
|
150
|
+
this._responseType = type;
|
|
151
|
+
return this;
|
|
152
|
+
}
|
|
153
|
+
|
|
130
154
|
override publisher<T extends EventPublisher<any>, TName extends string>(
|
|
131
155
|
publisher: Service<TName, T>,
|
|
132
156
|
): EndpointBuilder<
|
|
@@ -728,6 +752,7 @@ export class EndpointBuilder<
|
|
|
728
752
|
databaseService: this._databaseService,
|
|
729
753
|
rlsConfig: this._rlsConfig,
|
|
730
754
|
rlsBypass: this._rlsBypass,
|
|
755
|
+
responseType: this._responseType,
|
|
731
756
|
});
|
|
732
757
|
}
|
|
733
758
|
}
|
|
@@ -68,6 +68,16 @@ interface EndpointFeatures {
|
|
|
68
68
|
hasRls: boolean;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
+
/**
|
|
72
|
+
* Case-insensitive check for a `content-type` header in a metadata headers map.
|
|
73
|
+
*/
|
|
74
|
+
function hasContentTypeHeader(headers: Record<string, string>): boolean {
|
|
75
|
+
for (const key of Object.keys(headers)) {
|
|
76
|
+
if (key.toLowerCase() === 'content-type') return true;
|
|
77
|
+
}
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
|
|
71
81
|
/**
|
|
72
82
|
* Analyze endpoint features at registration time (not per-request)
|
|
73
83
|
*/
|
|
@@ -591,8 +601,21 @@ export class HonoEndpoint<
|
|
|
591
601
|
logger.info({ status, body: output }, 'Outgoing response');
|
|
592
602
|
}
|
|
593
603
|
|
|
604
|
+
// Respect the endpoint's declared responseType. For JSON (default)
|
|
605
|
+
// we use c.json() which sets Content-Type and serializes. For any
|
|
606
|
+
// other type, emit the body as-is and set the header explicitly —
|
|
607
|
+
// metadata.headers (from r.header()) applied above still wins.
|
|
608
|
+
if (endpoint.responseType === 'application/json') {
|
|
609
|
+
// @ts-expect-error
|
|
610
|
+
return c.json(output, status);
|
|
611
|
+
}
|
|
612
|
+
if (
|
|
613
|
+
!(metadata.headers && hasContentTypeHeader(metadata.headers))
|
|
614
|
+
) {
|
|
615
|
+
c.header('content-type', endpoint.responseType);
|
|
616
|
+
}
|
|
594
617
|
// @ts-expect-error
|
|
595
|
-
return c.
|
|
618
|
+
return c.body(output as any, status);
|
|
596
619
|
} catch (validationError: any) {
|
|
597
620
|
logger.error(validationError, 'Output validation failed');
|
|
598
621
|
const error = wrapError(
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { EnvironmentParser } from '@geekmidas/envkit';
|
|
2
|
+
import { createMockContext, createMockV2Event } from '@geekmidas/testkit/aws';
|
|
3
|
+
import type { Context } from 'aws-lambda';
|
|
4
|
+
import { beforeEach, describe, expect, it } from 'vitest';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { AmazonApiGatewayV2Endpoint } from '../AmazonApiGatewayV2EndpointAdaptor';
|
|
7
|
+
import { e } from '../EndpointFactory';
|
|
8
|
+
|
|
9
|
+
describe('AmazonApiGatewayV2Endpoint — responseType', () => {
|
|
10
|
+
let envParser: EnvironmentParser<{}>;
|
|
11
|
+
let mockContext: Context;
|
|
12
|
+
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
envParser = new EnvironmentParser({});
|
|
15
|
+
mockContext = createMockContext();
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('JSON-stringifies body with no content-type header when responseType is default', async () => {
|
|
19
|
+
const endpoint = e
|
|
20
|
+
.get('/users/:id')
|
|
21
|
+
.params(z.object({ id: z.string() }))
|
|
22
|
+
.output(z.object({ id: z.string() }))
|
|
23
|
+
.handle(async ({ params }) => ({ id: params.id }));
|
|
24
|
+
|
|
25
|
+
const adapter = new AmazonApiGatewayV2Endpoint(envParser, endpoint);
|
|
26
|
+
|
|
27
|
+
const event = createMockV2Event({
|
|
28
|
+
routeKey: 'GET /users/{id}',
|
|
29
|
+
rawPath: '/users/123',
|
|
30
|
+
pathParameters: { id: '123' },
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const response = await adapter.handler(event, mockContext);
|
|
34
|
+
|
|
35
|
+
expect(response.statusCode).toBe(200);
|
|
36
|
+
expect(response.body).toBe(JSON.stringify({ id: '123' }));
|
|
37
|
+
// Default JSON responseType should not inject a default content-type
|
|
38
|
+
expect(response.headers?.['content-type']).toBeUndefined();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('emits raw string body and text/html header when responseType is text/html', async () => {
|
|
42
|
+
const html = '<html><body>Checkout</body></html>';
|
|
43
|
+
const endpoint = e
|
|
44
|
+
.get('/checkout-page')
|
|
45
|
+
.output(z.string())
|
|
46
|
+
.responseType('text/html')
|
|
47
|
+
.handle(async () => html);
|
|
48
|
+
|
|
49
|
+
const adapter = new AmazonApiGatewayV2Endpoint(envParser, endpoint);
|
|
50
|
+
|
|
51
|
+
const event = createMockV2Event({
|
|
52
|
+
routeKey: 'GET /checkout-page',
|
|
53
|
+
rawPath: '/checkout-page',
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
const response = await adapter.handler(event, mockContext);
|
|
57
|
+
|
|
58
|
+
expect(response.statusCode).toBe(200);
|
|
59
|
+
// Body emitted as-is, NOT JSON-encoded (would be `"<html>..."`)
|
|
60
|
+
expect(response.body).toBe(html);
|
|
61
|
+
expect(response.body?.startsWith('"')).toBe(false);
|
|
62
|
+
expect(response.headers?.['content-type']).toBe('text/html');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('emits raw plain text for text/plain', async () => {
|
|
66
|
+
const endpoint = e
|
|
67
|
+
.get('/robots.txt')
|
|
68
|
+
.output(z.string())
|
|
69
|
+
.responseType('text/plain')
|
|
70
|
+
.handle(async () => 'User-agent: *');
|
|
71
|
+
|
|
72
|
+
const adapter = new AmazonApiGatewayV2Endpoint(envParser, endpoint);
|
|
73
|
+
|
|
74
|
+
const event = createMockV2Event({
|
|
75
|
+
routeKey: 'GET /robots.txt',
|
|
76
|
+
rawPath: '/robots.txt',
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
const response = await adapter.handler(event, mockContext);
|
|
80
|
+
|
|
81
|
+
expect(response.statusCode).toBe(200);
|
|
82
|
+
expect(response.body).toBe('User-agent: *');
|
|
83
|
+
expect(response.headers?.['content-type']).toBe('text/plain');
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('lets r.header() runtime override win over endpoint.responseType', async () => {
|
|
87
|
+
const endpoint = e
|
|
88
|
+
.get('/dynamic')
|
|
89
|
+
.output(z.string())
|
|
90
|
+
.responseType('text/html')
|
|
91
|
+
.handle(async (_ctx, r) => {
|
|
92
|
+
r.header('content-type', 'text/xml');
|
|
93
|
+
return r.send('<xml></xml>');
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
const adapter = new AmazonApiGatewayV2Endpoint(envParser, endpoint);
|
|
97
|
+
|
|
98
|
+
const event = createMockV2Event({
|
|
99
|
+
routeKey: 'GET /dynamic',
|
|
100
|
+
rawPath: '/dynamic',
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
const response = await adapter.handler(event, mockContext);
|
|
104
|
+
|
|
105
|
+
expect(response.statusCode).toBe(200);
|
|
106
|
+
// Body still emitted raw because responseType is not JSON
|
|
107
|
+
expect(response.body).toBe('<xml></xml>');
|
|
108
|
+
// Runtime r.header() wins over the declared responseType default
|
|
109
|
+
expect(response.headers?.['content-type']).toBe('text/xml');
|
|
110
|
+
});
|
|
111
|
+
});
|
|
@@ -77,6 +77,35 @@ describe('Endpoint', () => {
|
|
|
77
77
|
});
|
|
78
78
|
});
|
|
79
79
|
|
|
80
|
+
it('should use the endpoint responseType as the OpenAPI content key', async () => {
|
|
81
|
+
const endpoint = new Endpoint({
|
|
82
|
+
route: '/checkout-page',
|
|
83
|
+
method: 'GET',
|
|
84
|
+
description: 'Hosted checkout page',
|
|
85
|
+
fn: async () => '<html></html>',
|
|
86
|
+
input: undefined,
|
|
87
|
+
output: z.string(),
|
|
88
|
+
authorize: undefined,
|
|
89
|
+
services: [],
|
|
90
|
+
status: undefined,
|
|
91
|
+
getSession: undefined,
|
|
92
|
+
logger: {} as any,
|
|
93
|
+
timeout: undefined,
|
|
94
|
+
memorySize: undefined,
|
|
95
|
+
responseType: 'text/html',
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
const spec = await endpoint.toOpenApi3Route();
|
|
99
|
+
const response200 = (spec['/checkout-page'].get.responses?.['200'] ??
|
|
100
|
+
{}) as any;
|
|
101
|
+
|
|
102
|
+
expect(response200.content).toHaveProperty('text/html');
|
|
103
|
+
expect(response200.content).not.toHaveProperty('application/json');
|
|
104
|
+
expect(response200.content['text/html'].schema).toMatchObject({
|
|
105
|
+
type: 'string',
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
80
109
|
it('should include request body for POST endpoint', async () => {
|
|
81
110
|
const bodySchema = z.object({
|
|
82
111
|
name: z.string(),
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { EndpointBuilder } from '../EndpointBuilder';
|
|
4
|
+
|
|
5
|
+
describe('EndpointBuilder.responseType', () => {
|
|
6
|
+
it("defaults to 'application/json' when not set", () => {
|
|
7
|
+
const endpoint = new EndpointBuilder('/users', 'GET')
|
|
8
|
+
.output(z.object({ id: z.string() }))
|
|
9
|
+
.handle(async () => ({ id: '1' }));
|
|
10
|
+
|
|
11
|
+
expect(endpoint.responseType).toBe('application/json');
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
it('stores a custom response type on the built Endpoint', () => {
|
|
15
|
+
const endpoint = new EndpointBuilder('/checkout-page', 'GET')
|
|
16
|
+
.output(z.string())
|
|
17
|
+
.responseType('text/html')
|
|
18
|
+
.handle(async () => '<html></html>');
|
|
19
|
+
|
|
20
|
+
expect(endpoint.responseType).toBe('text/html');
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('returns the builder for chaining', () => {
|
|
24
|
+
const builder = new EndpointBuilder('/users', 'GET');
|
|
25
|
+
const result = builder.responseType('text/plain');
|
|
26
|
+
|
|
27
|
+
expect(result).toBe(builder);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('supports any arbitrary MIME type', () => {
|
|
31
|
+
const endpoint = new EndpointBuilder('/export.csv', 'GET')
|
|
32
|
+
.output(z.string())
|
|
33
|
+
.responseType('text/csv')
|
|
34
|
+
.handle(async () => 'a,b,c\n1,2,3');
|
|
35
|
+
|
|
36
|
+
expect(endpoint.responseType).toBe('text/csv');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('last call wins when chained multiple times', () => {
|
|
40
|
+
const endpoint = new EndpointBuilder('/pdf', 'GET')
|
|
41
|
+
.responseType('text/html')
|
|
42
|
+
.responseType('application/pdf')
|
|
43
|
+
.handle(async () => 'pdf-bytes');
|
|
44
|
+
|
|
45
|
+
expect(endpoint.responseType).toBe('application/pdf');
|
|
46
|
+
});
|
|
47
|
+
});
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { EnvironmentParser } from '@geekmidas/envkit';
|
|
2
|
+
import type { Logger } from '@geekmidas/logger';
|
|
3
|
+
import { ServiceDiscovery } from '@geekmidas/services';
|
|
4
|
+
import { Hono } from 'hono';
|
|
5
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { Endpoint } from '../Endpoint';
|
|
8
|
+
import { HonoEndpoint } from '../HonoEndpointAdaptor';
|
|
9
|
+
|
|
10
|
+
const mockLogger: Logger = {
|
|
11
|
+
debug: vi.fn(),
|
|
12
|
+
info: vi.fn(),
|
|
13
|
+
warn: vi.fn(),
|
|
14
|
+
error: vi.fn(),
|
|
15
|
+
fatal: vi.fn(),
|
|
16
|
+
trace: vi.fn(),
|
|
17
|
+
child: vi.fn(() => mockLogger),
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
function makeEndpoint<T>(overrides: {
|
|
21
|
+
route: string;
|
|
22
|
+
method: 'GET';
|
|
23
|
+
output: any;
|
|
24
|
+
fn: () => Promise<T> | T;
|
|
25
|
+
responseType?: string;
|
|
26
|
+
}) {
|
|
27
|
+
return new Endpoint({
|
|
28
|
+
route: overrides.route,
|
|
29
|
+
method: overrides.method,
|
|
30
|
+
fn: overrides.fn as any,
|
|
31
|
+
input: undefined,
|
|
32
|
+
output: overrides.output,
|
|
33
|
+
services: [],
|
|
34
|
+
logger: mockLogger,
|
|
35
|
+
timeout: undefined,
|
|
36
|
+
memorySize: undefined,
|
|
37
|
+
status: undefined,
|
|
38
|
+
getSession: undefined,
|
|
39
|
+
authorize: undefined,
|
|
40
|
+
description: undefined,
|
|
41
|
+
responseType: overrides.responseType,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
describe('HonoEndpointAdaptor — responseType', () => {
|
|
46
|
+
const envParser = new EnvironmentParser({});
|
|
47
|
+
const serviceDiscovery = ServiceDiscovery.getInstance(envParser);
|
|
48
|
+
|
|
49
|
+
it('defaults to application/json and JSON-encodes the output', async () => {
|
|
50
|
+
const endpoint = makeEndpoint({
|
|
51
|
+
route: '/users/:id',
|
|
52
|
+
method: 'GET',
|
|
53
|
+
output: z.object({ id: z.string() }),
|
|
54
|
+
fn: async () => ({ id: '123' }),
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
const app = new Hono();
|
|
58
|
+
new HonoEndpoint(endpoint).addRoute(serviceDiscovery, app);
|
|
59
|
+
|
|
60
|
+
const response = await app.request('/users/123');
|
|
61
|
+
expect(response.status).toBe(200);
|
|
62
|
+
expect(response.headers.get('content-type')).toMatch(/application\/json/);
|
|
63
|
+
expect(await response.json()).toEqual({ id: '123' });
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('emits raw HTML body when responseType is text/html', async () => {
|
|
67
|
+
const html = '<html><body><h1>Checkout</h1></body></html>';
|
|
68
|
+
const endpoint = makeEndpoint({
|
|
69
|
+
route: '/checkout-page',
|
|
70
|
+
method: 'GET',
|
|
71
|
+
output: z.string(),
|
|
72
|
+
fn: async () => html,
|
|
73
|
+
responseType: 'text/html',
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
const app = new Hono();
|
|
77
|
+
new HonoEndpoint(endpoint).addRoute(serviceDiscovery, app);
|
|
78
|
+
|
|
79
|
+
const response = await app.request('/checkout-page');
|
|
80
|
+
expect(response.status).toBe(200);
|
|
81
|
+
expect(response.headers.get('content-type')).toMatch(/text\/html/);
|
|
82
|
+
|
|
83
|
+
const body = await response.text();
|
|
84
|
+
// The body is emitted as-is, NOT JSON-encoded (would be `"<html>..."`)
|
|
85
|
+
expect(body).toBe(html);
|
|
86
|
+
expect(body.startsWith('"')).toBe(false);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('emits raw plain text when responseType is text/plain', async () => {
|
|
90
|
+
const endpoint = makeEndpoint({
|
|
91
|
+
route: '/robots.txt',
|
|
92
|
+
method: 'GET',
|
|
93
|
+
output: z.string(),
|
|
94
|
+
fn: async () => 'User-agent: *\nDisallow:',
|
|
95
|
+
responseType: 'text/plain',
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
const app = new Hono();
|
|
99
|
+
new HonoEndpoint(endpoint).addRoute(serviceDiscovery, app);
|
|
100
|
+
|
|
101
|
+
const response = await app.request('/robots.txt');
|
|
102
|
+
expect(response.status).toBe(200);
|
|
103
|
+
expect(response.headers.get('content-type')).toMatch(/text\/plain/);
|
|
104
|
+
expect(await response.text()).toBe('User-agent: *\nDisallow:');
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('lets r.header() runtime override win over the declared responseType header', async () => {
|
|
108
|
+
const endpoint = makeEndpoint({
|
|
109
|
+
route: '/dynamic',
|
|
110
|
+
method: 'GET',
|
|
111
|
+
output: z.string(),
|
|
112
|
+
fn: async (_ctx: any, r: any) => {
|
|
113
|
+
r.header('content-type', 'text/xml; charset=utf-8');
|
|
114
|
+
return r.send('<xml></xml>');
|
|
115
|
+
},
|
|
116
|
+
responseType: 'text/html',
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
const app = new Hono();
|
|
120
|
+
new HonoEndpoint(endpoint).addRoute(serviceDiscovery, app);
|
|
121
|
+
|
|
122
|
+
const response = await app.request('/dynamic');
|
|
123
|
+
expect(response.status).toBe(200);
|
|
124
|
+
// Runtime header via r.header() takes precedence over endpoint.responseType
|
|
125
|
+
expect(response.headers.get('content-type')).toMatch(/text\/xml/);
|
|
126
|
+
expect(await response.text()).toBe('<xml></xml>');
|
|
127
|
+
});
|
|
128
|
+
});
|
|
@@ -1,13 +1,5 @@
|
|
|
1
1
|
import { setupServer } from 'msw/node';
|
|
2
|
-
import {
|
|
3
|
-
afterAll,
|
|
4
|
-
afterEach,
|
|
5
|
-
beforeAll,
|
|
6
|
-
describe,
|
|
7
|
-
expect,
|
|
8
|
-
it,
|
|
9
|
-
vi,
|
|
10
|
-
} from 'vitest';
|
|
2
|
+
import { afterAll, afterEach, beforeAll, describe, expect, it } from 'vitest';
|
|
11
3
|
import { z } from 'zod';
|
|
12
4
|
import { e } from '../EndpointFactory';
|
|
13
5
|
import { createMswHandlers, TEST_CONTEXT_HEADER } from '../MswEndpointAdaptor';
|
package/tsdown.config.ts
CHANGED
|
@@ -1,3 +1,32 @@
|
|
|
1
1
|
import { defineConfig } from 'tsdown';
|
|
2
2
|
|
|
3
|
-
export default defineConfig({
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
entry: [
|
|
5
|
+
'src/index.ts',
|
|
6
|
+
'src/types.ts',
|
|
7
|
+
'src/endpoints/index.ts',
|
|
8
|
+
'src/functions/index.ts',
|
|
9
|
+
'src/crons/index.ts',
|
|
10
|
+
'src/subscribers/index.ts',
|
|
11
|
+
'src/adaptors/hono.ts',
|
|
12
|
+
'src/adaptors/aws.ts',
|
|
13
|
+
'src/adaptors/testing.ts',
|
|
14
|
+
],
|
|
15
|
+
clean: true,
|
|
16
|
+
outDir: 'dist',
|
|
17
|
+
format: ['cjs', 'esm'],
|
|
18
|
+
sourcemap: true,
|
|
19
|
+
dts: true,
|
|
20
|
+
outExtensions: (ctx) => ({
|
|
21
|
+
js: ctx.format === 'es' ? '.mjs' : '.cjs',
|
|
22
|
+
}),
|
|
23
|
+
// Bundle lodash utilities — they are not hoisted to the workspace root
|
|
24
|
+
// and would fail to resolve when consumers load the dist from the root context.
|
|
25
|
+
noExternal: [
|
|
26
|
+
'lodash.compact',
|
|
27
|
+
'lodash.get',
|
|
28
|
+
'lodash.pick',
|
|
29
|
+
'lodash.set',
|
|
30
|
+
'lodash.uniqby',
|
|
31
|
+
],
|
|
32
|
+
});
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { Function, FunctionHandler } from "./Function-D74HrBnX.mjs";
|
|
2
|
-
import { FunctionExecutionWrapper } from "./FunctionExecutionWrapper-xbTmBARx.mjs";
|
|
3
|
-
import { Service } from "@geekmidas/services";
|
|
4
|
-
import { AuditStorage, AuditableAction } from "@geekmidas/audit";
|
|
5
|
-
import { EnvironmentParser } from "@geekmidas/envkit";
|
|
6
|
-
import { EventPublisher } from "@geekmidas/events";
|
|
7
|
-
import { Logger } from "@geekmidas/logger";
|
|
8
|
-
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
9
|
-
import { Handler } from "aws-lambda";
|
|
10
|
-
import { ComposableStandardSchema } from "@geekmidas/schema";
|
|
11
|
-
|
|
12
|
-
//#region src/functions/AWSLambdaFunction.d.ts
|
|
13
|
-
type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<TEvent, TResult>;
|
|
14
|
-
declare class AWSLambdaFunction<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> extends FunctionExecutionWrapper<TInput, TOutSchema, TServices, TLogger, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction> {
|
|
15
|
-
readonly fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>;
|
|
16
|
-
constructor(envParser: EnvironmentParser<{}>, fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>);
|
|
17
|
-
private error;
|
|
18
|
-
private baseInput;
|
|
19
|
-
private input;
|
|
20
|
-
private loggerMiddleware;
|
|
21
|
-
private services;
|
|
22
|
-
private database;
|
|
23
|
-
private auditor;
|
|
24
|
-
private events;
|
|
25
|
-
private _handler;
|
|
26
|
-
get handler(): AWSLambdaHandler;
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=AWSLambdaFunction.d.ts.map
|
|
29
|
-
|
|
30
|
-
//#endregion
|
|
31
|
-
export { AWSLambdaFunction, AWSLambdaHandler };
|
|
32
|
-
//# sourceMappingURL=AWSLambdaFunction-CC8gMZhz.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AWSLambdaFunction-CC8gMZhz.d.mts","names":[],"sources":["../src/functions/AWSLambdaFunction.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;KAmBY,gDAAgD,QAC3D,QACA;cAuCY,iCACG,qEACI,4DACD,gCACF,SAAS,gCACD,uHAEF,kLAID,mCAAmC,0CAI/C,yBACT,QACA,YACA,WACA,SACA,iBACA,4BACA,eACA,0BACA,WACA,sBACA;EAnEW,SAAA,EAAA,EAuEY,QAvEI,CAwEzB,MAxEyB,EAyEzB,SAzEyB,EA0EzB,OA1EyB,EA2EzB,UA3EyB,EA4EzB,eA5EyB,EA6EzB,0BA7EyB,EA8EzB,aA9EyB,EA+EzB,wBA/EyB,EAgFzB,SAhFyB,EAiFzB,oBAjFyB,EAkFzB,YAlFyB,EAmFzB,eAnFyB,CAoFxB,MApFwB,EAqFxB,SArFwB,EAsFxB,OAtFwB,EAuFxB,UAvFwB,EAwFxB,SAxFwB,EAyFxB,aAzFwB,EA0FxB,YA1FwB,CAAA,CAAA;EAAA,WAAA,CAAA,SAAA,EAsEf,iBAtEe,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,EAuEJ,QAvEI,CAwEzB,MAxEyB,EAyEzB,SAzEyB,EA0EzB,OA1EyB,EA2EzB,UA3EyB,EA4EzB,eA5EyB,EA6EzB,0BA7EyB,EA8EzB,aA9EyB,EA+EzB,wBA/EyB,EAgFzB,SAhFyB,EAiFzB,oBAjFyB,EAkFzB,YAlFyB,EAmFzB,eAnFyB,CAoFxB,MApFwB,EAqFxB,SArFwB,EAsFxB,OAtFwB,EAuFxB,UAvFwB,EAwFxB,SAxFwB,EAyFxB,aAzFwB,EA0FxB,YA1FwB,CAAA,CAAA;EAAA,QAC3B,KAAA;EAAM,QACN,SAAA;EAAO,QAFoD,KAAA;EAAO,QAAA,gBAAA;EAyCtD,QAAA,QAAA;EAAiB,QAAA,QAAA;EAAA,QACd,OAAA;EAAwB,QACpB,MAAA;EAAgB,QACjB,QAAA;EAAO,IACT,OAAA,CAAA,CAAA,EAgQD,gBAhQC"}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
const require_chunk = require('./chunk-CUT6urMc.cjs');
|
|
2
|
-
const require_FunctionBuilder = require('./FunctionBuilder-C_xG9As7.cjs');
|
|
3
|
-
const require_FunctionExecutionWrapper = require('./FunctionExecutionWrapper-KKHP6fDY.cjs');
|
|
4
|
-
const __middy_core = require_chunk.__toESM(require("@middy/core"));
|
|
5
|
-
const __geekmidas_errors = require_chunk.__toESM(require("@geekmidas/errors"));
|
|
6
|
-
const __geekmidas_services = require_chunk.__toESM(require("@geekmidas/services"));
|
|
7
|
-
|
|
8
|
-
//#region src/functions/AWSLambdaFunction.ts
|
|
9
|
-
var AWSLambdaFunction = class extends require_FunctionExecutionWrapper.FunctionExecutionWrapper {
|
|
10
|
-
constructor(envParser, fn) {
|
|
11
|
-
super(envParser, fn);
|
|
12
|
-
this.fn = fn;
|
|
13
|
-
}
|
|
14
|
-
error() {
|
|
15
|
-
return { onError: (req) => {
|
|
16
|
-
const logger = req.event?.logger || this.fn.logger;
|
|
17
|
-
logger.error(req.error || {}, "Error processing function");
|
|
18
|
-
throw (0, __geekmidas_errors.wrapError)(req.error);
|
|
19
|
-
} };
|
|
20
|
-
}
|
|
21
|
-
baseInput() {
|
|
22
|
-
return { before: (_req) => {} };
|
|
23
|
-
}
|
|
24
|
-
input() {
|
|
25
|
-
return { before: async (req) => {
|
|
26
|
-
try {
|
|
27
|
-
if (this.fn.input) {
|
|
28
|
-
const parsedInput = await require_FunctionBuilder.FunctionBuilder.parseComposableStandardSchema(req.event, this.fn.input);
|
|
29
|
-
req.event.parsedInput = parsedInput;
|
|
30
|
-
} else req.event.parsedInput = req.event;
|
|
31
|
-
} catch (error) {
|
|
32
|
-
this.logger.error({
|
|
33
|
-
error,
|
|
34
|
-
event: req.event
|
|
35
|
-
}, "Failed to parse input");
|
|
36
|
-
throw error;
|
|
37
|
-
}
|
|
38
|
-
} };
|
|
39
|
-
}
|
|
40
|
-
loggerMiddleware() {
|
|
41
|
-
return { before: (req) => {
|
|
42
|
-
this._logger = this.fn.logger.child({
|
|
43
|
-
fn: {
|
|
44
|
-
name: req.context.functionName,
|
|
45
|
-
version: req.context.functionVersion,
|
|
46
|
-
memory: req.context.memoryLimitInMB
|
|
47
|
-
},
|
|
48
|
-
req: { id: req.context.awsRequestId }
|
|
49
|
-
});
|
|
50
|
-
req.event.logger = this._logger;
|
|
51
|
-
} };
|
|
52
|
-
}
|
|
53
|
-
services() {
|
|
54
|
-
return { before: async (req) => {
|
|
55
|
-
req.event.services = await this.getServices();
|
|
56
|
-
} };
|
|
57
|
-
}
|
|
58
|
-
database() {
|
|
59
|
-
return { before: async (req) => {
|
|
60
|
-
req.event.db = await this.getDatabase();
|
|
61
|
-
} };
|
|
62
|
-
}
|
|
63
|
-
auditor() {
|
|
64
|
-
return {
|
|
65
|
-
before: async (req) => {
|
|
66
|
-
req.event.auditor = await this.createAuditor();
|
|
67
|
-
},
|
|
68
|
-
after: async (req) => {
|
|
69
|
-
if (req.event.auditor) {
|
|
70
|
-
const records = req.event.auditor.getRecords();
|
|
71
|
-
if (records.length > 0) {
|
|
72
|
-
this.logger.debug({ auditCount: records.length }, "Flushing function audits");
|
|
73
|
-
await req.event.auditor.flush();
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
events() {
|
|
80
|
-
return { after: async (req) => {
|
|
81
|
-
const response = req.response || void 0;
|
|
82
|
-
await this.publishEvents(response);
|
|
83
|
-
} };
|
|
84
|
-
}
|
|
85
|
-
async _handler(event) {
|
|
86
|
-
const result = await this.fn.fn({
|
|
87
|
-
input: event.parsedInput,
|
|
88
|
-
services: event.services,
|
|
89
|
-
logger: event.logger,
|
|
90
|
-
db: event.db,
|
|
91
|
-
auditor: event.auditor
|
|
92
|
-
});
|
|
93
|
-
const output = await this.fn.parseOutput(result);
|
|
94
|
-
return output;
|
|
95
|
-
}
|
|
96
|
-
get handler() {
|
|
97
|
-
const handler = this._handler.bind(this);
|
|
98
|
-
const chain = (0, __middy_core.default)(handler).use(this.loggerMiddleware()).use(this.baseInput()).use(this.error()).use(this.services()).use(this.database()).use(this.auditor()).use(this.input()).use(this.events());
|
|
99
|
-
const wrappedHandler = async (event, context) => {
|
|
100
|
-
const startTime = Date.now();
|
|
101
|
-
const requestId = context.awsRequestId;
|
|
102
|
-
const logger = this.fn.logger.child({ requestId });
|
|
103
|
-
return (0, __geekmidas_services.runWithRequestContext)({
|
|
104
|
-
logger,
|
|
105
|
-
requestId,
|
|
106
|
-
startTime
|
|
107
|
-
}, () => chain(event, context));
|
|
108
|
-
};
|
|
109
|
-
return wrappedHandler;
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
//#endregion
|
|
114
|
-
Object.defineProperty(exports, 'AWSLambdaFunction', {
|
|
115
|
-
enumerable: true,
|
|
116
|
-
get: function () {
|
|
117
|
-
return AWSLambdaFunction;
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
//# sourceMappingURL=AWSLambdaFunction-CPEAl5nZ.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AWSLambdaFunction-CPEAl5nZ.cjs","names":["FunctionExecutionWrapper","envParser: EnvironmentParser<{}>","fn: Function<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTAuditAction,\n\t\t\tFunctionHandler<\n\t\t\t\tTInput,\n\t\t\t\tTServices,\n\t\t\t\tTLogger,\n\t\t\t\tTOutSchema,\n\t\t\t\tTDatabase,\n\t\t\t\tTAuditStorage,\n\t\t\t\tTAuditAction\n\t\t\t>\n\t\t>","event: FunctionEvent<\n\t\t\tTEvent,\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTDatabase,\n\t\t\tTAuditAction\n\t\t>","event: unknown","context: Context"],"sources":["../src/functions/AWSLambdaFunction.ts"],"sourcesContent":["import type { AuditableAction, Auditor, AuditStorage } from '@geekmidas/audit';\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type {\n\tComposableStandardSchema,\n\tInferComposableStandardSchema,\n\tInferStandardSchema,\n} from '@geekmidas/schema';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport { runWithRequestContext } from '@geekmidas/services';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { Context, Handler } from 'aws-lambda';\nimport type { Function, FunctionHandler } from './Function';\nimport { FunctionBuilder } from './FunctionBuilder';\nimport { FunctionExecutionWrapper } from './FunctionExecutionWrapper';\n\nexport type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<\n\tTEvent,\n\tTResult\n>;\n\ntype FunctionEvent<\n\tTEvent,\n\tTInput extends ComposableStandardSchema | undefined,\n\tTServices extends Service[],\n\tTLogger extends Logger,\n\tTDatabase = undefined,\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n> = TEvent & {\n\tparsedInput: InferComposableStandardSchema<TInput>;\n\tservices: ServiceRecord<TServices>;\n\tlogger: TLogger;\n\tdb: TDatabase | undefined;\n\tauditor: Auditor<TAuditAction> | undefined;\n};\n\ntype Middleware<\n\tTEvent,\n\tTInput extends ComposableStandardSchema | undefined,\n\tTServices extends Service[],\n\tTLogger extends Logger,\n\tTOutSchema extends StandardSchemaV1 | undefined,\n\tTDatabase = undefined,\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n> = MiddlewareObj<\n\tFunctionEvent<TEvent, TInput, TServices, TLogger, TDatabase, TAuditAction>,\n\tInferComposableStandardSchema<TOutSchema>,\n\tError,\n\tContext\n>;\n\nexport class AWSLambdaFunction<\n\tTInput extends ComposableStandardSchema | undefined = undefined,\n\tTOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTAuditStorage extends AuditStorage | undefined = undefined,\n\tTAuditStorageServiceName extends string = string,\n\tTDatabase = undefined,\n\tTDatabaseServiceName extends string = string,\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n> extends FunctionExecutionWrapper<\n\tTInput,\n\tTOutSchema,\n\tTServices,\n\tTLogger,\n\tTEventPublisher,\n\tTEventPublisherServiceName,\n\tTAuditStorage,\n\tTAuditStorageServiceName,\n\tTDatabase,\n\tTDatabaseServiceName,\n\tTAuditAction\n> {\n\tconstructor(\n\t\tenvParser: EnvironmentParser<{}>,\n\t\toverride readonly fn: Function<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTAuditAction,\n\t\t\tFunctionHandler<\n\t\t\t\tTInput,\n\t\t\t\tTServices,\n\t\t\t\tTLogger,\n\t\t\t\tTOutSchema,\n\t\t\t\tTDatabase,\n\t\t\t\tTAuditStorage,\n\t\t\t\tTAuditAction\n\t\t\t>\n\t\t>,\n\t) {\n\t\tsuper(envParser, fn);\n\t}\n\n\tprivate error<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tonError: (req) => {\n\t\t\t\tconst logger = req.event?.logger || this.fn.logger;\n\t\t\t\tlogger.error(req.error || {}, 'Error processing function');\n\n\t\t\t\t// Re-throw the wrapped error to let Lambda handle it\n\t\t\t\tthrow wrapError(req.error);\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate baseInput<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tbefore: (_req) => {},\n\t\t};\n\t}\n\n\tprivate input<\n\t\tTEvent extends { input: InferComposableStandardSchema<TInput> },\n\t>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\ttry {\n\t\t\t\t\t// Parse input if schema is provided\n\t\t\t\t\tif (this.fn.input) {\n\t\t\t\t\t\tconst parsedInput =\n\t\t\t\t\t\t\tawait FunctionBuilder.parseComposableStandardSchema(\n\t\t\t\t\t\t\t\treq.event,\n\t\t\t\t\t\t\t\tthis.fn.input,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\treq.event.parsedInput =\n\t\t\t\t\t\t\tparsedInput as InferComposableStandardSchema<TInput>;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// If no schema, pass the event as-is\n\t\t\t\t\t\treq.event.parsedInput = req.event as any;\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t{ error, event: req.event },\n\t\t\t\t\t\t'Failed to parse input',\n\t\t\t\t\t);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate loggerMiddleware<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tbefore: (req) => {\n\t\t\t\tthis._logger = this.fn.logger.child({\n\t\t\t\t\tfn: {\n\t\t\t\t\t\tname: req.context.functionName,\n\t\t\t\t\t\tversion: req.context.functionVersion,\n\t\t\t\t\t\tmemory: req.context.memoryLimitInMB,\n\t\t\t\t\t},\n\t\t\t\t\treq: {\n\t\t\t\t\t\tid: req.context.awsRequestId,\n\t\t\t\t\t},\n\t\t\t\t}) as TLogger;\n\n\t\t\t\treq.event.logger = this._logger;\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate services<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\treq.event.services = await this.getServices();\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate database<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\treq.event.db = await this.getDatabase();\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate auditor<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\treq.event.auditor = await this.createAuditor();\n\t\t\t},\n\t\t\tafter: async (req) => {\n\t\t\t\t// Flush any pending audits after successful execution\n\t\t\t\tif (req.event.auditor) {\n\t\t\t\t\tconst records = req.event.auditor.getRecords();\n\t\t\t\t\tif (records.length > 0) {\n\t\t\t\t\t\tthis.logger.debug(\n\t\t\t\t\t\t\t{ auditCount: records.length },\n\t\t\t\t\t\t\t'Flushing function audits',\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait req.event.auditor.flush();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate events<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tafter: async (req) => {\n\t\t\t\tconst response = (req.response ||\n\t\t\t\t\tundefined) as InferStandardSchema<TOutSchema>;\n\t\t\t\tawait this.publishEvents(response);\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate async _handler<TEvent>(\n\t\tevent: FunctionEvent<\n\t\t\tTEvent,\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTDatabase,\n\t\t\tTAuditAction\n\t\t>,\n\t) {\n\t\t// Execute the function with the parsed context\n\t\tconst result = await this.fn.fn({\n\t\t\tinput: event.parsedInput,\n\t\t\tservices: event.services,\n\t\t\tlogger: event.logger,\n\t\t\tdb: event.db,\n\t\t\tauditor: event.auditor,\n\t\t} as any);\n\n\t\t// Parse output if schema is provided\n\t\tconst output = await this.fn.parseOutput(result);\n\n\t\treturn output;\n\t}\n\n\tget handler(): AWSLambdaHandler {\n\t\tconst handler = this._handler.bind(this);\n\n\t\t// Apply middleware in order\n\t\tconst chain = middy(handler)\n\t\t\t.use(this.loggerMiddleware())\n\t\t\t.use(this.baseInput())\n\t\t\t.use(this.error())\n\t\t\t.use(this.services())\n\t\t\t.use(this.database())\n\t\t\t.use(this.auditor())\n\t\t\t.use(this.input())\n\t\t\t.use(this.events());\n\n\t\t// Wrap entire Middy chain in request context for service access\n\t\tconst wrappedHandler = async (event: unknown, context: Context) => {\n\t\t\tconst startTime = Date.now();\n\t\t\tconst requestId = context.awsRequestId;\n\t\t\tconst logger = this.fn.logger.child({ requestId }) as TLogger;\n\n\t\t\treturn runWithRequestContext({ logger, requestId, startTime }, () =>\n\t\t\t\tchain(event as Parameters<typeof chain>[0], context),\n\t\t\t);\n\t\t};\n\n\t\treturn wrappedHandler as unknown as AWSLambdaHandler;\n\t}\n}\n"],"mappings":";;;;;;;;AA4DA,IAAa,oBAAb,cAeUA,0DAYR;CACD,YACCC,WACkBC,IAsBjB;AACD,QAAM,WAAW,GAAG;EAvBF;CAwBlB;CAED,AAAQ,QAQN;AACD,SAAO,EACN,SAAS,CAAC,QAAQ;GACjB,MAAM,SAAS,IAAI,OAAO,UAAU,KAAK,GAAG;AAC5C,UAAO,MAAM,IAAI,SAAS,CAAE,GAAE,4BAA4B;AAG1D,SAAM,kCAAU,IAAI,MAAM;EAC1B,EACD;CACD;CAED,AAAQ,YAQN;AACD,SAAO,EACN,QAAQ,CAAC,SAAS,CAAE,EACpB;CACD;CAED,AAAQ,QAUN;AACD,SAAO,EACN,QAAQ,OAAO,QAAQ;AACtB,OAAI;AAEH,QAAI,KAAK,GAAG,OAAO;KAClB,MAAM,cACL,MAAM,wCAAgB,8BACrB,IAAI,OACJ,KAAK,GAAG,MACR;AAEF,SAAI,MAAM,cACT;IACD,MAEA,KAAI,MAAM,cAAc,IAAI;GAE7B,SAAQ,OAAO;AACf,SAAK,OAAO,MACX;KAAE;KAAO,OAAO,IAAI;IAAO,GAC3B,wBACA;AACD,UAAM;GACN;EACD,EACD;CACD;CAED,AAAQ,mBAQN;AACD,SAAO,EACN,QAAQ,CAAC,QAAQ;AAChB,QAAK,UAAU,KAAK,GAAG,OAAO,MAAM;IACnC,IAAI;KACH,MAAM,IAAI,QAAQ;KAClB,SAAS,IAAI,QAAQ;KACrB,QAAQ,IAAI,QAAQ;IACpB;IACD,KAAK,EACJ,IAAI,IAAI,QAAQ,aAChB;GACD,EAAC;AAEF,OAAI,MAAM,SAAS,KAAK;EACxB,EACD;CACD;CAED,AAAQ,WAQN;AACD,SAAO,EACN,QAAQ,OAAO,QAAQ;AACtB,OAAI,MAAM,WAAW,MAAM,KAAK,aAAa;EAC7C,EACD;CACD;CAED,AAAQ,WAQN;AACD,SAAO,EACN,QAAQ,OAAO,QAAQ;AACtB,OAAI,MAAM,KAAK,MAAM,KAAK,aAAa;EACvC,EACD;CACD;CAED,AAAQ,UAQN;AACD,SAAO;GACN,QAAQ,OAAO,QAAQ;AACtB,QAAI,MAAM,UAAU,MAAM,KAAK,eAAe;GAC9C;GACD,OAAO,OAAO,QAAQ;AAErB,QAAI,IAAI,MAAM,SAAS;KACtB,MAAM,UAAU,IAAI,MAAM,QAAQ,YAAY;AAC9C,SAAI,QAAQ,SAAS,GAAG;AACvB,WAAK,OAAO,MACX,EAAE,YAAY,QAAQ,OAAQ,GAC9B,2BACA;AACD,YAAM,IAAI,MAAM,QAAQ,OAAO;KAC/B;IACD;GACD;EACD;CACD;CAED,AAAQ,SAQN;AACD,SAAO,EACN,OAAO,OAAO,QAAQ;GACrB,MAAM,WAAY,IAAI;AAEtB,SAAM,KAAK,cAAc,SAAS;EAClC,EACD;CACD;CAED,MAAc,SACbC,OAQC;EAED,MAAM,SAAS,MAAM,KAAK,GAAG,GAAG;GAC/B,OAAO,MAAM;GACb,UAAU,MAAM;GAChB,QAAQ,MAAM;GACd,IAAI,MAAM;GACV,SAAS,MAAM;EACf,EAAQ;EAGT,MAAM,SAAS,MAAM,KAAK,GAAG,YAAY,OAAO;AAEhD,SAAO;CACP;CAED,IAAI,UAA4B;EAC/B,MAAM,UAAU,KAAK,SAAS,KAAK,KAAK;EAGxC,MAAM,QAAQ,0BAAM,QAAQ,CAC1B,IAAI,KAAK,kBAAkB,CAAC,CAC5B,IAAI,KAAK,WAAW,CAAC,CACrB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,SAAS,CAAC,CACnB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,QAAQ,CAAC;EAGpB,MAAM,iBAAiB,OAAOC,OAAgBC,YAAqB;GAClE,MAAM,YAAY,KAAK,KAAK;GAC5B,MAAM,YAAY,QAAQ;GAC1B,MAAM,SAAS,KAAK,GAAG,OAAO,MAAM,EAAE,UAAW,EAAC;AAElD,UAAO,gDAAsB;IAAE;IAAQ;IAAW;GAAW,GAAE,MAC9D,MAAM,OAAsC,QAAQ,CACpD;EACD;AAED,SAAO;CACP;AACD"}
|