@konker.dev/neverthrow-r-middleware 0.0.2
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/LICENSE +15 -0
- package/README.md +26 -0
- package/dist/handler.d.ts +3 -0
- package/dist/handler.d.ts.map +1 -0
- package/dist/handler.js +2 -0
- package/dist/handler.js.map +1 -0
- package/dist/http/HttpApiError.d.ts +16 -0
- package/dist/http/HttpApiError.d.ts.map +1 -0
- package/dist/http/HttpApiError.js +60 -0
- package/dist/http/HttpApiError.js.map +1 -0
- package/dist/http/HttpApiError.test.d.ts +2 -0
- package/dist/http/HttpApiError.test.d.ts.map +1 -0
- package/dist/http/HttpApiError.test.js +45 -0
- package/dist/http/HttpApiError.test.js.map +1 -0
- package/dist/http/Rec.d.ts +13 -0
- package/dist/http/Rec.d.ts.map +1 -0
- package/dist/http/Rec.js +2 -0
- package/dist/http/Rec.js.map +1 -0
- package/dist/http/RequestResponseHandler.d.ts +7 -0
- package/dist/http/RequestResponseHandler.d.ts.map +1 -0
- package/dist/http/RequestResponseHandler.js +2 -0
- package/dist/http/RequestResponseHandler.js.map +1 -0
- package/dist/http/RequestW.d.ts +14 -0
- package/dist/http/RequestW.d.ts.map +1 -0
- package/dist/http/RequestW.js +17 -0
- package/dist/http/RequestW.js.map +1 -0
- package/dist/http/RequestW.test.d.ts +2 -0
- package/dist/http/RequestW.test.d.ts.map +1 -0
- package/dist/http/RequestW.test.js +26 -0
- package/dist/http/RequestW.test.js.map +1 -0
- package/dist/http/ResponseW.d.ts +11 -0
- package/dist/http/ResponseW.d.ts.map +1 -0
- package/dist/http/ResponseW.js +14 -0
- package/dist/http/ResponseW.js.map +1 -0
- package/dist/http/ResponseW.test.d.ts +2 -0
- package/dist/http/ResponseW.test.d.ts.map +1 -0
- package/dist/http/ResponseW.test.js +23 -0
- package/dist/http/ResponseW.test.js.map +1 -0
- package/dist/http/contrib/apiGatewayProxyEventV2Adapter.d.ts +14 -0
- package/dist/http/contrib/apiGatewayProxyEventV2Adapter.d.ts.map +1 -0
- package/dist/http/contrib/apiGatewayProxyEventV2Adapter.js +26 -0
- package/dist/http/contrib/apiGatewayProxyEventV2Adapter.js.map +1 -0
- package/dist/http/contrib/apiGatewayProxyEventV2Adapter.test.d.ts +2 -0
- package/dist/http/contrib/apiGatewayProxyEventV2Adapter.test.d.ts.map +1 -0
- package/dist/http/contrib/apiGatewayProxyEventV2Adapter.test.js +76 -0
- package/dist/http/contrib/apiGatewayProxyEventV2Adapter.test.js.map +1 -0
- package/dist/http/contrib/base64BodyDecoder.d.ts +7 -0
- package/dist/http/contrib/base64BodyDecoder.d.ts.map +1 -0
- package/dist/http/contrib/base64BodyDecoder.js +15 -0
- package/dist/http/contrib/base64BodyDecoder.js.map +1 -0
- package/dist/http/contrib/base64BodyDecoder.test.d.ts +2 -0
- package/dist/http/contrib/base64BodyDecoder.test.d.ts.map +1 -0
- package/dist/http/contrib/base64BodyDecoder.test.js +47 -0
- package/dist/http/contrib/base64BodyDecoder.test.js.map +1 -0
- package/dist/http/contrib/basicAuthAuthenticator.d.ts +17 -0
- package/dist/http/contrib/basicAuthAuthenticator.d.ts.map +1 -0
- package/dist/http/contrib/basicAuthAuthenticator.js +30 -0
- package/dist/http/contrib/basicAuthAuthenticator.js.map +1 -0
- package/dist/http/contrib/basicAuthAuthenticator.test.d.ts +2 -0
- package/dist/http/contrib/basicAuthAuthenticator.test.d.ts.map +1 -0
- package/dist/http/contrib/basicAuthAuthenticator.test.js +64 -0
- package/dist/http/contrib/basicAuthAuthenticator.test.js.map +1 -0
- package/dist/http/contrib/basicAuthDecoder.d.ts +13 -0
- package/dist/http/contrib/basicAuthDecoder.d.ts.map +1 -0
- package/dist/http/contrib/basicAuthDecoder.js +23 -0
- package/dist/http/contrib/basicAuthDecoder.js.map +1 -0
- package/dist/http/contrib/basicAuthDecoder.test.d.ts +2 -0
- package/dist/http/contrib/basicAuthDecoder.test.d.ts.map +1 -0
- package/dist/http/contrib/basicAuthDecoder.test.js +31 -0
- package/dist/http/contrib/basicAuthDecoder.test.js.map +1 -0
- package/dist/http/contrib/bodyValidator.d.ts +11 -0
- package/dist/http/contrib/bodyValidator.d.ts.map +1 -0
- package/dist/http/contrib/bodyValidator.js +15 -0
- package/dist/http/contrib/bodyValidator.js.map +1 -0
- package/dist/http/contrib/bodyValidator.test.d.ts +2 -0
- package/dist/http/contrib/bodyValidator.test.d.ts.map +1 -0
- package/dist/http/contrib/bodyValidator.test.js +58 -0
- package/dist/http/contrib/bodyValidator.test.js.map +1 -0
- package/dist/http/contrib/envValidator.d.ts +10 -0
- package/dist/http/contrib/envValidator.d.ts.map +1 -0
- package/dist/http/contrib/envValidator.js +12 -0
- package/dist/http/contrib/envValidator.js.map +1 -0
- package/dist/http/contrib/envValidator.test.d.ts +2 -0
- package/dist/http/contrib/envValidator.test.d.ts.map +1 -0
- package/dist/http/contrib/envValidator.test.js +49 -0
- package/dist/http/contrib/envValidator.test.js.map +1 -0
- package/dist/http/contrib/headerSignatureAuthorizer/index.d.ts +13 -0
- package/dist/http/contrib/headerSignatureAuthorizer/index.d.ts.map +1 -0
- package/dist/http/contrib/headerSignatureAuthorizer/index.js +22 -0
- package/dist/http/contrib/headerSignatureAuthorizer/index.js.map +1 -0
- package/dist/http/contrib/headerSignatureAuthorizer/index.test.d.ts +2 -0
- package/dist/http/contrib/headerSignatureAuthorizer/index.test.d.ts.map +1 -0
- package/dist/http/contrib/headerSignatureAuthorizer/index.test.js +39 -0
- package/dist/http/contrib/headerSignatureAuthorizer/index.test.js.map +1 -0
- package/dist/http/contrib/headerSignatureAuthorizer/lib.d.ts +4 -0
- package/dist/http/contrib/headerSignatureAuthorizer/lib.d.ts.map +1 -0
- package/dist/http/contrib/headerSignatureAuthorizer/lib.js +13 -0
- package/dist/http/contrib/headerSignatureAuthorizer/lib.js.map +1 -0
- package/dist/http/contrib/headerSignatureAuthorizer/lib.test.d.ts +2 -0
- package/dist/http/contrib/headerSignatureAuthorizer/lib.test.d.ts.map +1 -0
- package/dist/http/contrib/headerSignatureAuthorizer/lib.test.js +9 -0
- package/dist/http/contrib/headerSignatureAuthorizer/lib.test.js.map +1 -0
- package/dist/http/contrib/headersNormalizer/index.d.ts +9 -0
- package/dist/http/contrib/headersNormalizer/index.d.ts.map +1 -0
- package/dist/http/contrib/headersNormalizer/index.js +8 -0
- package/dist/http/contrib/headersNormalizer/index.js.map +1 -0
- package/dist/http/contrib/headersNormalizer/index.test.d.ts +2 -0
- package/dist/http/contrib/headersNormalizer/index.test.d.ts.map +1 -0
- package/dist/http/contrib/headersNormalizer/index.test.js +38 -0
- package/dist/http/contrib/headersNormalizer/index.test.js.map +1 -0
- package/dist/http/contrib/headersNormalizer/lib.d.ts +11 -0
- package/dist/http/contrib/headersNormalizer/lib.d.ts.map +1 -0
- package/dist/http/contrib/headersNormalizer/lib.js +64 -0
- package/dist/http/contrib/headersNormalizer/lib.js.map +1 -0
- package/dist/http/contrib/headersNormalizer/lib.test.d.ts +2 -0
- package/dist/http/contrib/headersNormalizer/lib.test.d.ts.map +1 -0
- package/dist/http/contrib/headersNormalizer/lib.test.js +35 -0
- package/dist/http/contrib/headersNormalizer/lib.test.js.map +1 -0
- package/dist/http/contrib/headersNormalizer/types.d.ts +10 -0
- package/dist/http/contrib/headersNormalizer/types.d.ts.map +1 -0
- package/dist/http/contrib/headersNormalizer/types.js +2 -0
- package/dist/http/contrib/headersNormalizer/types.js.map +1 -0
- package/dist/http/contrib/headersValidator.d.ts +12 -0
- package/dist/http/contrib/headersValidator.d.ts.map +1 -0
- package/dist/http/contrib/headersValidator.js +15 -0
- package/dist/http/contrib/headersValidator.js.map +1 -0
- package/dist/http/contrib/headersValidator.test.d.ts +2 -0
- package/dist/http/contrib/headersValidator.test.d.ts.map +1 -0
- package/dist/http/contrib/headersValidator.test.js +46 -0
- package/dist/http/contrib/headersValidator.test.js.map +1 -0
- package/dist/http/contrib/helmetJsHeaders.d.ts +5 -0
- package/dist/http/contrib/helmetJsHeaders.d.ts.map +1 -0
- package/dist/http/contrib/helmetJsHeaders.js +25 -0
- package/dist/http/contrib/helmetJsHeaders.js.map +1 -0
- package/dist/http/contrib/helmetJsHeaders.test.d.ts +2 -0
- package/dist/http/contrib/helmetJsHeaders.test.d.ts.map +1 -0
- package/dist/http/contrib/helmetJsHeaders.test.js +18 -0
- package/dist/http/contrib/helmetJsHeaders.test.js.map +1 -0
- package/dist/http/contrib/honoAdapter.d.ts +16 -0
- package/dist/http/contrib/honoAdapter.d.ts.map +1 -0
- package/dist/http/contrib/honoAdapter.js +28 -0
- package/dist/http/contrib/honoAdapter.js.map +1 -0
- package/dist/http/contrib/honoAdapter.test.d.ts +2 -0
- package/dist/http/contrib/honoAdapter.test.d.ts.map +1 -0
- package/dist/http/contrib/honoAdapter.test.js +75 -0
- package/dist/http/contrib/honoAdapter.test.js.map +1 -0
- package/dist/http/contrib/identity.d.ts +4 -0
- package/dist/http/contrib/identity.d.ts.map +1 -0
- package/dist/http/contrib/identity.js +3 -0
- package/dist/http/contrib/identity.js.map +1 -0
- package/dist/http/contrib/identity.test.d.ts +2 -0
- package/dist/http/contrib/identity.test.d.ts.map +1 -0
- package/dist/http/contrib/identity.test.js +12 -0
- package/dist/http/contrib/identity.test.js.map +1 -0
- package/dist/http/contrib/index.d.ts +25 -0
- package/dist/http/contrib/index.d.ts.map +1 -0
- package/dist/http/contrib/index.js +25 -0
- package/dist/http/contrib/index.js.map +1 -0
- package/dist/http/contrib/jsonBodyParserRequest.d.ts +10 -0
- package/dist/http/contrib/jsonBodyParserRequest.d.ts.map +1 -0
- package/dist/http/contrib/jsonBodyParserRequest.js +22 -0
- package/dist/http/contrib/jsonBodyParserRequest.js.map +1 -0
- package/dist/http/contrib/jsonBodyParserRequest.test.d.ts +2 -0
- package/dist/http/contrib/jsonBodyParserRequest.test.d.ts.map +1 -0
- package/dist/http/contrib/jsonBodyParserRequest.test.js +37 -0
- package/dist/http/contrib/jsonBodyParserRequest.test.js.map +1 -0
- package/dist/http/contrib/jsonBodySerializerResponse.d.ts +9 -0
- package/dist/http/contrib/jsonBodySerializerResponse.d.ts.map +1 -0
- package/dist/http/contrib/jsonBodySerializerResponse.js +15 -0
- package/dist/http/contrib/jsonBodySerializerResponse.js.map +1 -0
- package/dist/http/contrib/jsonBodySerializerResponse.test.d.ts +2 -0
- package/dist/http/contrib/jsonBodySerializerResponse.test.d.ts.map +1 -0
- package/dist/http/contrib/jsonBodySerializerResponse.test.js +31 -0
- package/dist/http/contrib/jsonBodySerializerResponse.test.js.map +1 -0
- package/dist/http/contrib/jwtAuthenticator.d.ts +15 -0
- package/dist/http/contrib/jwtAuthenticator.d.ts.map +1 -0
- package/dist/http/contrib/jwtAuthenticator.js +28 -0
- package/dist/http/contrib/jwtAuthenticator.js.map +1 -0
- package/dist/http/contrib/jwtAuthenticator.test.d.ts +2 -0
- package/dist/http/contrib/jwtAuthenticator.test.d.ts.map +1 -0
- package/dist/http/contrib/jwtAuthenticator.test.js +88 -0
- package/dist/http/contrib/jwtAuthenticator.test.js.map +1 -0
- package/dist/http/contrib/jwtAuthenticatorRsa.d.ts +15 -0
- package/dist/http/contrib/jwtAuthenticatorRsa.d.ts.map +1 -0
- package/dist/http/contrib/jwtAuthenticatorRsa.js +28 -0
- package/dist/http/contrib/jwtAuthenticatorRsa.js.map +1 -0
- package/dist/http/contrib/jwtAuthenticatorRsa.test.d.ts +2 -0
- package/dist/http/contrib/jwtAuthenticatorRsa.test.d.ts.map +1 -0
- package/dist/http/contrib/jwtAuthenticatorRsa.test.js +88 -0
- package/dist/http/contrib/jwtAuthenticatorRsa.test.js.map +1 -0
- package/dist/http/contrib/jwtDecoder.d.ts +13 -0
- package/dist/http/contrib/jwtDecoder.d.ts.map +1 -0
- package/dist/http/contrib/jwtDecoder.js +23 -0
- package/dist/http/contrib/jwtDecoder.js.map +1 -0
- package/dist/http/contrib/jwtDecoder.test.d.ts +2 -0
- package/dist/http/contrib/jwtDecoder.test.d.ts.map +1 -0
- package/dist/http/contrib/jwtDecoder.test.js +76 -0
- package/dist/http/contrib/jwtDecoder.test.js.map +1 -0
- package/dist/http/contrib/pathParametersValidator.d.ts +12 -0
- package/dist/http/contrib/pathParametersValidator.d.ts.map +1 -0
- package/dist/http/contrib/pathParametersValidator.js +15 -0
- package/dist/http/contrib/pathParametersValidator.js.map +1 -0
- package/dist/http/contrib/pathParametersValidator.test.d.ts +2 -0
- package/dist/http/contrib/pathParametersValidator.test.d.ts.map +1 -0
- package/dist/http/contrib/pathParametersValidator.test.js +46 -0
- package/dist/http/contrib/pathParametersValidator.test.js.map +1 -0
- package/dist/http/contrib/pathTokenAuthorizer.d.ts +13 -0
- package/dist/http/contrib/pathTokenAuthorizer.d.ts.map +1 -0
- package/dist/http/contrib/pathTokenAuthorizer.js +19 -0
- package/dist/http/contrib/pathTokenAuthorizer.js.map +1 -0
- package/dist/http/contrib/pathTokenAuthorizer.test.d.ts +2 -0
- package/dist/http/contrib/pathTokenAuthorizer.test.d.ts.map +1 -0
- package/dist/http/contrib/pathTokenAuthorizer.test.js +29 -0
- package/dist/http/contrib/pathTokenAuthorizer.test.js.map +1 -0
- package/dist/http/contrib/queryStringValidator.d.ts +12 -0
- package/dist/http/contrib/queryStringValidator.d.ts.map +1 -0
- package/dist/http/contrib/queryStringValidator.js +15 -0
- package/dist/http/contrib/queryStringValidator.js.map +1 -0
- package/dist/http/contrib/queryStringValidator.test.d.ts +2 -0
- package/dist/http/contrib/queryStringValidator.test.d.ts.map +1 -0
- package/dist/http/contrib/queryStringValidator.test.js +46 -0
- package/dist/http/contrib/queryStringValidator.test.js.map +1 -0
- package/dist/http/contrib/requestResponseLogger.d.ts +5 -0
- package/dist/http/contrib/requestResponseLogger.d.ts.map +1 -0
- package/dist/http/contrib/requestResponseLogger.js +8 -0
- package/dist/http/contrib/requestResponseLogger.js.map +1 -0
- package/dist/http/contrib/requestResponseLogger.test.d.ts +2 -0
- package/dist/http/contrib/requestResponseLogger.test.d.ts.map +1 -0
- package/dist/http/contrib/requestResponseLogger.test.js +18 -0
- package/dist/http/contrib/requestResponseLogger.test.js.map +1 -0
- package/dist/http/contrib/responseProcessor.d.ts +8 -0
- package/dist/http/contrib/responseProcessor.d.ts.map +1 -0
- package/dist/http/contrib/responseProcessor.js +16 -0
- package/dist/http/contrib/responseProcessor.js.map +1 -0
- package/dist/http/contrib/responseProcessor.test.d.ts +2 -0
- package/dist/http/contrib/responseProcessor.test.d.ts.map +1 -0
- package/dist/http/contrib/responseProcessor.test.js +29 -0
- package/dist/http/contrib/responseProcessor.test.js.map +1 -0
- package/dist/http/contrib/standardRequestResponseAdapter.d.ts +16 -0
- package/dist/http/contrib/standardRequestResponseAdapter.d.ts.map +1 -0
- package/dist/http/contrib/standardRequestResponseAdapter.js +27 -0
- package/dist/http/contrib/standardRequestResponseAdapter.js.map +1 -0
- package/dist/http/contrib/standardRequestResponseAdapter.test.d.ts +2 -0
- package/dist/http/contrib/standardRequestResponseAdapter.test.d.ts.map +1 -0
- package/dist/http/contrib/standardRequestResponseAdapter.test.js +85 -0
- package/dist/http/contrib/standardRequestResponseAdapter.test.js.map +1 -0
- package/dist/http/contrib/trivial.d.ts +5 -0
- package/dist/http/contrib/trivial.d.ts.map +1 -0
- package/dist/http/contrib/trivial.js +9 -0
- package/dist/http/contrib/trivial.js.map +1 -0
- package/dist/http/contrib/trivial.test.d.ts +2 -0
- package/dist/http/contrib/trivial.test.d.ts.map +1 -0
- package/dist/http/contrib/trivial.test.js +14 -0
- package/dist/http/contrib/trivial.test.js.map +1 -0
- package/dist/http/index.d.ts +6 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +6 -0
- package/dist/http/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/Logger.d.ts +23 -0
- package/dist/lib/Logger.d.ts.map +1 -0
- package/dist/lib/Logger.js +30 -0
- package/dist/lib/Logger.js.map +1 -0
- package/dist/lib/Logger.test.d.ts +2 -0
- package/dist/lib/Logger.test.d.ts.map +1 -0
- package/dist/lib/Logger.test.js +54 -0
- package/dist/lib/Logger.test.js.map +1 -0
- package/dist/lib/MiddlewareError.d.ts +10 -0
- package/dist/lib/MiddlewareError.d.ts.map +1 -0
- package/dist/lib/MiddlewareError.js +20 -0
- package/dist/lib/MiddlewareError.js.map +1 -0
- package/dist/lib/MiddlewareError.test.d.ts +2 -0
- package/dist/lib/MiddlewareError.test.d.ts.map +1 -0
- package/dist/lib/MiddlewareError.test.js +55 -0
- package/dist/lib/MiddlewareError.test.js.map +1 -0
- package/dist/lib/index.d.ts +4 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +4 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/utils.d.ts +7 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +11 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/utils.test.d.ts +2 -0
- package/dist/lib/utils.test.d.ts.map +1 -0
- package/dist/lib/utils.test.js +47 -0
- package/dist/lib/utils.test.js.map +1 -0
- package/dist/test/kitchen-sink.test.d.ts +2 -0
- package/dist/test/kitchen-sink.test.d.ts.map +1 -0
- package/dist/test/kitchen-sink.test.js +76 -0
- package/dist/test/kitchen-sink.test.js.map +1 -0
- package/dist/test/round-trip.test.d.ts +2 -0
- package/dist/test/round-trip.test.d.ts.map +1 -0
- package/dist/test/round-trip.test.js +75 -0
- package/dist/test/round-trip.test.js.map +1 -0
- package/dist/test/test-common.d.ts +17 -0
- package/dist/test/test-common.d.ts.map +1 -0
- package/dist/test/test-common.js +25 -0
- package/dist/test/test-common.js.map +1 -0
- package/package.json +265 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
ISC License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Konrad Markus <mail@konker.dev>
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
7
|
+
copyright notice and this permission notice appear in all copies.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
10
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
11
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
12
|
+
SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
13
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
|
14
|
+
OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
15
|
+
CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# @konker.dev/neverthrow-r-middleware
|
|
2
|
+
|
|
3
|
+
Type-safe HTTP middleware system built on
|
|
4
|
+
[`@konker.dev/neverthrow-r`](../neverthrow-r). Composition is decorator-style:
|
|
5
|
+
each middleware wraps an inner handler and returns a new handler.
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import type { ResultAsyncR } from '@konker.dev/neverthrow-r/types';
|
|
9
|
+
|
|
10
|
+
export type Handler<I, R, O, E> = (i: I) => ResultAsyncR<R, O, E>;
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
The package is the `ResultAsyncR`-based counterpart to
|
|
14
|
+
[`@konker.dev/middleware-fp`](../middleware-fp) (which is built on Effect).
|
|
15
|
+
|
|
16
|
+
## Included middlewares
|
|
17
|
+
|
|
18
|
+
- `identity` / `trivial` — minimal decorator examples.
|
|
19
|
+
- `jsonBodyParserRequest` / `jsonBodySerializerResponse` — JSON request/response IO.
|
|
20
|
+
- `bodyValidator` — validates the request body against any
|
|
21
|
+
[Standard Schema](https://standardschema.dev) validator (zod, valibot,
|
|
22
|
+
arktype, effect/Schema, …).
|
|
23
|
+
- `requestResponseLogger` — logs request/response via the `Logger` threaded
|
|
24
|
+
through the `R` channel.
|
|
25
|
+
- `apiGatewayProxyEventV2Adapter` — adapts an AWS API Gateway HTTP API event.
|
|
26
|
+
- `honoAdapter` — adapts a `HonoRequest`.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEnE,MAAM,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC"}
|
package/dist/handler.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ResponseW } from './ResponseW.js';
|
|
2
|
+
export declare const ERROR_TAG: "HttpApiError";
|
|
3
|
+
export declare class HttpApiError extends Error {
|
|
4
|
+
readonly _tag: "HttpApiError";
|
|
5
|
+
readonly statusCode: number;
|
|
6
|
+
readonly internal: Array<unknown> | undefined;
|
|
7
|
+
constructor({ internal, message, statusCode, }: {
|
|
8
|
+
readonly statusCode: number;
|
|
9
|
+
readonly message: string;
|
|
10
|
+
readonly internal?: Array<unknown>;
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
export declare function isHttpApiError(x: unknown): x is HttpApiError;
|
|
14
|
+
export declare function toHttpApiError(x: unknown, statusCode?: number, message?: string): HttpApiError;
|
|
15
|
+
export declare function toErrorResponseW(error: HttpApiError): ResponseW;
|
|
16
|
+
//# sourceMappingURL=HttpApiError.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpApiError.d.ts","sourceRoot":"","sources":["../../src/http/HttpApiError.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,eAAO,MAAM,SAAS,EAAG,cAAuB,CAAC;AAEjD,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,iBAAa;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;gBAElC,EACV,QAAQ,EACR,OAAO,EACP,UAAU,GACX,EAAE;QACD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;KACpC;CAMF;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,YAAY,CAI5D;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY,CA8B9F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,CAoB/D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
import { Result } from 'neverthrow';
|
|
3
|
+
import { makeResponseW } from './ResponseW.js';
|
|
4
|
+
export const ERROR_TAG = 'HttpApiError';
|
|
5
|
+
export class HttpApiError extends Error {
|
|
6
|
+
_tag = ERROR_TAG;
|
|
7
|
+
statusCode;
|
|
8
|
+
internal;
|
|
9
|
+
constructor({ internal, message, statusCode, }) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = ERROR_TAG;
|
|
12
|
+
this.statusCode = statusCode;
|
|
13
|
+
this.internal = internal;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function isHttpApiError(x) {
|
|
17
|
+
return (x instanceof HttpApiError || (typeof x === 'object' && x !== null && x._tag === ERROR_TAG));
|
|
18
|
+
}
|
|
19
|
+
export function toHttpApiError(x, statusCode, message) {
|
|
20
|
+
if (isHttpApiError(x)) {
|
|
21
|
+
return new HttpApiError({
|
|
22
|
+
statusCode: statusCode ?? x.statusCode,
|
|
23
|
+
message: message ?? x.message,
|
|
24
|
+
internal: [x, ...(x.internal ?? [])],
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
if (x instanceof Error) {
|
|
28
|
+
return new HttpApiError({
|
|
29
|
+
statusCode: statusCode ?? 500,
|
|
30
|
+
message: message ?? x.message,
|
|
31
|
+
internal: [x],
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (typeof x === 'string') {
|
|
35
|
+
return new HttpApiError({
|
|
36
|
+
statusCode: statusCode ?? 500,
|
|
37
|
+
message: message ?? x,
|
|
38
|
+
internal: [x],
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return new HttpApiError({
|
|
42
|
+
statusCode: statusCode ?? 500,
|
|
43
|
+
message: message ?? 'Internal Server Error',
|
|
44
|
+
internal: [x],
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
export function toErrorResponseW(error) {
|
|
48
|
+
const bodyResult = Result.fromThrowable(() => JSON.stringify({
|
|
49
|
+
message: error.message,
|
|
50
|
+
statusCode: error.statusCode,
|
|
51
|
+
}), () => new Error('JSON stringify failed'))();
|
|
52
|
+
return makeResponseW({
|
|
53
|
+
statusCode: error.statusCode,
|
|
54
|
+
headers: {
|
|
55
|
+
'Content-Type': 'application/json',
|
|
56
|
+
},
|
|
57
|
+
body: bodyResult.match((body) => body, () => '{"message":"Internal Server Error","statusCode":500}'),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=HttpApiError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpApiError.js","sourceRoot":"","sources":["../../src/http/HttpApiError.ts"],"names":[],"mappings":"AAAA,oBAAoB;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGpC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,CAAC,MAAM,SAAS,GAAG,cAAuB,CAAC;AAEjD,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,GAAG,SAAS,CAAC;IACjB,UAAU,CAAS;IACnB,QAAQ,CAA6B;IAE9C,YAAY,EACV,QAAQ,EACR,OAAO,EACP,UAAU,GAKX;QACC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,CAAU;IACvC,OAAO,CACL,CAAC,YAAY,YAAY,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAK,CAAwB,CAAC,IAAI,KAAK,SAAS,CAAC,CACnH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,CAAU,EAAE,UAAmB,EAAE,OAAgB;IAC9E,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,YAAY,CAAC;YACtB,UAAU,EAAE,UAAU,IAAI,CAAC,CAAC,UAAU;YACtC,OAAO,EAAE,OAAO,IAAI,CAAC,CAAC,OAAO;YAC7B,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;SACrC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;QACvB,OAAO,IAAI,YAAY,CAAC;YACtB,UAAU,EAAE,UAAU,IAAI,GAAG;YAC7B,OAAO,EAAE,OAAO,IAAI,CAAC,CAAC,OAAO;YAC7B,QAAQ,EAAE,CAAC,CAAC,CAAC;SACd,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,IAAI,YAAY,CAAC;YACtB,UAAU,EAAE,UAAU,IAAI,GAAG;YAC7B,OAAO,EAAE,OAAO,IAAI,CAAC;YACrB,QAAQ,EAAE,CAAC,CAAC,CAAC;SACd,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,YAAY,CAAC;QACtB,UAAU,EAAE,UAAU,IAAI,GAAG;QAC7B,OAAO,EAAE,OAAO,IAAI,uBAAuB;QAC3C,QAAQ,EAAE,CAAC,CAAC,CAAC;KACd,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAmB;IAClD,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,CACrC,GAAG,EAAE,CACH,IAAI,CAAC,SAAS,CAAC;QACb,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC,EACJ,GAAG,EAAE,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CACzC,EAAE,CAAC;IAEJ,OAAO,aAAa,CAAC;QACnB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,UAAU,CAAC,KAAK,CACpB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EACd,GAAG,EAAE,CAAC,sDAAsD,CAC7D;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpApiError.test.d.ts","sourceRoot":"","sources":["../../src/http/HttpApiError.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { ERROR_TAG, HttpApiError, isHttpApiError, toErrorResponseW, toHttpApiError } from './HttpApiError.js';
|
|
3
|
+
describe('HttpApiError', () => {
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
vi.restoreAllMocks();
|
|
6
|
+
});
|
|
7
|
+
it('recognises HttpApiError instances and tagged objects', () => {
|
|
8
|
+
expect(isHttpApiError(new HttpApiError({ statusCode: 400, message: 'bad' }))).toBe(true);
|
|
9
|
+
expect(isHttpApiError({ _tag: ERROR_TAG })).toBe(true);
|
|
10
|
+
expect(isHttpApiError({})).toBe(false);
|
|
11
|
+
});
|
|
12
|
+
it('wraps string inputs', () => {
|
|
13
|
+
const error = toHttpApiError('boom');
|
|
14
|
+
expect(error.statusCode).toBe(500);
|
|
15
|
+
expect(error.message).toBe('boom');
|
|
16
|
+
expect(error.internal).toEqual(['boom']);
|
|
17
|
+
});
|
|
18
|
+
it('wraps unknown inputs with the default message', () => {
|
|
19
|
+
const error = toHttpApiError({ no: 'shape' });
|
|
20
|
+
expect(error.statusCode).toBe(500);
|
|
21
|
+
expect(error.message).toBe('Internal Server Error');
|
|
22
|
+
});
|
|
23
|
+
it('overrides status and message when wrapping an Error', () => {
|
|
24
|
+
const error = toHttpApiError(new Error('inner'), 401, 'outer');
|
|
25
|
+
expect(error.statusCode).toBe(401);
|
|
26
|
+
expect(error.message).toBe('outer');
|
|
27
|
+
});
|
|
28
|
+
it('uses the original Error status defaults when no overrides are provided', () => {
|
|
29
|
+
const error = toHttpApiError(new Error('inner'));
|
|
30
|
+
expect(error.statusCode).toBe(500);
|
|
31
|
+
expect(error.message).toBe('inner');
|
|
32
|
+
});
|
|
33
|
+
it('falls back when JSON stringification throws', () => {
|
|
34
|
+
vi.spyOn(JSON, 'stringify').mockImplementation(() => {
|
|
35
|
+
throw new Error('nope');
|
|
36
|
+
});
|
|
37
|
+
const response = toErrorResponseW(new HttpApiError({ statusCode: 418, message: 'teapot' }));
|
|
38
|
+
expect(response).toEqual({
|
|
39
|
+
statusCode: 418,
|
|
40
|
+
headers: { 'Content-Type': 'application/json' },
|
|
41
|
+
body: '{"message":"Internal Server Error","statusCode":500}',
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=HttpApiError.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpApiError.test.js","sourceRoot":"","sources":["../../src/http/HttpApiError.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE7D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE9G,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,cAAc,CAAC,IAAI,YAAY,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzF,MAAM,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAC/D,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAClD,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,YAAY,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAE5F,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;YACvB,UAAU,EAAE,GAAG;YACf,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,sDAAsD;SAC7D,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type Rec = Record<string, unknown>;
|
|
2
|
+
type KnownKeys<T> = {
|
|
3
|
+
[K in keyof T]: string extends K ? never : number extends K ? never : symbol extends K ? never : K;
|
|
4
|
+
}[keyof T];
|
|
5
|
+
export type Override<T, U> = Omit<T, KnownKeys<U>> & U;
|
|
6
|
+
export type BodyRec = Record<string, unknown> & {
|
|
7
|
+
readonly body?: unknown;
|
|
8
|
+
};
|
|
9
|
+
export type StrBodyRec = Record<string, unknown> & {
|
|
10
|
+
readonly body?: string;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=Rec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rec.d.ts","sourceRoot":"","sources":["../../src/http/Rec.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE1C,KAAK,SAAS,CAAC,CAAC,IAAI;KACjB,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,GAAG,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,KAAK,GAAG,CAAC;CACnG,CAAC,MAAM,CAAC,CAAC,CAAC;AAEX,MAAM,MAAM,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAEvD,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE5E,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC"}
|
package/dist/http/Rec.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rec.js","sourceRoot":"","sources":["../../src/http/Rec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Handler } from '../handler.js';
|
|
2
|
+
import type { Rec } from './Rec.js';
|
|
3
|
+
import type { RequestW } from './RequestW.js';
|
|
4
|
+
import type { ResponseW } from './ResponseW.js';
|
|
5
|
+
export type { BodyRec, Override, Rec, StrBodyRec } from './Rec.js';
|
|
6
|
+
export type RequestResponseHandler<I extends Rec, R, O extends Rec, E> = Handler<RequestW<I>, R, ResponseW<O>, E>;
|
|
7
|
+
//# sourceMappingURL=RequestResponseHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestResponseHandler.d.ts","sourceRoot":"","sources":["../../src/http/RequestResponseHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEnE,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestResponseHandler.js","sourceRoot":"","sources":["../../src/http/RequestResponseHandler.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Override, StrBodyRec } from './Rec.js';
|
|
2
|
+
type RequestWBase = {
|
|
3
|
+
readonly url: string;
|
|
4
|
+
readonly method: string;
|
|
5
|
+
readonly headers: Record<string, string>;
|
|
6
|
+
readonly queryStringParameters: Record<string, string>;
|
|
7
|
+
readonly pathParameters: Record<string, string>;
|
|
8
|
+
};
|
|
9
|
+
export type RequestW<T extends Record<string, unknown> = StrBodyRec> = RequestWBase & T;
|
|
10
|
+
export declare function makeRequestW<T extends Record<string, unknown>>(requestW: RequestW<T>): RequestW<T>;
|
|
11
|
+
export declare function makeRequestW<T extends Record<string, unknown> = {}, U extends Record<string, unknown> | undefined = undefined>(requestW: RequestW<T>, u: U): NoInfer<U extends undefined ? RequestW<T> : U extends Record<string, unknown> ? RequestW<Override<T, U>> : never>;
|
|
12
|
+
export declare const EMPTY_REQUEST_W: RequestW;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=RequestW.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestW.d.ts","sourceRoot":"","sources":["../../src/http/RequestW.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGrD,KAAK,YAAY,GAAG;IAClB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,IAAI,YAAY,GAAG,CAAC,CAAC;AAGxF,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;AAEpG,wBAAgB,YAAY,CAC1B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,EACtC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,EAEzD,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EACrB,CAAC,EAAE,CAAC,GACH,OAAO,CAAC,CAAC,SAAS,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AAerH,eAAO,MAAM,eAAe,EAAE,QAMpB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function makeRequestW(requestW, u) {
|
|
2
|
+
return u
|
|
3
|
+
? {
|
|
4
|
+
...requestW,
|
|
5
|
+
...u,
|
|
6
|
+
}
|
|
7
|
+
: { ...requestW };
|
|
8
|
+
}
|
|
9
|
+
// --------------------------------------------------------------------------
|
|
10
|
+
export const EMPTY_REQUEST_W = {
|
|
11
|
+
url: '/',
|
|
12
|
+
method: 'GET',
|
|
13
|
+
headers: {},
|
|
14
|
+
queryStringParameters: {},
|
|
15
|
+
pathParameters: {},
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=RequestW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestW.js","sourceRoot":"","sources":["../../src/http/RequestW.ts"],"names":[],"mappings":"AAwBA,MAAM,UAAU,YAAY,CAC1B,QAAqB,EACrB,CAAK;IAEL,OAAO,CAAC;QACN,CAAC,CAAC;YACE,GAAG,QAAQ;YACX,GAAG,CAAC;SACL;QACH,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED,6EAA6E;AAC7E,MAAM,CAAC,MAAM,eAAe,GAAa;IACvC,GAAG,EAAE,GAAG;IACR,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,EAAE;IACX,qBAAqB,EAAE,EAAE;IACzB,cAAc,EAAE,EAAE;CACV,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestW.test.d.ts","sourceRoot":"","sources":["../../src/http/RequestW.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { EMPTY_REQUEST_W, makeRequestW } from './RequestW.js';
|
|
3
|
+
describe('RequestW', () => {
|
|
4
|
+
it('EMPTY_REQUEST_W has the expected default shape', () => {
|
|
5
|
+
expect(EMPTY_REQUEST_W).toEqual({
|
|
6
|
+
url: '/',
|
|
7
|
+
method: 'GET',
|
|
8
|
+
headers: {},
|
|
9
|
+
queryStringParameters: {},
|
|
10
|
+
pathParameters: {},
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
describe('makeRequestW', () => {
|
|
14
|
+
it('returns a shallow copy when called with one arg', () => {
|
|
15
|
+
const copy = makeRequestW(EMPTY_REQUEST_W);
|
|
16
|
+
expect(copy).toEqual(EMPTY_REQUEST_W);
|
|
17
|
+
expect(copy).not.toBe(EMPTY_REQUEST_W);
|
|
18
|
+
});
|
|
19
|
+
it('merges extra fields when called with two args', () => {
|
|
20
|
+
const merged = makeRequestW(EMPTY_REQUEST_W, { body: 'hi', extra: 1 });
|
|
21
|
+
expect(merged.body).toBe('hi');
|
|
22
|
+
expect(merged.extra).toBe(1);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=RequestW.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestW.test.js","sourceRoot":"","sources":["../../src/http/RequestW.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE9D,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC;YAC9B,GAAG,EAAE,GAAG;YACR,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE;YACX,qBAAqB,EAAE,EAAE;YACzB,cAAc,EAAE,EAAE;SACnB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,IAAI,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,MAAM,GAAG,YAAY,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACvE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,CAAE,MAA4B,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { BodyRec, Override } from './Rec.js';
|
|
2
|
+
type ResponseWBase = {
|
|
3
|
+
readonly statusCode: number;
|
|
4
|
+
readonly headers: Record<string, string>;
|
|
5
|
+
};
|
|
6
|
+
export type ResponseW<T extends Record<string, unknown> = BodyRec> = ResponseWBase & T;
|
|
7
|
+
export declare function makeResponseW<T extends Record<string, unknown>>(responseW: ResponseW<T>): ResponseW<T>;
|
|
8
|
+
export declare function makeResponseW<T extends Record<string, unknown> = {}, U extends Record<string, unknown> | undefined = undefined>(responseW: ResponseW<T>, u: U): U extends undefined ? ResponseW<T> : U extends Record<string, unknown> ? ResponseW<Override<T, U>> : never;
|
|
9
|
+
export declare const EMPTY_RESPONSE_W: ResponseW;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=ResponseW.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResponseW.d.ts","sourceRoot":"","sources":["../../src/http/ResponseW.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGlD,KAAK,aAAa,GAAG;IACnB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,IAAI,aAAa,GAAG,CAAC,CAAC;AAGvF,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;AAExG,wBAAgB,aAAa,CAC3B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,EACtC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,EAEzD,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,EACvB,CAAC,EAAE,CAAC,GACH,CAAC,SAAS,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAe9G,eAAO,MAAM,gBAAgB,EAAE,SAGrB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function makeResponseW(responseW, u) {
|
|
2
|
+
return u
|
|
3
|
+
? {
|
|
4
|
+
...responseW,
|
|
5
|
+
...u,
|
|
6
|
+
}
|
|
7
|
+
: { ...responseW };
|
|
8
|
+
}
|
|
9
|
+
// --------------------------------------------------------------------------
|
|
10
|
+
export const EMPTY_RESPONSE_W = {
|
|
11
|
+
statusCode: 200,
|
|
12
|
+
headers: {},
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=ResponseW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResponseW.js","sourceRoot":"","sources":["../../src/http/ResponseW.ts"],"names":[],"mappings":"AAqBA,MAAM,UAAU,aAAa,CAC3B,SAAuB,EACvB,CAAK;IAEL,OAAO,CAAC;QACN,CAAC,CAAC;YACE,GAAG,SAAS;YACZ,GAAG,CAAC;SACL;QACH,CAAC,CAAC,EAAE,GAAG,SAAS,EAAE,CAAC;AACvB,CAAC;AAED,6EAA6E;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAc;IACzC,UAAU,EAAE,GAAG;IACf,OAAO,EAAE,EAAE;CACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResponseW.test.d.ts","sourceRoot":"","sources":["../../src/http/ResponseW.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { EMPTY_RESPONSE_W, makeResponseW } from './ResponseW.js';
|
|
3
|
+
describe('ResponseW', () => {
|
|
4
|
+
it('EMPTY_RESPONSE_W has the expected default shape', () => {
|
|
5
|
+
expect(EMPTY_RESPONSE_W).toEqual({ statusCode: 200, headers: {} });
|
|
6
|
+
});
|
|
7
|
+
describe('makeResponseW', () => {
|
|
8
|
+
it('returns a shallow copy when called with one arg', () => {
|
|
9
|
+
const copy = makeResponseW(EMPTY_RESPONSE_W);
|
|
10
|
+
expect(copy).toEqual(EMPTY_RESPONSE_W);
|
|
11
|
+
expect(copy).not.toBe(EMPTY_RESPONSE_W);
|
|
12
|
+
});
|
|
13
|
+
it('merges extra fields when called with two args', () => {
|
|
14
|
+
const merged = makeResponseW(EMPTY_RESPONSE_W, {
|
|
15
|
+
body: '{"ok":true}',
|
|
16
|
+
statusCode: 201,
|
|
17
|
+
});
|
|
18
|
+
expect(merged.statusCode).toBe(201);
|
|
19
|
+
expect(merged.body).toBe('{"ok":true}');
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
//# sourceMappingURL=ResponseW.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResponseW.test.js","sourceRoot":"","sources":["../../src/http/ResponseW.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEjE,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,IAAI,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;YACvC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,MAAM,GAAG,aAAa,CAAC,gBAAgB,EAAE;gBAC7C,IAAI,EAAE,aAAa;gBACnB,UAAU,EAAE,GAAG;aAChB,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,CAAE,MAA4B,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { APIGatewayProxyEventV2, APIGatewayProxyResult } from 'aws-lambda';
|
|
2
|
+
import type { Handler } from '../../handler.js';
|
|
3
|
+
import type { WithLogger } from '../../lib/Logger.js';
|
|
4
|
+
import type { StrBodyRec } from '../RequestResponseHandler.js';
|
|
5
|
+
import type { RequestW } from '../RequestW.js';
|
|
6
|
+
import type { ResponseW } from '../ResponseW.js';
|
|
7
|
+
export declare const TAG = "apiGatewayProxyEventV2Adapter";
|
|
8
|
+
export type WithApiGatewayProxyEventRaw = {
|
|
9
|
+
readonly apiGatewayProxyEventV2Raw: APIGatewayProxyEventV2;
|
|
10
|
+
};
|
|
11
|
+
export declare function adaptFromApiGatewayProxyEventV2(request: APIGatewayProxyEventV2): RequestW<WithApiGatewayProxyEventRaw & StrBodyRec>;
|
|
12
|
+
export declare function adaptToApiGatewayProxyResult<O extends StrBodyRec>(responseW: ResponseW<O>): APIGatewayProxyResult;
|
|
13
|
+
export declare const middleware: (_params?: never) => <O extends StrBodyRec, E, R>(wrapped: Handler<RequestW<WithApiGatewayProxyEventRaw & StrBodyRec>, R, ResponseW<O>, E>) => Handler<APIGatewayProxyEventV2, R & WithLogger, APIGatewayProxyResult, E>;
|
|
14
|
+
//# sourceMappingURL=apiGatewayProxyEventV2Adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiGatewayProxyEventV2Adapter.d.ts","sourceRoot":"","sources":["../../../src/http/contrib/apiGatewayProxyEventV2Adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEhF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,eAAO,MAAM,GAAG,kCAAkC,CAAC;AAEnD,MAAM,MAAM,2BAA2B,GAAG;IACxC,QAAQ,CAAC,yBAAyB,EAAE,sBAAsB,CAAC;CAC5D,CAAC;AAEF,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,sBAAsB,GAC9B,QAAQ,CAAC,2BAA2B,GAAG,UAAU,CAAC,CAUpD;AAED,wBAAgB,4BAA4B,CAAC,CAAC,SAAS,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAMjH;AAED,eAAO,MAAM,UAAU,GACpB,UAAU,KAAK,MACf,CAAC,SAAS,UAAU,EAAE,CAAC,EAAE,CAAC,EACzB,SAAS,OAAO,CAAC,QAAQ,CAAC,2BAA2B,GAAG,UAAU,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KACvF,OAAO,CAAC,sBAAsB,EAAE,CAAC,GAAG,UAAU,EAAE,qBAAqB,EAAE,CAAC,CASxE,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { andThenAsync, mapAsync } from '@konker.dev/neverthrow-r/async';
|
|
2
|
+
import { okAsyncR } from '@konker.dev/neverthrow-r/constructors';
|
|
3
|
+
import { pipe } from '@konker.dev/neverthrow-r/pipe';
|
|
4
|
+
import { tapLogger } from '../../lib/Logger.js';
|
|
5
|
+
import { sanitizeRecord } from '../../lib/utils.js';
|
|
6
|
+
export const TAG = 'apiGatewayProxyEventV2Adapter';
|
|
7
|
+
export function adaptFromApiGatewayProxyEventV2(request) {
|
|
8
|
+
return {
|
|
9
|
+
url: request.requestContext.http.path,
|
|
10
|
+
method: request.requestContext.http.method,
|
|
11
|
+
body: request.body ?? '',
|
|
12
|
+
headers: sanitizeRecord(request.headers),
|
|
13
|
+
queryStringParameters: sanitizeRecord(request.queryStringParameters),
|
|
14
|
+
pathParameters: sanitizeRecord(request.pathParameters),
|
|
15
|
+
apiGatewayProxyEventV2Raw: request,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function adaptToApiGatewayProxyResult(responseW) {
|
|
19
|
+
return {
|
|
20
|
+
statusCode: responseW.statusCode,
|
|
21
|
+
body: responseW.body ?? '',
|
|
22
|
+
headers: responseW.headers,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export const middleware = (_params) => (wrapped) => (i) => pipe(okAsyncR(i), tapLogger('debug', `[${TAG}] IN`), mapAsync(adaptFromApiGatewayProxyEventV2), andThenAsync(wrapped), mapAsync(adaptToApiGatewayProxyResult), tapLogger('debug', `[${TAG}] OUT`));
|
|
26
|
+
//# sourceMappingURL=apiGatewayProxyEventV2Adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiGatewayProxyEventV2Adapter.js","sourceRoot":"","sources":["../../../src/http/contrib/apiGatewayProxyEventV2Adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,uCAAuC,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAKrD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAKpD,MAAM,CAAC,MAAM,GAAG,GAAG,+BAA+B,CAAC;AAMnD,MAAM,UAAU,+BAA+B,CAC7C,OAA+B;IAE/B,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI;QACrC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM;QAC1C,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;QACxB,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC;QACxC,qBAAqB,EAAE,cAAc,CAAC,OAAO,CAAC,qBAAqB,CAAC;QACpE,cAAc,EAAE,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC;QACtD,yBAAyB,EAAE,OAAO;KACnC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAuB,SAAuB;IACxF,OAAO;QACL,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,EAAE;QAC1B,OAAO,EAAE,SAAS,CAAC,OAAO;KAC3B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GACrB,CAAC,OAAe,EAAE,EAAE,CACpB,CACE,OAAwF,EACb,EAAE,CAC/E,CAAC,CAAyB,EAAE,EAAE,CAC5B,IAAI,CACF,QAAQ,CAAC,CAAC,CAAC,EACX,SAAS,CAAC,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC,EACjC,QAAQ,CAAC,+BAA+B,CAAC,EACzC,YAAY,CAAC,OAAO,CAAC,EACrB,QAAQ,CAAC,4BAA4B,CAAC,EACtC,SAAS,CAAC,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,CACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiGatewayProxyEventV2Adapter.test.d.ts","sourceRoot":"","sources":["../../../src/http/contrib/apiGatewayProxyEventV2Adapter.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { okAsyncR } from '@konker.dev/neverthrow-r/constructors';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { recordingLogger } from '../../test/test-common.js';
|
|
4
|
+
import { EMPTY_RESPONSE_W } from '../ResponseW.js';
|
|
5
|
+
import { adaptFromApiGatewayProxyEventV2, adaptToApiGatewayProxyResult, middleware as apiGatewayProxyEventV2Adapter, } from './apiGatewayProxyEventV2Adapter.js';
|
|
6
|
+
const sampleEvent = {
|
|
7
|
+
version: '2.0',
|
|
8
|
+
routeKey: 'GET /hello',
|
|
9
|
+
rawPath: '/hello',
|
|
10
|
+
rawQueryString: 'a=1',
|
|
11
|
+
headers: { 'x-test': 'yes', missing: undefined },
|
|
12
|
+
queryStringParameters: { a: '1' },
|
|
13
|
+
pathParameters: undefined,
|
|
14
|
+
requestContext: {
|
|
15
|
+
accountId: '123',
|
|
16
|
+
apiId: 'abc',
|
|
17
|
+
domainName: 'example.com',
|
|
18
|
+
domainPrefix: 'example',
|
|
19
|
+
http: {
|
|
20
|
+
method: 'GET',
|
|
21
|
+
path: '/hello',
|
|
22
|
+
protocol: 'HTTP/1.1',
|
|
23
|
+
sourceIp: '127.0.0.1',
|
|
24
|
+
userAgent: 'test',
|
|
25
|
+
},
|
|
26
|
+
requestId: 'req',
|
|
27
|
+
routeKey: 'GET /hello',
|
|
28
|
+
stage: '$default',
|
|
29
|
+
time: '1/Jan/2026:00:00:00 +0000',
|
|
30
|
+
timeEpoch: 0,
|
|
31
|
+
},
|
|
32
|
+
isBase64Encoded: false,
|
|
33
|
+
};
|
|
34
|
+
describe('apiGatewayProxyEventV2Adapter', () => {
|
|
35
|
+
describe('adaptFromApiGatewayProxyEventV2', () => {
|
|
36
|
+
it('flattens an event into a RequestW with sanitised records', () => {
|
|
37
|
+
const req = adaptFromApiGatewayProxyEventV2(sampleEvent);
|
|
38
|
+
expect(req.url).toBe('/hello');
|
|
39
|
+
expect(req.method).toBe('GET');
|
|
40
|
+
expect(req.body).toBe('');
|
|
41
|
+
expect(req.headers).toEqual({ 'x-test': 'yes', missing: '' });
|
|
42
|
+
expect(req.queryStringParameters).toEqual({ a: '1' });
|
|
43
|
+
expect(req.pathParameters).toEqual({});
|
|
44
|
+
expect(req.apiGatewayProxyEventV2Raw).toBe(sampleEvent);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe('adaptToApiGatewayProxyResult', () => {
|
|
48
|
+
it('flattens a ResponseW back into a proxy result', () => {
|
|
49
|
+
const res = adaptToApiGatewayProxyResult({
|
|
50
|
+
...EMPTY_RESPONSE_W,
|
|
51
|
+
body: 'hi',
|
|
52
|
+
});
|
|
53
|
+
expect(res).toEqual({ statusCode: 200, body: 'hi', headers: {} });
|
|
54
|
+
});
|
|
55
|
+
it('falls back to empty body when body is missing', () => {
|
|
56
|
+
const res = adaptToApiGatewayProxyResult(EMPTY_RESPONSE_W);
|
|
57
|
+
expect(res.body).toBe('');
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe('middleware', () => {
|
|
61
|
+
it('round-trips an event through a wrapped handler', async () => {
|
|
62
|
+
const { logger } = recordingLogger();
|
|
63
|
+
const wrapped = apiGatewayProxyEventV2Adapter()((_req) => okAsyncR({
|
|
64
|
+
...EMPTY_RESPONSE_W,
|
|
65
|
+
body: 'hello',
|
|
66
|
+
}));
|
|
67
|
+
const result = await wrapped(sampleEvent)({ logger });
|
|
68
|
+
expect(result.isOk() && result.value).toEqual({
|
|
69
|
+
statusCode: 200,
|
|
70
|
+
body: 'hello',
|
|
71
|
+
headers: {},
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=apiGatewayProxyEventV2Adapter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiGatewayProxyEventV2Adapter.test.js","sourceRoot":"","sources":["../../../src/http/contrib/apiGatewayProxyEventV2Adapter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { WithLogger } from '../../lib/Logger.js';
|
|
2
|
+
import type { MiddlewareError } from '../../lib/MiddlewareError.js';
|
|
3
|
+
import type { Rec, RequestResponseHandler, StrBodyRec } from '../RequestResponseHandler.js';
|
|
4
|
+
import type { RequestW } from '../RequestW.js';
|
|
5
|
+
export declare const TAG = "base64BodyDecoder";
|
|
6
|
+
export declare const middleware: <I extends Rec>(isBase64Encoded: (i: RequestW<I>) => boolean) => <O extends Rec, E, R>(wrapped: RequestResponseHandler<I & StrBodyRec, R, O, E>) => RequestResponseHandler<I & StrBodyRec, R & WithLogger, O, E | MiddlewareError>;
|
|
7
|
+
//# sourceMappingURL=base64BodyDecoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64BodyDecoder.d.ts","sourceRoot":"","sources":["../../../src/http/contrib/base64BodyDecoder.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAGpE,OAAO,KAAK,EAAE,GAAG,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC5F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,eAAO,MAAM,GAAG,sBAAsB,CAAC;AAEvC,eAAO,MAAM,UAAU,GACpB,CAAC,SAAS,GAAG,EAAE,iBAAiB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,OAAO,MAC3D,CAAC,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC,EAClB,SAAS,sBAAsB,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KACvD,sBAAsB,CAAC,CAAC,GAAG,UAAU,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,CAAC,GAAG,eAAe,CAqB7E,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { andThenAsync, mapAsync } from '@konker.dev/neverthrow-r/async';
|
|
2
|
+
import { okAsyncR } from '@konker.dev/neverthrow-r/constructors';
|
|
3
|
+
import { pipe } from '@konker.dev/neverthrow-r/pipe';
|
|
4
|
+
import { tapLogger } from '../../lib/Logger.js';
|
|
5
|
+
import { toMiddlewareError } from '../../lib/MiddlewareError.js';
|
|
6
|
+
import { fromPromise } from '../../lib/utils.js';
|
|
7
|
+
import { makeResponseW } from '../ResponseW.js';
|
|
8
|
+
export const TAG = 'base64BodyDecoder';
|
|
9
|
+
export const middleware = (isBase64Encoded) => (wrapped) => (i) => pipe(okAsyncR(i), tapLogger('debug', `[${TAG}] IN`), andThenAsync((req) => () => fromPromise(async () => isBase64Encoded(req)
|
|
10
|
+
? {
|
|
11
|
+
...req,
|
|
12
|
+
body: Buffer.from(req.body ?? '', 'base64').toString('utf-8'),
|
|
13
|
+
}
|
|
14
|
+
: { ...req }, toMiddlewareError)), andThenAsync(wrapped), mapAsync((res) => makeResponseW(res)), tapLogger('debug', `[${TAG}] OUT`));
|
|
15
|
+
//# sourceMappingURL=base64BodyDecoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64BodyDecoder.js","sourceRoot":"","sources":["../../../src/http/contrib/base64BodyDecoder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,uCAAuC,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AAGrD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,CAAC,MAAM,GAAG,GAAG,mBAAmB,CAAC;AAEvC,MAAM,CAAC,MAAM,UAAU,GACrB,CAAgB,eAA4C,EAAE,EAAE,CAChE,CACE,OAAwD,EACwB,EAAE,CACpF,CAAC,CAA2B,EAAE,EAAE,CAC9B,IAAI,CACF,QAAQ,CAAC,CAAC,CAAC,EACX,SAAS,CAAC,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC,EACjC,YAAY,CACV,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,CACZ,WAAW,CACT,KAAK,IAAuC,EAAE,CAC5C,eAAe,CAAC,GAAG,CAAC;IAClB,CAAC,CAAC;QACE,GAAG,GAAG;QACN,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;KAC9D;IACH,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,EAChB,iBAAiB,CAClB,CACJ,EACD,YAAY,CAAC,OAAO,CAAC,EACrB,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EACrC,SAAS,CAAC,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,CACnC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64BodyDecoder.test.d.ts","sourceRoot":"","sources":["../../../src/http/contrib/base64BodyDecoder.test.ts"],"names":[],"mappings":""}
|