import { Entity } from '../entity/Entity';
import { Context } from '../context/Context';
import { GraphQLResolveInfo, Source } from 'graphql';
export declare const MUTATION_TYPE_CREATE = "create";
export declare const MUTATION_TYPE_UPDATE = "update";
export declare const MUTATION_TYPE_DELETE = "delete";
export declare const mutationTypes: string[];
export interface MutationMap {
    [key: string]: Mutation;
}
export interface MutationGenerator {
    (mutations: MutationMap): Mutation[];
}
export declare const defaultEntityMutations: ({
    name: string;
    type: string;
    description: (typeName: string) => string;
    hasAttributes: boolean;
} | {
    name: string;
    description: (typeName: string) => string;
    type: string;
    hasAttributes?: undefined;
})[];
interface MutationPreProcessorResponse {
    [key: string]: unknown;
}
export declare type MutationPreProcessor = (params: {
    entity: Entity;
    id?: number | string;
    source?: Source;
    input?: {
        [key: string]: unknown;
    };
    typeName: string;
    entityMutation: Mutation;
    context?: Context;
    info?: GraphQLResolveInfo;
}) => MutationPreProcessorResponse | Promise<MutationPreProcessorResponse>;
export declare type MutationPostProcessor = (params: {
    result?: {
        [key: string]: unknown;
    };
    error?: Error;
    entity: Entity;
    id?: number | string;
    source?: Source;
    input?: {
        [key: string]: unknown;
    };
    typeName: string;
    entityMutation: Mutation;
    context?: Context;
    info?: GraphQLResolveInfo;
}) => void | Promise<void>;
export declare type MutationSetup = {
    name?: string;
    type?: string;
    description?: string;
    attributes?: string[];
    preProcessor?: MutationPreProcessor;
    postProcessor?: MutationPostProcessor;
    fromState?: string | string[];
    toState?: string | string[];
};
export declare class Mutation {
    name: string;
    type: string;
    description: string;
    attributes: string[];
    fromState?: string | string[];
    toState?: string | string[];
    preProcessor?: MutationPreProcessor;
    postProcessor?: MutationPostProcessor;
    isTypeCreate?: boolean;
    isTypeDelete?: boolean;
    needsInstance?: boolean;
    ignoreRequired?: boolean;
    isTypeUpdate?: boolean;
    constructor(setup?: MutationSetup);
    toString(): string;
}
export declare const isMutation: (obj: unknown) => obj is Mutation;
export declare const processEntityMutations: (entity: Entity, mutations: Mutation[]) => Mutation[];
export {};
