@7nohe/openapi-react-query-codegen
Version:
OpenAPI React Query Codegen
37 lines (36 loc) • 2.06 kB
JavaScript
import { StructureKind, VariableDeclarationKind, } from "ts-morph";
import { SDK_CALL_ARGS } from "./buildQueryHooks.mjs";
import { getDataTypeName, getErrorType } from "./operationNames.mjs";
/**
* Build useMutation hook.
* Example:
* export const useAddPet = <TData = Common.AddPetMutationResult, TError = AddPetError, TQueryKey extends Array<unknown> = unknown[], TContext = unknown>(
* mutationKey?: TQueryKey,
* options?: Omit<UseMutationOptions<TData, TError, Options<AddPetData, true>, TContext>, "mutationKey" | "mutationFn">
* ) => useMutation<TData, TError, Options<AddPetData, true>, TContext>({
* mutationKey: Common.UseAddPetKeyFn(mutationKey),
* mutationFn: clientOptions => addPet(clientOptions) as unknown as Promise<TData>,
* ...options
* });
*/
export function buildUseMutationHook(op, ctx) {
const hookName = `use${op.capitalizedMethodName}`;
const errorType = getErrorType(op, ctx);
const dataTypeDefault = `Common.${op.capitalizedMethodName}MutationResult`;
const optionsType = `Options<${getDataTypeName(op)}, true>`;
const mutationFn = `clientOptions => ${op.methodName}(${SDK_CALL_ARGS}) as unknown as Promise<TData>`;
const body = `useMutation<TData, TError, ${optionsType}, TContext>({ mutationKey: Common.Use${op.capitalizedMethodName}KeyFn(mutationKey), mutationFn: ${mutationFn}, ...options })`;
return {
kind: StructureKind.VariableStatement,
// Copy the operation's JSDoc (description and @deprecated) from the SDK function
leadingTrivia: op.jsDoc ? `${op.jsDoc}\n` : undefined,
isExported: true,
declarationKind: VariableDeclarationKind.Const,
declarations: [
{
name: hookName,
initializer: `<TData = ${dataTypeDefault}, TError = ${errorType}, TQueryKey extends Array<unknown> = unknown[], TContext = unknown>(mutationKey?: TQueryKey, options?: Omit<UseMutationOptions<TData, TError, ${optionsType}, TContext>, "mutationKey" | "mutationFn">) => ${body}`,
},
],
};
}