bookish-potato-dto
Version:
A TypeScript DTO (Data Transfer Object) parsing and validation library. Define a schema once — get runtime validation and a fully inferred TypeScript type for free.
66 lines (65 loc) • 3.6 kB
TypeScript
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 {};