import { ClassDeclaration, DecoratorStructure, MethodDeclaration, OptionalKind, ParameterDeclarationStructure, Project, SourceFile, StatementStructures, WriterFunction } from 'ts-morph';
import { DataProperty } from '../data-property';
import { OverwriteOptions } from '../overwrite-options';
import { TypeImport } from '../type-import';
import { NormalizedUpstreamOptions } from '../upstream-options';
import { CoerceDtoClassOutput } from './coerce-dto-class';
import { DtoClassProperty } from './dto-class-property';
export interface OperationParameter extends DataProperty {
    type?: string | WriterFunction | TypeImport;
    pipeList?: Array<string | WriterFunction | TypeImport>;
    defaultValue?: string | WriterFunction;
    hasQuestionToken?: boolean;
    required?: boolean;
    /**
     * (optional) the method parameter name. If not defined the name property will be used
     */
    alias?: string;
    /**
     * true - the parameter is a parent parameter.
     * Example
     * @Controller('/user/:uuid')
     * ...
     * @Get('/profile')
     *
     * In this case the uuid parameter should not be added to the operation path.
     *
     */
    fromParent?: boolean;
}
export interface OperationOptions {
    paramList?: OperationParameter[];
    queryList?: OperationParameter[];
    operationName: string;
    path?: string | null;
    returnType?: string | WriterFunction;
    isAsync?: boolean;
    method?: string;
    body?: string | WriterFunction | null;
    statements?: (string | WriterFunction | StatementStructures)[] | string | WriterFunction | null;
    decorators?: OptionalKind<DecoratorStructure>[];
}
export interface CoerceOperationOptions extends OperationOptions {
    tsMorphTransform?: (project: Project, sourceFile: SourceFile, classDeclaration: ClassDeclaration, controllerName: string, moduleSourceFile: SourceFile, dto: CoerceDtoClassOutput | null, options: Readonly<CoerceOperationOptions & any>) => Partial<OperationOptions> | void;
    overwrite?: OverwriteOptions;
    controllerPath?: string;
    /**
     * true - the control path is overwritten with
     */
    overwriteControllerPath?: boolean;
    context?: string | null;
    coerceUpstreamOperationImplementation?: (classDeclaration: ClassDeclaration, moduleSourceFile: SourceFile, dto: CoerceDtoClassOutput | null, options: Readonly<CoerceOperationOptions & any>) => TransformOperation;
    buildUpstreamGetParametersImplementation?: (classDeclaration: ClassDeclaration, moduleSourceFile: SourceFile, dto: CoerceDtoClassOutput | null, options: Readonly<CoerceOperationOptions & any>) => TransformOperation<string | WriterFunction>;
    buildDtoReturnImplementation?: (classDeclaration: ClassDeclaration, moduleSourceFile: SourceFile, dto: CoerceDtoClassOutput | null, options: Readonly<CoerceOperationOptions & any>) => TransformOperation;
    builtDtoDataMapperImplementation?: (classDeclaration: ClassDeclaration, moduleSourceFile: SourceFile, dto: CoerceDtoClassOutput | null, options: Readonly<CoerceOperationOptions & any>) => TransformOperation<string | WriterFunction>;
    buildUpstreamGetDataImplementation?: (classDeclaration: ClassDeclaration, moduleSourceFile: SourceFile, dto: CoerceDtoClassOutput | null, options: Readonly<CoerceOperationOptions & any>) => TransformOperation<void>;
    buildGetDataImplementation?: (classDeclaration: ClassDeclaration, moduleSourceFile: SourceFile, dto: CoerceDtoClassOutput | null, options: Readonly<CoerceOperationOptions & any>) => TransformOperation<void>;
    coerceOperationDtoClass?: (classDeclaration: ClassDeclaration, controllerName: string, moduleSourceFile: SourceFile, options: Readonly<CoerceOperationOptions & any>) => CoerceDtoClassOutput | null;
    buildOperationDtoClassName?: (controllerName: string, options: Readonly<Pick<CoerceOperationOptions, 'dtoClassNameSuffix' | 'dtoClassName'>>) => string;
    upstream?: NormalizedUpstreamOptions | null;
    propertyList?: DtoClassProperty[];
    isArray?: boolean;
    isReturnVoid?: boolean;
    dtoClassNameSuffix?: string;
    dtoClassName?: string;
}
export declare function CoerceUpstreamBasicOperationImplementation(classDeclaration: ClassDeclaration, moduleSourceFile: SourceFile, upstream: NormalizedUpstreamOptions): {
    className: string;
    memberName: string;
};
export declare function BuildOperationDtoClassName(controllerName: string, options: Readonly<Pick<CoerceOperationOptions, 'dtoClassNameSuffix' | 'dtoClassName'>>): string;
export declare function CoerceOperationDtoClass(classDeclaration: ClassDeclaration, controllerName: string, moduleSourceFile: SourceFile, options: Readonly<CoerceOperationOptions>): CoerceDtoClassOutput | null;
export type TransformOperation<T = void> = (operationOptions: OperationOptions) => T;
export declare function BuiltDtoDataMapperImplementation(classDeclaration: ClassDeclaration, moduleSourceFile: SourceFile, dto: CoerceDtoClassOutput | null, options: Readonly<CoerceOperationOptions>): TransformOperation<string | WriterFunction>;
export declare function BuildDtoReturnImplementation(classDeclaration: ClassDeclaration, moduleSourceFile: SourceFile, dto: CoerceDtoClassOutput | null, options: Readonly<CoerceOperationOptions>): TransformOperation;
export declare function BuildUpstreamGetDataImplementation(classDeclaration: ClassDeclaration, moduleSourceFile: SourceFile, dto: CoerceDtoClassOutput | null, options: Readonly<CoerceOperationOptions>): TransformOperation;
export declare function CoerceUpstreamDefaultOperationImplementation(classDeclaration: ClassDeclaration, moduleSourceFile: SourceFile, dto: CoerceDtoClassOutput | null, options: Readonly<CoerceOperationOptions>): TransformOperation;
export declare function BuildMethodQueryParameters(queryList: OperationParameter[], sourceFile: SourceFile): Array<OptionalKind<ParameterDeclarationStructure>>;
export declare function BuildMethodParamParameters(paramList: OperationParameter[], sourceFile: SourceFile): Array<OptionalKind<ParameterDeclarationStructure>>;
export declare function BuildMethodBodyParameters(body: string | WriterFunction | undefined | null): Array<OptionalKind<ParameterDeclarationStructure>>;
export declare function CoerceApiQueryDecorators(queryList: OperationParameter[], methodDeclaration: MethodDeclaration): void;
export declare function CoerceOperationParamList(paramList: OperationParameter[], classDeclaration: ClassDeclaration): void;
export declare function CoerceNestOperation(sourceFile: SourceFile, options: CoerceOperationOptions, moduleSourceFile?: SourceFile): MethodDeclaration;
