UNPKG

next-safe-action

Version:

Type safe and validated Server Actions in your Next.js project.

1 lines 50.7 kB
{"version":3,"file":"index.mjs","names":["#args"],"sources":["../src/standard-schema.ts","../src/utils.ts","../src/validation-errors.ts","../src/action-builder.ts","../src/safe-action-client.ts","../src/middleware.ts","../src/index.ts"],"sourcesContent":["/** The Standard Schema interface. */\nexport interface StandardSchemaV1<Input = unknown, Output = Input> {\n\t/** The Standard Schema properties. */\n\treadonly \"~standard\": StandardSchemaV1.Props<Input, Output>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport declare namespace StandardSchemaV1 {\n\t/** The Standard Schema properties interface. */\n\texport interface Props<Input = unknown, Output = Input> {\n\t\t/** The version number of the standard. */\n\t\treadonly version: 1;\n\t\t/** The vendor name of the schema library. */\n\t\treadonly vendor: string;\n\t\t/** Validates unknown input values. */\n\t\treadonly validate: (value: unknown) => Result<Output> | Promise<Result<Output>>;\n\t\t/** Inferred types associated with the schema. */\n\t\treadonly types?: Types<Input, Output> | undefined;\n\t}\n\n\t/** The result interface of the validate function. */\n\texport type Result<Output> = SuccessResult<Output> | FailureResult;\n\n\t/** The result interface if validation succeeds. */\n\texport interface SuccessResult<Output> {\n\t\t/** The typed output value. */\n\t\treadonly value: Output;\n\t\t/** The non-existent issues. */\n\t\treadonly issues?: undefined;\n\t}\n\n\t/** The result interface if validation fails. */\n\texport interface FailureResult {\n\t\t/** The issues of failed validation. */\n\t\treadonly issues: ReadonlyArray<Issue>;\n\t}\n\n\t/** The issue interface of the failure output. */\n\texport interface Issue {\n\t\t/** The error message of the issue. */\n\t\treadonly message: string;\n\t\t/** The path of the issue, if any. */\n\t\treadonly path?: ReadonlyArray<PropertyKey | PathSegment> | undefined;\n\t}\n\n\t/** The path segment interface of the issue. */\n\texport interface PathSegment {\n\t\t/** The key representing a path segment. */\n\t\treadonly key: PropertyKey;\n\t}\n\n\t/** The Standard Schema types interface. */\n\texport interface Types<Input = unknown, Output = Input> {\n\t\t/** The input type of the schema. */\n\t\treadonly input: Input;\n\t\t/** The output type of the schema. */\n\t\treadonly output: Output;\n\t}\n\n\t/** Infers the input type of a Standard Schema. */\n\texport type InferInput<Schema extends StandardSchemaV1> = NonNullable<Schema[\"~standard\"][\"types\"]>[\"input\"];\n\n\t/** Infers the output type of a Standard Schema. */\n\texport type InferOutput<Schema extends StandardSchemaV1> = NonNullable<Schema[\"~standard\"][\"types\"]>[\"output\"];\n}\n\n// custom helpers\n\n/** Infer the input type of an array of Standard Schemas. */\nexport type InferInputArray<Schemas extends readonly StandardSchemaV1[]> = {\n\t[K in keyof Schemas]: StandardSchemaV1.InferInput<Schemas[K]>;\n};\n\n/** Infer the output type of an array of Standard Schemas. */\nexport type InferOutputArray<Schemas extends readonly StandardSchemaV1[]> = {\n\t[K in keyof Schemas]: StandardSchemaV1.InferOutput<Schemas[K]>;\n};\n\n/** Infer the input type of a Standard Schema, or a default type if the schema is undefined. */\nexport type InferInputOrDefault<MaybeSchema, Default> = MaybeSchema extends StandardSchemaV1\n\t? StandardSchemaV1.InferInput<MaybeSchema>\n\t: Default;\n\n/** Infer the output type of a Standard Schema, or a default type if the schema is undefined. */\nexport type InferOutputOrDefault<MaybeSchema, Default> = MaybeSchema extends StandardSchemaV1\n\t? StandardSchemaV1.InferOutput<MaybeSchema>\n\t: Default;\n\nexport function isStandardSchema(value: unknown): value is StandardSchemaV1 {\n\tif (value === null || (typeof value !== \"object\" && typeof value !== \"function\")) {\n\t\treturn false;\n\t}\n\n\tconst standardProps = (value as { [\"~standard\"]?: unknown })[\"~standard\"];\n\n\tif (standardProps === null || typeof standardProps !== \"object\") {\n\t\treturn false;\n\t}\n\n\treturn (\n\t\t(standardProps as { version?: unknown }).version === 1 &&\n\t\ttypeof (standardProps as { validate?: unknown }).validate === \"function\"\n\t);\n}\n\nexport async function standardParse<Output>(schema: StandardSchemaV1<unknown, Output>, value: unknown) {\n\treturn schema[\"~standard\"].validate(value);\n}\n","export const DEFAULT_SERVER_ERROR_MESSAGE = \"Something went wrong while executing the operation.\";\n\n/**\n * Checks if passed argument is an instance of Error.\n */\nexport const isError = (error: unknown): error is Error => error instanceof Error;\n\n/**\n * Checks what the winning boolean value is from a series of values, from lowest to highest priority.\n * `null` and `undefined` values are skipped.\n */\nexport const winningBoolean = (...args: (boolean | undefined | null)[]) => {\n\treturn args.reduce((acc, v) => (typeof v === \"boolean\" ? v : acc), false) as boolean;\n};\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment */\nimport type { StandardSchemaV1 } from \"./standard-schema\";\nimport type { FlattenedValidationErrors, IssueWithUnionErrors, ValidationErrors } from \"./validation-errors.types\";\n\nconst getKey = (segment: PropertyKey | StandardSchemaV1.PathSegment) =>\n\ttypeof segment === \"object\" ? segment.key : segment;\n\nconst getIssueMessage = (issue: IssueWithUnionErrors) => {\n\tif (issue.unionErrors) {\n\t\treturn issue.unionErrors.map((u) => u.issues.map((i) => i.message)).flat();\n\t}\n\treturn issue.message;\n};\n\n// This function is used internally to build the validation errors object from a list of validation issues.\nexport const buildValidationErrors = <S extends StandardSchemaV1 | undefined>(\n\tissues: readonly IssueWithUnionErrors[]\n) => {\n\tconst ve: any = {};\n\n\tfor (const issue of issues) {\n\t\tconst { path, message, unionErrors } = issue;\n\n\t\t// When path is undefined or empty, set root errors.\n\t\tif (!path || path.length === 0) {\n\t\t\tve._errors = ve._errors ? [...ve._errors, message] : [message];\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Reference to errors object.\n\t\tlet ref = ve;\n\n\t\t// Set object for the path, if it doesn't exist.\n\t\tfor (let i = 0; i < path.length - 1; i++) {\n\t\t\tconst k = getKey(path[i]!);\n\n\t\t\tif (!ref[k]) {\n\t\t\t\tref[k] = {};\n\t\t\t}\n\n\t\t\tref = ref[k];\n\t\t}\n\n\t\t// Key is always the last element of the path.\n\t\tconst key = getKey(path[path.length - 1]!);\n\n\t\tconst issueMessage = getIssueMessage(issue);\n\n\t\t// Set error for the current path. If `_errors` array exists, add the message to it.\n\t\tref[key] = ref[key]?._errors\n\t\t\t? {\n\t\t\t\t\t...structuredClone(ref[key]),\n\t\t\t\t\t_errors: [...ref[key]._errors, issueMessage],\n\t\t\t\t}\n\t\t\t: { ...structuredClone(ref[key]), _errors: unionErrors ? issueMessage : [issueMessage] };\n\t}\n\n\treturn ve as ValidationErrors<S>;\n};\n\n// This class is internally used to throw validation errors in action's server code function, using\n// `returnValidationErrors`.\nexport class ActionServerValidationError<S extends StandardSchemaV1> extends Error {\n\tpublic validationErrors: ValidationErrors<S>;\n\tconstructor(validationErrors: ValidationErrors<S>) {\n\t\tsuper(\"Server Action server validation error(s) occurred\");\n\t\tthis.validationErrors = validationErrors;\n\t}\n}\n\n// This class is internally used to throw validation errors in action's server code function, using\n// `returnValidationErrors`.\nexport class ActionValidationError<CVE> extends Error {\n\tpublic validationErrors: CVE;\n\tconstructor(validationErrors: CVE, overriddenErrorMessage?: string) {\n\t\tsuper(overriddenErrorMessage ?? \"Server Action validation error(s) occurred\");\n\t\tthis.validationErrors = validationErrors;\n\t}\n}\n\n// This class is internally used to throw validation errors in action's server code function, using\n// `returnValidationErrors`.\nexport class ActionBindArgsValidationError extends Error {\n\tpublic validationErrors: unknown[];\n\tconstructor(validationErrors: unknown[]) {\n\t\tsuper(\"Server Action bind args validation error(s) occurred\");\n\t\tthis.validationErrors = validationErrors;\n\t}\n}\n\n/**\n * Return custom validation errors to the client from the action's server code function.\n * Code declared after this function invocation will not be executed.\n * @param schema Input schema\n * @param validationErrors Validation errors object\n *\n * {@link https://next-safe-action.dev/docs/define-actions/validation-errors#returnvalidationerrors See docs for more information}\n */\nexport function returnValidationErrors<\n\tS extends StandardSchemaV1 | (() => Promise<StandardSchemaV1>),\n\tAS extends StandardSchemaV1 = S extends () => Promise<StandardSchemaV1> ? Awaited<ReturnType<S>> : S, // actual schema\n>(schema: S, validationErrors: ValidationErrors<AS>): never {\n\tthrow new ActionServerValidationError<AS>(validationErrors);\n}\n\n/**\n * Default validation errors format.\n * Emulation of `zod`'s [`format`](https://zod.dev/ERROR_HANDLING?id=formatting-errors) function.\n */\nexport function formatValidationErrors<VE extends ValidationErrors<any>>(validationErrors: VE) {\n\treturn validationErrors;\n}\n\n/**\n * Transform default formatted validation errors into flattened structure.\n * `formErrors` contains global errors, and `fieldErrors` contains errors for each field,\n * one level deep. It discards errors for nested fields.\n * Emulation of `zod`'s [`flatten`](https://zod.dev/ERROR_HANDLING?id=flattening-errors) function.\n * @param {ValidationErrors} [validationErrors] Validation errors object\n *\n * {@link https://next-safe-action.dev/docs/define-actions/validation-errors#flattenvalidationerrorsutility-function See docs for more information}\n */\nexport function flattenValidationErrors<VE extends ValidationErrors<any>>(validationErrors: VE) {\n\tconst flattened: FlattenedValidationErrors<VE> = {\n\t\tformErrors: [],\n\t\tfieldErrors: {},\n\t};\n\n\tfor (const [key, value] of Object.entries<string[] | { _errors: string[] }>(validationErrors ?? {})) {\n\t\tif (key === \"_errors\" && Array.isArray(value)) {\n\t\t\tflattened.formErrors = [...value];\n\t\t} else {\n\t\t\tif (\"_errors\" in value) {\n\t\t\t\tflattened.fieldErrors[key as keyof Omit<VE, \"_errors\">] = [...value._errors];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn flattened;\n}\n\n/**\n * This error is thrown when an action metadata is invalid, i.e. when there's a mismatch between the\n * type of the metadata schema returned from `defineMetadataSchema` and the actual data passed.\n */\nexport class ActionMetadataValidationError<MDS extends StandardSchemaV1 | undefined> extends Error {\n\tpublic validationErrors: ValidationErrors<MDS>;\n\n\tconstructor(validationErrors: ValidationErrors<MDS>) {\n\t\tsuper(\"Invalid metadata input. Please be sure to pass metadata via `metadata` method before defining the action.\");\n\t\tthis.name = \"ActionMetadataError\";\n\t\tthis.validationErrors = validationErrors;\n\t}\n}\n\n/**\n * This error is thrown when an action's data (output) is invalid, i.e. when there's a mismatch between the\n * type of the data schema passed to `dataSchema` method and the actual return of the action.\n */\nexport class ActionOutputDataValidationError<DS extends StandardSchemaV1 | undefined> extends Error {\n\tpublic validationErrors: ValidationErrors<DS>;\n\n\tconstructor(validationErrors: ValidationErrors<DS>) {\n\t\tsuper(\n\t\t\t\"Invalid action data (output). Please be sure to return data following the shape of the schema passed to `dataSchema` method.\"\n\t\t);\n\t\tthis.name = \"ActionOutputDataError\";\n\t\tthis.validationErrors = validationErrors;\n\t}\n}\n","import { deepmerge } from \"deepmerge-ts\";\nimport type {} from \"zod\";\nimport type {\n\tDVES,\n\tMiddlewareResult,\n\tSafeActionClientArgs,\n\tSafeActionFn,\n\tSafeActionResult,\n\tSafeActionUtils,\n\tSafeStateActionFn,\n\tServerCodeFn,\n\tStateServerCodeFn,\n} from \"./index.types\";\nimport { FrameworkErrorHandler } from \"./next/errors\";\nimport type {\n\tInferInputArray,\n\tInferInputOrDefault,\n\tInferOutputArray,\n\tInferOutputOrDefault,\n\tStandardSchemaV1,\n} from \"./standard-schema\";\nimport { standardParse } from \"./standard-schema\";\nimport { DEFAULT_SERVER_ERROR_MESSAGE, isError, winningBoolean } from \"./utils\";\nimport {\n\tActionBindArgsValidationError,\n\tActionMetadataValidationError,\n\tActionOutputDataValidationError,\n\tActionServerValidationError,\n\tActionValidationError,\n\tbuildValidationErrors,\n} from \"./validation-errors\";\nimport type { ValidationErrors } from \"./validation-errors.types\";\n\nexport function actionBuilder<\n\tServerError,\n\tODVES extends DVES | undefined, // override default validation errors shape\n\tMetadataSchema extends StandardSchemaV1 | undefined = undefined,\n\tMD = InferOutputOrDefault<MetadataSchema, undefined>, // metadata type (inferred from metadata schema)\n\tCtx extends object = {},\n\tISF extends ((clientInput?: unknown) => Promise<StandardSchemaV1>) | undefined = undefined, // input schema function\n\tIS extends StandardSchemaV1 | undefined = ISF extends Function ? Awaited<ReturnType<ISF>> : undefined, // input schema\n\tOS extends StandardSchemaV1 | undefined = undefined, // output schema\n\tconst BAS extends readonly StandardSchemaV1[] = [],\n\tCVE = undefined,\n>(args: SafeActionClientArgs<ServerError, ODVES, MetadataSchema, MD, true, Ctx, ISF, IS, OS, BAS, CVE>) {\n\tconst bindArgsSchemas = args.bindArgsSchemas ?? [];\n\n\tfunction buildAction({ withState }: { withState: false }): {\n\t\taction: <Data extends InferOutputOrDefault<OS, any>>(\n\t\t\tserverCodeFn: ServerCodeFn<MD, Ctx, IS, BAS, Data>,\n\t\t\tutils?: SafeActionUtils<ServerError, MD, Ctx, IS, BAS, CVE, Data>\n\t\t) => SafeActionFn<ServerError, IS, BAS, CVE, Data>;\n\t};\n\tfunction buildAction({ withState }: { withState: true }): {\n\t\taction: <Data extends InferOutputOrDefault<OS, any>>(\n\t\t\tserverCodeFn: StateServerCodeFn<ServerError, MD, Ctx, IS, BAS, CVE, Data>,\n\t\t\tutils?: SafeActionUtils<ServerError, MD, Ctx, IS, BAS, CVE, Data>\n\t\t) => SafeStateActionFn<ServerError, IS, BAS, CVE, Data>;\n\t};\n\tfunction buildAction({ withState }: { withState: boolean }) {\n\t\treturn {\n\t\t\taction: <Data extends InferOutputOrDefault<OS, any>>(\n\t\t\t\tserverCodeFn:\n\t\t\t\t\t| ServerCodeFn<MD, Ctx, IS, BAS, Data>\n\t\t\t\t\t| StateServerCodeFn<ServerError, MD, Ctx, IS, BAS, CVE, Data>,\n\t\t\t\tutils?: SafeActionUtils<ServerError, MD, Ctx, IS, BAS, CVE, Data>\n\t\t\t) => {\n\t\t\t\treturn async (...clientInputs: unknown[]) => {\n\t\t\t\t\tlet currentCtx: object = {};\n\t\t\t\t\tconst middlewareResult: MiddlewareResult<ServerError, object> = { success: false };\n\t\t\t\t\ttype PrevResult = SafeActionResult<ServerError, IS, CVE, Data>;\n\t\t\t\t\tlet prevResult: PrevResult = {};\n\t\t\t\t\tconst parsedInputDatas: any[] = [];\n\t\t\t\t\tconst frameworkErrorHandler = new FrameworkErrorHandler();\n\n\t\t\t\t\t// Track if server error has been handled.\n\t\t\t\t\tlet serverErrorHandled = false;\n\n\t\t\t\t\tif (withState) {\n\t\t\t\t\t\t// Previous state is placed between bind args and main arg inputs, so it's always at the index of\n\t\t\t\t\t\t// the bind args schemas + 1. Get it and remove it from the client inputs array.\n\t\t\t\t\t\tprevResult = clientInputs.splice(bindArgsSchemas.length, 1)[0] as PrevResult;\n\t\t\t\t\t}\n\n\t\t\t\t\t// If the number of bind args schemas + 1 (which is the optional main arg schema) is greater\n\t\t\t\t\t// than the number of provided client inputs, it means that the main argument is missing.\n\t\t\t\t\t// This happens when the main schema is missing (since it's optional), or if a void main schema\n\t\t\t\t\t// is provided along with bind args schemas.\n\t\t\t\t\tif (bindArgsSchemas.length + 1 > clientInputs.length) {\n\t\t\t\t\t\tclientInputs.push(undefined);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Execute the middleware stack.\n\t\t\t\t\tconst executeMiddlewareStack = async (idx = 0) => {\n\t\t\t\t\t\tif (frameworkErrorHandler.error) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst middlewareFn = args.middlewareFns[idx];\n\t\t\t\t\t\tmiddlewareResult.ctx = currentCtx;\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif (idx === 0) {\n\t\t\t\t\t\t\t\tif (args.metadataSchema) {\n\t\t\t\t\t\t\t\t\t// Validate metadata input.\n\t\t\t\t\t\t\t\t\tconst parsedMd = await standardParse(args.metadataSchema, args.metadata);\n\n\t\t\t\t\t\t\t\t\tif (parsedMd.issues) {\n\t\t\t\t\t\t\t\t\t\tthrow new ActionMetadataValidationError<MetadataSchema>(buildValidationErrors(parsedMd.issues));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Middleware function.\n\t\t\t\t\t\t\tif (middlewareFn) {\n\t\t\t\t\t\t\t\tawait middlewareFn({\n\t\t\t\t\t\t\t\t\tclientInput: clientInputs.at(-1), // pass raw client input\n\t\t\t\t\t\t\t\t\tbindArgsClientInputs: bindArgsSchemas.length ? clientInputs.slice(0, -1) : [],\n\t\t\t\t\t\t\t\t\tctx: currentCtx,\n\t\t\t\t\t\t\t\t\tmetadata: args.metadata,\n\t\t\t\t\t\t\t\t\tnext: async (nextOpts) => {\n\t\t\t\t\t\t\t\t\t\tcurrentCtx = deepmerge(currentCtx, nextOpts?.ctx ?? {});\n\t\t\t\t\t\t\t\t\t\tawait executeMiddlewareStack(idx + 1);\n\t\t\t\t\t\t\t\t\t\treturn middlewareResult;\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}).catch((e) => {\n\t\t\t\t\t\t\t\t\tframeworkErrorHandler.handleError(e);\n\t\t\t\t\t\t\t\t\tif (frameworkErrorHandler.error) {\n\t\t\t\t\t\t\t\t\t\tmiddlewareResult.success = false;\n\t\t\t\t\t\t\t\t\t\tmiddlewareResult.navigationKind = FrameworkErrorHandler.getNavigationKind(\n\t\t\t\t\t\t\t\t\t\t\tframeworkErrorHandler.error\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t// Action function.\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Validate the client inputs in parallel.\n\t\t\t\t\t\t\t\tconst parsedInputs = await Promise.all(\n\t\t\t\t\t\t\t\t\tclientInputs.map(async (input, i) => {\n\t\t\t\t\t\t\t\t\t\t// Last client input in the array, main argument (no bind arg).\n\t\t\t\t\t\t\t\t\t\tif (i === clientInputs.length - 1) {\n\t\t\t\t\t\t\t\t\t\t\t// If schema is undefined, set parsed data to undefined.\n\t\t\t\t\t\t\t\t\t\t\tif (typeof args.inputSchemaFn === \"undefined\") {\n\t\t\t\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue: undefined,\n\t\t\t\t\t\t\t\t\t\t\t\t} as const satisfies StandardSchemaV1.Result<undefined>;\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Otherwise, parse input with the schema.\n\t\t\t\t\t\t\t\t\t\t\treturn standardParse(await args.inputSchemaFn(input), input);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Otherwise, we're processing bind args client inputs.\n\t\t\t\t\t\t\t\t\t\treturn standardParse(bindArgsSchemas[i]!, input);\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tlet hasBindValidationErrors = false;\n\n\t\t\t\t\t\t\t\t// Initialize the bind args validation errors array with null values.\n\t\t\t\t\t\t\t\t// It has the same length as the number of bind arguments (parsedInputs - 1).\n\t\t\t\t\t\t\t\tconst bindArgsValidationErrors = Array(parsedInputs.length - 1).fill({});\n\n\t\t\t\t\t\t\t\tfor (let i = 0; i < parsedInputs.length; i++) {\n\t\t\t\t\t\t\t\t\tconst parsedInput = parsedInputs[i]!;\n\n\t\t\t\t\t\t\t\t\tif (!parsedInput.issues) {\n\t\t\t\t\t\t\t\t\t\tparsedInputDatas.push(parsedInput.value);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t// If we're processing a bind argument and there are validation errors for this one,\n\t\t\t\t\t\t\t\t\t\t// we need to store them in the bind args validation errors array at this index.\n\t\t\t\t\t\t\t\t\t\tif (i < parsedInputs.length - 1) {\n\t\t\t\t\t\t\t\t\t\t\tbindArgsValidationErrors[i] = buildValidationErrors<BAS[number]>(parsedInput.issues);\n\t\t\t\t\t\t\t\t\t\t\thasBindValidationErrors = true;\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t// Otherwise, we're processing the non-bind argument (the last one) in the array.\n\t\t\t\t\t\t\t\t\t\t\tconst validationErrors = buildValidationErrors<IS>(parsedInput.issues);\n\n\t\t\t\t\t\t\t\t\t\t\tmiddlewareResult.validationErrors = await Promise.resolve(\n\t\t\t\t\t\t\t\t\t\t\t\targs.handleValidationErrorsShape(validationErrors, {\n\t\t\t\t\t\t\t\t\t\t\t\t\tclientInput: clientInputs.at(-1) as InferInputOrDefault<IS, undefined>,\n\t\t\t\t\t\t\t\t\t\t\t\t\tbindArgsClientInputs: (bindArgsSchemas.length\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? clientInputs.slice(0, -1)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: []) as InferInputArray<BAS>,\n\t\t\t\t\t\t\t\t\t\t\t\t\tctx: currentCtx as Ctx,\n\t\t\t\t\t\t\t\t\t\t\t\t\tmetadata: args.metadata,\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If there are bind args validation errors, throw an error.\n\t\t\t\t\t\t\t\tif (hasBindValidationErrors) {\n\t\t\t\t\t\t\t\t\tthrow new ActionBindArgsValidationError(bindArgsValidationErrors);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (middlewareResult.validationErrors) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\t\tconst scfArgs: Parameters<StateServerCodeFn<ServerError, MD, Ctx, IS, BAS, CVE, Data>> = [];\n\n\t\t\t\t\t\t\t\t// Server code function always has this object as the first argument.\n\t\t\t\t\t\t\t\tscfArgs[0] = {\n\t\t\t\t\t\t\t\t\tparsedInput: parsedInputDatas.at(-1) as InferOutputOrDefault<IS, undefined>,\n\t\t\t\t\t\t\t\t\tbindArgsParsedInputs: parsedInputDatas.slice(0, -1) as InferOutputArray<BAS>,\n\t\t\t\t\t\t\t\t\tclientInput: clientInputs.at(-1) as InferInputOrDefault<IS, undefined>,\n\t\t\t\t\t\t\t\t\tbindArgsClientInputs: (bindArgsSchemas.length\n\t\t\t\t\t\t\t\t\t\t? clientInputs.slice(0, -1)\n\t\t\t\t\t\t\t\t\t\t: []) as InferInputArray<BAS>,\n\t\t\t\t\t\t\t\t\tctx: currentCtx as Ctx,\n\t\t\t\t\t\t\t\t\tmetadata: args.metadata,\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\t// If this action is stateful, server code function also has a `prevResult` property inside the second\n\t\t\t\t\t\t\t\t// argument object.\n\t\t\t\t\t\t\t\tif (withState) {\n\t\t\t\t\t\t\t\t\tscfArgs[1] = { prevResult: structuredClone(prevResult) };\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst data = await serverCodeFn(...scfArgs).catch((e) => frameworkErrorHandler.handleError(e));\n\n\t\t\t\t\t\t\t\t// If a `outputSchema` is passed, validate the action return value.\n\t\t\t\t\t\t\t\tif (typeof args.outputSchema !== \"undefined\" && !frameworkErrorHandler.error) {\n\t\t\t\t\t\t\t\t\tconst parsedData = await standardParse(args.outputSchema, data);\n\n\t\t\t\t\t\t\t\t\tif (parsedData.issues) {\n\t\t\t\t\t\t\t\t\t\tthrow new ActionOutputDataValidationError<OS>(buildValidationErrors(parsedData.issues));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (frameworkErrorHandler.error) {\n\t\t\t\t\t\t\t\t\tmiddlewareResult.success = false;\n\t\t\t\t\t\t\t\t\tmiddlewareResult.navigationKind = FrameworkErrorHandler.getNavigationKind(\n\t\t\t\t\t\t\t\t\t\tframeworkErrorHandler.error\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tmiddlewareResult.success = true;\n\t\t\t\t\t\t\t\t\tmiddlewareResult.data = data;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tmiddlewareResult.parsedInput = parsedInputDatas.at(-1);\n\t\t\t\t\t\t\t\tmiddlewareResult.bindArgsParsedInputs = parsedInputDatas.slice(0, -1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (e: unknown) {\n\t\t\t\t\t\t\t// Only handle server errors once. If already handled, rethrow to bubble up.\n\t\t\t\t\t\t\tif (serverErrorHandled) {\n\t\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// If error is `ActionServerValidationError`, return `validationErrors` as if schema validation would fail.\n\t\t\t\t\t\t\tif (e instanceof ActionServerValidationError) {\n\t\t\t\t\t\t\t\tconst ve = e.validationErrors as ValidationErrors<IS>;\n\t\t\t\t\t\t\t\tmiddlewareResult.validationErrors = await Promise.resolve(\n\t\t\t\t\t\t\t\t\targs.handleValidationErrorsShape(ve, {\n\t\t\t\t\t\t\t\t\t\tclientInput: clientInputs.at(-1) as InferInputOrDefault<IS, undefined>,\n\t\t\t\t\t\t\t\t\t\tbindArgsClientInputs: (bindArgsSchemas.length\n\t\t\t\t\t\t\t\t\t\t\t? clientInputs.slice(0, -1)\n\t\t\t\t\t\t\t\t\t\t\t: []) as InferInputArray<BAS>,\n\t\t\t\t\t\t\t\t\t\tctx: currentCtx as Ctx,\n\t\t\t\t\t\t\t\t\t\tmetadata: args.metadata,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Mark that we're handling the server error to prevent multiple calls.\n\t\t\t\t\t\t\t\tserverErrorHandled = true;\n\n\t\t\t\t\t\t\t\t// If error is not an instance of Error, wrap it in an Error object with\n\t\t\t\t\t\t\t\t// the default message.\n\t\t\t\t\t\t\t\tconst error = isError(e) ? e : new Error(DEFAULT_SERVER_ERROR_MESSAGE);\n\t\t\t\t\t\t\t\tconst returnedError = await Promise.resolve(\n\t\t\t\t\t\t\t\t\targs.handleServerError(error, {\n\t\t\t\t\t\t\t\t\t\tclientInput: clientInputs.at(-1), // pass raw client input\n\t\t\t\t\t\t\t\t\t\tbindArgsClientInputs: bindArgsSchemas.length ? clientInputs.slice(0, -1) : [],\n\t\t\t\t\t\t\t\t\t\tctx: currentCtx,\n\t\t\t\t\t\t\t\t\t\tmetadata: args.metadata as InferOutputOrDefault<MetadataSchema, undefined>,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tmiddlewareResult.serverError = returnedError;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\t// Execute middleware chain + action function.\n\t\t\t\t\tawait executeMiddlewareStack();\n\n\t\t\t\t\tconst callbackPromises: (Promise<unknown> | undefined)[] = [];\n\n\t\t\t\t\t// If an internal (navigation) framework error occurred, throw it, so it will be processed by Next.js.\n\t\t\t\t\tif (frameworkErrorHandler.error) {\n\t\t\t\t\t\tcallbackPromises.push(\n\t\t\t\t\t\t\tutils?.onNavigation?.({\n\t\t\t\t\t\t\t\tmetadata: args.metadata,\n\t\t\t\t\t\t\t\tctx: currentCtx as Ctx,\n\t\t\t\t\t\t\t\tclientInput: clientInputs.at(-1) as InferInputOrDefault<IS, undefined>,\n\t\t\t\t\t\t\t\tbindArgsClientInputs: (bindArgsSchemas.length ? clientInputs.slice(0, -1) : []) as InferInputArray<BAS>,\n\t\t\t\t\t\t\t\tnavigationKind: FrameworkErrorHandler.getNavigationKind(frameworkErrorHandler.error),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tcallbackPromises.push(\n\t\t\t\t\t\t\tutils?.onSettled?.({\n\t\t\t\t\t\t\t\tmetadata: args.metadata,\n\t\t\t\t\t\t\t\tctx: currentCtx as Ctx,\n\t\t\t\t\t\t\t\tclientInput: clientInputs.at(-1) as InferInputOrDefault<IS, undefined>,\n\t\t\t\t\t\t\t\tbindArgsClientInputs: (bindArgsSchemas.length ? clientInputs.slice(0, -1) : []) as InferInputArray<BAS>,\n\t\t\t\t\t\t\t\tresult: {},\n\t\t\t\t\t\t\t\tnavigationKind: FrameworkErrorHandler.getNavigationKind(frameworkErrorHandler.error),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tawait Promise.all(callbackPromises);\n\n\t\t\t\t\t\tthrow frameworkErrorHandler.error;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst actionResult: SafeActionResult<ServerError, IS, CVE, Data> = {};\n\n\t\t\t\t\tif (typeof middlewareResult.validationErrors !== \"undefined\") {\n\t\t\t\t\t\t// `utils.throwValidationErrors` has higher priority since it's set at the action level.\n\t\t\t\t\t\t// It overrides the client setting, if set.\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\twinningBoolean(\n\t\t\t\t\t\t\t\targs.throwValidationErrors,\n\t\t\t\t\t\t\t\ttypeof utils?.throwValidationErrors === \"undefined\" ? undefined : Boolean(utils.throwValidationErrors)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst overrideErrorMessageFn =\n\t\t\t\t\t\t\t\ttypeof utils?.throwValidationErrors === \"object\" && utils?.throwValidationErrors.overrideErrorMessage\n\t\t\t\t\t\t\t\t\t? utils?.throwValidationErrors.overrideErrorMessage\n\t\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t\tthrow new ActionValidationError(\n\t\t\t\t\t\t\t\tmiddlewareResult.validationErrors as CVE,\n\t\t\t\t\t\t\t\tawait overrideErrorMessageFn?.(middlewareResult.validationErrors as CVE)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tactionResult.validationErrors = middlewareResult.validationErrors as CVE;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (typeof middlewareResult.serverError !== \"undefined\") {\n\t\t\t\t\t\tif (utils?.throwServerError) {\n\t\t\t\t\t\t\tthrow middlewareResult.serverError;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tactionResult.serverError = middlewareResult.serverError;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (middlewareResult.success) {\n\t\t\t\t\t\tif (typeof middlewareResult.data !== \"undefined\") {\n\t\t\t\t\t\t\tactionResult.data = middlewareResult.data as Data;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcallbackPromises.push(\n\t\t\t\t\t\t\tutils?.onSuccess?.({\n\t\t\t\t\t\t\t\tmetadata: args.metadata,\n\t\t\t\t\t\t\t\tctx: currentCtx as Ctx,\n\t\t\t\t\t\t\t\tdata: actionResult.data as Data,\n\t\t\t\t\t\t\t\tclientInput: clientInputs.at(-1) as InferInputOrDefault<IS, undefined>,\n\t\t\t\t\t\t\t\tbindArgsClientInputs: (bindArgsSchemas.length ? clientInputs.slice(0, -1) : []) as InferInputArray<BAS>,\n\t\t\t\t\t\t\t\tparsedInput: parsedInputDatas.at(-1) as InferOutputOrDefault<IS, undefined>,\n\t\t\t\t\t\t\t\tbindArgsParsedInputs: parsedInputDatas.slice(0, -1) as InferOutputArray<BAS>,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcallbackPromises.push(\n\t\t\t\t\t\t\tutils?.onError?.({\n\t\t\t\t\t\t\t\tmetadata: args.metadata,\n\t\t\t\t\t\t\t\tctx: currentCtx as Ctx,\n\t\t\t\t\t\t\t\tclientInput: clientInputs.at(-1) as InferInputOrDefault<IS, undefined>,\n\t\t\t\t\t\t\t\tbindArgsClientInputs: (bindArgsSchemas.length ? clientInputs.slice(0, -1) : []) as InferInputArray<BAS>,\n\t\t\t\t\t\t\t\terror: actionResult,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// onSettled, if provided, is always executed.\n\t\t\t\t\tcallbackPromises.push(\n\t\t\t\t\t\tutils?.onSettled?.({\n\t\t\t\t\t\t\tmetadata: args.metadata,\n\t\t\t\t\t\t\tctx: currentCtx as Ctx,\n\t\t\t\t\t\t\tclientInput: clientInputs.at(-1) as InferInputOrDefault<IS, undefined>,\n\t\t\t\t\t\t\tbindArgsClientInputs: (bindArgsSchemas.length ? clientInputs.slice(0, -1) : []) as InferInputArray<BAS>,\n\t\t\t\t\t\t\tresult: actionResult,\n\t\t\t\t\t\t})\n\t\t\t\t\t);\n\n\t\t\t\t\tawait Promise.all(callbackPromises);\n\n\t\t\t\t\treturn actionResult;\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t}\n\n\treturn {\n\t\t/**\n\t\t * Define the action.\n\t\t * @param serverCodeFn Code that will be executed on the **server side**\n\t\t *\n\t\t * {@link https://next-safe-action.dev/docs/define-actions/instance-methods#action--stateaction See docs for more information}\n\t\t */\n\t\taction: buildAction({ withState: false }).action,\n\n\t\t/**\n\t\t * Define the stateful action. To be used with the [`useStateAction`](https://next-safe-action.dev/docs/execute-actions/hooks/usestateaction) hook.\n\t\t * @param serverCodeFn Code that will be executed on the **server side**\n\t\t *\n\t\t * {@link https://next-safe-action.dev/docs/define-actions/instance-methods#action--stateaction See docs for more information}\n\t\t */\n\t\tstateAction: buildAction({ withState: true }).action,\n\t};\n}\n","import { actionBuilder } from \"./action-builder\";\nimport type {\n\tDVES,\n\tInputSchemaFactoryFn,\n\tMiddlewareFn,\n\tSafeActionClientArgs,\n\tSafeActionUtils,\n\tServerCodeFn,\n\tStateServerCodeFn,\n} from \"./index.types\";\nimport { isStandardSchema } from \"./standard-schema\";\nimport type { InferOutputOrDefault, StandardSchemaV1 } from \"./standard-schema\";\nimport type {\n\tFlattenedValidationErrors,\n\tHandleValidationErrorsShapeFn,\n\tValidationErrors,\n} from \"./validation-errors.types\";\n\nexport class SafeActionClient<\n\tServerError,\n\tODVES extends DVES | undefined, // override default validation errors shape\n\tMetadataSchema extends StandardSchemaV1 | undefined = undefined,\n\tMD = InferOutputOrDefault<MetadataSchema, undefined>, // metadata type (inferred from metadata schema)\n\tMDProvided extends boolean = MetadataSchema extends undefined ? true : false,\n\tCtx extends object = {},\n\tISF extends ((clientInput?: unknown) => Promise<StandardSchemaV1>) | undefined = undefined, // input schema function\n\tIS extends StandardSchemaV1 | undefined = ISF extends Function ? Awaited<ReturnType<ISF>> : undefined, // input schema\n\tOS extends StandardSchemaV1 | undefined = undefined, // output schema\n\tconst BAS extends readonly StandardSchemaV1[] = [],\n\tCVE = undefined,\n> {\n\treadonly #args: SafeActionClientArgs<ServerError, ODVES, MetadataSchema, MD, MDProvided, Ctx, ISF, IS, OS, BAS, CVE>;\n\n\tconstructor(\n\t\targs: SafeActionClientArgs<ServerError, ODVES, MetadataSchema, MD, MDProvided, Ctx, ISF, IS, OS, BAS, CVE>\n\t) {\n\t\tthis.#args = args;\n\t}\n\n\t/**\n\t * Use a middleware function.\n\t * @param middlewareFn Middleware function\n\t *\n\t * {@link https://next-safe-action.dev/docs/define-actions/instance-methods#use See docs for more information}\n\t */\n\tuse<NextCtx extends object>(middlewareFn: MiddlewareFn<ServerError, MD, Ctx, Ctx & NextCtx>) {\n\t\treturn new SafeActionClient({\n\t\t\t...this.#args,\n\t\t\tmiddlewareFns: [...this.#args.middlewareFns, middlewareFn],\n\t\t\tctxType: {} as Ctx & NextCtx,\n\t\t});\n\t}\n\n\t/**\n\t * Define metadata for the action.\n\t * @param data Metadata with the same type as the return value of the [`defineMetadataSchema`](https://next-safe-action.dev/docs/define-actions/create-the-client#definemetadataschema) optional initialization function\n\t *\n\t * {@link https://next-safe-action.dev/docs/define-actions/instance-methods#metadata See docs for more information}\n\t */\n\tmetadata(data: MD) {\n\t\treturn new SafeActionClient({\n\t\t\t...this.#args,\n\t\t\tmetadata: data,\n\t\t\tmetadataProvided: true,\n\t\t});\n\t}\n\n\t/**\n\t * Define the input validation schema for the action.\n\t * @param inputSchema Input validation schema\n\t * @param utils Optional utils object\n\t *\n\t * {@link https://next-safe-action.dev/docs/define-actions/create-the-client#inputschema See docs for more information}\n\t */\n\tinputSchema<\n\t\tOIS extends StandardSchemaV1 | InputSchemaFactoryFn<IS>, // override input schema\n\t\tAIS extends StandardSchemaV1 = OIS extends InputSchemaFactoryFn<IS, infer NextSchema> // actual input schema\n\t\t\t? NextSchema\n\t\t\t: OIS,\n\t\t// override custom validation errors shape\n\t\tOCVE = ODVES extends \"flattened\" ? FlattenedValidationErrors<ValidationErrors<AIS>> : ValidationErrors<AIS>,\n\t>(\n\t\tinputSchema: OIS,\n\t\tutils?: {\n\t\t\thandleValidationErrorsShape?: HandleValidationErrorsShapeFn<AIS, BAS, MD, Ctx, OCVE>;\n\t\t}\n\t) {\n\t\tconst isDirectStandardSchema = isStandardSchema(inputSchema);\n\t\tconst isInputSchemaFactoryFn =\n\t\t\t!isDirectStandardSchema &&\n\t\t\ttypeof inputSchema === \"function\" &&\n\t\t\tObject.prototype.toString.call(inputSchema) === \"[object AsyncFunction]\";\n\n\t\tif (!isDirectStandardSchema && typeof inputSchema === \"function\" && !isInputSchemaFactoryFn) {\n\t\t\tthrow new TypeError(\n\t\t\t\t\"`inputSchema()` received a function that is not a Standard Schema validator. Pass a Standard Schema validator (`~standard.validate`) directly, or use an async function to build/extend the schema.\"\n\t\t\t);\n\t\t}\n\n\t\treturn new SafeActionClient({\n\t\t\t...this.#args,\n\t\t\tinputSchemaFn: (isInputSchemaFactoryFn\n\t\t\t\t? async (clientInput?: unknown) => {\n\t\t\t\t\t\tconst prevSchema = await this.#args.inputSchemaFn?.(clientInput);\n\n\t\t\t\t\t\treturn (inputSchema as unknown as InputSchemaFactoryFn<IS, AIS>)(prevSchema as IS, {\n\t\t\t\t\t\t\tclientInput,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t: async () => inputSchema) as unknown as ISF,\n\t\t\thandleValidationErrorsShape: (utils?.handleValidationErrorsShape ??\n\t\t\t\tthis.#args.handleValidationErrorsShape) as HandleValidationErrorsShapeFn<AIS, BAS, MD, Ctx, OCVE>,\n\t\t});\n\t}\n\n\t/**\n\t * @deprecated Alias for `inputSchema` method. Use that instead.\n\t */\n\tschema = this.inputSchema;\n\n\t/**\n\t * Define the bind args input validation schema for the action.\n\t * @param bindArgsSchemas Bind args input validation schemas\n\t *\n\t * {@link https://next-safe-action.dev/docs/define-actions/instance-methods#bindargsschemas See docs for more information}\n\t */\n\tbindArgsSchemas<const OBAS extends readonly StandardSchemaV1[]>(bindArgsSchemas: OBAS) {\n\t\treturn new SafeActionClient({\n\t\t\t...this.#args,\n\t\t\tbindArgsSchemas,\n\t\t\thandleValidationErrorsShape: this.#args.handleValidationErrorsShape as unknown as HandleValidationErrorsShapeFn<\n\t\t\t\tIS,\n\t\t\t\tOBAS,\n\t\t\t\tMD,\n\t\t\t\tCtx,\n\t\t\t\tCVE\n\t\t\t>,\n\t\t});\n\t}\n\n\t/**\n\t * Define the output data validation schema for the action.\n\t * @param schema Output data validation schema\n\t *\n\t * {@link https://next-safe-action.dev/docs/define-actions/create-the-client#outputschema See docs for more information}\n\t */\n\toutputSchema<OOS extends StandardSchemaV1>(dataSchema: OOS) {\n\t\treturn new SafeActionClient({\n\t\t\t...this.#args,\n\t\t\toutputSchema: dataSchema,\n\t\t});\n\t}\n\n\t/**\n\t * Define the action.\n\t * @param serverCodeFn Code that will be executed on the **server side**\n\t * @param [cb] Optional callbacks that will be called after action execution, on the server.\n\t *\n\t * {@link https://next-safe-action.dev/docs/define-actions/instance-methods#action--stateaction See docs for more information}\n\t */\n\taction<Data extends InferOutputOrDefault<OS, any>>(\n\t\tthis: MDProvided extends true\n\t\t\t? SafeActionClient<ServerError, ODVES, MetadataSchema, MD, MDProvided, Ctx, ISF, IS, OS, BAS, CVE>\n\t\t\t: never,\n\t\tserverCodeFn: ServerCodeFn<MD, Ctx, IS, BAS, Data>,\n\t\tutils?: SafeActionUtils<ServerError, MD, Ctx, IS, BAS, CVE, Data>\n\t) {\n\t\treturn actionBuilder(this.#args).action(serverCodeFn, utils);\n\t}\n\n\t/**\n\t * Define the stateful action.\n\t * To be used with the [`useStateAction`](https://next-safe-action.dev/docs/execute-actions/hooks/usestateaction) hook.\n\t * @param serverCodeFn Code that will be executed on the **server side**\n\t * @param [cb] Optional callbacks that will be called after action execution, on the server.\n\t *\n\t * {@link https://next-safe-action.dev/docs/define-actions/instance-methods#action--stateaction See docs for more information}\n\t */\n\tstateAction<Data extends InferOutputOrDefault<OS, any>>(\n\t\tthis: MDProvided extends true\n\t\t\t? SafeActionClient<ServerError, ODVES, MetadataSchema, MD, MDProvided, Ctx, ISF, IS, OS, BAS, CVE>\n\t\t\t: never,\n\t\tserverCodeFn: StateServerCodeFn<ServerError, MD, Ctx, IS, BAS, CVE, Data>,\n\t\tutils?: SafeActionUtils<ServerError, MD, Ctx, IS, BAS, CVE, Data>\n\t) {\n\t\treturn actionBuilder(this.#args).stateAction(serverCodeFn, utils);\n\t}\n}\n","import type { MiddlewareFn } from \"./index.types\";\n\n/**\n * Creates a standalone middleware function. It accepts a generic object with optional `serverError`, `ctx` and `metadata`\n * properties, if you need one or all of them to be typed. The type for each property that is passed as generic is the\n * **minimum** shape required to define the middleware function, but it can also be larger than that.\n *\n * {@link https://next-safe-action.dev/docs/define-actions/middleware#create-standalone-middleware See docs for more information}\n */\nexport const createMiddleware = <BaseData extends { serverError?: any; ctx?: object; metadata?: any }>() => {\n\treturn {\n\t\tdefine: <NextCtx extends object>(\n\t\t\tmiddlewareFn: MiddlewareFn<\n\t\t\t\tBaseData extends { serverError: infer SE } ? SE : any,\n\t\t\t\tBaseData extends { metadata: infer MD } ? MD : any,\n\t\t\t\tBaseData extends { ctx: infer Ctx extends object } ? Ctx : object,\n\t\t\t\tNextCtx\n\t\t\t>\n\t\t) => middlewareFn,\n\t};\n};\n","import type { CreateClientOpts, DVES, HandleServerErrorFn } from \"./index.types\";\nimport { SafeActionClient } from \"./safe-action-client\";\nimport type { InferOutputOrDefault, StandardSchemaV1 } from \"./standard-schema\";\nimport { DEFAULT_SERVER_ERROR_MESSAGE } from \"./utils\";\nimport { flattenValidationErrors, formatValidationErrors } from \"./validation-errors\";\n\nexport { createMiddleware } from \"./middleware\";\nexport { DEFAULT_SERVER_ERROR_MESSAGE } from \"./utils\";\nexport {\n\tActionBindArgsValidationError,\n\tActionMetadataValidationError,\n\tActionOutputDataValidationError,\n\tActionValidationError,\n\tflattenValidationErrors,\n\tformatValidationErrors,\n\treturnValidationErrors,\n} from \"./validation-errors\";\n\nexport type * from \"./index.types\";\nexport type * from \"./validation-errors.types\";\n\n/**\n * Create a new safe action client.\n * Note: this client only works with Zod as the validation library.\n * @param createOpts Initialization options\n *\n * {@link https://next-safe-action.dev/docs/define-actions/create-the-client#initialization-options See docs for more information}\n */\nexport const createSafeActionClient = <\n\tODVES extends DVES | undefined = undefined,\n\tServerError = string,\n\tMetadataSchema extends StandardSchemaV1 | undefined = undefined,\n>(\n\tcreateOpts?: CreateClientOpts<ODVES, ServerError, MetadataSchema>\n) => {\n\t// If `handleServerError` is provided, use it, otherwise default to log to console and generic error message.\n\tconst handleServerError: HandleServerErrorFn<ServerError, MetadataSchema> =\n\t\tcreateOpts?.handleServerError ||\n\t\t((e) => {\n\t\t\tconsole.error(\"Action error:\", e.message);\n\t\t\treturn DEFAULT_SERVER_ERROR_MESSAGE as ServerError;\n\t\t});\n\n\treturn new SafeActionClient({\n\t\tmiddlewareFns: [async ({ next }) => next({ ctx: {} })],\n\t\thandleServerError,\n\t\tinputSchemaFn: undefined,\n\t\tbindArgsSchemas: [],\n\t\toutputSchema: undefined,\n\t\tctxType: {},\n\t\tmetadataSchema: (createOpts?.defineMetadataSchema?.() ?? undefined) as MetadataSchema,\n\t\tmetadata: undefined as InferOutputOrDefault<MetadataSchema, undefined>,\n\t\tdefaultValidationErrorsShape: (createOpts?.defaultValidationErrorsShape ?? \"formatted\") as ODVES,\n\t\tthrowValidationErrors: Boolean(createOpts?.throwValidationErrors),\n\t\thandleValidationErrorsShape: async (ve) =>\n\t\t\tcreateOpts?.defaultValidationErrorsShape === \"flattened\"\n\t\t\t\t? flattenValidationErrors(ve)\n\t\t\t\t: formatValidationErrors(ve),\n\t});\n};\n"],"mappings":"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