import { EnumAllowedGenericType, EnumType, PrimitiveMap } from '../_types';
import { ArrayDtoFieldDescriptor, ArrayFieldDescriptor, BooleanFieldDescriptor, CustomFieldDescriptor, DateFieldDescriptor, DtoFieldDescriptor, EnumFieldDescriptor, IntegerFieldDescriptor, NumberFieldDescriptor, RegexFieldDescriptor, SchemaMap, StringFieldDescriptor } from './field-descriptor.type';
import { ArrayDtoFieldOptions, ArrayFieldOptions, BooleanFieldOptions, CustomFieldOptions, DateFieldOptions, DtoFieldOptions, EnumFieldOptions, NumberFieldOptions, RegexFieldOptions, StringFieldOptions } from './field-options.type';
import { DtoDefinition } from './dto-definition.type';
import { InferDto } from './infer-dto.type';
/**
 * Namespace of field builder functions for the schema-first API.
 * Each builder returns a plain FieldDescriptor object.
 *
 * @example
 * const PersonDto = defineDto({
 *   name: field.string(),
 *   age:  field.integer({ strictDataTypes: true }),
 * });
 */
/**
 * A field descriptor extended with `optional`, `nullable`, and
 * `optionalAndNullable` modifier methods. Each method returns a *new*
 * descriptor with the requested flag(s) merged into `options`.
 */
type WithModifiers<T extends {
    readonly options: object;
}> = T & {
    optional: () => T & {
        options: {
            isOptional: true;
        };
    };
    nullable: () => T & {
        options: {
            isNullable: true;
        };
    };
    optionalAndNullable: () => T & {
        options: {
            isOptional: true;
            isNullable: true;
        };
    };
};
export declare const field: {
    /** A string field. Replaces @StringProperty. */
    readonly string: (options?: StringFieldOptions) => WithModifiers<StringFieldDescriptor>;
    /** A floating-point number field. Replaces @NumberProperty. */
    readonly number: (options?: NumberFieldOptions) => WithModifiers<NumberFieldDescriptor>;
    /** An integer field. Replaces @IntegerProperty. */
    readonly integer: (options?: NumberFieldOptions) => WithModifiers<IntegerFieldDescriptor>;
    /** A boolean field. Replaces @BooleanProperty. */
    readonly boolean: (options?: BooleanFieldOptions) => WithModifiers<BooleanFieldDescriptor>;
    /** An enum field. Replaces @EnumProperty. */
    readonly enum: <T extends EnumAllowedGenericType>(enumObj: EnumType<T>, options?: EnumFieldOptions<T>) => WithModifiers<EnumFieldDescriptor<T>>;
    /** A Date field. Replaces @DateProperty. */
    readonly date: (options?: DateFieldOptions) => WithModifiers<DateFieldDescriptor>;
    /** A regex-validated string field. Replaces @RegexProperty. */
    readonly regex: (pattern: RegExp, options?: RegexFieldOptions) => WithModifiers<RegexFieldDescriptor>;
    /** An array of primitives. Replaces @ArrayProperty. */
    readonly array: <K extends keyof PrimitiveMap>(itemType: K, options?: ArrayFieldOptions<PrimitiveMap[K]>) => WithModifiers<ArrayFieldDescriptor<K>>;
    /** An array of nested DTOs. Replaces @ArrayDtoProperty. */
    readonly arrayDto: <S extends SchemaMap>(dtoDefinition: DtoDefinition<S>, options?: ArrayDtoFieldOptions<InferDto<DtoDefinition<S>>>) => WithModifiers<ArrayDtoFieldDescriptor<S>>;
    /** A nested DTO field. Replaces @DtoProperty. */
    readonly dto: <S extends SchemaMap>(dtoDefinition: DtoDefinition<S>, options?: DtoFieldOptions<InferDto<DtoDefinition<S>>>) => WithModifiers<DtoFieldDescriptor<S>>;
    /** A field with a fully custom parser. Replaces @CustomProperty. */
    readonly custom: <T>(options: CustomFieldOptions<T>) => WithModifiers<CustomFieldDescriptor<T>>;
};
export {};
