From c6417c3ce1c772c83af84e5feb5a6509590fc49b Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Tue, 7 May 2024 18:02:54 -0400 Subject: [PATCH] fix: support zero arg actions --- .../src/actions/runtime/virtual/server.ts | 53 +++++++++++-------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/packages/astro/src/actions/runtime/virtual/server.ts b/packages/astro/src/actions/runtime/virtual/server.ts index b616ad91f5f8..c9c73481c471 100644 --- a/packages/astro/src/actions/runtime/virtual/server.ts +++ b/packages/astro/src/actions/runtime/virtual/server.ts @@ -20,29 +20,40 @@ export type InputSchema = T extends 'form' ? z.AnyZodObject | z.ZodType : z.ZodType; +type Handler = TInputSchema extends z.ZodType + ? (input: z.infer) => MaybePromise + : (input?: any) => MaybePromise; + export type ActionClient< TOutput, TAccept extends Accept, - TInputSchema extends InputSchema, -> = (( - input: TAccept extends 'form' ? FormData : z.input -) => Promise>) & { - safe: ( - input: TAccept extends 'form' ? FormData : z.input - ) => Promise< - SafeResult< - z.infer extends ErrorInferenceObject - ? z.infer - : ErrorInferenceObject, - Awaited - > - >; -}; + TInputSchema extends InputSchema | undefined, +> = TInputSchema extends z.ZodType + ? (( + input: TAccept extends 'form' ? FormData : z.input + ) => Promise>) & { + safe: ( + input: TAccept extends 'form' ? FormData : z.input + ) => Promise< + SafeResult< + z.input extends ErrorInferenceObject + ? z.input + : ErrorInferenceObject, + Awaited + > + >; + } + : ((input?: any) => Promise>) & { + safe: (input?: any) => Promise>>; + }; export function defineAction< TOutput, TAccept extends Accept = 'json', - TInputSchema extends InputSchema = TAccept extends 'form' ? z.ZodType : never, + TInputSchema extends InputSchema | undefined = TAccept extends 'form' + ? // If `input` is omitted, default to `FormData` for forms and `any` for JSON. + z.ZodType + : undefined, >({ accept, input: inputSchema, @@ -50,7 +61,7 @@ export function defineAction< }: { input?: TInputSchema; accept?: TAccept; - handler: (input: z.infer) => MaybePromise; + handler: Handler; }): ActionClient { const serverHandler = accept === 'form' @@ -65,8 +76,8 @@ export function defineAction< return serverHandler as ActionClient; } -function getFormServerHandler>( - handler: (input: z.infer) => MaybePromise, +function getFormServerHandler>( + handler: Handler, inputSchema?: TInputSchema ) { return async (unparsedInput: unknown): Promise> => { @@ -87,8 +98,8 @@ function getFormServerHandler>( - handler: (input: z.infer) => MaybePromise, +function getJsonServerHandler>( + handler: Handler, inputSchema?: TInputSchema ) { return async (unparsedInput: unknown): Promise> => {