@geekmidas/constructs 3.0.6 → 3.0.8
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-C2SyofdS.d.mts → Construct-CXqvzglu.d.cts} +11 -6
- package/dist/{Construct-C2SyofdS.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-DtFQFL63.d.mts → Endpoint-C991gK3T.d.cts} +133 -30
- package/dist/Endpoint-C991gK3T.d.cts.map +1 -0
- package/dist/{Endpoint-CGdCGJkC.d.cts → Endpoint-CRHpLPV3.d.mts} +133 -30
- package/dist/Endpoint-CRHpLPV3.d.mts.map +1 -0
- package/dist/{HonoEndpointAdaptor-B5fKdLi7.cjs → HonoEndpointAdaptor-BDz1qM4z.cjs} +81 -24
- package/dist/HonoEndpointAdaptor-BDz1qM4z.cjs.map +1 -0
- package/dist/{HonoEndpointAdaptor-DOUODM7n.mjs → HonoEndpointAdaptor-DPBfEPZj.mjs} +64 -7
- package/dist/HonoEndpointAdaptor-DPBfEPZj.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-BgB3RRxb.d.mts → Subscriber-Tft61-YG.d.mts} +5 -5
- package/dist/Subscriber-Tft61-YG.d.mts.map +1 -0
- package/dist/adaptors/aws.cjs +737 -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 +734 -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 -15
- package/dist/adaptors/testing.cjs.map +1 -0
- package/dist/adaptors/testing.d.cts +177 -13
- package/dist/adaptors/testing.d.cts.map +1 -0
- package/dist/adaptors/testing.d.mts +177 -13
- package/dist/adaptors/testing.d.mts.map +1 -0
- package/dist/adaptors/testing.mjs +389 -14
- 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 +48 -11
- 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 +717 -23
- package/dist/endpoints/index.cjs.map +1 -1
- package/dist/endpoints/index.d.cts +316 -14
- package/dist/endpoints/index.d.cts.map +1 -1
- package/dist/endpoints/index.d.mts +315 -14
- package/dist/endpoints/index.d.mts.map +1 -1
- package/dist/endpoints/index.mjs +706 -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-CJZYs9uM.mjs +1887 -0
- package/dist/lazyAccessors-CJZYs9uM.mjs.map +1 -0
- package/dist/lazyAccessors-DHvDeww0.cjs +1964 -0
- package/dist/lazyAccessors-DHvDeww0.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-BTaiRqPo.d.cts.map → telemetry-Bt0vK4ma.d.cts.map} +1 -1
- package/dist/{telemetry-C-kNOW3C.d.mts → telemetry-COvVBKBM.d.mts} +1 -1
- package/dist/{telemetry-C-kNOW3C.d.mts.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-aFmq5cKh.d.mts → types-BA3eK4xj.d.mts} +1 -1
- package/dist/{types-aFmq5cKh.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 +18 -13
- package/src/Construct.ts +26 -8
- package/src/__tests__/Construct.environment.spec.ts +123 -0
- package/src/adaptors/testing.ts +7 -0
- package/src/endpoints/MswEndpointAdaptor.ts +226 -0
- package/src/endpoints/__tests__/MswEndpointAdaptor.spec.ts +211 -0
- package/tsdown.config.ts +30 -1
- package/dist/AWSLambdaFunction-BF1gJJjG.d.mts +0 -32
- package/dist/AWSLambdaFunction-BF1gJJjG.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-OQvj2lKI.d.mts +0 -36
- package/dist/AWSLambdaSubscriberAdaptor-OQvj2lKI.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-DqNcQGMf.d.cts +0 -124
- package/dist/AmazonApiGatewayEndpointAdaptor-DqNcQGMf.d.cts.map +0 -1
- package/dist/AmazonApiGatewayEndpointAdaptor-Hi8Pbp2d.d.mts +0 -124
- package/dist/AmazonApiGatewayEndpointAdaptor-Hi8Pbp2d.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/AmazonApiGatewayV1EndpointAdaptor-cpwJzU4W.d.mts +0 -23
- package/dist/AmazonApiGatewayV1EndpointAdaptor-cpwJzU4W.d.mts.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-LzH3hkB-.d.mts +0 -22
- package/dist/AmazonApiGatewayV2EndpointAdaptor-LzH3hkB-.d.mts.map +0 -1
- package/dist/AmazonApiGatewayV2EndpointAdaptor-m9YKI294.mjs +0 -42
- package/dist/AmazonApiGatewayV2EndpointAdaptor-m9YKI294.mjs.map +0 -1
- package/dist/Authorizer-4unKN3Xn.mjs +0 -68
- package/dist/Authorizer-4unKN3Xn.mjs.map +0 -1
- package/dist/Authorizer-DBsrDTuf.d.mts +0 -126
- package/dist/Authorizer-DBsrDTuf.d.mts.map +0 -1
- package/dist/Authorizer-DWtwC8we.d.cts +0 -126
- package/dist/Authorizer-DWtwC8we.d.cts.map +0 -1
- package/dist/Authorizer-Dx57psuM.cjs +0 -92
- package/dist/Authorizer-Dx57psuM.cjs.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-CsvFjzA8.d.mts +0 -42
- package/dist/BaseFunctionBuilder-CsvFjzA8.d.mts.map +0 -1
- package/dist/BaseFunctionBuilder-DXf6HK-N.cjs +0 -76
- package/dist/BaseFunctionBuilder-DXf6HK-N.cjs.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-B3vrGuaD.mjs +0 -20
- package/dist/Cron-B3vrGuaD.mjs.map +0 -1
- package/dist/Cron-BDxW6fYg.d.cts +0 -26
- package/dist/Cron-BDxW6fYg.d.cts.map +0 -1
- package/dist/Cron-CWxjO2Fg.d.mts +0 -26
- package/dist/Cron-CWxjO2Fg.d.mts.map +0 -1
- package/dist/Cron-DEKZg5j4.cjs +0 -25
- package/dist/Cron-DEKZg5j4.cjs.map +0 -1
- package/dist/CronBuilder-BHpY6w3b.cjs +0 -74
- package/dist/CronBuilder-BHpY6w3b.cjs.map +0 -1
- package/dist/CronBuilder-CginrW3H.d.cts +0 -32
- package/dist/CronBuilder-CginrW3H.d.cts.map +0 -1
- package/dist/CronBuilder-DJnXbDGK.d.mts +0 -32
- package/dist/CronBuilder-DJnXbDGK.d.mts.map +0 -1
- package/dist/CronBuilder-VXpyNfp2.mjs +0 -68
- package/dist/CronBuilder-VXpyNfp2.mjs.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-DtFQFL63.d.mts.map +0 -1
- package/dist/Endpoint-DvY3aqAy.mjs +0 -422
- package/dist/Endpoint-DvY3aqAy.mjs.map +0 -1
- package/dist/EndpointBuilder-CMzbGG2c.mjs +0 -262
- package/dist/EndpointBuilder-CMzbGG2c.mjs.map +0 -1
- package/dist/EndpointBuilder-DIAsH97h.d.mts +0 -146
- package/dist/EndpointBuilder-DIAsH97h.d.mts.map +0 -1
- package/dist/EndpointBuilder-Dzqcm8Yv.d.cts +0 -146
- package/dist/EndpointBuilder-Dzqcm8Yv.d.cts.map +0 -1
- package/dist/EndpointBuilder-QdDf3x87.cjs +0 -268
- package/dist/EndpointBuilder-QdDf3x87.cjs.map +0 -1
- package/dist/EndpointFactory-AsfUsn-v.cjs +0 -393
- package/dist/EndpointFactory-AsfUsn-v.cjs.map +0 -1
- package/dist/EndpointFactory-C1rh407J.d.cts +0 -142
- package/dist/EndpointFactory-C1rh407J.d.cts.map +0 -1
- package/dist/EndpointFactory-CkPaFZA0.mjs +0 -381
- package/dist/EndpointFactory-CkPaFZA0.mjs.map +0 -1
- package/dist/EndpointFactory-pCuCu_1H.d.mts +0 -142
- package/dist/EndpointFactory-pCuCu_1H.d.mts.map +0 -1
- package/dist/Function-CZw1DRQ6.d.mts +0 -76
- package/dist/Function-CZw1DRQ6.d.mts.map +0 -1
- package/dist/Function-CwlB89lS.d.cts +0 -76
- package/dist/Function-CwlB89lS.d.cts.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_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/FunctionBuilder-m5BNA2Ap.d.mts +0 -40
- package/dist/FunctionBuilder-m5BNA2Ap.d.mts.map +0 -1
- package/dist/FunctionExecutionWrapper-B0ZAssiy.mjs +0 -101
- package/dist/FunctionExecutionWrapper-B0ZAssiy.mjs.map +0 -1
- package/dist/FunctionExecutionWrapper-C7yYXIq-.d.mts +0 -50
- package/dist/FunctionExecutionWrapper-C7yYXIq-.d.mts.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/HonoEndpointAdaptor-B5fKdLi7.cjs.map +0 -1
- package/dist/HonoEndpointAdaptor-BXga7Jqh.d.mts +0 -50
- package/dist/HonoEndpointAdaptor-BXga7Jqh.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/Subscriber-BEhOdNQi.mjs +0 -28
- package/dist/Subscriber-BEhOdNQi.mjs.map +0 -1
- package/dist/Subscriber-BgB3RRxb.d.mts.map +0 -1
- package/dist/Subscriber-Scz7hrV6.cjs +0 -34
- package/dist/Subscriber-Scz7hrV6.cjs.map +0 -1
- package/dist/SubscriberBuilder-B82h4v-S.cjs +0 -60
- package/dist/SubscriberBuilder-B82h4v-S.cjs.map +0 -1
- package/dist/SubscriberBuilder-B9uva8fZ.d.cts +0 -28
- package/dist/SubscriberBuilder-B9uva8fZ.d.cts.map +0 -1
- package/dist/SubscriberBuilder-DaQkh2Nt.d.mts +0 -28
- package/dist/SubscriberBuilder-DaQkh2Nt.d.mts.map +0 -1
- package/dist/SubscriberBuilder-DlUaG0Ej.mjs +0 -54
- package/dist/SubscriberBuilder-DlUaG0Ej.mjs.map +0 -1
- package/dist/TestEndpointAdaptor-Clz_L8Xj.d.cts +0 -45
- package/dist/TestEndpointAdaptor-Clz_L8Xj.d.cts.map +0 -1
- package/dist/TestEndpointAdaptor-DxXJoBBf.d.mts +0 -45
- package/dist/TestEndpointAdaptor-DxXJoBBf.d.mts.map +0 -1
- package/dist/TestEndpointAdaptor-G2T789bH.mjs +0 -174
- package/dist/TestEndpointAdaptor-G2T789bH.mjs.map +0 -1
- package/dist/TestEndpointAdaptor-YlwOEisx.cjs +0 -180
- package/dist/TestEndpointAdaptor-YlwOEisx.cjs.map +0 -1
- package/dist/TestFunctionAdaptor-BHk2bDOV.d.cts +0 -30
- package/dist/TestFunctionAdaptor-BHk2bDOV.d.cts.map +0 -1
- package/dist/TestFunctionAdaptor-C5CLuR-9.mjs +0 -75
- package/dist/TestFunctionAdaptor-C5CLuR-9.mjs.map +0 -1
- package/dist/TestFunctionAdaptor-CH6-gO_B.cjs +0 -81
- package/dist/TestFunctionAdaptor-CH6-gO_B.cjs.map +0 -1
- package/dist/TestFunctionAdaptor-DzT8GRdR.d.mts +0 -30
- package/dist/TestFunctionAdaptor-DzT8GRdR.d.mts.map +0 -1
- package/dist/TestSubscriberAdaptor-CPEiqSfE.d.mts +0 -26
- package/dist/TestSubscriberAdaptor-CPEiqSfE.d.mts.map +0 -1
- package/dist/TestSubscriberAdaptor-CwP3qNJ4.mjs +0 -51
- package/dist/TestSubscriberAdaptor-CwP3qNJ4.mjs.map +0 -1
- package/dist/TestSubscriberAdaptor-DQk5xzb0.d.cts +0 -26
- package/dist/TestSubscriberAdaptor-DQk5xzb0.d.cts.map +0 -1
- package/dist/TestSubscriberAdaptor-Dgxr_0vL.cjs +0 -57
- package/dist/TestSubscriberAdaptor-Dgxr_0vL.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/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-DQo_Csy7.d.mts +0 -12
- package/dist/index-DQo_Csy7.d.mts.map +0 -1
- package/dist/lazyAccessors-BVEtB9lU.cjs +0 -223
- package/dist/lazyAccessors-BVEtB9lU.cjs.map +0 -1
- package/dist/lazyAccessors-Bled3FVc.d.mts +0 -49
- package/dist/lazyAccessors-Bled3FVc.d.mts.map +0 -1
- package/dist/lazyAccessors-C8AF1hNi.d.cts +0 -49
- package/dist/lazyAccessors-C8AF1hNi.d.cts.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-BrzPGnm4.d.cts +0 -16
- package/dist/publisher-BrzPGnm4.d.cts.map +0 -1
- package/dist/publisher-Bw4770Hi.mjs +0 -41
- package/dist/publisher-Bw4770Hi.mjs.map +0 -1
- package/dist/publisher-CP4gpv-4.d.mts +0 -16
- package/dist/publisher-CP4gpv-4.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-7XXX7DvY.mjs +0 -9
- package/dist/rls-7XXX7DvY.mjs.map +0 -1
- package/dist/rls-DxFqdIA0.cjs +0 -15
- package/dist/rls-DxFqdIA0.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
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { EnvironmentParser } from '@geekmidas/envkit';
|
|
2
|
+
import type { Service } from '@geekmidas/services';
|
|
3
|
+
import { ServiceDiscovery } from '@geekmidas/services';
|
|
4
|
+
import { Hono } from 'hono';
|
|
5
|
+
import { type HttpHandler, http } from 'msw';
|
|
6
|
+
import type { Endpoint } from './Endpoint';
|
|
7
|
+
import { HonoEndpoint } from './HonoEndpointAdaptor';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Header used to identify which test context a request belongs to.
|
|
11
|
+
* Each concurrent test registers its own context (services, db transaction, etc.)
|
|
12
|
+
* and the MSW handler looks it up by this header value.
|
|
13
|
+
*/
|
|
14
|
+
export const TEST_CONTEXT_HEADER = 'x-test-context-id';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Per-test context containing an isolated ServiceDiscovery instance.
|
|
18
|
+
* Registered in the context map and looked up per-request via the context ID header.
|
|
19
|
+
*/
|
|
20
|
+
export interface MswTestContext {
|
|
21
|
+
serviceDiscovery: ServiceDiscovery<any>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Options for creating MSW handlers from endpoint constructs.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* import { createMswHandlers, registerTestContext } from '@geekmidas/constructs/testing';
|
|
30
|
+
* import { setupServer } from 'msw/node';
|
|
31
|
+
*
|
|
32
|
+
* // Create handlers once (global)
|
|
33
|
+
* const { handlers, registerContext, removeContext } = createMswHandlers(
|
|
34
|
+
* [getUsers, createUser],
|
|
35
|
+
* { baseURL: 'http://localhost:3000' },
|
|
36
|
+
* );
|
|
37
|
+
* const server = setupServer(...handlers);
|
|
38
|
+
*
|
|
39
|
+
* // Per test: register an isolated context with its own services/transaction
|
|
40
|
+
* it('should list users', async ({ db }) => {
|
|
41
|
+
* const contextId = crypto.randomUUID();
|
|
42
|
+
* registerContext(contextId, {
|
|
43
|
+
* services: { database: db, auth: mockAuth },
|
|
44
|
+
* });
|
|
45
|
+
*
|
|
46
|
+
* const api = createApi({
|
|
47
|
+
* baseURL: 'http://localhost:3000',
|
|
48
|
+
* headers: { [TEST_CONTEXT_HEADER]: contextId },
|
|
49
|
+
* });
|
|
50
|
+
*
|
|
51
|
+
* const result = await api('GET /users');
|
|
52
|
+
* expect(result).toBeDefined();
|
|
53
|
+
*
|
|
54
|
+
* removeContext(contextId);
|
|
55
|
+
* });
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export interface CreateMswHandlersOptions {
|
|
59
|
+
/** Base URL the client fetches from (e.g., 'http://localhost:3000') */
|
|
60
|
+
baseURL: string;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Options for registering a per-test context.
|
|
65
|
+
* Follows the same pattern as TestRequestAdaptor — services, database,
|
|
66
|
+
* publisher, and auditorStorage are provided explicitly.
|
|
67
|
+
*/
|
|
68
|
+
export interface RegisterContextOptions {
|
|
69
|
+
/** Service instances keyed by serviceName */
|
|
70
|
+
services?: Record<string, unknown>;
|
|
71
|
+
/** Database instance — required when endpoints use .database() */
|
|
72
|
+
database?: unknown;
|
|
73
|
+
/** Event publisher service definition */
|
|
74
|
+
publisher?: Service;
|
|
75
|
+
/** Audit storage instance — required when endpoints use .auditor() */
|
|
76
|
+
auditorStorage?: unknown;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const MSW_HTTP_METHODS = [
|
|
80
|
+
'get',
|
|
81
|
+
'post',
|
|
82
|
+
'put',
|
|
83
|
+
'patch',
|
|
84
|
+
'delete',
|
|
85
|
+
'options',
|
|
86
|
+
] as const;
|
|
87
|
+
|
|
88
|
+
type MswHttpMethod = (typeof MSW_HTTP_METHODS)[number];
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Result of creating MSW handlers from endpoint constructs.
|
|
92
|
+
*/
|
|
93
|
+
export interface CreateMswHandlersResult {
|
|
94
|
+
/** MSW handlers to pass to setupServer() */
|
|
95
|
+
handlers: HttpHandler[];
|
|
96
|
+
/** Register an isolated context for a test */
|
|
97
|
+
registerContext: (id: string, options: RegisterContextOptions) => void;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Creates MSW HTTP handlers from endpoint constructs.
|
|
102
|
+
*
|
|
103
|
+
* Mounts endpoints on a Hono app and creates MSW handlers that intercept
|
|
104
|
+
* fetch requests and route them through `app.request()` — giving frontend
|
|
105
|
+
* tests full endpoint behavior (validation, auth, sessions) without HTTP.
|
|
106
|
+
*
|
|
107
|
+
* Each test registers its own isolated context via `registerContext()`,
|
|
108
|
+
* which is resolved per-request using the `x-test-context-id` header.
|
|
109
|
+
* This allows concurrent tests with their own transactions and services.
|
|
110
|
+
*
|
|
111
|
+
* @param endpoints - Array of endpoint constructs to create handlers for
|
|
112
|
+
* @param options - Configuration including baseURL
|
|
113
|
+
* @returns MSW handlers, the Hono app, and context management functions
|
|
114
|
+
*/
|
|
115
|
+
export function createMswHandlers(
|
|
116
|
+
endpoints: Endpoint<any, any, any, any, any, any>[],
|
|
117
|
+
options: CreateMswHandlersOptions,
|
|
118
|
+
): CreateMswHandlersResult {
|
|
119
|
+
const { baseURL } = options;
|
|
120
|
+
const contexts = new Map<string, MswTestContext>();
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Register an isolated context for a test.
|
|
124
|
+
* Creates a fresh ServiceDiscovery and pre-registers all provided services.
|
|
125
|
+
*/
|
|
126
|
+
function registerContext(id: string, ctxOptions: RegisterContextOptions) {
|
|
127
|
+
const envParser = new EnvironmentParser({});
|
|
128
|
+
const serviceDiscovery = new ServiceDiscovery(envParser);
|
|
129
|
+
|
|
130
|
+
const serviceDefs: Service[] = [];
|
|
131
|
+
|
|
132
|
+
// Register explicit services
|
|
133
|
+
if (ctxOptions.services) {
|
|
134
|
+
for (const [name, instance] of Object.entries(ctxOptions.services)) {
|
|
135
|
+
serviceDefs.push({
|
|
136
|
+
serviceName: name,
|
|
137
|
+
register: () => instance,
|
|
138
|
+
} as Service);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Register database service from endpoint metadata
|
|
143
|
+
if (ctxOptions.database !== undefined) {
|
|
144
|
+
for (const endpoint of endpoints) {
|
|
145
|
+
if (endpoint.databaseService) {
|
|
146
|
+
serviceDefs.push({
|
|
147
|
+
serviceName: endpoint.databaseService.serviceName,
|
|
148
|
+
register: () => ctxOptions.database,
|
|
149
|
+
} as Service);
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Register publisher service
|
|
156
|
+
if (ctxOptions.publisher) {
|
|
157
|
+
serviceDefs.push(ctxOptions.publisher);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Register auditor storage service from endpoint metadata
|
|
161
|
+
if (ctxOptions.auditorStorage !== undefined) {
|
|
162
|
+
for (const endpoint of endpoints) {
|
|
163
|
+
if (endpoint.auditorStorageService) {
|
|
164
|
+
serviceDefs.push({
|
|
165
|
+
serviceName: endpoint.auditorStorageService.serviceName,
|
|
166
|
+
register: () => ctxOptions.auditorStorage,
|
|
167
|
+
} as Service);
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (serviceDefs.length > 0) {
|
|
174
|
+
serviceDiscovery.register(serviceDefs);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
contexts.set(id, { serviceDiscovery });
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Create a Hono app per-request that uses the correct ServiceDiscovery.
|
|
181
|
+
// We use a wrapper app that resolves the context from the header,
|
|
182
|
+
// then delegates to a context-specific Hono app.
|
|
183
|
+
const handlers: HttpHandler[] = [];
|
|
184
|
+
|
|
185
|
+
for (const endpoint of endpoints) {
|
|
186
|
+
const method = endpoint.method.toLowerCase() as MswHttpMethod;
|
|
187
|
+
if (!MSW_HTTP_METHODS.includes(method)) continue;
|
|
188
|
+
|
|
189
|
+
const mswUrl = `${baseURL}${endpoint.route}`;
|
|
190
|
+
const mswMethod = http[method];
|
|
191
|
+
|
|
192
|
+
handlers.push(
|
|
193
|
+
mswMethod(mswUrl, async ({ request }) => {
|
|
194
|
+
const contextId = request.headers.get(TEST_CONTEXT_HEADER);
|
|
195
|
+
const ctx = contextId ? contexts.get(contextId) : undefined;
|
|
196
|
+
|
|
197
|
+
if (!ctx) {
|
|
198
|
+
return new Response(
|
|
199
|
+
JSON.stringify({
|
|
200
|
+
error: 'Missing or unknown test context ID',
|
|
201
|
+
hint: `Set the '${TEST_CONTEXT_HEADER}' header to a registered context ID`,
|
|
202
|
+
}),
|
|
203
|
+
{ status: 500, headers: { 'content-type': 'application/json' } },
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Build a fresh Hono app with this context's ServiceDiscovery
|
|
208
|
+
const app = new Hono();
|
|
209
|
+
HonoEndpoint.addRoute(endpoint, ctx.serviceDiscovery as any, app);
|
|
210
|
+
|
|
211
|
+
const response = await app.request(request);
|
|
212
|
+
|
|
213
|
+
return new Response(response.body, {
|
|
214
|
+
status: response.status,
|
|
215
|
+
statusText: response.statusText,
|
|
216
|
+
headers: response.headers,
|
|
217
|
+
});
|
|
218
|
+
}),
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return {
|
|
223
|
+
handlers,
|
|
224
|
+
registerContext,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { setupServer } from 'msw/node';
|
|
2
|
+
import { afterAll, afterEach, beforeAll, describe, expect, it } from 'vitest';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { e } from '../EndpointFactory';
|
|
5
|
+
import { createMswHandlers, TEST_CONTEXT_HEADER } from '../MswEndpointAdaptor';
|
|
6
|
+
|
|
7
|
+
const BASE_URL = 'http://localhost:3000';
|
|
8
|
+
|
|
9
|
+
// --- Services ---
|
|
10
|
+
|
|
11
|
+
interface UserDatabase {
|
|
12
|
+
listUsers(): { id: string; name: string }[];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const DatabaseService = {
|
|
16
|
+
serviceName: 'database' as const,
|
|
17
|
+
register: () => ({ listUsers: () => [] }) as UserDatabase,
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// --- Endpoints ---
|
|
21
|
+
|
|
22
|
+
const listUsers = e
|
|
23
|
+
.get('/users')
|
|
24
|
+
.services([DatabaseService])
|
|
25
|
+
.output(
|
|
26
|
+
z.object({
|
|
27
|
+
users: z.array(z.object({ id: z.string(), name: z.string() })),
|
|
28
|
+
}),
|
|
29
|
+
)
|
|
30
|
+
.handle(async ({ services }) => {
|
|
31
|
+
const users = services.database.listUsers();
|
|
32
|
+
return { users };
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const createUser = e
|
|
36
|
+
.post('/users')
|
|
37
|
+
.body(z.object({ name: z.string().min(1), email: z.string().email() }))
|
|
38
|
+
.output(z.object({ id: z.string(), name: z.string(), email: z.string() }))
|
|
39
|
+
.handle(async ({ body }) => ({
|
|
40
|
+
id: crypto.randomUUID(),
|
|
41
|
+
name: body.name,
|
|
42
|
+
email: body.email,
|
|
43
|
+
}));
|
|
44
|
+
|
|
45
|
+
const getUser = e
|
|
46
|
+
.get('/users/:id')
|
|
47
|
+
.params(z.object({ id: z.string() }))
|
|
48
|
+
.output(z.object({ id: z.string(), name: z.string() }))
|
|
49
|
+
.handle(async ({ params }) => ({
|
|
50
|
+
id: params.id,
|
|
51
|
+
name: 'Test User',
|
|
52
|
+
}));
|
|
53
|
+
|
|
54
|
+
const authorizedEndpoint = e
|
|
55
|
+
.get('/protected')
|
|
56
|
+
.output(z.object({ message: z.string() }))
|
|
57
|
+
.authorize(({ header }) => header('authorization') === 'Bearer valid-token')
|
|
58
|
+
.handle(async () => ({ message: 'secret' }));
|
|
59
|
+
|
|
60
|
+
// --- Setup ---
|
|
61
|
+
|
|
62
|
+
const { handlers, registerContext } = createMswHandlers(
|
|
63
|
+
[listUsers, createUser, getUser, authorizedEndpoint],
|
|
64
|
+
{ baseURL: BASE_URL },
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
const server = setupServer(...handlers);
|
|
68
|
+
|
|
69
|
+
beforeAll(() => server.listen({ onUnhandledRequest: 'bypass' }));
|
|
70
|
+
afterEach(() => server.resetHandlers());
|
|
71
|
+
afterAll(() => server.close());
|
|
72
|
+
|
|
73
|
+
// --- Tests ---
|
|
74
|
+
|
|
75
|
+
describe('MswEndpointAdaptor', () => {
|
|
76
|
+
it('should handle a simple GET request', async () => {
|
|
77
|
+
const contextId = crypto.randomUUID();
|
|
78
|
+
registerContext(contextId, {
|
|
79
|
+
services: {
|
|
80
|
+
database: { listUsers: () => [{ id: '1', name: 'Alice' }] },
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
const response = await fetch(`${BASE_URL}/users`, {
|
|
85
|
+
headers: { [TEST_CONTEXT_HEADER]: contextId },
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
expect(response.status).toBe(200);
|
|
89
|
+
const body = await response.json();
|
|
90
|
+
expect(body.users).toEqual([{ id: '1', name: 'Alice' }]);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('should handle POST with body validation', async () => {
|
|
94
|
+
const contextId = crypto.randomUUID();
|
|
95
|
+
registerContext(contextId, {});
|
|
96
|
+
|
|
97
|
+
const response = await fetch(`${BASE_URL}/users`, {
|
|
98
|
+
method: 'POST',
|
|
99
|
+
headers: {
|
|
100
|
+
'content-type': 'application/json',
|
|
101
|
+
[TEST_CONTEXT_HEADER]: contextId,
|
|
102
|
+
},
|
|
103
|
+
body: JSON.stringify({ name: 'Bob', email: 'bob@example.com' }),
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
expect(response.status).toBe(200);
|
|
107
|
+
const body = await response.json();
|
|
108
|
+
expect(body.name).toBe('Bob');
|
|
109
|
+
expect(body.email).toBe('bob@example.com');
|
|
110
|
+
expect(body.id).toBeDefined();
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('should reject invalid body with 422', async () => {
|
|
114
|
+
const contextId = crypto.randomUUID();
|
|
115
|
+
registerContext(contextId, {});
|
|
116
|
+
|
|
117
|
+
const response = await fetch(`${BASE_URL}/users`, {
|
|
118
|
+
method: 'POST',
|
|
119
|
+
headers: {
|
|
120
|
+
'content-type': 'application/json',
|
|
121
|
+
[TEST_CONTEXT_HEADER]: contextId,
|
|
122
|
+
},
|
|
123
|
+
body: JSON.stringify({ name: '', email: 'not-an-email' }),
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
expect(response.status).toBe(422);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it('should handle path params', async () => {
|
|
130
|
+
const contextId = crypto.randomUUID();
|
|
131
|
+
registerContext(contextId, {});
|
|
132
|
+
|
|
133
|
+
const response = await fetch(`${BASE_URL}/users/user-123`, {
|
|
134
|
+
headers: { [TEST_CONTEXT_HEADER]: contextId },
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
expect(response.status).toBe(200);
|
|
138
|
+
const body = await response.json();
|
|
139
|
+
expect(body.id).toBe('user-123');
|
|
140
|
+
expect(body.name).toBe('Test User');
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('should return 401 when authorization fails', async () => {
|
|
144
|
+
const contextId = crypto.randomUUID();
|
|
145
|
+
registerContext(contextId, {});
|
|
146
|
+
|
|
147
|
+
const response = await fetch(`${BASE_URL}/protected`, {
|
|
148
|
+
headers: {
|
|
149
|
+
[TEST_CONTEXT_HEADER]: contextId,
|
|
150
|
+
authorization: 'Bearer wrong-token',
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
expect(response.status).toBe(401);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it('should return 200 when authorization passes', async () => {
|
|
158
|
+
const contextId = crypto.randomUUID();
|
|
159
|
+
registerContext(contextId, {});
|
|
160
|
+
|
|
161
|
+
const response = await fetch(`${BASE_URL}/protected`, {
|
|
162
|
+
headers: {
|
|
163
|
+
[TEST_CONTEXT_HEADER]: contextId,
|
|
164
|
+
authorization: 'Bearer valid-token',
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
expect(response.status).toBe(200);
|
|
169
|
+
const body = await response.json();
|
|
170
|
+
expect(body.message).toBe('secret');
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
it('should return 500 when context ID is missing', async () => {
|
|
174
|
+
const response = await fetch(`${BASE_URL}/users`);
|
|
175
|
+
|
|
176
|
+
expect(response.status).toBe(500);
|
|
177
|
+
const body = await response.json();
|
|
178
|
+
expect(body.error).toContain('Missing or unknown test context ID');
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it('should isolate concurrent contexts', async () => {
|
|
182
|
+
const contextA = crypto.randomUUID();
|
|
183
|
+
const contextB = crypto.randomUUID();
|
|
184
|
+
|
|
185
|
+
registerContext(contextA, {
|
|
186
|
+
services: {
|
|
187
|
+
database: { listUsers: () => [{ id: '1', name: 'From A' }] },
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
registerContext(contextB, {
|
|
191
|
+
services: {
|
|
192
|
+
database: { listUsers: () => [{ id: '2', name: 'From B' }] },
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
const [responseA, responseB] = await Promise.all([
|
|
197
|
+
fetch(`${BASE_URL}/users`, {
|
|
198
|
+
headers: { [TEST_CONTEXT_HEADER]: contextA },
|
|
199
|
+
}),
|
|
200
|
+
fetch(`${BASE_URL}/users`, {
|
|
201
|
+
headers: { [TEST_CONTEXT_HEADER]: contextB },
|
|
202
|
+
}),
|
|
203
|
+
]);
|
|
204
|
+
|
|
205
|
+
const bodyA = await responseA.json();
|
|
206
|
+
const bodyB = await responseB.json();
|
|
207
|
+
|
|
208
|
+
expect(bodyA.users).toEqual([{ id: '1', name: 'From A' }]);
|
|
209
|
+
expect(bodyB.users).toEqual([{ id: '2', name: 'From B' }]);
|
|
210
|
+
});
|
|
211
|
+
});
|
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-CZw1DRQ6.mjs";
|
|
2
|
-
import { FunctionExecutionWrapper } from "./FunctionExecutionWrapper-C7yYXIq-.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-BF1gJJjG.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AWSLambdaFunction-BF1gJJjG.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"}
|