8000 fix: specify event type explicitly by contexD · Pull Request #1295 · middyjs/middy · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

fix: specify event type explicitly #1295

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 27, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 47 additions & 39 deletions packages/core/index.d.ts
8000
Original file line number Diff line number Diff line change
Expand Up @@ -93,27 +93,28 @@ export interface MiddyfiedHandler<
TContext extends LambdaContext = LambdaContext,
TInternal extends Record<string, unknown> = {},
> extends MiddyInputHandler<TEvent, TResult, TContext>,
MiddyInputPromiseHandler<TEvent, TResult, TContext> {
use: UseFn<TEvent, TResult, TErr, TContext, TInternal>;
before: AttachMiddlewareFn<TEvent, TResult, TErr, TContext, TInternal>;
after: AttachMiddlewareFn<TEvent, TResult, TErr, TContext, TInternal>;
onError: AttachMiddlewareFn<TEvent, TResult, TErr, TContext, TInternal>;
handler: <
TInputHandlerEventProps = TEvent,
TInputHandlerResultProps = TResult,
>(
handler: MiddlewareHandler<
LambdaHandler<TInputHandlerEventProps, TInputHandlerResultProps>,
TContext,
TResult
>,
) => MiddyfiedHandler<
TInputHandlerEventProps,
TInputHandlerResultProps,
TErr,
TContext,
TInternal
>;
MiddyInputPromiseHandler<TEvent, TResult, TContext> {
use: UseFn<TEvent, TResult, TErr, TContext, TInternal>
before: AttachMiddlewareFn<TEvent, TResult, TErr, TContext, TInternal>
after: AttachMiddlewareFn<TEvent, TResult, TErr, TContext, TInternal>
onError: AttachMiddlewareFn<TEvent, TResult, TErr, TContext, TInternal>
handler: <
TInputHandlerEventProps = TEvent,
TInputHandlerResultProps = TResult
>(
handler: MiddlewareHandler<
LambdaHandler<TInputHandlerEventProps, TInputHandlerResultProps>,
TContext,
TResult,
TEvent
>
) => MiddyfiedHandler<
TInputHandlerEventProps,
TInputHandlerResultProps,
TErr,
TContext,
TInternal
>
}

declare type AttachMiddlewareFn<
Expand Down Expand Up @@ -161,31 +162,38 @@ declare type UseFn<
: never;

declare type MiddlewareHandler<
THandler extends LambdaHandler<any, any>,
TContext extends LambdaContext = LambdaContext,
TResult = any,
> = THandler extends LambdaHandler<infer TEvent, TResult> // always true
? MiddyInputHandler<TEvent, TResult, TContext>
: never;
THandler extends LambdaHandler<any, any>,
TContext extends LambdaContext = LambdaContext,
TResult = any,
TEvent = any
> =
THandler extends LambdaHandler<TEvent, TResult> // always true

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

anchor

? MiddyInputHandler<TEvent, TResult, TContext>
: never

/**
* Middy factory function. Use it to wrap your existing handler to enable middlewares on it.
* @param handler your original AWS Lambda function
* @param plugin wraps around each middleware and handler to add custom lifecycle behaviours (e.g. to profile performance)
*/
declare function middy<
TEvent = unknown,
TResult = any,
TErr = Error,
TContext extends LambdaContext = LambdaContext,
TInternal extends Record<string, unknown> = {},
>(
handler?:
| LambdaHandler<TEvent, TResult>
| MiddlewareHandler<LambdaHandler<TEvent, TResult>, TContext, TResult>
| PluginObject,
plugin?: PluginObject,
): MiddyfiedHandler<TEvent, TResult, TErr, TContext, TInternal>;
TEvent = unknown,
TResult = any,
TErr = Error,
TContext extends LambdaContext = LambdaContext,
TInternal extends Record<string, unknown> = {}
> (
handler?:
| LambdaHandler<TEvent, TResult>
| MiddlewareHandler<
LambdaHandler<TEvent, TResult>,
TContext,
TResult,
TEvent
>
| PluginObject,
plugin?: PluginObject
): MiddyfiedHandler<TEvent, TResult, TErr, TContext, TInternal>

declare namespace middy {
export type {
Expand Down
47 changes: 30 additions & 17 deletions packages/core/index.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -282,8 +282,12 @@ const typeErrorMiddleware = {
customCtxHandler = customCtxHandler.use(typeErrorMiddleware);
expectType<MutableContextHandler>(customCtxHandler);

const streamifiedResponseHandler = middy({ streamifyResponse: true });
expectType<middy.MiddyfiedHandler<unknown>>(streamifiedResponseHandler);
const streamifiedResponseHandler = middy<APIGatewayProxyEvent>({
streamifyResponse: true
})
expectType<middy.MiddyfiedHandler<APIGatewayProxyEvent>>(
streamifiedResponseHandler
)

streamifiedResponseHandler.handler(lambdaHandler);
streamifiedResponseHandler.use(middlewareObj);
Expand Down Expand Up @@ -500,8 +504,12 @@ const syncedTypeErrorMiddleware = {
customSyncedCtxHandler = customSyncedCtxHandler.use(syncedTypeErrorMiddleware);
expectType<MutableContextHandler>(customSyncedCtxHandler);

const syncedStreamifiedResponseHandler = middy({ streamifyResponse: true });
expectType<middy.MiddyfiedHandler<unknown>>(syncedStreamifiedResponseHandler);
const syncedStreamifiedResponseHandler = middy<APIGatewayProxyEvent>({
streamifyResponse: true
})
expectType<middy.MiddyfiedHandler<APIGatewayProxyEvent>>(
syncedStreamifiedResponseHandler
)

syncedStreamifiedResponseHandler.handler(syncedLambdaHandler);
syncedStreamifiedResponseHandler.use(middlewareObj);
Expand All @@ -519,8 +527,8 @@ const s3Handler = async (event: S3Event): Promise<undefined> => {
await Promise.all(event.Records.map(async () => await Promise.resolve()));
};

const handler1182 = middy().handler(s3Handler);
expectType<MiddyfiedHandler<S3Event, any, Error, Context, {}>>(handler1182);
const handler1182 = middy<S3Event>().handler(s3Handler)
expectType<MiddyfiedHandler<S3Event, any, Error, Context, {}>>(handler1182)

// Issue #1228 Correct return type
const numberHandler = middy<APIGatewayProxyEvent, number>().handler(
Expand All @@ -542,14 +550,19 @@ expectType<middy.MiddyfiedHandler<APIGatewayProxyEvent, number>>(

// Issue #1275 Early Response type
middy<unknown, string>()
.before(async (request) => {
request.earlyResponse = "Hello, world!";
})
.use({
after: (request) => {
request.earlyResponse = null;
},
})
.onError(async (request) => {
request.earlyResponse = undefined;
});
.before(async (request) => {
request.earlyResponse = 'Hello, world!'
})
.use({
after: (request) => {
request.earlyResponse = null
}
})
.onError(async (request) => {
request.earlyResponse = undefined
})

// Issue #1293 Handler event type is not correctly inferred
// @ts-expect-error
const s3MiddyHandler = middy().handler(s3Handler)
expectType<middy.MiddyfiedHandler<unknown, any>>(s3MiddyHandler)
Loading
0