@geekmidas/constructs 0.0.1
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/README.md +614 -0
- package/dist/AWSLambdaFunction-CpHFE2m6.d.mts +27 -0
- package/dist/AWSLambdaFunction-CwagvPG3.d.cts +27 -0
- package/dist/AWSLambdaFunction-DWIZYsCy.mjs +79 -0
- package/dist/AWSLambdaFunction-DWIZYsCy.mjs.map +1 -0
- package/dist/AWSLambdaFunction-qA5LqPsv.cjs +85 -0
- package/dist/AWSLambdaFunction-qA5LqPsv.cjs.map +1 -0
- package/dist/AWSLambdaSubscriberAdaptor-C1wQuucQ.d.mts +32 -0
- package/dist/AWSLambdaSubscriberAdaptor-CmPZ10JF.cjs +138 -0
- package/dist/AWSLambdaSubscriberAdaptor-CmPZ10JF.cjs.map +1 -0
- package/dist/AWSLambdaSubscriberAdaptor-G8y3YkWj.mjs +132 -0
- package/dist/AWSLambdaSubscriberAdaptor-G8y3YkWj.mjs.map +1 -0
- package/dist/AWSLambdaSubscriberAdaptor-QKVxR6qh.d.cts +32 -0
- package/dist/AmazonApiGatewayEndpointAdaptor-BoBh7vvD.d.mts +61 -0
- package/dist/AmazonApiGatewayEndpointAdaptor-Cx1oqcqh.mjs +124 -0
- package/dist/AmazonApiGatewayEndpointAdaptor-Cx1oqcqh.mjs.map +1 -0
- package/dist/AmazonApiGatewayEndpointAdaptor-DtzgQ9Vb.d.cts +61 -0
- package/dist/AmazonApiGatewayEndpointAdaptor-i74DEUbc.cjs +130 -0
- package/dist/AmazonApiGatewayEndpointAdaptor-i74DEUbc.cjs.map +1 -0
- package/dist/AmazonApiGatewayV1EndpointAdaptor-CLmBDYsl.mjs +42 -0
- package/dist/AmazonApiGatewayV1EndpointAdaptor-CLmBDYsl.mjs.map +1 -0
- package/dist/AmazonApiGatewayV1EndpointAdaptor-EhMd1YqV.d.mts +21 -0
- package/dist/AmazonApiGatewayV1EndpointAdaptor-GkMAUPL5.cjs +47 -0
- package/dist/AmazonApiGatewayV1EndpointAdaptor-GkMAUPL5.cjs.map +1 -0
- package/dist/AmazonApiGatewayV1EndpointAdaptor-Gw-j61qM.d.cts +21 -0
- package/dist/AmazonApiGatewayV2EndpointAdaptor-3RqegmJC.mjs +41 -0
- package/dist/AmazonApiGatewayV2EndpointAdaptor-3RqegmJC.mjs.map +1 -0
- package/dist/AmazonApiGatewayV2EndpointAdaptor-LUlpwmUW.d.cts +21 -0
- package/dist/AmazonApiGatewayV2EndpointAdaptor-YlFoFSS9.cjs +46 -0
- package/dist/AmazonApiGatewayV2EndpointAdaptor-YlFoFSS9.cjs.map +1 -0
- package/dist/AmazonApiGatewayV2EndpointAdaptor-zfd1gqXA.d.mts +21 -0
- package/dist/BaseFunctionBuilder-5QCHkchp.d.cts +31 -0
- package/dist/BaseFunctionBuilder-BFPVGnKi.d.mts +31 -0
- package/dist/BaseFunctionBuilder-BPE9JBbT.mjs +56 -0
- package/dist/BaseFunctionBuilder-BPE9JBbT.mjs.map +1 -0
- package/dist/BaseFunctionBuilder-DtO4Nwxm.cjs +62 -0
- package/dist/BaseFunctionBuilder-DtO4Nwxm.cjs.map +1 -0
- package/dist/Construct-BSEs6uwW.cjs +75 -0
- package/dist/Construct-BSEs6uwW.cjs.map +1 -0
- package/dist/Construct-BbKCIPQm.mjs +63 -0
- package/dist/Construct-BbKCIPQm.mjs.map +1 -0
- package/dist/Construct-Bm-PSO2V.d.cts +42 -0
- package/dist/Construct-DIguIyw4.d.mts +42 -0
- package/dist/Construct.cjs +4 -0
- package/dist/Construct.d.cts +2 -0
- package/dist/Construct.d.mts +2 -0
- package/dist/Construct.mjs +3 -0
- package/dist/Cron-Bgs6EQOb.mjs +20 -0
- package/dist/Cron-Bgs6EQOb.mjs.map +1 -0
- package/dist/Cron-DQiCj3ef.cjs +25 -0
- package/dist/Cron-DQiCj3ef.cjs.map +1 -0
- package/dist/Cron-FpAw03k6.d.mts +25 -0
- package/dist/Cron-ztnK6zgU.d.cts +25 -0
- package/dist/CronBuilder-B2clNQSP.d.mts +24 -0
- package/dist/CronBuilder-Cje9K8lZ.d.cts +24 -0
- package/dist/CronBuilder-DIBqJkh_.cjs +60 -0
- package/dist/CronBuilder-DIBqJkh_.cjs.map +1 -0
- package/dist/CronBuilder-DecAvvcn.mjs +54 -0
- package/dist/CronBuilder-DecAvvcn.mjs.map +1 -0
- package/dist/Endpoint-BaHC9y4Z.cjs +291 -0
- package/dist/Endpoint-BaHC9y4Z.cjs.map +1 -0
- package/dist/Endpoint-C7z9YJHK.d.cts +405 -0
- package/dist/Endpoint-DCn53Vd8.d.mts +405 -0
- package/dist/Endpoint-ierdM62O.mjs +279 -0
- package/dist/Endpoint-ierdM62O.mjs.map +1 -0
- package/dist/EndpointBuilder-BHFSpbPR.cjs +107 -0
- package/dist/EndpointBuilder-BHFSpbPR.cjs.map +1 -0
- package/dist/EndpointBuilder-BLUsoK3l.mjs +101 -0
- package/dist/EndpointBuilder-BLUsoK3l.mjs.map +1 -0
- package/dist/EndpointBuilder-Bfnb2oJr.d.mts +49 -0
- package/dist/EndpointBuilder-CP9RGwZH.d.cts +49 -0
- package/dist/EndpointFactory-BYdDVCNj.mjs +127 -0
- package/dist/EndpointFactory-BYdDVCNj.mjs.map +1 -0
- package/dist/EndpointFactory-CNtMXgIh.d.mts +52 -0
- package/dist/EndpointFactory-CXX4E6Gx.cjs +139 -0
- package/dist/EndpointFactory-CXX4E6Gx.cjs.map +1 -0
- package/dist/EndpointFactory-D2zgWbXZ.d.cts +52 -0
- package/dist/Function-BP58p9Mp.d.cts +59 -0
- package/dist/Function-BsBxc2wA.d.mts +59 -0
- package/dist/Function-C5mW-38v.mjs +72 -0
- package/dist/Function-C5mW-38v.mjs.map +1 -0
- package/dist/Function-CbO2NZx-.cjs +84 -0
- package/dist/Function-CbO2NZx-.cjs.map +1 -0
- package/dist/FunctionBuilder-BS1KgxA_.d.cts +24 -0
- package/dist/FunctionBuilder-C-PfPN3r.d.mts +24 -0
- package/dist/FunctionBuilder-CosgPmMl.mjs +53 -0
- package/dist/FunctionBuilder-CosgPmMl.mjs.map +1 -0
- package/dist/FunctionBuilder-DuOeWCAl.cjs +59 -0
- package/dist/FunctionBuilder-DuOeWCAl.cjs.map +1 -0
- package/dist/FunctionExecutionWrapper-Bx-Dl-2a.d.cts +24 -0
- package/dist/FunctionExecutionWrapper-CElXEjPe.cjs +42 -0
- package/dist/FunctionExecutionWrapper-CElXEjPe.cjs.map +1 -0
- package/dist/FunctionExecutionWrapper-DvglBBjE.d.mts +24 -0
- package/dist/FunctionExecutionWrapper-XGrSAAPD.mjs +36 -0
- package/dist/FunctionExecutionWrapper-XGrSAAPD.mjs.map +1 -0
- package/dist/HonoEndpointAdaptor-B0IO1zj2.d.mts +41 -0
- package/dist/HonoEndpointAdaptor-B4snrp7v.cjs +154 -0
- package/dist/HonoEndpointAdaptor-B4snrp7v.cjs.map +1 -0
- package/dist/HonoEndpointAdaptor-B6lW9Q1k.d.cts +41 -0
- package/dist/HonoEndpointAdaptor-D-M4-6Tf.mjs +148 -0
- package/dist/HonoEndpointAdaptor-D-M4-6Tf.mjs.map +1 -0
- package/dist/Subscriber-BoFm12i_.d.cts +33 -0
- package/dist/Subscriber-BwuCaC9G.mjs +28 -0
- package/dist/Subscriber-BwuCaC9G.mjs.map +1 -0
- package/dist/Subscriber-THGsj7Iy.d.mts +33 -0
- package/dist/Subscriber-iMRFG7ba.cjs +34 -0
- package/dist/Subscriber-iMRFG7ba.cjs.map +1 -0
- package/dist/SubscriberBuilder-CiPxgnKT.d.mts +26 -0
- package/dist/SubscriberBuilder-Dhz0C_t-.mjs +54 -0
- package/dist/SubscriberBuilder-Dhz0C_t-.mjs.map +1 -0
- package/dist/SubscriberBuilder-DuIgxuzc.d.cts +26 -0
- package/dist/SubscriberBuilder-wthr-FL9.cjs +60 -0
- package/dist/SubscriberBuilder-wthr-FL9.cjs.map +1 -0
- package/dist/adaptors/aws.cjs +19 -0
- package/dist/adaptors/aws.d.cts +15 -0
- package/dist/adaptors/aws.d.mts +15 -0
- package/dist/adaptors/aws.mjs +16 -0
- package/dist/adaptors/hono.cjs +12 -0
- package/dist/adaptors/hono.d.cts +9 -0
- package/dist/adaptors/hono.d.mts +9 -0
- package/dist/adaptors/hono.mjs +12 -0
- package/dist/chunk-CUT6urMc.cjs +30 -0
- package/dist/crons/Cron.cjs +8 -0
- package/dist/crons/Cron.d.cts +7 -0
- package/dist/crons/Cron.d.mts +7 -0
- package/dist/crons/Cron.mjs +8 -0
- package/dist/crons/CronBuilder.cjs +9 -0
- package/dist/crons/CronBuilder.d.cts +8 -0
- package/dist/crons/CronBuilder.d.mts +8 -0
- package/dist/crons/CronBuilder.mjs +9 -0
- package/dist/crons/index.cjs +16 -0
- package/dist/crons/index.cjs.map +1 -0
- package/dist/crons/index.d.cts +16 -0
- package/dist/crons/index.d.mts +16 -0
- package/dist/crons/index.mjs +14 -0
- package/dist/crons/index.mjs.map +1 -0
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +10 -0
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +9 -0
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +9 -0
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +10 -0
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +12 -0
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +10 -0
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +10 -0
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +12 -0
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +12 -0
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +10 -0
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +10 -0
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +12 -0
- package/dist/endpoints/Endpoint.cjs +9 -0
- package/dist/endpoints/Endpoint.d.cts +8 -0
- package/dist/endpoints/Endpoint.d.mts +8 -0
- package/dist/endpoints/Endpoint.mjs +8 -0
- package/dist/endpoints/EndpointBuilder.cjs +9 -0
- package/dist/endpoints/EndpointBuilder.d.cts +9 -0
- package/dist/endpoints/EndpointBuilder.d.mts +9 -0
- package/dist/endpoints/EndpointBuilder.mjs +9 -0
- package/dist/endpoints/EndpointFactory.cjs +11 -0
- package/dist/endpoints/EndpointFactory.d.cts +10 -0
- package/dist/endpoints/EndpointFactory.d.mts +10 -0
- package/dist/endpoints/EndpointFactory.mjs +10 -0
- package/dist/endpoints/HonoEndpointAdaptor.cjs +12 -0
- package/dist/endpoints/HonoEndpointAdaptor.d.cts +9 -0
- package/dist/endpoints/HonoEndpointAdaptor.d.mts +9 -0
- package/dist/endpoints/HonoEndpointAdaptor.mjs +12 -0
- package/dist/endpoints/TestEndpointAdaptor.cjs +54 -0
- package/dist/endpoints/TestEndpointAdaptor.cjs.map +1 -0
- package/dist/endpoints/TestEndpointAdaptor.d.cts +29 -0
- package/dist/endpoints/TestEndpointAdaptor.d.mts +29 -0
- package/dist/endpoints/TestEndpointAdaptor.mjs +53 -0
- package/dist/endpoints/TestEndpointAdaptor.mjs.map +1 -0
- package/dist/endpoints/helpers.cjs +10 -0
- package/dist/endpoints/helpers.d.cts +58 -0
- package/dist/endpoints/helpers.d.mts +58 -0
- package/dist/endpoints/helpers.mjs +9 -0
- package/dist/endpoints/index.cjs +16 -0
- package/dist/endpoints/index.cjs.map +1 -0
- package/dist/endpoints/index.d.cts +16 -0
- package/dist/endpoints/index.d.mts +16 -0
- package/dist/endpoints/index.mjs +15 -0
- package/dist/endpoints/index.mjs.map +1 -0
- package/dist/endpoints/parseHonoQuery.cjs +3 -0
- package/dist/endpoints/parseHonoQuery.d.cts +12 -0
- package/dist/endpoints/parseHonoQuery.d.mts +12 -0
- package/dist/endpoints/parseHonoQuery.mjs +3 -0
- package/dist/endpoints/parseQueryParams.cjs +3 -0
- package/dist/endpoints/parseQueryParams.d.cts +13 -0
- package/dist/endpoints/parseQueryParams.d.mts +13 -0
- package/dist/endpoints/parseQueryParams.mjs +3 -0
- package/dist/functions/AWSLambdaFunction.cjs +9 -0
- package/dist/functions/AWSLambdaFunction.d.cts +5 -0
- package/dist/functions/AWSLambdaFunction.d.mts +5 -0
- package/dist/functions/AWSLambdaFunction.mjs +9 -0
- package/dist/functions/BaseFunctionBuilder.cjs +4 -0
- package/dist/functions/BaseFunctionBuilder.d.cts +3 -0
- package/dist/functions/BaseFunctionBuilder.d.mts +3 -0
- package/dist/functions/BaseFunctionBuilder.mjs +4 -0
- package/dist/functions/Function.cjs +5 -0
- package/dist/functions/Function.d.cts +3 -0
- package/dist/functions/Function.d.mts +3 -0
- package/dist/functions/Function.mjs +4 -0
- package/dist/functions/FunctionBuilder.cjs +6 -0
- package/dist/functions/FunctionBuilder.d.cts +5 -0
- package/dist/functions/FunctionBuilder.d.mts +5 -0
- package/dist/functions/FunctionBuilder.mjs +6 -0
- package/dist/functions/FunctionExecutionWrapper.cjs +8 -0
- package/dist/functions/FunctionExecutionWrapper.d.cts +4 -0
- package/dist/functions/FunctionExecutionWrapper.d.mts +4 -0
- package/dist/functions/FunctionExecutionWrapper.mjs +8 -0
- package/dist/functions/TestFunctionAdaptor.cjs +38 -0
- package/dist/functions/TestFunctionAdaptor.cjs.map +1 -0
- package/dist/functions/TestFunctionAdaptor.d.cts +26 -0
- package/dist/functions/TestFunctionAdaptor.d.mts +26 -0
- package/dist/functions/TestFunctionAdaptor.mjs +37 -0
- package/dist/functions/TestFunctionAdaptor.mjs.map +1 -0
- package/dist/functions/index.cjs +10 -0
- package/dist/functions/index.d.cts +6 -0
- package/dist/functions/index.d.mts +6 -0
- package/dist/functions/index.mjs +7 -0
- package/dist/functions-DVDb5wEA.cjs +13 -0
- package/dist/functions-DVDb5wEA.cjs.map +1 -0
- package/dist/functions-mM-jcphA.mjs +8 -0
- package/dist/functions-mM-jcphA.mjs.map +1 -0
- package/dist/helpers-BeGM4pP_.cjs +95 -0
- package/dist/helpers-BeGM4pP_.cjs.map +1 -0
- package/dist/helpers-DbpO95aE.mjs +83 -0
- package/dist/helpers-DbpO95aE.mjs.map +1 -0
- package/dist/index-CuGR4L7O.d.mts +9 -0
- package/dist/index-Fg3N3EKD.d.cts +9 -0
- package/dist/index.cjs +4 -0
- package/dist/index.d.cts +4 -0
- package/dist/index.d.mts +4 -0
- package/dist/index.mjs +3 -0
- package/dist/parseHonoQuery-DopC24vB.cjs +37 -0
- package/dist/parseHonoQuery-DopC24vB.cjs.map +1 -0
- package/dist/parseHonoQuery-znDKBhdE.mjs +31 -0
- package/dist/parseHonoQuery-znDKBhdE.mjs.map +1 -0
- package/dist/parseQueryParams-BJaRh3OB.mjs +32 -0
- package/dist/parseQueryParams-BJaRh3OB.mjs.map +1 -0
- package/dist/parseQueryParams-BzPop4I1.cjs +38 -0
- package/dist/parseQueryParams-BzPop4I1.cjs.map +1 -0
- package/dist/publisher-Bw4770Hi.mjs +41 -0
- package/dist/publisher-Bw4770Hi.mjs.map +1 -0
- package/dist/publisher-lFQleddL.cjs +53 -0
- package/dist/publisher-lFQleddL.cjs.map +1 -0
- package/dist/publisher.cjs +4 -0
- package/dist/publisher.d.cts +13 -0
- package/dist/publisher.d.mts +13 -0
- package/dist/publisher.mjs +3 -0
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.cjs +3 -0
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.cts +4 -0
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +4 -0
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.mjs +3 -0
- package/dist/subscribers/Subscriber.cjs +4 -0
- package/dist/subscribers/Subscriber.d.cts +3 -0
- package/dist/subscribers/Subscriber.d.mts +3 -0
- package/dist/subscribers/Subscriber.mjs +4 -0
- package/dist/subscribers/SubscriberBuilder.cjs +5 -0
- package/dist/subscribers/SubscriberBuilder.d.cts +4 -0
- package/dist/subscribers/SubscriberBuilder.d.mts +4 -0
- package/dist/subscribers/SubscriberBuilder.mjs +5 -0
- package/dist/subscribers/index.cjs +12 -0
- package/dist/subscribers/index.cjs.map +1 -0
- package/dist/subscribers/index.d.cts +10 -0
- package/dist/subscribers/index.d.mts +10 -0
- package/dist/subscribers/index.mjs +10 -0
- package/dist/subscribers/index.mjs.map +1 -0
- package/dist/types-Bp9ysFXd.d.cts +7 -0
- package/dist/types-DBKNYvsW.d.mts +7 -0
- package/dist/types.cjs +0 -0
- package/dist/types.d.cts +2 -0
- package/dist/types.d.mts +2 -0
- package/dist/types.mjs +0 -0
- package/package.json +91 -0
- package/src/Construct.ts +98 -0
- package/src/__tests__/Construct.environment.spec.ts +360 -0
- package/src/__tests__/publisher.setting.spec.ts +511 -0
- package/src/__tests__/publisher.spec.ts +454 -0
- package/src/adaptors/aws.ts +4 -0
- package/src/adaptors/hono.ts +1 -0
- package/src/crons/Cron.ts +137 -0
- package/src/crons/CronBuilder.ts +192 -0
- package/src/crons/__tests__/Cron.spec.ts +464 -0
- package/src/crons/index.ts +11 -0
- package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +315 -0
- package/src/endpoints/AmazonApiGatewayV1EndpointAdaptor.ts +101 -0
- package/src/endpoints/AmazonApiGatewayV2EndpointAdaptor.ts +95 -0
- package/src/endpoints/Endpoint.ts +771 -0
- package/src/endpoints/EndpointBuilder.ts +308 -0
- package/src/endpoints/EndpointFactory.ts +329 -0
- package/src/endpoints/HonoEndpointAdaptor.ts +365 -0
- package/src/endpoints/TestEndpointAdaptor.ts +130 -0
- package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.events.spec.ts +553 -0
- package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.spec.ts +927 -0
- package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.events.spec.ts +721 -0
- package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.factory-publisher.spec.ts +296 -0
- package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.spec.ts +441 -0
- package/src/endpoints/__tests__/Endpoint.spec.ts +800 -0
- package/src/endpoints/__tests__/EndpointBuilder.spec.ts +488 -0
- package/src/endpoints/__tests__/EndpointFactory.spec.ts +479 -0
- package/src/endpoints/__tests__/HonoEndpointAdaptor.events.spec.ts +569 -0
- package/src/endpoints/__tests__/HonoEndpointAdaptor.openapi.spec.ts +313 -0
- package/src/endpoints/__tests__/HonoEndpointAdaptor.spec.ts +1078 -0
- package/src/endpoints/__tests__/TestEndpointAdaptor.spec.ts +236 -0
- package/src/endpoints/__tests__/__snapshots__/HonoEndpointAdaptor.spec.ts.snap +54 -0
- package/src/endpoints/__tests__/endpoint-types.test.ts +88 -0
- package/src/endpoints/helpers.ts +99 -0
- package/src/endpoints/index.ts +5 -0
- package/src/endpoints/parseHonoQuery.ts +51 -0
- package/src/endpoints/parseQueryParams.ts +51 -0
- package/src/functions/AWSLambdaFunction.ts +222 -0
- package/src/functions/BaseFunctionBuilder.ts +110 -0
- package/src/functions/Function.ts +160 -0
- package/src/functions/FunctionBuilder.ts +182 -0
- package/src/functions/FunctionExecutionWrapper.ts +86 -0
- package/src/functions/TestFunctionAdaptor.ts +125 -0
- package/src/functions/__tests__/AWSLambdaFunctionAdaptor.spec.ts +376 -0
- package/src/functions/__tests__/Function.spec.ts +402 -0
- package/src/functions/__tests__/TestFunctionAdaptor.spec.ts +398 -0
- package/src/functions/index.ts +10 -0
- package/src/index.ts +14 -0
- package/src/publisher.ts +83 -0
- package/src/subscribers/AWSLambdaSubscriberAdaptor.ts +269 -0
- package/src/subscribers/Subscriber.ts +112 -0
- package/src/subscribers/SubscriberBuilder.ts +150 -0
- package/src/subscribers/__tests__/AWSLambdaSubscriberAdaptor.spec.ts +623 -0
- package/src/subscribers/__tests__/Subscriber.spec.ts +432 -0
- package/src/subscribers/index.ts +5 -0
- package/src/types.ts +13 -0
- package/tsdown.config.ts +3 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import type { EnvironmentParser } from '@geekmidas/envkit';
|
|
2
|
+
import type { EventPublisher } from '@geekmidas/events';
|
|
3
|
+
import type { Logger } from '@geekmidas/logger';
|
|
4
|
+
import { checkRateLimit, getRateLimitHeaders } from '@geekmidas/rate-limit';
|
|
5
|
+
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
6
|
+
import { type Context, Hono } from 'hono';
|
|
7
|
+
import { validator } from 'hono/validator';
|
|
8
|
+
import type { HttpMethod, LowerHttpMethod } from '../types';
|
|
9
|
+
import {
|
|
10
|
+
Endpoint,
|
|
11
|
+
type EndpointContext,
|
|
12
|
+
type EndpointSchemas,
|
|
13
|
+
} from './Endpoint';
|
|
14
|
+
import { getEndpointsFromRoutes } from './helpers';
|
|
15
|
+
import { parseHonoQuery } from './parseHonoQuery';
|
|
16
|
+
|
|
17
|
+
import { wrapError } from '@geekmidas/errors';
|
|
18
|
+
import {
|
|
19
|
+
type Service,
|
|
20
|
+
ServiceDiscovery,
|
|
21
|
+
type ServiceRecord,
|
|
22
|
+
} from '@geekmidas/services';
|
|
23
|
+
import type { ContentfulStatusCode } from 'hono/utils/http-status';
|
|
24
|
+
import { publishConstructEvents } from '../publisher';
|
|
25
|
+
|
|
26
|
+
export interface HonoEndpointOptions {
|
|
27
|
+
/**
|
|
28
|
+
* Path where OpenAPI documentation will be served.
|
|
29
|
+
* Set to false to disable docs route.
|
|
30
|
+
* @default '/docs'
|
|
31
|
+
*/
|
|
32
|
+
docsPath?: string | false;
|
|
33
|
+
/**
|
|
34
|
+
* OpenAPI schema options
|
|
35
|
+
*/
|
|
36
|
+
openApiOptions?: {
|
|
37
|
+
title?: string;
|
|
38
|
+
version?: string;
|
|
39
|
+
description?: string;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export class HonoEndpoint<
|
|
44
|
+
TRoute extends string,
|
|
45
|
+
TMethod extends HttpMethod,
|
|
46
|
+
TInput extends EndpointSchemas = {},
|
|
47
|
+
TOutSchema extends StandardSchemaV1 | undefined = undefined,
|
|
48
|
+
TServices extends Service[] = [],
|
|
49
|
+
TLogger extends Logger = Logger,
|
|
50
|
+
TSession = unknown,
|
|
51
|
+
TEventPublisher extends EventPublisher<any> | undefined = undefined,
|
|
52
|
+
> {
|
|
53
|
+
constructor(
|
|
54
|
+
private readonly endpoint: Endpoint<
|
|
55
|
+
TRoute,
|
|
56
|
+
TMethod,
|
|
57
|
+
TInput,
|
|
58
|
+
TOutSchema,
|
|
59
|
+
TServices,
|
|
60
|
+
TLogger,
|
|
61
|
+
TSession,
|
|
62
|
+
TEventPublisher
|
|
63
|
+
>,
|
|
64
|
+
) {}
|
|
65
|
+
|
|
66
|
+
static async validate<T extends StandardSchemaV1>(
|
|
67
|
+
c: Context<any, string, {}>,
|
|
68
|
+
data: unknown,
|
|
69
|
+
schema?: T,
|
|
70
|
+
) {
|
|
71
|
+
if (!schema) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const parsed = await Endpoint.validate(schema, data);
|
|
76
|
+
|
|
77
|
+
if (parsed.issues) {
|
|
78
|
+
return c.json(parsed.issues, 422);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return parsed.value;
|
|
82
|
+
}
|
|
83
|
+
addRoute(
|
|
84
|
+
serviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,
|
|
85
|
+
app: Hono,
|
|
86
|
+
): void {
|
|
87
|
+
HonoEndpoint.addRoute(this.endpoint, serviceDiscovery, app);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
static applyEventMiddleware(
|
|
91
|
+
app: Hono,
|
|
92
|
+
serviceDiscovery: ServiceDiscovery<any, any>,
|
|
93
|
+
) {
|
|
94
|
+
app.use(async (c, next) => {
|
|
95
|
+
await next();
|
|
96
|
+
// @ts-ignore
|
|
97
|
+
const endpoint = c.get('__endpoint') as Endpoint<
|
|
98
|
+
any,
|
|
99
|
+
any,
|
|
100
|
+
any,
|
|
101
|
+
any,
|
|
102
|
+
any,
|
|
103
|
+
any,
|
|
104
|
+
any,
|
|
105
|
+
any
|
|
106
|
+
>;
|
|
107
|
+
// @ts-ignore
|
|
108
|
+
const response = c.get('__response') as InferStandardSchema<TOutSchema>;
|
|
109
|
+
// @ts-ignore
|
|
110
|
+
const logger = c.get('__logger') as Logger;
|
|
111
|
+
|
|
112
|
+
if (Endpoint.isSuccessStatus(c.res.status) && endpoint) {
|
|
113
|
+
await publishConstructEvents<any, any>(
|
|
114
|
+
endpoint,
|
|
115
|
+
response,
|
|
116
|
+
serviceDiscovery,
|
|
117
|
+
logger,
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
static async fromRoutes<TLogger extends Logger, TServices extends Service[]>(
|
|
124
|
+
routes: string[],
|
|
125
|
+
envParser: EnvironmentParser<{}>,
|
|
126
|
+
app = new Hono(),
|
|
127
|
+
logger: TLogger,
|
|
128
|
+
cwd = process.cwd(),
|
|
129
|
+
options?: HonoEndpointOptions,
|
|
130
|
+
): Promise<Hono> {
|
|
131
|
+
const endpoints = await getEndpointsFromRoutes<TServices>(routes, cwd);
|
|
132
|
+
const serviceDiscovery = ServiceDiscovery.getInstance<
|
|
133
|
+
ServiceRecord<TServices>,
|
|
134
|
+
TLogger
|
|
135
|
+
>(logger, envParser);
|
|
136
|
+
|
|
137
|
+
HonoEndpoint.addRoutes(endpoints, serviceDiscovery, app, options);
|
|
138
|
+
|
|
139
|
+
return app;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
static addRoutes<
|
|
143
|
+
TServices extends Service[] = [],
|
|
144
|
+
TLogger extends Logger = Logger,
|
|
145
|
+
>(
|
|
146
|
+
endpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[],
|
|
147
|
+
serviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,
|
|
148
|
+
app: Hono,
|
|
149
|
+
options?: HonoEndpointOptions,
|
|
150
|
+
): void {
|
|
151
|
+
// Add docs route if not disabled
|
|
152
|
+
const docsPath =
|
|
153
|
+
options?.docsPath !== false ? options?.docsPath || '/docs' : null;
|
|
154
|
+
if (docsPath) {
|
|
155
|
+
HonoEndpoint.addDocsRoute(
|
|
156
|
+
endpoints,
|
|
157
|
+
app,
|
|
158
|
+
docsPath,
|
|
159
|
+
options?.openApiOptions,
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Sort endpoints to ensure static routes come before dynamic ones
|
|
164
|
+
const sortedEndpoints = endpoints.sort((a, b) => {
|
|
165
|
+
const aSegments = a.route.split('/');
|
|
166
|
+
const bSegments = b.route.split('/');
|
|
167
|
+
|
|
168
|
+
// Compare each segment
|
|
169
|
+
for (let i = 0; i < Math.max(aSegments.length, bSegments.length); i++) {
|
|
170
|
+
const aSegment = aSegments[i] || '';
|
|
171
|
+
const bSegment = bSegments[i] || '';
|
|
172
|
+
|
|
173
|
+
// If one is dynamic and the other is not, static comes first
|
|
174
|
+
const aIsDynamic = aSegment.startsWith(':');
|
|
175
|
+
const bIsDynamic = bSegment.startsWith(':');
|
|
176
|
+
|
|
177
|
+
if (!aIsDynamic && bIsDynamic) return -1;
|
|
178
|
+
if (aIsDynamic && !bIsDynamic) return 1;
|
|
179
|
+
|
|
180
|
+
// If both are the same type, compare alphabetically
|
|
181
|
+
if (aSegment !== bSegment) {
|
|
182
|
+
return aSegment.localeCompare(bSegment);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
return 0;
|
|
187
|
+
});
|
|
188
|
+
HonoEndpoint.applyEventMiddleware(app, serviceDiscovery);
|
|
189
|
+
for (const endpoint of sortedEndpoints) {
|
|
190
|
+
HonoEndpoint.addRoute(endpoint, serviceDiscovery, app);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
static addRoute<
|
|
195
|
+
TRoute extends string,
|
|
196
|
+
TMethod extends HttpMethod,
|
|
197
|
+
TInput extends EndpointSchemas = {},
|
|
198
|
+
TOutSchema extends StandardSchemaV1 | undefined = undefined,
|
|
199
|
+
TServices extends Service[] = [],
|
|
200
|
+
TLogger extends Logger = Logger,
|
|
201
|
+
TSession = unknown,
|
|
202
|
+
TEventPublisher extends EventPublisher<any> | undefined = undefined,
|
|
203
|
+
>(
|
|
204
|
+
endpoint: Endpoint<
|
|
205
|
+
TRoute,
|
|
206
|
+
TMethod,
|
|
207
|
+
TInput,
|
|
208
|
+
TOutSchema,
|
|
209
|
+
TServices,
|
|
210
|
+
TLogger,
|
|
211
|
+
TSession,
|
|
212
|
+
TEventPublisher
|
|
213
|
+
>,
|
|
214
|
+
serviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,
|
|
215
|
+
app: Hono,
|
|
216
|
+
): void {
|
|
217
|
+
const { route } = endpoint;
|
|
218
|
+
const method = endpoint.method.toLowerCase() as LowerHttpMethod<TMethod>;
|
|
219
|
+
|
|
220
|
+
app[method](
|
|
221
|
+
route,
|
|
222
|
+
validator('json', (value, c) =>
|
|
223
|
+
HonoEndpoint.validate(c, value, endpoint.input?.body),
|
|
224
|
+
),
|
|
225
|
+
validator('query', (_, c) => {
|
|
226
|
+
const parsedQuery = parseHonoQuery(c);
|
|
227
|
+
return HonoEndpoint.validate(c, parsedQuery, endpoint.input?.query);
|
|
228
|
+
}),
|
|
229
|
+
validator('param', (params, c) =>
|
|
230
|
+
HonoEndpoint.validate(c, params, endpoint.input?.params),
|
|
231
|
+
),
|
|
232
|
+
async (c) => {
|
|
233
|
+
const logger = endpoint.logger.child({
|
|
234
|
+
endpoint: endpoint.fullPath,
|
|
235
|
+
route: endpoint.route,
|
|
236
|
+
host: c.header('host'),
|
|
237
|
+
method: endpoint.method,
|
|
238
|
+
path: c.req.path,
|
|
239
|
+
}) as TLogger;
|
|
240
|
+
|
|
241
|
+
try {
|
|
242
|
+
const headerValues = c.req.header();
|
|
243
|
+
|
|
244
|
+
const header = Endpoint.createHeaders(headerValues);
|
|
245
|
+
|
|
246
|
+
const services = await serviceDiscovery.register(endpoint.services);
|
|
247
|
+
|
|
248
|
+
const session = await endpoint.getSession({
|
|
249
|
+
services,
|
|
250
|
+
logger,
|
|
251
|
+
header,
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
const isAuthorized = await endpoint.authorize({
|
|
255
|
+
header,
|
|
256
|
+
services,
|
|
257
|
+
logger,
|
|
258
|
+
session,
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
if (!isAuthorized) {
|
|
262
|
+
logger.warn('Unauthorized access attempt');
|
|
263
|
+
return c.json({ error: 'Unauthorized' }, 401);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Check rate limit if configured
|
|
267
|
+
if (endpoint.rateLimit) {
|
|
268
|
+
const rateLimitInfo = await checkRateLimit(endpoint.rateLimit, {
|
|
269
|
+
header,
|
|
270
|
+
services,
|
|
271
|
+
logger,
|
|
272
|
+
session,
|
|
273
|
+
path: c.req.path,
|
|
274
|
+
method: endpoint.method,
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
// Set rate limit headers
|
|
278
|
+
const rateLimitHeaders = getRateLimitHeaders(
|
|
279
|
+
rateLimitInfo,
|
|
280
|
+
endpoint.rateLimit,
|
|
281
|
+
);
|
|
282
|
+
for (const [key, value] of Object.entries(rateLimitHeaders)) {
|
|
283
|
+
if (value) {
|
|
284
|
+
c.header(key, value);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
const response = await endpoint.handler({
|
|
290
|
+
services,
|
|
291
|
+
logger,
|
|
292
|
+
body: c.req.valid('json'),
|
|
293
|
+
query: c.req.valid('query'),
|
|
294
|
+
params: c.req.valid('param'),
|
|
295
|
+
session,
|
|
296
|
+
header: Endpoint.createHeaders(headerValues),
|
|
297
|
+
} as unknown as EndpointContext<
|
|
298
|
+
TInput,
|
|
299
|
+
TServices,
|
|
300
|
+
TLogger,
|
|
301
|
+
TSession
|
|
302
|
+
>);
|
|
303
|
+
|
|
304
|
+
// Publish events if configured
|
|
305
|
+
|
|
306
|
+
// Validate output if schema is defined
|
|
307
|
+
|
|
308
|
+
try {
|
|
309
|
+
const status = endpoint.status as ContentfulStatusCode;
|
|
310
|
+
const output = endpoint.outputSchema
|
|
311
|
+
? await endpoint.parseOutput(response)
|
|
312
|
+
: ({} as any);
|
|
313
|
+
// @ts-ignore
|
|
314
|
+
c.set('__response', output);
|
|
315
|
+
// @ts-ignore
|
|
316
|
+
c.set('__endpoint', endpoint);
|
|
317
|
+
// @ts-ignore
|
|
318
|
+
c.set('__logger', logger);
|
|
319
|
+
|
|
320
|
+
return c.json(output, status);
|
|
321
|
+
} catch (validationError: any) {
|
|
322
|
+
logger.error(validationError, 'Output validation failed');
|
|
323
|
+
const error = wrapError(
|
|
324
|
+
validationError,
|
|
325
|
+
422,
|
|
326
|
+
'Response validation failed',
|
|
327
|
+
);
|
|
328
|
+
return c.json(error, error.statusCode as ContentfulStatusCode);
|
|
329
|
+
}
|
|
330
|
+
} catch (e: any) {
|
|
331
|
+
logger.error(e, 'Error processing endpoint request');
|
|
332
|
+
const error = wrapError(e, 500, 'Internal Server Error');
|
|
333
|
+
return c.json(error, error.statusCode as ContentfulStatusCode);
|
|
334
|
+
}
|
|
335
|
+
},
|
|
336
|
+
);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
static addDocsRoute<
|
|
340
|
+
TServices extends Service[] = [],
|
|
341
|
+
TLogger extends Logger = Logger,
|
|
342
|
+
>(
|
|
343
|
+
endpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[],
|
|
344
|
+
app: Hono,
|
|
345
|
+
docsPath: string,
|
|
346
|
+
openApiOptions?: HonoEndpointOptions['openApiOptions'],
|
|
347
|
+
): void {
|
|
348
|
+
app.get(docsPath, async (c) => {
|
|
349
|
+
try {
|
|
350
|
+
const openApiSchema = await Endpoint.buildOpenApiSchema(
|
|
351
|
+
endpoints,
|
|
352
|
+
openApiOptions,
|
|
353
|
+
);
|
|
354
|
+
|
|
355
|
+
return c.json(openApiSchema);
|
|
356
|
+
} catch (error) {
|
|
357
|
+
console.error('Error generating OpenAPI schema:', error);
|
|
358
|
+
return c.json(
|
|
359
|
+
{ error: 'Failed to generate OpenAPI documentation' },
|
|
360
|
+
500,
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { EnvironmentParser } from '@geekmidas/envkit';
|
|
2
|
+
import type { EventPublisher } from '@geekmidas/events';
|
|
3
|
+
import type { Logger } from '@geekmidas/logger';
|
|
4
|
+
import type {
|
|
5
|
+
InferComposableStandardSchema,
|
|
6
|
+
InferStandardSchema,
|
|
7
|
+
} from '@geekmidas/schema';
|
|
8
|
+
import {
|
|
9
|
+
type Service,
|
|
10
|
+
ServiceDiscovery,
|
|
11
|
+
type ServiceRecord,
|
|
12
|
+
} from '@geekmidas/services';
|
|
13
|
+
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
14
|
+
import { publishConstructEvents } from '../publisher';
|
|
15
|
+
import type { HttpMethod } from '../types';
|
|
16
|
+
import { Endpoint, type EndpointSchemas } from './Endpoint';
|
|
17
|
+
|
|
18
|
+
export class TestEndpointAdaptor<
|
|
19
|
+
TRoute extends string,
|
|
20
|
+
TMethod extends HttpMethod,
|
|
21
|
+
TInput extends EndpointSchemas = {},
|
|
22
|
+
TOutSchema extends StandardSchemaV1 | undefined = undefined,
|
|
23
|
+
TServices extends Service[] = [],
|
|
24
|
+
TLogger extends Logger = Logger,
|
|
25
|
+
TSession = unknown,
|
|
26
|
+
TEventPublisher extends EventPublisher<any> | undefined = undefined,
|
|
27
|
+
TEventPublisherServiceName extends string = string,
|
|
28
|
+
> {
|
|
29
|
+
static getDefaultServiceDiscover<
|
|
30
|
+
TRoute extends string,
|
|
31
|
+
TMethod extends HttpMethod,
|
|
32
|
+
TInput extends EndpointSchemas = {},
|
|
33
|
+
TOutSchema extends StandardSchemaV1 | undefined = undefined,
|
|
34
|
+
TServices extends Service[] = [],
|
|
35
|
+
TLogger extends Logger = Logger,
|
|
36
|
+
TSession = unknown,
|
|
37
|
+
TEventPublisher extends EventPublisher<any> | undefined = undefined,
|
|
38
|
+
TEventPublisherServiceName extends string = string,
|
|
39
|
+
>(
|
|
40
|
+
endpoint: Endpoint<
|
|
41
|
+
TRoute,
|
|
42
|
+
TMethod,
|
|
43
|
+
TInput,
|
|
44
|
+
TOutSchema,
|
|
45
|
+
TServices,
|
|
46
|
+
TLogger,
|
|
47
|
+
TSession,
|
|
48
|
+
TEventPublisher,
|
|
49
|
+
TEventPublisherServiceName
|
|
50
|
+
>,
|
|
51
|
+
) {
|
|
52
|
+
return ServiceDiscovery.getInstance(
|
|
53
|
+
endpoint.logger,
|
|
54
|
+
new EnvironmentParser({}),
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
constructor(
|
|
58
|
+
private readonly endpoint: Endpoint<
|
|
59
|
+
TRoute,
|
|
60
|
+
TMethod,
|
|
61
|
+
TInput,
|
|
62
|
+
TOutSchema,
|
|
63
|
+
TServices,
|
|
64
|
+
TLogger,
|
|
65
|
+
TSession,
|
|
66
|
+
TEventPublisher,
|
|
67
|
+
TEventPublisherServiceName
|
|
68
|
+
>,
|
|
69
|
+
private serviceDiscovery: ServiceDiscovery<
|
|
70
|
+
any,
|
|
71
|
+
any
|
|
72
|
+
> = TestEndpointAdaptor.getDefaultServiceDiscover(endpoint),
|
|
73
|
+
) {}
|
|
74
|
+
|
|
75
|
+
async request(
|
|
76
|
+
ctx: TestRequestAdaptor<
|
|
77
|
+
TInput,
|
|
78
|
+
TServices,
|
|
79
|
+
TEventPublisher,
|
|
80
|
+
TEventPublisherServiceName
|
|
81
|
+
>,
|
|
82
|
+
): Promise<InferStandardSchema<TOutSchema>> {
|
|
83
|
+
const body = await this.endpoint.parseInput((ctx as any).body, 'body');
|
|
84
|
+
const query = await this.endpoint.parseInput((ctx as any).query, 'query');
|
|
85
|
+
const params = await this.endpoint.parseInput(
|
|
86
|
+
(ctx as any).params,
|
|
87
|
+
'params',
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
const header = Endpoint.createHeaders(ctx.headers);
|
|
91
|
+
const logger = this.endpoint.logger.child({
|
|
92
|
+
route: this.endpoint.route,
|
|
93
|
+
host: ctx.headers.host,
|
|
94
|
+
method: this.endpoint.method,
|
|
95
|
+
}) as TLogger;
|
|
96
|
+
const session = await this.endpoint.getSession({
|
|
97
|
+
logger,
|
|
98
|
+
services: ctx.services,
|
|
99
|
+
header,
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const response = await this.endpoint.handler({
|
|
103
|
+
body,
|
|
104
|
+
query,
|
|
105
|
+
params,
|
|
106
|
+
session,
|
|
107
|
+
services: ctx.services,
|
|
108
|
+
logger,
|
|
109
|
+
header,
|
|
110
|
+
} as any);
|
|
111
|
+
|
|
112
|
+
const output = await this.endpoint.parseOutput(response);
|
|
113
|
+
ctx.publisher && (await this.serviceDiscovery.register([ctx.publisher]));
|
|
114
|
+
|
|
115
|
+
await publishConstructEvents(this.endpoint, output, this.serviceDiscovery);
|
|
116
|
+
|
|
117
|
+
return output;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export type TestRequestAdaptor<
|
|
122
|
+
TInput extends EndpointSchemas = {},
|
|
123
|
+
TServices extends Service[] = [],
|
|
124
|
+
TEventPublisher extends EventPublisher<any> | undefined = undefined,
|
|
125
|
+
TEventPublisherServiceName extends string = string,
|
|
126
|
+
> = {
|
|
127
|
+
services: ServiceRecord<TServices>;
|
|
128
|
+
headers: Record<string, string>;
|
|
129
|
+
publisher?: Service<TEventPublisherServiceName, TEventPublisher>;
|
|
130
|
+
} & InferComposableStandardSchema<TInput>;
|